他们在Learning Spark书中写道:
对于作用于单个RDD的操作,例如reduceByKey(), 在预先分区的RDD上运行将导致每个 密钥可以在一台计算机上本地进行计算,只需要 最终的,局部降低的值将从每个工作节点发送回 主人。
但是,作者在this answer中说,不需要预先分区,因为:
对于reduceByKey(),第一质量会汇总相同元素 首先使用提供的关联缩减功能本地的键 每个执行者,然后最终汇总到各个执行者中。
那么,为什么书会建议进行预分区,如果reduceByKey()仍然会先聚集每个执行器上的元素,而不会对数据进行混编?
答案 0 :(得分:0)
这本书并没有真正建议进行预分区。它仅描述了*ByKey
方法应用于分区RDD
时的行为。考虑到分区本身是随机的,因此得出结论,您应该为单个 reduceByKey
抢先对数据进行分区。
实际上,如果数据包含具有 K 个唯一键和P
分区的 N 个值,则场景reduceByKey
中的随机播放大小partitionBy
总是大于和单独使用reduceByKey
的混洗大小。
如果您要申请{em> multiple 的partitionBy
摊销成本,然后再申请一组*byKey
或*Join
申请,则费用可能会低于申请{ {1}}个方法。同样,如果您已经将数据作为不同操作的一部分进行混洗,并且稍后将应用混洗操作,则应该尝试保留现有分区。但是,这并不意味着您应该始终总是优先使用*byKey
。
答案 1 :(得分:0)
上面的答案几乎总结了reduceByKey和partitionBy方法。
要回答您的问题,您无需在调用reduceByKey之前应用partitionBy。