FLink是一个有状态的分布式实时计算框架。
一、Flink API介绍
1、最底层的是有状态的流处理,已经继承到DataStream API中,一般不直接使用。
2、第二层核心API,分为流处理DataStream和批处理DataSetAPI,一般用于java、scala开发,使用较多。
3、第三层TableAPI,以表为中心的声明式编程API,可以把一个流程定义为一个table,有元数据schema,可以执行部分sql操作,例如select、join等。table api可以和第二层API很好的结合使用。
4、最顶层的是SQL,也是现在非常活跃开发的Flink SQL,但是实时sql和离线sql在使用上还是需要注意区别。
二、Flink集群剖析
Flink集群中主要有两中角色:JobManager和TaskManager,都是进程级。
1、JobManager
JobManager作为作业的管理者,主要负责TaskManager的调度、task的状态维护及相应、触发checkpoint、失败后重启恢复等。它有三个部分:
(1)资源管理器ResourceManager:负责资源的提供、回收、分配,操作的是task slots(槽位)。
(2)调度器Dispatcher:负责提交作业,创建jobMaster,我们要经常用到的webUI。
(3)作业主JobMaster:负责管理单个JobGraph,一个集群上可以跑多个作业。
2、TaskManager
管理task,一个taskManager上有多个task。
3、Task
Task是线程级别的,执行具体的计算操作。多个task可以链接在一起,叫做chain,这样做的能减少task间的交互成本、线程切换、缓冲区开销等。下图虚线框中就是chain在一起的task,由一个task执行。
4、Slot
slot是一个最小的资源单位,每个task占有一个slot,task是线程级别的,归宿于TaskManager,也就是说如果一个TaskManager由4个Task组成,也就是有4个Slot,那么每个slot会分1/4的资源,目前主要分cpu、内存资源,例如一个TaskManager是4核8G,那么一个slot就是1核2G,但是注意目前只做到了内存级别的隔离,cpu没法完全分开。