flink-架构

角色

JM,

接收提交的资料:class文件、依赖的jar、jobGraph、datafolwGraph
运行driver,类似于spark的driver,任务调度主从中的主
划分任务,把jobGraph转成executionGraph
分发任务,向RM申请slot,然后把subtask提交到TM的slot运行

管理checkpoint

jobGraph

代码的图形化表示,没有并行操作的信息
在这里插入图片描述

TM

启动后,TM会将slot注册到JM,然后JM根据slot分布情况将subtask分发到TM执行。
同JM进行心跳检测,检测集群的健康状况

RM

不是yarn的RM,只不过名字相同,2个RM可以交互
管理slot

dispather

提供rest接口、webUI
不是必须的

资源分配

standlone

前提是flink集群已经启动
RM、TM启动时,就已经将slot注册好,所以UI的jar还没提交时就可以显示slot数。
在这里插入图片描述

yarn

前提是yarn已经启动,RM和NM已经启动
worker节点也要装spark、flink,因为要启动executor和TM。
executor和TM也是运行在container中的
在这里插入图片描述

任务调度

在这里插入图片描述

如何实现并行计算

默认并行度、如何设置并行度

如果是本地运行,按cpu总线程数,如果是集群,则按如下的优先级
优先级:代码中算子 > 代码中env全局 > 提交命令中的-p 参数 > 集群flink-conf.yaml配置文件

并行度意味着同时运行,最终要在slot中运行,而slot取决于节点、TM

在这里插入图片描述

如下图。一个flink集群,flink-conf.yaml中设置slot数为3。意味着一个TM有3个slot。

在这里插入图片描述
在Example1中,使用了flink-conf.yaml中的设置,所以并行度为1。一个Task只有一个subTask
在Example2中,并行度为2,
在这里插入图片描述
在Example3中,
在Example4中,

并行的task如何获取slot

通过slot控制并行度

如何计算有多少task和subtask

slot和Task的关系

  1. TM中包含slot,task划分为st运行在同组名的多个slot中。
  2. 相同task的st,必然分配在不同的slot中,不然没法并行
  3. 不同task的st,可以运行在同一个slot中:
    1. 避免相互依赖的任务因为运行速度不同而产生背压问题,快等慢
    2. 如果某个算子需要资源多,可以通过diableChaining讲当前算子单独划分为一个task
  4. 一个slot可以拥有一个完整的任务链,可以通过配置来设置,默认是随机,有可能拼不成一个完整的
  5. app运行需要的slot不能小于算子中最大的并行度。鉴于算子task可以合并,所以并不是所有算子的并行度之和。

dataflow Graph 数据流的生成逻辑,task的合并和拆分

类似于flume,所有的Flink程序都是由三部分组成的: Source 、Transformation 和 Sink。
Source 负责读取数据源,Transformation 利用各种算子进行处理加工,Sink 负责输出
在运行时,Flink上运行的程序会被映射成“逻辑数据流”(dataflows),它包含了这三部分
每一个dataflow以一个或多个sources开始以一个或多个sinks结束。dataflow类似于任意的有向无环图(DAG)
在大部分情况下,程序中的转换运算(transformations)跟dataflow中的算子(operator)是一一对应的关系

Graph

Flink 中的执行图可以分成四层:StreamGraph -> JobGraph -> ExecutionGraph-> 物理执行图
6. StreamGraph:是根据用户通过 Stream API 编写的代码生成的最初的图。用来表示程序的拓扑结构。
7. JobGraph:StreamGraph经过优化后生成了 JobGraph,提交给 JobManager 的数据结构。主要的优化为,将多个符合条件的节点 chain 在一起作为一个节点
8. ExecutionGraph:JobManager 根据 JobGraph 生成ExecutionGraph。然后把ExecutionGraph分发给TM
ExecutionGraph是JobGraph的并行化版本,是调度层最核心的数据结构。
9. 物理执行图:JobManager 根据 ExecutionGraph 对 Job 进行调度后,在各个TaskManager 上部署 Task 后形成的“图”,并不是一个具体的数据结构。

在这里插入图片描述

DS之间的转换类型

一个程序中,不同的算子可能具有不同的并行度
算子之间传输数据的形式可以是 one-to-one (forwarding) 的模式也可以是redistributing 的模式,具体是哪一种形式,取决于算子的种类

  • One-to-one:stream维护着分区以及元素的顺序(比如source和map之间)。这意味着map 算子的子任务看到的元素的个数以及顺序跟 source 算子的子任务生产的元素的个数、顺序相同。map、fliter、flatMap等算子都是one-to-one的对应关系。
  • Redistributing:stream的分区会发生改变。每一个算子的子任务依据所选择的transformation发送数据到不同的目标任务。例如,keyBy 基于 hashCode 重分区、而 broadcast 和 rebalance 会随机重新分区,这些算子都会引起redistribute过程,而 redistribute 过程就类似于 Spark 中的 shuffle 过程
    以下都会触发Redistributing:
    特殊算子
    前后算子并行度不同

优化

  1. 任务链(Operator Chains)
    将operators链接成task是非常有效的优化:它能减少线程之间的切换,减少消息的序列化/反序列化,减少数据在缓冲区的交换,减少了延迟的同时提高整体的吞吐量。
    为了满足任务链的要求,必须将两个或多个算子设为相同的并行度,并通过本地转发(local forward)的方式进行连接
    • 相同并行度的 one-to-one 操作,Flink 这样相连的算子链接在一起形成一个 task,原来的算子成为里面的 subtask
    • 并行度相同、并且是 one-to-one 操作,两个条件缺一不可。否则会发生redistributing,就无法合并了
      1. diableChaining 某个计算很复杂,可以独立成一个task,独享slot
      2. startNewChain:某个合并链很长,算子很多,可以分割为多个
      3. slotSharingGroup:同组内可以共享slot。不同组的task一定放在不同的slot。比如3个算子,前后2个都是a组,中间是b组,则前后2个可以共享,中间算子独享
    • disableOperatorChaining 禁用任务链,不再进行合并
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值