零. 主要内容

一. Flink 提交
1. Flink怎么提交?
Local模式
JobManager 和 TaskManager 共用一个 JVM,只需要jdk支持,单节点运行,主要用来调试。
Standlone模式
Standlone 是Flink自带的一个分布式集群,它不依赖其他的资源调度框架、不依赖yarn 等。
充当Master角色的是JobManager。
充当Slave/Worker角色是TaskManager
Yarn 模式
| Yarn模式 |
生命周期 |
资源隔离 |
优点 |
缺点 |
main方法 |
| Session |
关闭会话,才会停止 |
共用JM和TM |
预先启动,启动作业不再启动。资源充分共享 |
资源隔离比较差,TM不容易扩展 |
在客户端执行 |
| Per-job |
Job停止,集群停止 |
单个Job独享JM和TM |
充分隔离,资源根据job按需申请 |
job启动慢,每个job需要启动一个JobManager |
在客户端执行 |
| Application |
当Application全部执行完,集群才会停止 |
Application使用一套JM和TM |
Client负载低,Application之间实现资源隔离,Application内实现资源共享 |
对per-job模式和session模式的优化部署模式(优点) |
在Cluster |
2. Flink集群规模? 在Flink项目做了什么?
Flink群集大小时要考虑的一些方面
1.记录数和每条记录的大小
每秒到达流式传输框架的预期记录数以及每条记录的大小。
不同的记录类型将具有不同的大小,这将最终影响Flink应用程序平稳运行所需的资源。
2.不同key的数量和每个键的状态大小
3.状态更新的数量和状态后端的访问模式
Java的堆状态后端上的各种访问模式可能会显着影响群集的大小以及Flink作业所需的资源
4.网络容量
网络容量不仅会受到Flink应用程序本身的影响,还会受到可能正在与之交互的外部服务(如Kafka或HDFS)的影响。 此类外部服务可能会导致网络出现额外流量。
例如,启用replication 可能会在网络的消息brokers之间创建额外的流量。
5.磁盘带宽
6.机器数量及其可用CPU和内存
美团的性能吞吐测试
流计算框架 Flink 与 Storm 的性能对比 - 美团技术团队
Flink项目做了什么?
实时监控:
- 用户行为预警,服务器攻击预警 .....
实时报表:
- 活动直播大屏: 双11、双12
- 对外数据产品时效性
- 数据化运营
流数据分析:
- 实时计算相关指标反馈及时调整决策
- 内容投放、无线智能推送、实时个性化推荐等
实时仓库:
- 数据实时清洗、归并、结构化
- 数仓的补充和优化
3. Flink提交作业的流程,以及与Yarn怎么交互?

(1)提交App之前,先上传Flink的Jar包和配置到HDFS,以便JobManager和TaskManager共享HDFS的数据。
(2)客户端向ResourceManager提交Job,ResouceManager接到请求后,先分配container资源,然后通知NodeManager启动ApplicationMaster。
(3)ApplicationMaster会加载HDFS的配置,启动对应的JobManager,然后JobManager会分析当前的作业图,将它转化成执行图(包含了所有可以并发执行的任务),从而知道当前需要的具体资源。
(4)接着,JobManager会向ResourceManager申请资源,ResouceManager接到请求后,继续分配container资源,然后通知ApplictaionMaster启动更多的TaskManager(先分配好container资源,再启动TaskManager)。 container在启动TaskManager时也会从HDFS加载数据。
(5)TaskManager启动后,会向JobManager发送心跳包。JobManager向TaskManager分配任务。
4. Flink提交Job的方式以及参数设置?
./bin/flink run -t yarn-session \
-Dyarn.application.id=application_XXXX_YY \
./examples/streaming/TopSpeedWindowing.jar
./bin/flink run -t yarn-per-job
--detached ./examples/streaming/TopSpeedWindowing.jar
./bin/flink run-application -t yarn-application
./examples/streaming/TopSpeedWindowing.jar
yn(实际) = Math.ceil(p/ys)
ys(总共) = yn(实际) * ys(指定)
ys(使用) = p(指定)
flink run
-c,--class Flink应用程序的入口
-C,--classpath 指定所有节点都可以访问到的url,可用于多个应用程序都需要的工具类加载
-d,--detached 是否使用分离模式,就是提交任务,cli是否退出,加了-d参数,cli会退出
-n,--allowNonRestoredState 允许跳过无法还原的savepoint。比如删除了代码中的部分operator
-p,--parallelism 执行并行度
-s,--fromSavepoint 从savepoint恢复任务
-sae,--shutdownOnAttachedExit 以attached模式提交,客户端退出的时候关闭集群
flink yarn-cluster 模式
-d,--detached 是否使用分离模式
-m,--jobmanager 指定提交的jobmanager
-yat,--yarnapplicationType 设置yarn应用的类型
-yD 使用给定属性的值
-yd,--yarndetached 使用yarn分离模式
-yh,--yarnhelp yarn session的帮助
-yid,--yarnapplicationId 挂到正在运行的yarnsession上
-yj,--yarnjar Flink jar文件的路径
-yjm,--yarnjobManagerMemory jobmanager的内存(单位M)
-ynl,--yarnnodeLabel 指定 YARN 应用程序 YARN 节点标签
-ynm,--yarnname 自定义yarn应用名称
-yq,--yarnquery 显示yarn的可用资源
-yqu,--yarnqueue 指定yarn队列
-ys,--yarnslots 指定每个taskmanager的slots数
-yt,--yarnship 在指定目录中传输文件
-ytm,--yarntaskManagerMemory 每个taskmanager的内存
-yz,--yarnzookeeperNamespace 用来创建ha的zk子路径的命名空间
-z,--zookeeperNamespace 用来创建ha的zk子路径的命名空间
5. Flink的JobManger? 有多少个JobManager?
JobManger
(1) 控制一个应用程序执行的主进程,也就是说,每个应用程序 都会被一个不同的JM所控制执行。
(2) JM会先接收到要执行的应用程序,这个应用程序会包括:
作业图(Job Graph)、逻辑数据流图( ogical dataflow graph)和打包了所有的类、库和其它资源的JAR包。
(3) JM会把 Jobgraph转换成一个物理层面的 数据流图,这个图被叫做 “执行图”(Executiongraph),包含了所有可以并发执行的任务。
Job Manager会向资源管理器(Resourcemanager)请求执行任务必要的资源,也就是 任务管理器(Taskmanager)上的插槽slot。
一旦它获取到了足够的资源,就会将执行图分发到真正运行它们的TM上。而在运行过程中JM会负责所有需要中央协调的操作,比如说检查点(checkpoints)的协调。
有多少个JobManager
集群默认只有一个 JobManager。但为了防止单点故障,我们配置了高可用。我们公司一般配置一个主 Job Manager,两个备用 JobManager,然后结合 ZooKeeper 的使用,来达到高可用。
6. JobManger 在集群启动过程中起到什么作用?
JobManager 的职责主要是接收 Flink 作业,调度 Task,收集作业状态和管理 TaskManager。
它包含一个 Actor,并且做如下操作:
RegisterTaskManager: 它由想要注册到 JobManager 的 TaskManager 发送。注册成功会通过 AcknowledgeRegistration 消息进行 Ack。
SubmitJob: 由提交作业到系统的 Client 发送。提交的信息是 JobGraph 形式的作业描述信息。
CancelJob: 请求取消指定 id 的作业。成功会返回 CancellationSuccess ,否则返回CancellationFailure。
UpdateTaskExecutionState: 由 TaskManager 发送,用来更新执行节点(ExecutionVertex)
的状态。成功则返回 true,否则返回 false。
RequestNextInputSplit: TaskManager 上的 Task 请求下一个输入 split ,成功则返回NextInputSplit,否则返回 null。
JobStatusChanged: 它意味着作业的状态(RUNNING, CANCELING, FINISHED,等)发生变化。这个消息由 ExecutionGraph 发送。
7. Flink的TaskManager?

