微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flink知识点总结

Flink简介

Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。并且 Flink 提供了数据分布、容错机制以及资源管理等核心功能。Flink提供了诸多高抽象层的API以便用户编写分布式任务:DataSet API、DataStream API、Table API等

Flink跟Spark Streaming的区别

Flink 是标准的实时处理引擎,基于事件驱动。而 Spark Streaming 是微批的模型。

下面我们就分几个方面介绍两个框架的主要区别:

1)架构模型Spark Streaming 在运行时的主要角色包括:Master、Worker、Driver、Executor,Flink 在运行时主要包含:Jobmanager、Taskmanager和Slot。

2)任务调度Spark Streaming 连续不断的生成微小的数据批次,构建有向无环图DAG,Spark Streaming 会依次创建 DStreamGraph、JobGenerator、JobScheduler。Flink 根据用户提交的代码生成 StreamGraph,经过优化生成 JobGraph,然后提交给 JobManager进行处理,JobManager 会根据 JobGraph 生成 ExecutionGraph,ExecutionGraph 是 Flink 调度最核心的数据结构,JobManager 根据 ExecutionGraph 对 Job 进行调度。

3)时间机制Spark Streaming 支持的时间机制有限,只支持处理时间。 Flink 支持了流处理程序在时间上的三个定义:处理时间、事件时间、注入时间。同时也支持 watermark 机制来处理滞后数据。

4)容错机制对于 Spark Streaming 任务,我们可以设置 checkpoint,然后假如发生故障并重启,我们可以从上次 checkpoint 之处恢复,但是这个行为只能使得数据不丢失,可能会重复处理,不能做到恰好一次处理语义。Flink 则使用两阶段提交协议来解决这个问题。

Flink架构

Flink程序在运行时主要有TaskManager,JobManager,Client三种角色。

JobManager

扮演着集群中的管理者Master的角色,它是整个集群的协调者,负责接收Flink Job,协调检查点,Failover 故障恢复等,同时管理Flink集群中从节点TaskManager。

Jobmanger 又包含 3 个不同的组件

1. JobMaster

JobMaster 是 JobManager 中最核心的组件,负责处理单独的作业(Job)。所以 JobMaster 和具体的 Job 是一一对应的,多个 Job 可以同时运行在一个 Flink 集群中, 每个 Job 都有一个 自己的 JobMaster。

在作业提交时,JobMaster 会先接收到要执行的应用。这里所说“应用”一般是客户端提 交来的,包括:Jar 包,数据流图(dataflow graph),和作业图(JobGraph)。

JobMaster 会把 JobGraph 转换成一个物理层面的数据流图,这个图被叫作“执行图” (ExecutionGraph),它包含了所有可以并发执行的任务。 JobMaster 会向资源管理器 (ResourceManager)发出请求,申请执行任务必要的资源。一旦它获取到了足够的资源,就会将执行图分发到真正运行它们的 TaskManager 上。

而在运行过程中,JobMaster 会负责所有需要中央协调的操作,比如说检查点(checkpoints) 的协调。

2. 资源管理器(ResourceManager)

ResourceManager 主要负责资源的分配和管理,在 Flink 集群中只有一个。所谓“资源”, 主要是指 TaskManager 的任务槽(task slots)。任务槽就是 Flink 集群中的资源调配单元,包含 了机器用来执行计算的一组 cpu 和内存资源。每一个任务(Task)都需要分配到一个 slot 上 执行。

Flink 的 ResourceManager,针对不同的环境和资源管理平台(比如 Standalone 部署,或者 YARN),有不同的具体实现。在 Standalone 部署时,因为 TaskManager 是单独启动的(没有 Per-Job 模式),所以 ResourceManager 只能分发可用 TaskManager 的任务槽,不能单独启动新 TaskManager。 而在有资源管理平台时,就不受此限制。当新的作业申请资源时,ResourceManager 会将 有空闲槽位的 TaskManager 分配给 JobMaster。如果 ResourceManager 没有足够的任务槽,它 还可以向资源提供平台发起会话,请求提供启动 TaskManager 进程的容器。另外, ResourceManager 还负责停掉空闲的 TaskManager,释放计算资源。

