哪一个遇到的内存瓶颈较少 - reduceByKey 还是 reduceByKeyLocal?



我查看了 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带回主服务器,如果您进行大规模操作,所有这些数据将完全淹没一台机器,并破坏使用分布式数据抽象的目的。

相关内容

最新更新