(1) Flink中的工作进程。通常在 Flink中会有多个TM运行, 每个TM都包含了一定数量的插槽slots。插槽的数量限制了TM能够执行的任务数量。
(2) 启动之后,TM会向资源管理器注册它的插槽;收到资源管理器的指令后, TM就会将一个或者多个插槽提供给JM调用。TM就可以向插槽分配任务tasks来执行了。
(3) 在执行过程中, 一个TM可以跟其它运行同一应用程序的TM交换数据。
TaskManager 相当于整个集群的Slave节点,负责具体的任务执行和对应任务在每个
节点上的资源申请和管理。客户端通过将编写好的 Flink 应用编译打包,提交到
JobManager,然后 JobManager 会根据已注册在 JobManager 中 TaskManager 的资源情况,将任务分配给有资源的 TaskManager 节点,然后启动并运行任务。 TaskManager 从JobManager 接收需要部署的任务,然后使用 Slot 资源启动 Task,建立数据接入的网络连接,接收数据并开始数据处理。同时 TaskManager 之间的数据交互都是通过数据流的方式进行的。可以看出,Flink的任务运行其实是采用多线程的方式,这和 MapReduce 多 JVM 进行的方式有很大的区别,Flink 能够极大提高 CPU 使用效率,在多个任务和 Task 之间通过TaskSlot 方式共享系统资源,每个 TaskManager 中通过管理多个 TaskSlot 资源池进
行对资源进行有效管理。
8. 说一下slot,业务中一个TaskManager设置几个slot?
jobManager:负责接收Flink Client提交的Job,并将Job分发到TaskManager执行,一个JobManager包含一个或多个TaskManager。
TaskManager:负责执行Client提交的Job。每个TaskManager可以有一个或多个slot,但slot的个数不能多于cpu-cores。
slot:slot是Flink任务的最小执行单位,并行度上限不能大于slot的数量。
9. Flink 的并行度?
Flink 中的任务被分为多个并行任务来执行,其中每个并行的实例处理一部分数据。这些并行实例的数量被称为并行度。设置并行度一般在四个层面设置(优先级由高到低)
操作算子层面
执行环境层面
客户端层面
系统层面
10. Flink 计算资源的调度是如何实现的?
TaskManager 中最细粒度的资源是Taskslot,代表了一个固定大小的资源子集,每个TaskManager 会将其所占有的资源平分给它的 s

本文围绕Flink展开,介绍了其提交方式、集群规模考量等内容。阐述状态编程、反压处理、与Spark对比等要点。还涉及Checkpoint机制、窗口与Watermark、Join操作等知识,最后提及Flink内存管理、序列化机制等,以及数据倾斜的解决办法。
最低0.47元/天 解锁文章
458

被折叠的 条评论
为什么被折叠?



