Apache Spark - reduceByKey和reduceByKeyLocally哪个遇到的内存瓶颈更少?

3

我已经查看了API,并找到以下两者的文档:

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

使用关联归约函数合并每个键的值。这也会在将结果发送到减速器之前,在每个映射器上本地执行合并,类似于MapReduce中的“组合器”。

def reduceByKeyLocally(func: (V, V) ⇒ V): Map[K, V]

该函数使用关联的reduce函数合并每个键的值,但将结果立即作为Map返回给主节点。这也会在每个mapper上本地执行合并,然后将结果发送到reducer,类似于MapReduce中的“combiner”。

我没有看出两者之间有太大的区别,除了reduceByKeyLocally将结果作为map返回给主节点。

1个回答

7
差异非常明显。
使用 reduceByKey,键值对被表示为一个 RDD,这意味着数据仍然分布在整个集群中。当您需要大规模操作时,这是必要的。
使用 reduceByKeyLocally,所有分区都会返回到主节点,合并成一个单独的 Map 在该单台机器上。与 collect 操作类似,将所有内容作为 Array 返回到主节点,如果您需要进行大规模操作,则所有这些数据将完全淹没一台机器,并且会使使用分布式数据抽象的目的失去意义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接