耶耶耶耶耶 发表于 2024-7-26 08:38:41

Flink 运行时架构

Flink 运行时的组件

https://img-blog.csdnimg.cn/direct/0f9ad4b52add489c89b065167253ce89.png


[*]作业管理器(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 任务提交流程

https://img-blog.csdnimg.cn/direct/d4fb89dce4484d169741560284e9eb2f.png

[*]当程序执行 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 上为例:
https://img-blog.csdnimg.cn/direct/8e370a1553e74516b6957b701569f8b9.png

[*]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 向其分配任务;

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Flink 运行时架构