首页 > 解决方案 > Apache Spark 中的 ExternalSorter 和 ExternalAppendOnlyMap 有什么区别?

问题描述

我在看Spark的源码,我在它的shuffle实现中发现,在shuffle读取的时候BlockStoreShuffleReader.read,调用的时候会先用aExternalAppendOnlyMap来聚合

def combineValuesByKey(
    iter: Iterator[_ <: Product2[K, V]],
    context: TaskContext): Iterator[(K, C)] = {
  val combiners = new ExternalAppendOnlyMap[K, V, C](createCombiner, mergeValue, mergeCombiners)
  combiners.insertAll(iter)
  updateMetrics(context, combiners)
  combiners.iterator
}

然后,它将使用 aExternalSorter进行排序和聚合。所以这里会有很多磁盘溢出/读取工作。

val resultIter = dep.keyOrdering match {
  case Some(keyOrd: Ordering[K]) =>
    // Create an ExternalSorter to sort the data.
    val sorter =
      new ExternalSorter[K, C, C](context, ordering = Some(keyOrd), serializer = dep.serializer)
...

我的问题是为什么我们同时需要ExternalSorterand ExternalAppendOnlyMap?我们有可能将这两者合二为一吗?

我的意思是他们的代码看起来很相似,为什么我们不能都使用ExternalSorterthen ExternalAppendOnlyMap?既然它既可以聚合又可以排序?

标签: apache-spark

解决方案


免责声明我现在只是在探索 Spark Core 的这一部分,所以我的理解可能完全不正确。


我的理解是,这ExternalAppendOnlyMap只是一个可溢出的大小跟踪仅附加映射,而ExternalSorter可以是缓冲区或映射(基于映射端部分值的映射端组合标志)。

我们有可能将这两者合二为一吗?

有了这个,我认为他们分享了很多,并且ExternalSorter看起来更灵活(因为它可以做 ExternalAppendOnlyMap 所做的事情)。

我认为你的问题的答案是“是”,但很少有人有足够的勇气或鼓励去实施这些改变。


推荐阅读