2.1 Flink结构与支持
Flink是一个分层架构的系统,不同层的栈建立在其下层基础上,并且每一层所包含的组件都提供了特定的抽象,用来服务于上层组件。Flink分层的组件栈如下图所示(从下至上):
- 部署:Flink 支持本地运行、能在独立集群或者在被 YARN 或 Mesos 管理的集群上运行, 也能部署在云上。
- 运行:Flink 的核心是分布式流式数据引擎,意味着数据以一次一个事件的形式被处理。
- API:DataStream、DataSet、Table、SQL API。
- 扩展库:Flink 还包括用于复杂事件处理,机器学习,图形处理和 Apache Storm 兼容性的专用代码库。
API支持 | Libs支持 | 整合支持 |
---|---|---|
DataStream | 复杂事件处理(CEP) | Flink on YARN、Storm |
DataSet | 机器学习(FlinkML) | HDFS、Tachyon、S3、XtreemFS |
Table | 图分析处理(Gelly) | Kafka、RabbitMQ |
Streaming | 关系数据处理(Table) | HBase、ElasticSearch |
2.2 Deployment调度层
该层主要涉及了Flink的部署模式,Flink支持多种部署模式:本地、集群(Standalone/YARN)、云(GCE/EC2)。Standalone部署模式与Spark类似,Flink on YARN的部署模式如下图所示:
了解YARN的话,对上图的原理非常熟悉,实际Flink也实现了满足在YARN集群上运行的各个组件:Flink YARN Client负责与YARN RM通信协商资源请求,Flink JobManager和Flink TaskManager分别申请到Container去运行各自的进程。通过上图可以看到,YARN AM与Flink JobManager在同一个Container中,这样AM可以知道Flink JobManager的地址,从而AM可以申请Container去启动Flink TaskManager。待Flink成功运行在YARN集群上,Flink YARN Client就可以提交Flink Job到Flink JobManager,并进行后续的映射、调度和计算处理。
2.3 Runtime层
Runtime层提供了支持Flink计算的全部核心实现,比如支持分布式Stream处理、JobGraph到ExecutionGraph的映射、调度等等,为上层API层提供基础服务。
2.4 API层
API层主要实现了面向无界Stream的流处理和面向Batch的批处理API,其中面向流处理对应DataStream API,面向批处理对应DataSet API。
2.5 Libraries层
Libraries层也可以称为Flink应用框架层,根据API层的划分,在API层之上构建的满足特定应用的实现计算框架,也分别对应于面向流处理和面向批处理两类。
面向流处理支持:CEP(复杂事件处理)、基于SQL-like的操作(基于Table的关系操作)
面向批处理支持:FlinkML(机器学习库)、Gelly(图处理)
- 运行时层以JobGraph形式接收程序。JobGraph即为一个一般化的并行数据流图(data flow),它拥有任意数量的Task来接收和产生data stream。
- DataStream API和DataSet API都会使用单独编译的处理方式生成JobGraph。DataSet API使用optimizer优化器来决定针对程序的优化方法,而DataStream API则使用stream builder流生成器来完成该任务。
- 在执行JobGraph时,Flink提供了多种候选部署方案(如local,remote,YARN等)。
- Flink附随了一些产生DataSet或DataStream API程序的的类库和API:处理逻辑表查询的Table,机器学习的FlinkML,图像处理的Gelly,复杂事件处理的CEP。