apache spark - 哪个遇到更少的内存瓶颈 - reduceByKey或reduceByKeyLocally?

Uda*_*gar 2 scala apache-spark rdd

我查看了API并找到了以下文档 -

def reduceByKey(partitioner: Partitioner, func: (V, V) ? V): RDD[(K, V)]
Run Code Online (Sandbox Code Playgroud)

它使用关联reduce函数合并每个键的值.在将结果发送到reducer之前,这也将在每个映射器上本地执行合并,类似于MapReduce中的"组合器".

def reduceByKeyLocally(func: (V, V) ? V): Map[K, V]
Run Code Online (Sandbox Code Playgroud)

它使用关联reduce函数合并每个键的值,但会立即将结果作为Map返回到master.在将结果发送到reducer之前,这也将在每个映射器上本地执行合并,类似于MapReduce中的"组合器".

除了reduceByKeyLocally将结果作为地图返回给master之外,我认为两者之间没有太大区别.

Vid*_*dya 5

差异很大.

使用时reduceByKey,对表示为a RDD,这意味着数据保持在集群之间分布.当您大规模操作时,这是必要的.

使用时reduceByKeyLocally,所有分区都会返回到主服务器,以便Map在该单个计算机上合并为单个分区.与collect动作类似Array,如果您正在大规模操作,则将所有内容都返回给主服务器,所有这些数据将完全压倒一台计算机,并且无法使用分布式数据抽象.