Shuffle的原理与实践 | 青训营笔记

133 阅读2分钟

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

一、Shuffle概述

1. Shuffle是什么

MapReduce

  • Map:单机上对一小块数据进行的计算过程
  • Shuffle: Map阶段基础上进行数据移动,为后续的Reduce阶段做准备
  • Reduce: 对移动后的数据进行处理,依然是单机上处理一小份数据

2. 为什么需要Shuffle

Shuffle的挑战:对性能影响重要

  • M*R次网络链接
  • 大量数据移动
  • 数据丢失风险
  • 大量排序操作
  • 大量数据序列化、反序列化
  • 数据压缩

3. Shuffle的基本过程

Shuffle表示了不同分区数据交换的过程,不同的Shuffle策略性能差异大。

二、Shuffle算子

1. Repartition

  • coalesce
  • repartition

2. ByKey

  • groupByKey
  • reduceByKey
  • aggregateByKey
  • combineByKey
  • sortByKey
  • sortBy

3. Join

  • cogroup
  • join
  • leftOuterJoin
  • intersection
  • subtract
  • subtractByKey

4. Distinct

  • distinct

Shuffle Dependency构造

  • Single K-V pair RDD
  • Partitioner
    • numberPartitions
    • getPartition
    • HashPartitioner
  • Serializer
  • Optional Key Ordering
  • Optional Aggregator
    • createCombiner:只有一个value的时候
    • mergeValue: 合并一个value到Aggregator
    • mergeCombiner: 合并两个Aggregator
  • mapSideCombine

三、Shuffle过程——Spark中Shuffle的核心原理

1. Hash Based Shuffle

  • Spark1.2默认方式从HBS改为Sort Based Shuffle
  • Spark2.0 HBS退出历史舞台
  • 每个partition映射到一个文件片段

2. Sort Shuffle

  • 写:每个task生成一个包含所有partition数据的文件
  • 读:每个Reduce task分别获取所有map task生成的属于自己的片段

3. Shuffle过程的触发

  • Collect Action
  • Submit Job
  • Get Dependencies
  • Register Shuffle

4. Shuffle Handle的创建

Register Shuffle 最重要的事:根据不同条件创建不同的shuffle handle

4.1 Shuffle Handle的创建

  • BypassMergeSortShuffleHandle <-> *ShuffleHandle
  • Serialied* <-> *
  • Base* <-> *

4.2 Writter的实现

  • BypassMergeWriter
    • 不需要排序,节省时间
    • 写操作会打开大量文件
    • 类似Hash Shuffle
  • UnsafeShuffleWriter
    • 类似内存页储存序列化数据
    • 数据写入后不再反序列化
    • 只根据partition排序Long Array
    • 数据不移动
  • SortShuffleWriter
    • 支持combine
    • combine时使用PartitionedAppendOnlyMap,是个hashtable
    • 不需要combine: partitionedPairBuffer是个array

4.3 Reader实现

  • 网络时序图
  • ShuffleBlockFetchIterator
  • External Shuffle Service

4.4 Shuffle优化使用的技术

  • Zero Copy
  • Netty Zero Copy
  • 避免Shuffle, 使用broadcast替代join
  • mapside join 预聚合算子
  • 倾斜优化
    • 提高并行度
    • AQE Skew Join

四、Push Shuffle——各个社区包括Spark3.2的方案及字节方案

1. 为什么

  • Avg IO size太小,大量随机IO
  • M*R次读请求,大量网络连接,影响稳定性

2. 实现方案

  • Facebook: cosco
  • Bytedance: CSS
  • Spark3.2: push based shuffle
  • Tencent: FireStorm

3. Magnet实现原理

Spark Driver的组件,是强化的ESS

  • bitmap
  • position offset
  • currentMapId Cloud Shuffle Service思想
  • 写入速度
    • 主从inmemory副本,异步刷盘,极低的失败几率换取高速写入速度
  • IO聚合
    • 所有mapper同一个partition数据都远程写到同一个文件
  • 备份
    • HDFS太重,使用双磁盘副本 Cloud Shuffle Service AQE