apache-spark - 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)
...
我的问题是为什么我们同时需要ExternalSorter
and ExternalAppendOnlyMap
?我们有可能将这两者合二为一吗?
我的意思是他们的代码看起来很相似,为什么我们不能都使用ExternalSorter
then ExternalAppendOnlyMap
?既然它既可以聚合又可以排序?
解决方案
免责声明我现在只是在探索 Spark Core 的这一部分,所以我的理解可能完全不正确。
我的理解是,这ExternalAppendOnlyMap
只是一个可溢出的大小跟踪仅附加映射,而ExternalSorter
可以是缓冲区或映射(基于映射端部分值的映射端组合标志)。
我们有可能将这两者合二为一吗?
有了这个,我认为他们分享了很多,并且ExternalSorter
看起来更灵活(因为它可以做 ExternalAppendOnlyMap 所做的事情)。
我认为你的问题的答案是“是”,但很少有人有足够的勇气或鼓励去实施这些改变。
推荐阅读
- vba - 单个单元格 (A1) 的范围地址有时会返回单元格范围地址“A1:A1”而不是“A1”
- python - 如何获得带有 m 尾的列表?Python
- wpf - 通过样式设置的 WPF 控件模板属性
- elixir - 动态预加载表
- php - Symfony 2.7:无法加载类型“Symfony\Component\Form\Extension\Core\Type\TextType”
- c# - StreamWriter Encoding.Default 使用不同的编码?
- iis - 通过 wfastcgi 将烧瓶部署到 IIS,日志在蓝图中不起作用
- c# - 无法使用c#将数据从excel文件复制到另一个文件
- azure - Azure AD 是否与 GCP/GKE 集成以允许 SSO?
- java - 如何从 html 表中检索数据并将其发送到另一个 jsp 页面?