往期推荐:

Flink深入浅出:内存模型

Flink深入浅出:JDBC Source从理论到实战

Flink深入浅出:Sql Gateway源码分析

Flink深入浅出:JDBC Connector源码分析

什么是Flink 之 架构篇

什么是Flink 之 应用篇

Flink在1.11版本新增了一种部署模式,目前支持三种:Session 模式、Per job 模式、Application 模式,这三种模式主要在集群管理、资源隔离、用户main方法执行位置几个方面有所不同。

本篇会按照下面几个步骤进行介绍:

1 什么是Session模式

2 什么是Per Job模式

3 从任务解析过程到Application的设计初衷

4 什么是Application模式

5 启动过程源码分析

6 总结与参考资料

Session 模式

Flink支持事先创建好一个集群,然后往这个集群上提交任务。所有的任务都在客户端进行编译,编译成JobGraph后,附加上依赖的库,提交到Flink的集群。集群接收到任务后,会再创建对应的JobMaster进行ExecutionGraph的解析,然后申请资源并执行。如果Flink集群申请的TM内部有很多Slot,那么会按照Slot的粒度进行任务分配,这样就可能在一个TM上运行多个任务。

这样设计的好处是,多个任务可以共用一套集群,方便管理监控。但是带来的缺点也很明显,当某一个任务崩溃高挂了对应的TM,上面其他的任务都会受到影响。其他的任务受影响崩溃不说,如果大面积的任务恢复,也可能导致JM的性能压力。

因此Session模式适用于量多、执行任务时间短、对资源不敏感的场景,比如作为在线(即席)查询引擎。

关于Session模式的部署和使用,也可以参考之前的文章:

Flink Yarn Session模式安装部署指南

Flink Sql-Gateway在Yarn Session模式下的工作原理

Per job 模式

为了进行更好的资源隔离,Flink支持为每个任务单独创建一个集群,该模式目前支持Yarn、K8s等。当任务执行完毕,集群会自动关闭并回收资源。这样就保证了更好的资源隔离,单独的任务失败也不会影响其他的任务。另外,这种模式分摊了JM的压力到每个任务,因此这种模式更适合生产环境部署。

观察下图可以发现,per job模式和session模式,只有提交任务和启动graph不一样,其他后面的流程都是一样的。

因此Per Job模式适用于执行任务长、对资源敏感或者消耗资源大的任务。

从任务解析过程到Application的设计初衷

在Flink 1.11之前仅有上面两种模式,那么新实现的Application模式又是什么呢?在了解Application的由来时,最好先来了解下Flink程序的执行过程。

以DataStream API的程序为例,我们编写的.map().print()属于程序代码,对应上图的program code:

1 当执行env.execute()时,会触发程序代码编译成StreamGraph,StreamGraph主要的作用就是把.map、.partition等翻译成数据流图中的节点和边。

2 接下来任务提交前,会把StreamGraph编译成JobGraph,JobGraph更像是可以执行的图结构,并会对其中的一些节点进行合并优化,也叫做chain。比如输入数据后进行map操作,就可以在一个节点中同时完成读取和map操作。

3 生成JobGraph后,再把需要的依赖资源,如第三方Jar等一起提交到集群

4 提交到集群后,session和job模式有所不同。session模式已经存在一个集群,此时的提交是直接发送到集群的dispatcher,内部创建对应的JobMaster,编译成ExecutionGraph。如果是per job模式则需要新建一个集群,等服务启动后,把附加过来的jobGraph直接用内部的dispatcher启动。他们的俩的区别简单来说,就是一个是事先创建好的集群,一个是临时启动的集群。

5 说回到ExecutionGraph,它就是常说的执行图,执行图代表了真正物理执行的拓扑图,比如并行的节点有多少;每个节点读取什么数据,从哪里读取;每个节点输出什么数据,输出到哪里;然后JobMaster通过调度器进行任务分配

6 申请好的TM内部会有很多Slot,每个Slot接收发来的Task进行执行,直到任务结束。

7 任务结束后,Session模式会释放任务申请的资源,并通知内部的ResourceManager组件,方便后续来任务继续执行;Per Job模式会直接释放集群。

