博客 大数据Flink进阶(十五):Flink On Yarn任务提交

大数据Flink进阶(十五):Flink On Yarn任务提交

   数栈君   发表于 2023-06-06 11:09  258  0

Flink的整个提交流程会涉及到组件有:客户端、JobManager、ResourceManager、Dispatcher、JobMaster、TaskManager这几个相关的组件。对于这几个组件的作用可以查看下篇Flink运行架构介绍,本篇将主要讲解Flink在k8s、yarn的两种模式提交流程。

Flink on yarn 模式

      Flink的任务部署模式有local-cluster模式、Standalone模式、Yarn模式、K8s模式等。

    对于yarn模式有三种部署模式,Session-cluster、Per-job-cluster、Application模式,其中Application模式与Per-Job-Cluster的区别: 就是Application Mode下, 用户的main函数是在集群中执行的。本文将主要介绍yarn 的per-job-cluster:


  1. Flink任务提交后,Client向HDFS上传Flink的Jar包和配置

  2. 向Yarn ResourceManager提交任务,ResourceManager分配Container资源

  3. 通知对应的NodeManager启动ApplicationMaster,ApplicationMaster启动后加载Flink的Jar包和配置构建环境,然后启动JobManager

  4. ApplicationMaster向ResourceManager申请资源启动TaskManager

  5. ResourceManager分配Container资源后,由ApplicationMaster通知资源所在节点的NodeManager启动TaskManager

  6. NodeManager加载Flink的Jar包和配置构建环境并启动TaskManager

  7. TaskManager启动后向JobManager发送心跳包,并等待JobManager向其分配任务。


Flink  on  Kubernetes

    k8s部署Flink任务有四种方式:

  • Flink session 模式

  • Flink per-job 模式

  • Flink native session 模式

  • Flink native per-job 模式

    四种模式中不同的是两种是否使用了native模式。现在部署任务一般都是使用native模式、所最大的区别是native模式是按照作业集群所需要的资源进行申请而不是一开始就申请好的资源。对于四种模式的区别可以看下图:

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/73ec89579a9a8c15d1e7ee7ed351fc26..jpg

    对于k8s的Flink的任务的部署模式,将主要介绍native的Flink任务的提交流程:

Native Session Cluster 模式

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/8bd530ac56b6ca769a24c249bfa1d7cc..jpg

  1. Flink提供了 Kubernetes 模式的入口脚本 kubernetes-session.sh,当用户执行了该脚本之后,Flink 客户端会生成 Kubernets 资源描述文件,包括 FlinkMaster Service,FlinkMasterDeloyment,Configmap,Service并设置了owner reference,在 Flink 1.10 版本中,是将 FlinkMaster Service 作为其他资源的 Owner,也就意味着在删除 Flink 集群的时候,只需要删除 FlinkMaster service,其他资源则会被以及联的方式自动删除;

  2. Kubernetes 收到来自 Flink 的资源描述请求后,开始创建FlinkMaster Service,FlinkMaster Deloyment,以及 Configmap 资源,从图中可以看到,伴随着 FlinkMaster 的创建,Dispatch 和 K8sResMngr 组件也同时被创建了,这里的 K8sResMngr 就是 Native 方式的核心组件,正是这个组件去和 Kubernetes API server 进行通信,申请 TaskManager 资源;当前,用户已经可以向 Flink 集群提交任务请求了;

  3. 用户通过 Flink client 向 Flink 集群提交任务,flink client 会生成 Job graph,然后和 jar 包一起上传;当任务提交成功后,JobSubmitHandler 收到了请求并提交给 Dispatcher并生成 JobMaster,JobMaster 用于向 KubernetesResourceManager 申请 task 资源;

  4. Kubernetes-Resource-Manager 会为 taskmanager 生成一个新的配置文件,包含了 service 的地址,这样当 Flink Master 异常重建后,能保证 taskmanager 通过 Service 仍然能连接到新的 Flink Master;

  5. TaskManager 创建成功后注册到 slotManager,这时 slotManager向TaskManager 申请 slots,TaskManager 提供自己的空闲 slots,任务被部署并运行。


特点分析

    对于不是native两种部署模式,在 Kubernetes 上运行 Flink 任务是需要事先指定好 TaskManager 的数量,但是大部分情况下,用户在任务启动前是无法准确地预知该任务所需的 TaskManager 数量和规格。

    指定的多了会资源浪费,指定的少了会导致任务的执行失败。最根本的原因,就是没有 Native 的使用 Kubernetes 资源,这里的 Native,可以理解为 Flink 直接与 Kuberneter 通信来申请资源。

    这种类型的集群,也是在提交任务之前就创建好了,不过只包含了 FlinkMaster 及其 Entrypoint(Service),当任务提交的时候,Flink client 会根据任务计算出并行度,进而确定出所需 TaskManager 的数量,然后 Flink 内核会直接向 Kubernetes API server 申请 taskmanager,达到资源动态创建的目的。

优点:相对于前两种集群而言,taskManager 的资源是实时的、按需进行的创建,对资源的利用率更高,所需资源更精准。

缺点:taskManager 是实时创建的,用户的作业真正运行前,与 Per Job集群一样,仍需要先等待 taskManager 的创建,因此对任务启动时间比较敏感的用户,需要进行一定的权衡。

Native Per Job 模式

    在当前的 Apache Flink 1.10 版本里,Flink native per-job 特性尚未发布,预计在后续的 Flink 1.11 版本中提供,我们可以提前一览 native per job 的特性。

原理分析

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/1d913fb8aae3daddb2842ccaba04f37a..jpg

当任务被提交后,同样由 Flink 来向 Kubernetes 申请资源,其过程与之前提到的 native session 模式相似,不同之处在于:

  1. Flink Master是随着任务的提交而动态创建的;

  2. 用户可以将Flink、作业Jar包和classpath依赖打包到自己的镜像里;

  3. 作业运行图由FlinkMaster生成,所以无需通过RestClient上传Jar包(图2步骤3)。


特点分析

    native per-job cluster 也是任务提交的时候才创建 Flink 集群,不同的是,无需用户指定 TaskManager 资源的数量,因为同样借助了 Native 的特性,Flink 直接与 Kubernetes 进行通信并按需申请资源。

优点:资源按需申请,适合一次性任务,任务执行后立即释放资源,保证了资源的利用率。

缺点:资源是在任务提交后开始创建,同样意味着对于提交任务后对延时比较敏感的场景,需要一定的权衡;。

  • 免责申明:

    本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!

  • 《数据治理行业实践白皮书》下载地址:https://fs80.cn/4w2atu


  • 《数栈V6.0产品白皮书》下载地址:https://fs80.cn/cw0iw1

  • 想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:https://www.dtstack.com/?src=bbs

    同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:
    https://github.com/DTStack

0条评论
社区公告
  • 大数据领域最专业的产品&技术交流社区,专注于探讨与分享大数据领域有趣又火热的信息,专业又专注的数据人园地

最新活动更多
微信扫码获取数字化转型资料
钉钉扫码加入技术交流群