|NO.Z.00098|——————————|BigDataEnd|——|Hadoop&Spark.V14|——|Spark.v14|Spark 原理 源码|Shuffle详解&Sort Shuffle V1&Sort Shuffle V2|
一、Sort Shuffle V1
### --- Sort Shuffle V1
~~~ 为了更好地解决上面的问题,Spark 参考了 MapReduce 中 Shuffle 的处理方式,
~~~ 引入基于排序的 Shuffle 写操作机制。
~~~ 每个 Task 不会为后续的每个 Task 创建单独的文件,而是将所有对结果写入同一个文件。
~~~ 该文件中的记录首先是按照Partition Id 排序,每个 Partition 内部再按照 Key 进行排序,
~~~ Map Task 运行期间会顺序写每个 Partition 的数据,
~~~ 同时生成一个索引文件记录每个 Partition 的大小和偏移量。
二、Sort Shuffle V1架构图

### --- Sort Shuffle V1说明
~~~ 在 Reduce 阶段,Reduce Task 拉取数据做 Combine 时不再采用 HashMap,
~~~ 而是采用ExternalAppendOnlyMap,该数据结构在做 Combine 时,
~~~ 如果内存不足,会刷写磁盘,避免大数据情况下的 OOM。
~~~ 总体上看来 Sort Shuffle 解决了 Hash Shuffle 的所有弊端,
~~~ 但是因为需要其 Shuffle 过程需要对记录进行排序,所以在性能上有所损失。
### --- Tungsten-Sort Based Shuffle / Unsafe Shuffle
~~~ 从 Spark 1.5.0 开始,Spark 开始了钨丝计划(Tungsten),
~~~ 目的是优化内存和CPU的使用,进一步提升Spark的性能。
~~~ 由于使用了堆外内存,而它基于 JDK Sun Unsafe API,
~~~ 故 Tungsten-Sort Based Shuffle 也被称为 UnsafeShuffle。
~~~ 它的做法是将数据记录用二进制的方式存储,
~~~ 直接在序列化的二进制数据上 Sort 而不是在 Java 对象上,
~~~ 这样一方面可以减少内存的使用和 GC 的开销,
~~~ 另一方面避免 Shuffle 过程中频繁的序列化以及反序列化。
~~~ 在排序过程中,它提供 cache-efficient sorter,使用一个 8 bytes 的指针,
~~~ 把排序转化成了一个指针数组的排序,极大的优化了排序性能。
~~~ 但是使用 Tungsten-Sort Based Shuffle 有几个限制,Shuffle 阶段不能有 aggregate 操作,
~~~ 分区数不能超过一定大小(2^24-1,这是可编码的最大 Parition Id),
~~~ 所以像 reduceByKey 这类有 aggregate 操作的算子是不能使用Tungsten-Sort Based Shuffle,
~~~ 它会退化采用 Sort Shuffle。
二、Sort Shuffle V2
### --- Sort Shuffle V2
~~~ 从 Spark1.6.0 开始,把 Sort Shuffle 和 Tungsten-Sort Based Shuffle 全部统一到 Sort Shuffle 中,
~~~ 如果检测到满足Tungsten-Sort Based Shuffle 条件会自动采用 Tungsten-Sort Based Shuffle,
~~~ 否则采用 Sort Shuffle。从Spark2.0 开始,Spark 把 Hash Shuffle 移除,
~~~ Spark2.x 中只有一种 Shuffle,即为 Sort Shuffle。
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
bdv018-spark.v03
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」