我查看了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/