了解Spark中的shuffle管理器

时间:2017-01-11 08:09:09

标签: apache-spark rdd partitioning shuffle

让我帮助澄清深度洗牌以及Spark如何使用随机播放管理器。我报告了一些非常有用的资源:

https://trongkhoanguyenblog.wordpress.com/

https://0x0fff.com/spark-architecture-shuffle/

https://github.com/JerryLead/SparkInternals/blob/master/markdown/english/4-shuffleDetails.md

读它们,我知道有不同的洗牌经理。我想关注其中两个:hash managersort manager(这是默认的经理)。

为了揭露我的问题,我想从一个非常普遍的转变开始:

val rdd = reduceByKey(_ + _)

此转换会导致地图端聚合,然后随机播放,以便将所有相同的密钥带入同一分区。

我的问题是:

  • Map-Side聚合是使用内部mapPartition转换实现的,因此使用组合器函数聚合所有相同的键,还是使用AppendOnlyMapExternalAppendOnlyMap实现?

  • 如果使用AppendOnlyMapExternalAppendOnlyMap地图进行汇总,它们是否也用于ResultTask中发生的减少副汇总?< / p>

  • 这两种地图(AppendOnlyMapExternalAppendOnlyMap)的目的是什么?

  • 所有随机播放管理器中使用AppendOnlyMapExternalAppendOnlyMap还是仅使用sortManager?

  • 我读到AppendOnlyMapExternalAppendOnlyMap已满,已泄露到文件后,这个步骤究竟是如何发生的?

  • 使用Sort shuffle管理器,我们使用appendOnlyMap来聚合和组合分区记录,对吧?然后当执行内存填满时,我们开始排序映射,将其溢出到磁盘然后清理映射,我的问题是:溢出到磁盘和shuffle写入有什么区别?它们主要包括在本地文件系统上创建文件,但它们的处理方式不同,Shuffle写入记录,不会放入appendOnlyMap。

  • 你能深入解释在执行reduceByKey时会发生什么,向我解释完成该任务所涉及的所有步骤?例如,地图边聚合,改组等所有步骤。

1 个答案:

答案 0 :(得分:2)

它遵循reduceByKey一步一步的描述:

  1. reduceByKey调用combineByKeyWithTag,使用标识合并器和相同的合并值并创建值
  2. combineByKeyWithClassTag创建Aggregator并返回ShuffledRDD。 “map”和“reduce”侧聚合都使用内部机制,不使用mapPartitions
  3. Agregator使用ExternalAppendOnlyMap同时combineValuesByKey(“地图缩减”)和combineCombinersByKey(“减少副作用”)
  4. 两种方法都使用ExternalAppendOnlyMap.insertAllMethod
  5. ExternalAppendOnlyMap keeps track of spilled parts和当前的内存中地图(SizeTrackingAppendOnlyMap
  6. 如果当前地图的尺寸​​估计尺寸超过阈值,
  7. insertAll方法会更新内存中的地图和checks on insert。它使用继承的Spillable.maybeSpill方法。如果超过阈值,则此方法会调用spill as a side effectinsertAll会初始化清除SizeTrackingAppendOnlyMap
  8. spill从块管理器调用spillMemoryIteratorToDisk which gets DiskBlockObjectWriter object
  9. insertAll步骤适用于map和reduce副聚合,以及相应的Aggregator函数,其间有shuffle阶段。

    从Spark 2.0开始,只有基于排序的管理器:SPARK-14667