可以发现,无论是Session还是Per Job,程序代码都是在客户端编译完成。这里的客户端就是我们执行flink run启动的程序(其实是CliFrontend)。假如现在需要做一个平台给多个用户提交任务,或者任务的量级很大,那么客户端的压力会非常大。因为编译生成StreamGraph和JobGraph需要消耗大量的CPU,下载依赖的Jar包资源、上传JobGraph也需要大量的网络带宽,客户端很容易成为瓶颈。此时,就考虑可不可以把编译图的工作放在集群中完成?就类似于Spark的cluster模式,这就是Appllication模式。

Application 模式

Application的设计跟per job非常像,只不过客户端不在编译图,而是直接把执行的Jar和参数信息发送到yarn的AppMaster,在该进程中,同时完成JM的启动、编译图(用户main方法执行)、任务执行等过程。

这样还带来了其他的好处,比如一些公共的lib可以直接存储在Hdfs,避免多次上传下载浪费流量。

以Yarn部署为例,想要启动application模式,可以使用下面的命令:

# 基于application模式启动本地jar./bin/flink run-application -t yarn-application \
./examples/batch/WordCount.jar

# 附加集群参数配置
./bin/flink run-application -t yarn-application \
-Djobmanager.memory.process.size=2048m \
-Dtaskmanager.memory.process.size=4096m \
./examples/batch/WordCount.jar

# 基于application模式启动远程jar
./bin/flink run-application -t yarn-application \
-Dyarn.provided.lib.dirs="hdfs://myhdfs/my-remote-flink-dist-dir" \
hdfs://myhdfs/jars/my-application.jar

启动过程源码分析

观察flink脚本,可以看到 exec … org.apache.flink.client.cli.CliFrontend “$@“ 的命令,这就是客户端代码入口。

在run中是正常session和job的启动流程,在runApplication中为application模式启动流程。

在run中通过反射直接运行用户代码的main函数,在用户代码的execute()方法中编译图并提交到yarn。如果是session则直接发送给dispatcher,如果是per job则重新创建集群。

在Application中直接创建远程集群,并附加Application相关参数:

目前提交到集群启动的Master进程大致可以分为下面几种,后续会详细探索下各个Entrypoint中的细节。

总结

在Session模式中,集群的生命周期与任务无关,可以在集群中同时提交多个任务,他们共享集群资源。Per job模式中,每个任务单独维护集群,可以做到更好的资源隔离,集群的生命周期与任务相同。在Application模式中,为每个应用创建一个集群,main方法会运行在集群中,避免客户端过大的压力。

参考

Flink 1.11 官方文档——集群与部署:

https://ci.apache.org/projects/flink/flink-docs-release-1.11/ops/deployment/

Flink 1.11 官方文档——Yarn集群与部署:

https://ci.apache.org/projects/flink/flink-docs-release-1.11/ops/deployment/yarn_setup.html#user-jars--classpath

Flink 1.11 官方文档——CLI客户端命令:

https://ci.apache.org/projects/flink/flink-docs-release-1.11/ops/cli.html

FLIP-85 Application Mode:

https://cwiki.apache.org/confluence/display/FLINK/FLIP-85+Flink+Application+Mode

关于Application模式的邮件讨论:

http://apache-flink-mailing-list-archive.1008284.n3.nabble.com/DISCUSS-FLIP-85-Delayed-Job-Graph-Generation-td35759.html

[简书]Flink 1.11 中的Application模式:

https://www.jianshu.com/p/85f2b32186cb

