在Spark中进行ReduceByKey和parititionBy

时间:2018-09-30 09:02:42

标签: apache-spark

他们在Learning Spark书中写道:

  

对于作用于单个RDD的操作,例如reduceByKey(),   在预先分区的RDD上运行将导致每个   密钥可以在一台计算机上本地进行计算,只需要   最终的,局部降低的值将从每个工作节点发送回   主人。

但是,作者在this answer中说,不需要预先分区,因为:

  

对于reduceByKey(),第一质量会汇总相同元素   首先使用提供的关联缩减功能本地的键   每个执行者,然后最终汇总到各个执行者中。

那么,为什么书会建议进行预分区,如果reduceByKey()仍然会先聚集每个执行器上的元素,而不会对数据进行混编?

2 个答案:

答案 0 :(得分:0)

这本书并没有真正建议进行预分区。它仅描述了*ByKey方法应用于分区RDD时的行为。考虑到分区本身是随机的,因此得出结论,您应该为单个 reduceByKey抢先对数据进行分区。

实际上,如果数据包含具有 K 个唯一键和P分区的 N 个值,则场景reduceByKey中的随机播放大小partitionBy总是大于和单独使用reduceByKey的混洗大小。

如果您要申请{em> multiple 的partitionBy摊销成本,然后再申请一组*byKey*Join申请,则费用可能会低于申请{ {1}}个方法。同样,如果您已经将数据作为不同操作的一部分进行混洗,并且稍后将应用混洗操作,则应该尝试保留现有分区。但是,这并不意味着您应该始终总是优先使用*byKey

答案 1 :(得分:0)

上面的答案几乎总结了reduceByKey和partitionBy方法。

要回答您的问题,您无需在调用reduceByKey之前应用partitionBy。