Flink笔记-架构设计

Flink笔记-架构设计

    • 基本组件栈
      • 物理部署层
      • Runtime核心层
      • API层
    • 架构设计细节

Flink架构体系采用的也是分层设计,在降低系统耦合度的同时,也为上层用户构建Flink应用提供了丰富友好的接口。整体从下到上分为三层,物理部署层、Runtime核心层以及API&Libraries层,而API层官方又根据抽象级别的不同细分了四层,之前笔记介绍过。

基本组件栈

物理部署层

主要是负责Flink的部署模式,Flink目前支持多种部署模式:本地部署、集群部署(Standalone/YARN)、云(GCE/EC2)以及kubernetes。Flink能够通过该层支持不同平台的部署,用户可以根据自身场景和需求选择使用对应的部署模式。

Runtime核心层

该层主要负责对上层不同接口提供基础服务,也是Flink分布式计算框架的核心实现层,支持分布式Stream作业的执行、JobGraph到ExecutionGraph的映射转换以及任务调度等。将DataStream和DataSet转成统一的可执行的Task Operator,达到在流式计算引擎下同时处理批量计算和流式计算的目的。

API层

作为分布式数据处理框架,Flink同时提供了支撑流计算和批处理的接口,同时在这基础上抽象出不同的应用类型的组件库,如基于流处理的CEP(复杂事件处理库)、SQL&TABLE库和基于批处理的FlinkML(机器学习库)以及Gelly(图处理库)等等。API层包括构建流计算应用的DataStream API和批处理应用的DataSet API,两者都为用户提供了丰富的数据处理高级API,例如Map、FllatMap操作等,同时也提供了比较低级的Process Functin API,方便用于直接操作状态和时间等底层数据。
Flink笔记-架构设计_第1张图片

架构设计细节

Flink整个系统主要由两个组件构成,分别为JobManager和TaskManager,Flink架构也遵从Master-Slave架构设计原则,JobManager充当Master节点,TaskManager充当Worker节点。所有组件之间的通信都是借助于Akka Framework(响应式并发处理架构),包括任务的状态以及Checkpoint触发等信息。
Flink笔记-架构设计_第2张图片

  • Client客戶端
    客户端负责将任务提交到集群环境,与JobManager构建Akka连接,然后将任务提交到JobManager,通过和JobManager之间进行交互获取任务执行状态。客户端提交任务可以采用CLI方式或者通过使用Flink WebUi提交,也可以在程序中指定JobManager的RPC网络端口构建ExecutionEnvironment提交Flink应用。
  • JobManager
    JobManager负责整个Flink集群任务的调度以及资源的管理,从客户端中获取提交的应用,然后根据集群中TaskManager上TaskSlot的使用情况,为提交的应用分配相应的TaskSlots资源并命令TaskManager启动从客户端中获取的应用。JobManager相当于整个集群的Master节点,且整个集群中有且仅有一个活跃的JobManager,负责整个集群的任务管理和资源管理。JobManager和TaskManager之间通过Actor System(Akka基于Actor模型)进行通信,获取任务执行的情况并通过Actor System将应用的任务执行情况发送给客户端。同时在任务执行过程中,Flink JobManager会触发CheckPoints操作,每个TaskManager节点收到Checkpoints触发指令后,完成Checkpoints操作,所有的Checkpoint协调过程都是在Flink JobManager中完成。当任务完成后,Flink会将任务执行的信息反馈给客户端,并且释放掉TaskManager中的资源以供下一次提交任务使用。
  • TaskManager
    TaskManager相当于spark的WorkerNode,也就是整个集群中的Slave节点,负责集群的任务执行和对应任务在每个节点上的资源申请和管理。客户端通过将编写好的Flink应用编译打包,提交到JobManager,然后JobManager会根据已经注册在JobManager中TaskManager的资源情况,将任务分配给有资源的TaskManager节点,然后启动并运行任务。TaskManager从JobManager接收需要部署的任务,然后使用Slot资源启动Task,建立数据接入的网络连接,接收数据并开始数据处理,同时,TaskManager之间的数据交互都是通过数据流的方式进行的。

Flink的任务运行是采用多线程的方式,和MapReduce多JVM进程的方式有很大的区别,Flink能够极大的提高CPU使用效率,在多个任务和Task之间通过TaskSlot方式共享系统资源,每个TaskManager中会通过管理多个TaskSlot资源池对资源进行有效管理。成就了Flink的高吞吐,低延时,强一致性保障。

你可能感兴趣的:(Flink)