3. 分发器(dispatcher)

dispatcher 主要负责提供一个 REST 接口,用来提交应用,并且负责为每一个新提交的作 业启动一个新的 JobMaster 组件。dispatcher 也会启动一个 Web UI,用来方便地展示和监控作 业执行的信息。dispatcher 在架构中并不是必需的,在不同的部署模式下可能会被忽略掉。

TaskManager

是实际负责执行计算的Worker,在其上执行Flink Job的一组Task,每个TaskManager负责管理其所在节点上的资源信息,如内存、磁盘、网络,在启动的时候将资源的状态向JobManager汇报。

一个 TaskManager 都包含了一定数量的任务槽(task slots)。Slot 是资源调度的最小单位,slot 的数量限制了 TaskManager 能够并行处理的任务数量

启动之后,TaskManager 会向资源管理器注册它的 slots;收到资源管理器的指令后, TaskManager 就会将一个或者多个槽位提供给 JobMaster 调用,JobMaster 就可以分配任务来执 行了。

在执行过程中,TaskManager 可以缓冲数据,还可以跟其他运行同一应用的 TaskManager 交换数据。

Client

Flink程序提交的客户端,当用户提交一个Flink程序时,会首先创建一个Client,该Client首先会对用户提交的Flink程序进行预处理(调用程序的 main 方法,将代码转换成数据流图并最终生成作业图,一并发送给 JobManager),并提交到Flink集群中处理,所以Client需要从用户提交的Flink程序配置中获取JobManager的地址,并建立到JobManager的连接,将Flink Job提交给JobManager。

Yarn集群下作业提交流程

会话(Session)模式

在会话模式下,我们需要先启动一个 YARN session,这个会话会创建一个 Flink 集群。

 

这里只启动了 JobManager,而 TaskManager 可以根据需要动态地启动。在 JobManager 内 部,由于还没有提交作业,所以只有 ResourceManager 和 dispatcher 在运行

 

 

 

 

(1)客户端通过 REST 接口,将作业提交给分发器。

(2)分发器启动 JobMaster,并将作业(包含 JobGraph)提交给 JobMaster。

(3)JobMaster 向资源管理器请求资源(slots)。

(4)资源管理器向 YARN 的资源管理器请求 container 资源。

(5)YARN 启动新的 TaskManager 容器。

(6)TaskManager 启动之后,向 Flink 的资源管理器注册自己的可用任务槽。

(7)资源管理器通知 TaskManager 为新的作业提供 slots。

(8)TaskManager 连接到对应的 JobMaster,提供 slots。

(9)JobMaster 将需要执行的任务分发给 TaskManager,执行任务。

单作业(Per-Job)模式(详细流程)

 

(1)脚本启动执行,解析参数,创建对应的客户端。客户端执行用户代码生成StreamGraph;调用YarnJobClusterExecutor生成JobGraph,其中YarnClusterDescriptor上传jar包、配置、数据流图和作业图到HDFS,封装提交参数和命令通过YarnClient提交任务信息给ResourceManager

(2)ResourceManager选择一个Nodemanger创建Container启动ApplicationMaster

(3)ApplicationMaster启动dispatcher和Resourcemangerdispatcher启动JobMaster,JobMaster生成ExecutionGraph

(4)JobMaster中的SlotPool向Resourcemanger中的Slotmanger注册、请求slot

(5)ResourceManager向Yarn的ResourceManager申请资源

(6)找到合适的NodeManager创建Container,启动TaskManager

(7)YarnTaskExcutorRunner调用runTaskManager启动TaskExecutor

(8)TaskExecutor向ResourceManager的SlotManager注册slot

(9)ResourceManager分配slot给TaskExecutor

(10)TaskExecutor提供slot给JobMaster中的SlotPool

(11)JobMaster 将需要执行的任务分发给 TaskManager,执行任务。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