让我帮助澄清关于深度洗牌以及Spark如何使用洗牌管理器的问题。我报告了一些非常有用的资源:
https://trongkhoanguyenblog.wordpress.com/
https://0x0fff.com/spark-architecture-shuffle/
https://github.com/JerryLead/SparkInternals/blob/master/markdown/english/4-shuffleDetails.md
阅读它们,我了解到有不同的洗牌管理器。我想专注于其中两个: hash manager
和 sort manager
(这是默认管理器)。
为了提出我的问题,我想从一个非常常见的转换开始:
val rdd = reduceByKey(_ + _)
这种转换会导致地图端聚合,然后进行洗牌(shuffle),将所有相同的键放入同一个分区。
我的问题是:
是否使用内部的mapPartition转换来实现地图端聚合,从而使用组合器函数汇总所有相同的键,或者使用
AppendOnlyMap
或ExternalAppendOnlyMap
实现?如果使用
AppendOnlyMap
或ExternalAppendOnlyMap
映射进行聚合,它们是否也用于在ResultTask
中进行的减少端聚合?这两种映射(
AppendOnlyMap
或ExternalAppendOnlyMap
)的目的是什么?AppendOnlyMap
或ExternalAppendOnlyMap
是否由所有shuffle管理器使用,还是只由sortManager使用?我读到说,
AppendOnlyMap
或ExternalAppendOnlyMap
填满后,会被溢写到文件中,具体步骤是如何进行的?使用Sort shuffle管理器,我们使用appendOnlyMap进行聚合和组合分区记录,对吗?然后当执行内存填满时,我们开始对map进行排序,将其溢写到磁盘上,然后清除map,我的问题是:溢写到磁盘和shuffle write之间有什么区别?它们基本上都是在本地文件系统上创建文件,但它们的处理方式不同。Shuffle写入的记录不会被放入appendOnlyMap。
您能否深入解释一下执行reduceByKey时会发生什么,为实现这一目标所涉及的所有步骤,例如地图端聚合、洗牌等等。