Flink面试准备

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

零. 主要内容

一. 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项目做了什么?

实时监控:

  1. 用户行为预警,服务器攻击预警  .....

实时报表:

  1. 活动直播大屏: 双11、双12
  1. 对外数据产品时效性
  1. 数据化运营

流数据分析:

  1. 实时计算相关指标反馈及时调整决策
  1. 内容投放、无线智能推送、实时个性化推荐等

实时仓库:

  1. 数据实时清洗、归并、结构化
  1. 数仓的补充和优化

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值