我查看了API,并找到了以下两个文档:

def reduceByKey(partitioner: Partitioner, func: (V, V) ⇒ V): RDD[(K, V)]

它使用关联的reduce函数合并每个键的值。
在将结果发送给reducer之前,这还将在每个mapper上本地执行合并,类似于MapReduce中的“combiner”。
def reduceByKeyLocally(func: (V, V) ⇒ V): Map[K, V]

使用关联的reduce函数合并每个键的值,但是将结果立即作为Map返回给主数据库。
在将结果发送给reducer之前,这还将在每个mapper上本地执行合并,类似于MapReduce中的“combiner”。

除了reduceByKeyLocally将结果作为映射返回给主服务器之外,我看不出两者之间有多少区别。

最佳答案

区别是深远的。

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

使用reduceByKeyLocally,所有分区都返回到主分区,以合并到该单台计算机上的单个Map中。与collect操作类似,该操作将所有内容作为Array带回主服务器,如果您按比例操作,那么所有这些数据将完全淹没一台机器,并且无法达到使用分布式数据抽象的目的。

关于scala - apache spark-哪个遇到较少的内存瓶颈-reduceByKey或reduceByKeyLocally?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43622873/

10-11 07:10