我正在使用"学习星火"这本书学习火花.遇到这个术语(第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无关.
使用地图端聚合背后的想法与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,combineByKey与mapSideCombine设置为trueaggregateByKeyfoldByKey将使用地图边聚集,同时groupByKey并combineByKey用mapSideCombine设置为false不会.
然而,在应用地图侧聚合之间的选择并不总是显而易见的.在许多情况下,维护所需数据结构和随后的垃圾收集的成本可能超过洗牌成本.
你是对的,术语“映射端归约”确实来自 Map/Reduce 领域,并且这个想法在 Apache Spark 方面有点复杂。如果我们可以在打乱元素之前组合分区内的多个元素(并且组合元素占用更少的空间),那么在打乱数据之前执行每个分区的缩减将会很有用。
Spark 中禁用映射端缩减的一种情况是,groupByKey即使我们可以将某些元素合并到同一分区中,它们仍然会占用大约相同的空间量,因此网络/序列化工作不会相应减少。
希望对您有所帮助,并且很高兴您正在阅读 Learning Spark :)
| 归档时间: |
|
| 查看次数: |
2429 次 |
| 最近记录: |