1.讲一下flink的运行架构
当flink集群启动后,首先会启动一个JobManager和一个或者多个TaskManager。有Client提交任务给JobManager,JobManager在调度任务到各个TaskManager去执行,然后 TaskManager 将心跳和统计信息汇报给 JobManager。TaskManager 之间以流的形式进行数据的传输。上述三者均为独立的 JVM 进程。
- Client 为提交 Job 的客户端,可以是运行在任何机器上(与 JobManager 环境连通即可)。提交 Job 后,Client 可以结束进程(Streaming的任务),也可以不结束并等待结果返回。
- JobManager 主要负责调度 Job 并协调 Task 做 checkpoint,职责上很像 Storm 的 Nimbus。从 Client 处接收到 Job 和 JAR 包等资源后,会生成优化后的执行计划,并以 Task 的单元调度到各个 TaskManager 去执行。
- TaskManager 在启动的时候就设置好了槽位数(Slot),每个 slot 能启动一个 Task,Task 为线程。从 JobManager 处接收需要部署的 Task,部署启动后,与自己的上游建立 Netty 连接,接收数据并处理。
2.讲一下flink的作业执行流程
以yarn模式Per-job方式为例概述作业提交执行流程
当执行executor() 之后,会首先在本地client 中将代码转化为可以提交的 JobGraph如果提交为Per-Job模式,则首先需要启动AM, client会首先向资源系统申请资源, 在yarn下即为申请container开启AM, 如果是Session模式的话则不需要这个步骤Yarn分配资源, 开启AM
- Client将Job提交给Dispatcher
- Dispatcher 会开启一个新的 JobManager线程
- JM 向Flink 自己的 Resourcemanager申请slot资源来执行任务
- RM 向 Yarn申请资源来启动 TaskManger (Session模式跳过此步)
- Yarn 分配 Container 来启动 taskManger (Session模式跳过此步)
- Flink 的 RM 向 TM 申请 slot资源来启动 task
- TM 将待分配的 slot 提供给 JM
- JM 提交 task, TM 会启动新的线程来执行任务,开始启动后就可以通过 shuffle模块进行 task之间的数据交换