Flink流批一体的Shuffle Service层 | 青训营笔记

531 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第1天

1. 什么是Shuffle

  • 在分布式计算中,用来连接上下游交互的一个过程叫做shuffle。
  • A1到B1,B1到C1,...,每个过程都是一个Shuffle,只要涉及到上下游的数据交换都是Shuffle

image.png

2. Shuffle的两种实现

  • 基于文件的Pull Based Shuffle

    • 比如Spark或MapReduce,适合批处理,因为是基于文件的,所以容错性会比较好。
    • 基于文件,就是说,如果上游要把数据传递到下游,在传递过程中,会把数据存到文件里面。类似于Blocking模式
  • 基于Pipeline的Push Based Shuffle

    • 比如Flink,它的特点是低延迟高性能,因为Shuffle的数据没有落盘,直接存在内存里面,推到下游的
    • Batch任务也可以用Pipline的模式,这样性能很快,就相当于把批作业当成流调度,需要全部资源去运行,同时需要的资源也会多一些

3. 流和批Shuffle之间的差异

  • Shuffle数据的生命周期

    • 流作业的Shuffle数据和Task是绑定的,就是说,如果Task销毁了,Shuffle也就没了。
    • 批作业的Shuffle数据和Task是解耦的,就是说,如果上游的Task跑完了,数据写到了文件里,这段时间如果上游的Task挂掉了,资源可以释放掉,而Task产生的Shuffle的生命周期还在,这就是解耦。
  • Shuffle数据存储介质

    • 流作业对性能要求高,所以流作业的Shuffle数据通常存在内存里面
    • 批作业通常来说数据量比较大,会走lazy的调度模式,Shuffle数据一般会存在磁盘里面
  • Shuffle的部署方式

    • 流作业是Pipline的模式,通常Shuffle和计算节点部署在一起,减少网络开销

    • 批作业除了传统的落盘,还有Remote Shuffle Service

    • Remote Shuffle Service就是一个远端的专门存Shuffle Service的一个服务,批作业可以把Shuffle直接写到远端的一个系统里面,上游跑完,下游再去读。

    • 这样有一个好处,如果作业写到本地磁盘,本地机器宕机,作业就需要重跑了,如果是大的批作业,这是很难接受的。

    • Remote Shuffle Service可以把数据多存储几份来提高容错性

Flink对流和批提供两种类型的Shuffle,Streaming Shuffle和Batch Shuffle本质上都是为了对数据进行Re-Partition

4. Flink支持的Shuffle Service

  • Netty Shuffle Service
    • Netty Shuffle Service是Flink内置的,既支持Pipeline Shuffle又支持Blocking Shuffle,是Flink默认的Shuffle策略。
    • 如果选择Pipline Shuffle,数据不落盘,直接存到内存里,会通过Netty去连接,把数据直接传到下游
    • 如果选择Blocking,上游可以把数据写到磁盘里面,下游再从磁盘里面读数据
  • Remote Shuffle Service
    • Remote Shuffle Service多用于Blocking场景。因为如果Pipeline场景走Remote Shuffle Service,相当于多了一层网络传输,性能反而会下降