Flink深入浅出: 应用部署与原理图解(v1.11)的更多相关文章

  1. Flink深入浅出: 资源管理(v1.11)

    -- 图片来自 <国家地理中文网>-- 往期推荐: Flink深入浅出:部署模式 Flink深入浅出:内存模型 Flink深入浅出:JDBC Source从理论到实战 Flink深入浅出: ...

  2. Atitit 图像处理 深刻理解梯度原理计算.v1 qc8

    Atitit 图像处理 深刻理解梯度原理计算.v1 qc8 1.1. 图像处理  梯度计算  基本梯度 内部梯度 外部梯度 方向梯度1 2. 图像梯度就是图像边缘吗?2 1.1. 图像处理  梯度计算 ...

  3. 《Java虚拟机原理图解》 1.2、class文件里的常量池

    [最新更新:2014/11/11]  了解JVM虚拟机原理 是每个Java程序猿修炼的必经之路. 可是因为JVM虚拟机中有非常多的东西讲述的比較宽泛.在当前接触到的关于JVM虚拟机原理的教程或者博客中 ...

  4. memcache分布式部署的原理分析

    下面本文章来给各位同学介绍memcache分布式部署的原理分析,希望此文章对你理解memcache分布式部署会有所帮助哦.   今天在封装memcache操作类库过程中,意识到一直以来对memcach ...

  5. tomcat源码解读(1)–tomcat热部署实现原理

    tomcat的热部署实现原理:tomcat启动的时候会有启动一个线程每隔一段时间会去判断应用中加载的类是否发生变法(类总数的变化,类的修改),如果发生了变化就会把应用的启动的线程停止掉,清除引用,并且 ...

  6. Java基础知识强化之网络编程笔记02:Socket通信原理图解

    1. Socket (1)Socket套接字  网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字 (2)Socket原理机制:  • 通信两端都有Socket.  • 网 ...

  7. 《Java虚拟机原理图解》1.4 class文件里的字段表集合--field字段在class文件里是如何组织的

    0.前言 了解JVM虚拟机原理是每个Java程序猿修炼的必经之路.可是因为JVM虚拟机中有非常多的东西讲述的比較宽泛.在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描写 ...

  8. 《Java虚拟机原理图解》 1.2.2、Class文件里的常量池具体解释(上)

    [last updated:2014/11/27] NO1.常量池在class文件的什么位置? 我的上一篇文章<Java虚拟机原理图解> 1.class文件基本组织结构中已经提到了clas ...

  9. 《Java虚拟机原理图解》1.3、class文件里的訪问标志、类索引、父类索引、接口索引集合

    讲完了class文件里的常量池,我们就相当于克服了class文件里最麻烦的模块了.如今,我们来看一下class文件里紧接着常量池后面的几个东西:訪问标志.类索引.父类索引.接口索引集合. 1. 訪问标 ...

随机推荐

  1. Netty学习笔记-入门版

    目录 Netty学习笔记 前言 什么是Netty IO基础 概念说明 IO简单介绍 用户空间与内核空间 进程(Process) 线程(thread) 程序和进程 进程切换 进程阻塞 文件描述符 文件句 ...

  2. 非IT行业大企程序员讲述MIS系统开发案例

      雪莉叹了一口气,调整了一下被汗水濡湿的刘海,然后向后靠在办公椅中,伸手在电脑键盘上输入了一些内容, 最后拿起印刷着房地产广告的扇子,边扇风边等待着.   她的工位在办公室的东侧角落,侧靠着窗.此时 ...

  3. 实战解读丨Linux下实现高并发socket最大连接数的配置方法

    摘要:Linux操作系统,无论是编写客户端程序还是服务端程序,在高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制. [诉求场景] Linux操作系统,无论是编写 ...

  4. 20190930-01 Redis的事务 000 031

  5. Fabric1.4 kafka共识的多orderer集群

    https://www.cnblogs.com/zhangmingcheng/p/10556469.html#FeedBack https://yq.aliyun.com/articles/63746 ...

  6. 8成以上的java线程状态图都画错了,看看这个-图解java并发第二篇

    本文作为图解java并发编程的第二篇,前一篇访问地址如下所示: 图解进程线程.互斥锁与信号量-看完还不懂你来打我 图形说明 在开始想写这篇文章之前,我去网上搜索了很多关于线程状态转换的图,我惊讶的发现 ...

  7. 10.QT-QAudioOutput类使用

    本章需要用到的类如下: QAudioDeviceInfo类提供音频输出设备 QAudioFormat类提供音频参数设置 QAudioOutput类提供了用于将PCM原始音频数据发送到音频输出设备的接口 ...

  8. React 和 VUE 的区别和优缺点

    前言 React 是由Facebook创建的JavaScript UI框架,React推广了 Virtual DOM( 虚拟 DOM )并创造了 JSX 语法.JSX 语法的出现允许我们在 javas ...

  9. WIN10自动修复失败无限循环

    网上解决方案大部分都是要重置电脑或者进pe修复系统,手头没有启动盘又不想重置电脑的可以照下边的操作试一试 1.先暂时禁用自动修复功能cmd管理员(winre可以进cmd)执行bcdedit bcded ...

  10. centos7新增用户并授权root权限、非root用户启动tomcat程序

    一.centos7新增用户并授权root权限 cat /etc/redhat-release查看centos版本号 1.禁用root账户登录 vim /etc/ssh/sshd_config 找到这一 ...