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

120 阅读2分钟

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

shuffle概述

在大数据场景下,数据 shuffle 表示了不同分区数据交换的过程,不同的 shuffle 策略性能差异较大。 目前在各个引擎中 shuffle 都是优化的重点,在 spark 框架中,shuffle 是支撑 spark进行大规模复杂 发 数据处理的基石。

MapReduce概述

  • 2004年谷歌发布了《MapReduce: Simplified Data Processing on Large Clusters》论文
  • 在开源实现的MapReduce中,存在Map、 Shuffle、Reduce三个阶段。

shuffle算子

spark产生的四类shuffle算子

image.png

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数据