Hi~朋友,关注置顶防止错过消息
Flink整体架构
Flink整体架构从下自上分为:
Flink可以运行在多种不同的环境中:
针对不同的运行环境,Flink提供了一套统一的分布式作业引擎,就是上图的Runtime层。
Flink Runtime架构
Flink Runtime采用了标准的Master-Slave架构:
Flink Runtime Master结构
Flin Runtime Master包含三个主要组件(全部存在于AppMaster进程中):
Flin集群运行模式
Flink集群主要有两种运行模式:
Flink集群两种运行模式的特点:
Flink TaskExecutor
Flink中TaskExecutor的资源是通过Slot进行描述,一个Slot一般可以执行1个具体的Task,但在一些情况下可以执行多个相关联的Task。
Flink作业提交运行过程
用户提交作业时,提交脚本会启动一个Client进程负责作业的编译和提交,该Client进程会将代码编译为一个JobGraph(该过程中还会进行检查和优化等工作,比如判断哪些Operator可以Chain到同一个Task中),最后Client会将产生的JobGraph提交到集群中运行。
在将作业提交到AM的Dispatcher后,Dispatcher首先会启动一个JobManager,然后JobManager会向ResourceManager申请资源启动作业中的具体任务,此时根据Flink运行模式的不同会有不同的逻辑:
ResourceManager在选择到空闲的Slot以后,就会通知TaskManager将该Slot分配给JobManager,然后TaskExecutor进行记录,会向JobManager进行注册。JobManager收到TaskExecutor注册上来的Slot便可以提交Task。
TaskExecutor收到JobManager提交的Task后,会启动一个新的线程执行该Task,Task启动后就开始进行计算,并通过数据Shuffle模块互相交换数据。
Flink资源管理
Flink中的资源是由TaskExecutor的Slot进行表示。
当我们Flink JobManager为Task申请资源时,主要有以下过程:
JobManager在Task任务完成以后,并不会立即释放Slot,而是经过当Slot在SlotPool中的时间超过指定的时间并未使用时(延迟释放),SlotPool才会发起释放请求释放该slot(7.release/cancel slot),在释放过程中:
通过Slot的延迟释放,避免如果直接将Slot还给ResourceManager,在任务异常结束后重启需要立即重新申请slot的步骤,可以将失败的Task尽快调度回原来的TaskManager进行执行,加快Failover的速度。
除了正常的通信以外,TaskManager和ResourceManager及JobManager还会存在心跳信息来同步Slot的状态,避免了正常通信的消息丢失时各组件状态不一致的问题。
Flink Share Slot
Flink Share Slot指的是在一个Slot中可以运行多个Task,每个Slot中可以部署来自不同JobVertex的Task,这样可以提高Slot的资源利用率。
Flink作业调度
前面我们已经提到了,在提交作业时,我们的Client进程会将作业编译成一个JobGraph,JobGraph代表了作业的逻辑结构,当JobManager收到提交的作业以后,会根据JobGraph按照并发展开,从而得到实际的ExecutionGraph,ExecutionGraph是物理结构,JobManager实际维护的就是ExecutionGraph的相关数据结构。
Flink的一个Job任务通常包含很多个Task,目前Task的调度方式主要有两种:
Flink错误恢复
Flink的错误主要分为两类:
对于Task错误的恢复策略主要有以下几种:
借助Flink的Checkpoint机制,任务重启以后我们可以直接从上次的Checkpoint开始重新执行,Restart-all策略更适合流式处理作业。
Flink的批处理作业没有Checkpoint机制,对于需要数据传输的作业,如果重启后从头开始计算将会造成性能问题,由于Restart-individual只适合Task之间没有数据传输的任务,所以为了解决这个问题,Flink集群引入了一种新的策略:
在Flink批处理的Task中,数据的传输方式主要有两种:
基于上述两种传输方式,Flink根据ExecutionGraph中使用Pipeline传输数据的Task的子图叫做Region,从而将ExecutionGraph划分为多个Region。
基于上述特点,如果某个Region的Task发生执行错误,可以分两种情况进行考虑:
Flink的Master集群发生异常,Flink支持多个Master做备份,当主Master发生宕机时,备份的Master可以通过Zookeeper进行选主,保证任一时刻只有一个Master运行。针对Master集群发生故障时的作业恢复,目前Flink是直接重启整个作业。