Spark中的"map-side"聚合

Raj*_*Raj 11 apache-spark

我正在使用"学习星火"这本书学习火花.遇到这个术语(第54页) We can disable map-side aggregation in combineByKey() if we know that our data won’t benefit from it我很困惑这里的地图边聚合是什么意思?我想到的唯一的事情是Hadoop MapReduce中的Mapper和Reducer ......但是相信这与Spark无关.

zer*_*323 7

使用地图端聚合背后的想法与Hadoop组合器几乎相同.如果单个映射器可以为同一个键生成多个值,则可以通过在本地减少值来减少混洗.

可以从映射端聚合中受益的一个操作示例是为每个键创建一组值,尤其是在组合之前对RDD进行分区时:

首先让我们创建一些虚拟数据:

val pairs = sc.parallelize(
    ("foo", 1) :: ("foo", 1) :: ("foo", 2) ::
    ("bar", 3) :: ("bar", 4) :: ("bar", 5) :: Nil
)
Run Code Online (Sandbox Code Playgroud)

合并数据使用combineByKey:

import collection.mutable.{Set => MSet}
val combined = partitionedPairs.combineByKey(
    (v: Int) => MSet[Int](v),
    (set: MSet[Int], v: Int) => set += v,
    (set1: MSet[Int], set2: MSet[Int]) => set1 ++= set2
)
Run Code Online (Sandbox Code Playgroud)

根据数据分布,这可以显着减少网络流量.总体

  • reduceByKey,
  • combineByKeymapSideCombine设置为true
  • aggregateByKey
  • foldByKey

将使用地图边聚集,同时groupByKeycombineByKeymapSideCombine设置为false不会.

然而,在应用地图侧聚合之间的选择并不总是显而易见的.在许多情况下,维护所需数据结构和随后的垃圾收集的成本可能超过洗牌成本.


Hol*_*den 5

你是对的,术语“映射端归约”确实来自 Map/Reduce 领域,并且这个想法在 Apache Spark 方面有点复杂。如果我们可以在打乱元素之前组合分区内的多个元素(并且组合元素占用更少的空间),那么在打乱数据之前执行每个分区的缩减将会很有用。

Spark 中禁用映射端缩减的一种情况是,groupByKey即使我们可以将某些元素合并到同一分区中,它们仍然会占用大约相同的空间量,因此网络/序列化工作不会相应减少。

希望对您有所帮助,并且很高兴您正在阅读 Learning Spark :)