新年第一发,打麻将输的好惨啊!说好的M*ABC+N*DDD+EE就能胡牌呢!!!
Flink 基本组件和逻辑计划生成
概要和背景
flink是一个被誉为 the 4th G 的计算框架,不同的框架特性及其代表项目列表如下:
第一代
第二代
第三代
第四代
Batch
BatchInteractive
Batch Interactive Near-Real-TimeInterative-processing
Hybrid Interactive Real-Time-StreamingNative-Iterative-processing
DAG Dataflows
RDD
Cyclic Dataflows
Hadoop MapReduce
TEZ
Spark
Flink
本文主要介绍flink的核心组件以及物理计划的生成过程
参考代码分支 flink-1.7.1 本系列大概有7-10章,那3章是留给阿里开源的Blink的新特性的。。。
核心组件介绍
这里只介绍 on yarn 模式下的组件
flink 的 on yarn 模式支持两种不同的类型:
- 单作业单集群
- 多作业单集群
首先介绍 单作业单集群 的架构,单作业单集群下一个正常的 flink 程序会拥有以下组件
job Cli: 非 detatched 模式下的客户端进程,用以获取 yarn Application Master 的运行状态并将日志输出掉终端
JobManager[JM]: 负责作业的运行时计划 ExecutionGraph 的生成、物理计划生成和作业调度
TaskManager[TM]: 负责被分发 task 的执行、心跳/状态上报、资源管理
Tips:
启动Flink Yarn Session有2种模式:分离模式、客户端模式
通过-d指定分离模式,即客户端在启动Flink Yarn Session后,就不再属于Yarn Cluster的一部分。如果想要停止Flink Yarn Application,需要通过yarn application -kill 命令来停止。
整体的架构大致如下图所示:
![b247935ff59a2484b42f751eff3120e7.png](https://i-blog.csdnimg.cn/blog_migrate/931b50a4a6ea70639b03dd63b8625987.jpeg)
下面将以一次 Job 的提交过程描述 flink 的各组件的作用及协同
作业提交流程分析
单作业单集群模式下,一个作业会启动一个 JM,并依据用户的参数传递启动相应数量的 TM,每个 TM 运行在 yarn 的一个 container 中,
一个通常的 flink on yarn 提交命令:./bin/flink run -m yarn-cluster -yn 2 -j flink-demo-1.0.0-with-dependencies.jar —ytm 1024 -yst 4 -yjm 1024 —yarnname flink_demo flink 在收到这样一条命令后会首先通过 Cli 获取 flink 的配置,并解析命令行参数。
配置加载
CliFrontend.java 是 flink 提交作业的入口
//CliFrontend line144
// 1. find the configuration directory
final String configurationDirectory = getConfigurationDirectoryFromEnv();
这里会尝试加载 conf 文件夹下的所有 yaml 文件,配置文件的命名并没有强制限制
参数解析
解析命令行参数的第一步是路由用户的命令,然后交由run方法去处理
//CliFrontend line1119
try {
final CliFrontend cli = new CliFrontend(
configuration,
customCommandLines);
SecurityUtils.install(new SecurityConfiguration(cli.configuration));
int retCode = SecurityUtils.getInstalledContext()
.runSecured(() -> cli.parseParameters(args));
System.exit(retCode);
}
catch (Throwable t) {
final Throwable strippedThrowable = ExceptionUtils.stripException(t, UndeclaredThrowableException.class);
LOG.error("Fatal error while running command line interface.