赞
踩
·框架和分布式处理引擎;
·对无界和有界数据流进行有状态计算;
·提供了数据分布、容错机制以及资源管理等核心功能;
·提供了诸多高抽象层的API以便用户编写分布式任务:
- DataSet API, 对静态数据进行批处理操作,将静态数据抽象成分布式的数据集
- DataStream API,对数据流进行流处理操作,将流式的数据抽象成分布式的数据流
- Table API,对结构化数据进行查询操作,将结构化数据抽象成关系表
·Flink 还针对特定的应用领域提供了领域库。Flink ML机器学习库、Gelly,图计算库。
标准的实时处理引擎,基于事件驱动。而Spark Streaming是微批(Micro-Batch)的模型。
分几个方面介绍两个框架的主要区别:
·SparkStreaming 在运行时的主要角色包括:Master、Worker、Driver、Executor
·Flink 在运行时主要包含:Jobmanager、Taskmanager和Slot。
2. 任务调度
·SparkStreaming连续不断的生成微批次数据,构建有向无环图DAG,依次创建DStreamGraph、JobGenerator、JobScheduler。
·Flink根据用户提交的代码生成StreamGraph,经过优化生成JobGraph,然后提交给 JobManager进行处理,生成ExecutionGraph,ExecutionGraph是Flink 任务调度的核心。
·SparkStreaming 只支持处理时间
·Flink 处理时间、事件时间、注入时间、watermark机制来处理滞后数据。
·SparkStreaming设置checkpoint,发生故障并重启,从上次checkpoint之处恢复,只能使得数据不丢失,可能会重复处理,不能做到恰好一次处理语义。
·Flink则使用两阶段提交协议来解决这个问题。
Flink是一个分层架构的系统,每一层所包含的组件都提供了特定的抽象,用来服务于上层组件。
·Deploy层: locol、standalone、cluster、cloud
·Runtime层: Flink 计算的核心实现,比如:支持分布式流处理、JobGraph到ExecutionGraph的映射、调度等。
·API层:DataStream API、DataSet API
·Libraries层: CEP、Table API&SQL、FlinkML、Gelly
Flink可以完全独立于Hadoop,但是做为大数据的基础设施,Hadoop体系是任何大数据框架都绕不过去的。
Flink可以和Yarn集成做资源调度,也可以读写HDFS,或者利用HDFS做检查点。
将自己生产环节中的集群规模、节点、内存情况说明,部署模式(一般是Flink on Yarn),除此之外,用户也可以同时在小集群(少于5个节点)和拥有 TB 级别状态的上千个节点上运行 Flink 任务。
Flink 程序的基本构建是数据输入来自一个 Source,经过 Transformation 进行转换,然后在一个或者多个Sink接收器中结束。执行时Flink程序映射到streaming dataflows。
7 Flink集群有哪些角色?各自有什么作用?
·JobManager:Master
- 集群的协调者
- 接收Flink Job
- 协调检查点
- Failover 故障恢复等
- 管理Flink集群中从节点TaskManager
·TaskManager执行计算的Worker,
- 执行Flink Job的一组Task
- 管理资源信息,如内存、磁盘、网络
- 在启动的时候将资源的状态向JobManager汇报
·Client程序提交的客户端,提交一个Flink程序时会首先创建一个Client
- Client首先会对用户提交的Flink程序进行预处理,并提交到Flink集群中处理;
- 从用户提交的Flink程序配置中获取JobManager的地址,并建立连接;
- 将Flink Job提交给JobManager。
TaskManager会将自己节点上管理的资源分为不同的Slot:固定大小的资源子集。
避免了不同Job的Task互相竞争内存资源,Slot只会做内存的隔离。没有做CPU的隔离。
Map:对输入的参数进行转换操作。
Filter:过滤掉指定条件的数据。
KeyBy:按照指定的key进行分组。
Reduce:用来进行结果汇总合并。
Window:窗口函数,根据某些特性将每个key的数据进行分组(例如:在5s内到达的数据)
分区策略是用来决定数据如何发送至下游。Flink 支持了8中分区策略的实现。
·GlobalPartitioner:分发到第一个实例
·ShufflePartitioner:随机
·RebalancePartitioner:循环
·RescalePartitioner:根据并行度
·BroadcastPartitioner:广播到每个实例(适合于大数据集和小数据集做Jion)
·ForwardPartitioner:one to one
·KeyGroupStreamPartition:按key的hash值分发到下游实例
·CustomPartitionerWrapper:用户自定义分区器。
Flink中的任务可并行执行任务,每个并行的实例处理一部分数据。并行实例的数量被称为并行度。可以从不同层面设置并行度(优先级:算子层面>环境层面>客户端层面>系统层面)
·slot是指taskmanager的并发执行能力
·parallelism是指taskmanager实际使用的并发能力
·固定延迟重启策略(Fixed Delay Restart Strategy)
·故障率重启策略(Failure Rate Restart Strategy)
·没有重启策略(No Restart Strategy)
·Fallback重启策略(Fallback Restart Strategy)
Flink实现的分布式缓存目的是在本地读取文件,并把他放在taskmanager节点中,防止task重复拉取。
Flink是并行的计算过程可能不在一个Slot中进行。广播变量理解为是一个公共的共享变量,当访问同一份数据,把一个DataSet数据集广播,然后不同的task在节点上都能够获取到(这个数据在每个节点上只会存在一份)
·Sessionwindow
·timeWindow(Time.seconds(5))
timeWindow(Time.seconds(5), Time.seconds(3))
·countWindow(5)
countWindow(5,3)
·计算的过程中需要存储中间状态,来避免数据丢失和状态恢复
·状态存储策略会影响状态持久化如何和 checkpoint 交互
·三种状态存储方式:MemoryStateBackend、FsStateBackend、RocksDBStateBackend
·EventTime为基准来定义时间窗口,消息本身携带EventTime
·IngesingtTime为基准来定义时间窗口,是source 的systemTime
·ProcessingTime基准来定义时间窗口,是operator 的systemTime
为处理 EventTime 窗口计算提出的一种机制, 本质上是一种时间戳。
Watermark经常和Window一起被用来处理乱序事件。
TableEnvironment是Table API和SQL集成的核心概念。这个类主要用来:
·在内部catalog中注册表
·注册外部catalog
·执行SQL查询
·注册用户定义(标量,表或聚合)函数
·将DataStream或DataSet转换为表
·持有对ExecutionEnvironment或StreamExecutionEnvironment的引用
·用calcite对StreamSQL进行语法检验,语法检验通过后,转换成calcite的逻辑树节点,最终形成calcite的逻辑计划
·采用Flink自定义的优化规则和calcite火山模型、启发式模型共同对逻辑树进行优化,生成最优的Flink物理计划
·对物理计划采用janino codegen生成代码,生成用低阶API DataStream 描述的流应用,提交到Flink平台执行
Flink的开发者认为批处理是流处理的一种特殊情况。批处理是有限的流处理。
Flink 使用一个引擎支持了DataSet API 和 DataStream API。
在一个Flink Job中数据需要在不同的task中进行交换,数据交换是由TaskManager负责的,TaskManager的网络组件首先从缓冲buffer中收集一批records再发送,batch 技术可以更加高效的利用网络资源。
·Checkpoint 负责定时制作分布式快照、对程序中的状态进行备份;
·State 用来存储计算过程中的中间状态。
持续创建分布式数据流及其状态的一致快照。
在input source端插入barrier,控制barrier的同步来实现snapshot的备份和exactly-once语义。
Flink通过实现两阶段提交和状态保存来实现端到端的一致性语义。
分为以下几个步骤:
·开始事务(beginTransaction)创建一个临时文件夹,来写把数据写入到这个文件夹里面
·预提交(preCommit)将内存中缓存的数据写入文件并关闭
·正式提交(commit)将之前写完的临时文件放入目标目录下。这代表着最终的数据会有一些延迟
·丢弃(abort)丢弃临时文件
若失败发生在预提交成功后,正式提交前。可以根据状态来提交预提交的数据,也可删除预提交的数据。
Flink 在1.9版本发布的全新kafka连接器,不同版本的kafka集群只需要依赖一个connector即可。
·Flink是将对象都序列化到一个预分配的内存块上。
·Flink大量的使用了堆外内存,如果需要处理的数据超出了内存限制,则存储到硬盘上。
·Flink 为了直接操作二进制数据实现了自己的序列化框架。
·Flink的内存管理分为三部分:
- Network Buffers:这个是在TaskManager启动的时候分配的,用于缓存网络数据的内存,每个块是32K,默认分配2048个;
- Memory Manage pool:大量的Memory Segment块,用于运行时的算法(Sort/Join/Shuffle等),启动的时候就会分配;
- User Code:用于User code和TaskManager本身的数据结构。
·Java本身自带的序列化和反序列化的功能,但是笨重。
·Flink针对不同数据集,可以自动生成对应的TypeSerializer,能非常高效地对数据集进行序列化和反序列化。
window产生数据倾斜指的是数据在不同的窗口内堆积的数据量相差过多。数据源头发送的数据量速度不同导致的。
·在数据进入窗口前做预聚合
·重新设计窗口聚合的key
·在业务上规避这类问题:单独处理数据北京的数据。
·Key的设计上:把热key进行拆分,北京按照地区进行拆分聚合。
·参数设置:Flink 1.9.0 SQL性能优化中升级了微批模型(MiniBatch)。原理是缓存一定的数据后再触发处理,减少对状态访问并提升吞吐量,减少数据的输出量。
·在Flink的后台任务管理中看到Flink的哪个算子和task出现了反压。
·资源调优:作业中的Operator的并发数、CPU、堆内存等参数进行调优。
·作业参数调优:并行度的设置,State的设置,checkpoint的设置。
Flink 内部是基于producer-consumer模型来进行消息传递的,Flink的反压设计也是基于这个模型。
Flink 使用了高效有界的分布式阻塞队列:下游消费者消费变慢,上游就会受到阻塞。
Flink是逐级反压,而Storm是直接从源头降速。
为了更高效地分布式执行,Flink会尽可能地将operator的subtask链接在一起形成task。每个task在一个线程中执行。将operators链接成task是非常有效的优化:
·减少线程之间的切换,
·减少消息的序列化/反序列化,
·减少数据在缓冲区的交换,
·减少了延迟的同时提高整体的吞吐量。
·上下游的并行度一致
·下游节点的入度为1 (也就是说下游节点没有来自其他节点的输入)
·上下游节点都在同一个slot group中
·下游节点的chain策略为 ALWAYS(可以与上下游链接,map、flatmap、filter等默认是ALWAYS)
·上游节点的chain策略为ALWAYS或HEAD(只能与下游链接,不能与上游链接,Source默认是HEAD)
·两个节点间数据分区方式是forward(参考理解数据流的分区)
·用户没有禁用chain
·支持hive读写,支持UDF
·Flink SQL TopN和GroupBy等优化
·Checkpoint跟savepoint针对实际业务场景做了优化
·Flink state查询
可以在处理前加一个fliter算子,将不符合规则的数据过滤出去。
·用户提交的Flink Job会被转化成一个DAG任务运行,分别是:StreamGraph、JobGraph、ExecutionGraph
·Flink中JobManager与TaskManager,JobManager与Client的交互是基于Akka工具包的,是通过消息驱动
·整个Flink Job的提交还包含着ActorSystem的创建,JobManager的启动,TaskManager的启动和注册
·StreamGraph 最接近代码所表达的逻辑层面的计算拓扑结构,按照用户代码的执行顺序向StreamExecutionEnvironment添加StreamTransformation构成流式图。
·JobGraph 从StreamGraph生成,将可以串联合并的节点进行合并,设置节点之间的边,安排资源共享slot槽位和放置相关联的节点,上传任务所需的文件,设置检查点配置等。相当于经过部分初始化和优化处理的任务图。
·ExecutionGraph 由JobGraph转换而来,包含了任务具体执行所需的内容,是最贴近底层实现的执行图。
TaskManager 相当于整个集群的 Slave 节点,
·负责具体的任务执行和对应任务在每个节点上的资源申请和管理。
·TaskManager从JobManager 接收需要部署的任务,然后使用Slot资源启动Task,建立数据接入的网络连接,接收数据并开始数据处理。通过数据流进行数据交互.
·Flink 的任务运行采用多线程的方式,Flink能够提高CPU使用效率,在多个任务和Task之间通过askSlot方式共享系统资源,TaskManager中管理多个TaskSlot资源池。
TaskManager会将其所有的资源平分给Task slot:固定大小的资源子集
·多个task运行在同一个JVM中。
·共享TCP连接(基于多路复用)和心跳消息,
·减少数据的网络传输,共享一些数据结构,减少了每个task的消耗。
·每个slot可以接受单个task,也可以接受多个连续task组成的pipeline,
·Flink的容错机制是制作分布式数据流和操作算子状态的一致性快照。快照充当一致性checkpoint,系统可以在发生故障时回滚。
·barriers在数据流源处被注入并行数据流中。然后barriers向下游流动,一旦sink操作算子从其所有输入流接收到barriers n,它就向checkpoint协调器确认快照n完成。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。