关于flink:Flink开篇总述

4次阅读

共计 1920 个字符,预计需要花费 5 分钟才能阅读完成。

1、Flink 分布式运行架构

执行原理:

  1. Client 提交作业,相当于 Spark 的 Driver
  2. ActorSystem 相当于 Hadoop RPC,是用来进行节点之间通信的
  3. Client 的程序 DataFlow 相当于是 StreamGraph,而后通过优化成 JobGraph
  4. 由 ActorSystem 把 JobGraph 提交到 JobManager 节点
  5. JobManager 对 JobGraph 引入并行度造成 ExecutionGraph
  6. 而后由 TaskScheduler 进行 task 之间的任务调度,将 task 调配到 TaskSlot 外面运行,底层也是基于 ActorSystem 进行交互
  7. TaskManager 会返回 task 运行的状态信息给 JobManager,JobManager 会将 task 运行的状态信息返回给客户端
  8. 在⻚面上能够看到工作的执行状况,是由 TaskManager 返回给 JobManager,而后 JobManager 返回给客户端的

2、数据传输的策略

随机分区 (shuffle)

  • 最简略的重分区形式就是间接“洗牌”。通过调用 DataStream 的.shuffle() 办法,将数据随机地调配到上游算子的并行任务中去

    轮询分区 (REBALANCE)

  • 通过调用 DataStream 的.rebalance() 办法,就能够实现轮询重分区。rebalance 应用的是 Round-Robin 负载平衡算法,能够将输出流数据平均分配到上游的并行任务中去

    重缩放分区 (rescale)

  • 重缩放分区其实和轮询分区十分类似。不同点是轮询分区是针对所有分区进行轮询,重缩放分区只对指定分区外部进行轮询。如下图所示,source 并行度为 2,上游 flatMap 并行度为 4:

    其实就是分成了小组,在组内进行 REBALANCE。通过调用 DataStream 的.rebalance()

    播送 (broadcast)

  • 简略说就是一份数据散发到上游所有的 Task 中。能够通过调用 DataStream 的 broadcast() 办法,将输出数据复制并发送到上游算子的所有并行任务中去

    全局分区 (global)

  • 全局分区也是一种非凡的分区形式。这种做法十分极其,通过调用.global() 办法,会将所有的输出流数据都发送到上游算子的第一个并行子工作中去。这就相当于强行让上游工作并行度变成了 1

    自定义分区 (Custom)

  • 当 Flink 提供的所有分区策略都不能满足用户的需要时,咱们能够通过应用 partitionCustom() 办法来自定义分区策略。
    在调用时,办法须要传入两个参数,
    第一个是自定义分区器(Partitioner)对象,
    第二个是利用分区器的字段,
    它的指定形式与 keyBy 指定 key 根本一样:能够通过字段名称指定,也能够通过字段地位索引来指定,还能够实现一个 KeySelector

    * HASH

  • 对数据流进行 keyBy/window、keyBy/reduce 操作

3、Task 并行度和 Slot 的关系

如果 task 的工作数量也就是并行度大于 slot 那么程序会无奈运行

  1. 一个 TaksManager 外面默认只有一个 slot
  2. 在 task 运行的过程中会进行算子合并,会产生 operatorChain 的状况,比如说 KeyBy->Map

Operator Chain 的条件 :

  1. 数据传输策略是 forward strategy
  2. 在同一个 TaskManager 中运行
  3. TaskManager 会尽量保障 task 在同一个 JVM 外面运行,有利于晋升效率

如下图,设置 Source 并行度为 3,faltMap 并行度为 2,keyBy->sum->map 并行度为 2,Sink 并行度为 1,一共 8 个 Task

如果全局并行度设置为 1 呢?

  • source -> flatmap 属于 operator Chain 的状况,会将 souce->flatMap 进行合并为一个 task
  • keyby sum -> map -> sink 也是属于 oprator chain 的状况,会将 keyby sum -> map -> sink 进行合并为一个 task
  • 上游 task -> 上游 task 因为两头有 keyby 所以数据传输的策略是 keybased strategy,也就是 HASH
    所以上述 2 个 Task

4、Flink 四层图构造

  • Flink 程序从提交到运行,须要经验如下 4 个阶段 :

    1. Stream Graph
    2. Job Graph
    3. Execution Graph
    4. Physical Execution Graph
  • Stream Graph 和 Job Graph 是在客户端阶段实现的,而后 client 通过 ActorSystem 把 JobGraph 提交到 JobManager
  • Execution Graph 阶段会引入并行度
  • Physical Execution Graph 进一步确定了数据寄存的地位和收发的具体形式
正文完
 0