让我帮助澄清深度洗牌以及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(_ + _)
此转换会导致地图端聚合,然后随机播放,以便将所有相同的密钥带入同一分区。
我的问题是:
Map-Side聚合是使用内部mapPartition转换实现的,因此使用组合器函数聚合所有相同的键,还是使用AppendOnlyMap
或ExternalAppendOnlyMap
实现?
如果使用AppendOnlyMap
或ExternalAppendOnlyMap
地图进行汇总,它们是否也用于ResultTask
中发生的减少副汇总?< / p>
这两种地图(AppendOnlyMap
或ExternalAppendOnlyMap
)的目的是什么?
所有随机播放管理器中使用AppendOnlyMap
或ExternalAppendOnlyMap
还是仅使用sortManager?
我读到AppendOnlyMap
或ExternalAppendOnlyMap
已满,已泄露到文件后,这个步骤究竟是如何发生的?
使用Sort shuffle管理器,我们使用appendOnlyMap来聚合和组合分区记录,对吧?然后当执行内存填满时,我们开始排序映射,将其溢出到磁盘然后清理映射,我的问题是:溢出到磁盘和shuffle写入有什么区别?它们主要包括在本地文件系统上创建文件,但它们的处理方式不同,Shuffle写入记录,不会放入appendOnlyMap。
你能深入解释在执行reduceByKey时会发生什么,向我解释完成该任务所涉及的所有步骤?例如,地图边聚合,改组等所有步骤。
答案 0 :(得分:2)
它遵循reduceByKey
一步一步的描述:
reduceByKey
调用combineByKeyWithTag
,使用标识合并器和相同的合并值并创建值combineByKeyWithClassTag
创建Aggregator
并返回ShuffledRDD
。 “map”和“reduce”侧聚合都使用内部机制,不使用mapPartitions
。Agregator
使用ExternalAppendOnlyMap
同时combineValuesByKey
(“地图缩减”)和combineCombinersByKey
(“减少副作用”)ExternalAppendOnlyMap.insertAllMethod
ExternalAppendOnlyMap
keeps track of spilled parts和当前的内存中地图(SizeTrackingAppendOnlyMap
)insertAll
方法会更新内存中的地图和checks on insert。它使用继承的Spillable.maybeSpill
方法。如果超过阈值,则此方法会调用spill
as a side effect,insertAll
会初始化清除SizeTrackingAppendOnlyMap
spill
从块管理器调用spillMemoryIteratorToDisk
which gets DiskBlockObjectWriter
object。 insertAll
步骤适用于map和reduce副聚合,以及相应的Aggregator
函数,其间有shuffle阶段。
从Spark 2.0开始,只有基于排序的管理器:SPARK-14667