Flink 运行时的组件
- 作业管理器(JobManager)
- 资源管理器(ResourceManager)
- 任务管理器(TaskManager)
- 分发器(Dispatch)
JobManager
- 控制一个应用程序执行的主进程,也就是说,每个应用程序都会被一个不同的 JobManager 所控制执行;
- JobManager 会先接收到要执行的应用程序,这个应用程序,这个应用程序包括作业图(JobGraph)、逻辑数据流图(logical dataflow graph)和打包了所有类、库和其他资源的JAR包;
- JobManager 会把 JobGraph 转换成一个物理层面的数据流图,这个图叫做执行图(ExecutionGraph),包含了所有可以并发执行的任务;
- JobManager 会向 ResourceManager 请求执行任务必要的资源,也就是 TaskManager 上的 slot 。一旦它获取到了足够的资源,就会将执行图分发到真正运行它们的 TaskManager 上。而在运行过程中,JobManager 会负责所有需要中央协调的操作,比如所 checkpoint 的协调;
ResourceManager
- 主要负责管理 TaskManager 和 slot;
- Flink 为不同环境和资源管理工具提供了不同的 ResourceManager,比如Yarn、Mesos、K8s,以及 standalone部署;
- 当 JobManager 申请 slot 资源时,ResourceManager 会将有空闲 slot 的 TaskManager 分配给 JobManager。如果 ResourceManager 没有足够的 slot 来满足 JobManager 的请求,它还可以向资源提供平台发起会话,以提供启动 TaskManager 进程的容器;
TaskManager
- Flink 中的工作进程。通常在 Flink 中会有多个 TaskManager 运行,每一个 TaskManager 都包含一定数量的 slot 。slot 的数量限制了 TaskManager 能够执行的任务数量(并行度);
- 启动之后,TaskManager 会向 ResourceManager 注册它的 slot ;收到 ResourceManager 的指令后,TaskManager 就会将一个或者多个 slot 提供给 JobManager 调用。JobManager 就可以向 slot 分配任务来执行了;
- 在执行过程中,一个 TaskManager 可以跟其他运行同一应用程序的 TaskManager 交换数据;
Dispatcher
- 可以跨作业运行,它为应用提交提供了 REST 接口;
- 当一个应用被提交时,Dispatcher 就会启动并将应用移交给一个 JobManager;
- Dispatcher 也会启动一个 Web UI,用来方便地展示和监控作业执行的信息;
- Dispatcher 在架构中可能并不是必需的,这取决于应用提交的方式;
Flink 任务提交流程
- 当程序执行 execute() 方法时,Client 会将程序编译成一个 DAG(有向无环图),这个图被称为 JobGraph ,JobGraph 描述了程序的数据流和操作;
- Dispatcher 将 JobGraph 提交给 JobManager;
- JobManager 接收到 JobGraph 后会将其解析,并创建一个 ExecutionGraph,ExecutionGraph 描述了如何在集群中并行执行 JobGraph 中定义的数据流;
- JobManager 根据 ExecutionGraph 的需求向 ResourceManager 请求资源;
- 一旦资源被分配,JobManager 会将作业分解成一系列的 Task ,然后将这些 Task 分配给集群中 TaskManager ,每个 TaskManager 执行一个或多个 Task;
- TaskManager 接收到 Task 后会在本地执行它们;
- TaskManager 会定期保存状态快照,并向 JobManager 报告任务的进度和状态;
- 当所有 Task 都成功执行完毕,JobManager 会标记作业为完成,并且释放所有分配的资源;
以上是从一个较为高级的视角,来看应用中各组件的交互协作。如果部署的集群环境不同,其中一些步骤可以省略,或是有些组件会运行在同一个 JVM 进程中。
下面以具体部署到 Yarn 上为例:
- Flink 提交任务后,Client 向 HDFS 上传 Flink 的 Jar 包和配置;
- Client 向 ResourceManager 提交任务,ResourceManager 分配 Container 资源并通知对应的 NodeManager 启动 ApplicationMaster,ApplicationMaster 启动后加载 Flink 的 Jar 包和配置构建环境,然后启动 JobManager;
- ApplicationMaster 向 ResouceManager 申请资源启动 TaskManager;
- ResourceManager 分配 Container 资源后,由 ApplicationMaster 通知资源所在节点的 NodeManager 启动 TaskManager;
- TaskManager 加载 Flink 的 Jar包和配置构建环境并启动 TaskManager;
- TaskManager 启动后向 JobManager 发送心跳包,并等待 JobManager 向其分配任务;