我查看了 API,并找到了以下文档 -
def reduceByKey(partitioner: Partitioner, func: (V, V) ⇒ V): RDD[(K, V)]
它使用关联归约函数合并每个键的值。 这也将在将结果发送到化简器之前在每个映射器上本地执行合并,类似于 MapReduce 中的"合并器"。
def reduceByKeyLocally(func: (V, V) ⇒ V): Map[K, V]
它使用关联归约函数合并每个键的值,但立即将结果作为 Map 返回给主键。 这也将在将结果发送到化简器之前在每个映射器上本地执行合并,类似于 MapReduce 中的"合并器"。
我认为两者之间没有太大区别,除了 reduceByKeyLocal 将结果作为映射返回给主数据库。
差异是深远的。
在reduceByKey
,这些对表示为一个RDD
,这意味着数据仍然分布在集群中。当您大规模运营时,这是必需的。
使用reduceByKeyLocally
时,所有分区都返回到主节点,以合并到该单台机器上的单个Map
中。与collect
操作类似,它将所有内容作为Array
带回主服务器,如果您进行大规模操作,所有这些数据将完全淹没一台机器,并破坏使用分布式数据抽象的目的。