这是我参与「第四届青训营 」笔记创作活动的第3天
shuffle概述
在大数据场景下,数据 shuffle 表示了不同分区数据交换的过程,不同的 shuffle 策略性能差异较大。 目前在各个引擎中 shuffle 都是优化的重点,在 spark 框架中,shuffle 是支撑 spark进行大规模复杂 发 数据处理的基石。
MapReduce概述
- 2004年谷歌发布了《MapReduce: Simplified Data Processing on Large Clusters》论文
- 在开源实现的MapReduce中,存在Map、 Shuffle、Reduce三个阶段。
shuffle算子
spark产生的四类shuffle算子
shuffle算子应用
val text = sc.textFile("mytextfile.txt")
val counts = text
.flatMap(line => line.split(" "))
.map(word => (word,1))
.reduceByKey(_+_)
counts.collect
shuffle的宽依赖和窄依赖
- 窄依赖:父RDD的每个分片至多被子RDD中的一个分片所依赖
- 宽依赖:父RDD中的分片可能被子RDD中的多个分片所依赖
shuffle实现发展的过程
- Spark 0.8及以前 Hash Based Shuffle
- Spark 0.8.1为Hash Based Shuffle引l入File Consolidation机制
- Spark 0.9 引I入 ExternalAppendOnlyMap
- Spark 1.2 默认的 Shuffle 方式改为 Sort Based Shuffle
- Spark 1.4 引|入 Tungsten-Sort Based Shuffle
- Spark 1.6 Tungsten-Sort Based Shuffle 并入SortBased Shuffle
- Spark 2.O Hash Based Shuffle 退出历史舞台
Shuffle 优化使用的技术 Netty Zero Copy
- 可堆外内存,避免JVM堆内存到堆外内存的数据拷贝。
- CompositeByteBuf、 Unpooled.wrappedBuffer、 ByteBuf.slice,可以合并、包装、切分数组,避免发生内存拷贝
- Netty 使用FileRegion实现文件传输,FileRegion 底层封装了 FileChannel#transferTo()方法,可以将文件缓冲区的数据直接传输到目标 Channel,避免内核缓冲区和用户态缓冲区之间的数据拷贝
Shuffle参数优化
- spark.default.parallelism && spark.sql.shuffle.partitions
- spark.hadoopRDD.ignoreEmptySplits
- spark.hadoop.mapreduce.input.fileinputformat.split.minsize
- spark.sql.file.maxPartitionBytes
- spark sql.adaptive.enabled && spark.sql.adaptive.shuhffle.targetPostShufflelnputSize
- spark.reducer.maxSizelnFlight
- spark.reducer.maxReqslnFlight
- spark.reducer.maxBlocksInFlightPerAddress
Magnet 实现原理
- Spark driver组件,协调整体的shuffle操作
- map任务的shuffle writer过程完成后,增加了一个额外的操作push-merge,将数据复制 一份推到远程shuffle服务上
- magnet shuffle service是一个强化版的ESS。将隶属于同一个shuffle partition的block,会 在远程传输到magnet后被merge到一个文件中
- reduce任务从magnet shuffle service 接收合并好的shuffle数据