【问题标题】:ReduceByKey and parititionBy in SparkSpark 中的 ReduceByKey 和 parititionBy
【发布时间】:2019-03-05 16:39:31
【问题描述】:

他们在《学习火花》一书中写道:

对于作用于单个 RDD 的操作,例如 reduceByKey(), 在 预分区 RDD 上运行将导致每个 RDD 的所有值 要在单台机器上本地计算的密钥,只需要 最终的,从每个工作节点发送回的本地缩减值 主人。

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

对于reduceByKey(),第一质量聚合相同的元素 键与提供的关联减少功能本地首先 每个 executor,然后最终在 executor 之间聚合。

那么,如果reduceByKey() 无论如何都会首先在每个执行程序上聚合元素而不对数据进行洗牌,那么为什么一本书建议进行预分区?

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

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

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

    如果您要应用 多个 partitionBy 的摊销成本后跟一组 *byKey*Joinapplications 可能低于应用 *byKey 方法的成本。同样,如果您已经将数据作为不同操作的一部分进行了混洗,并且稍后将应用混洗操作,则应尝试保留现有分区。然而,这并不意味着您应该总是优先选择partitionBy

    【讨论】:

    • 如果我理解正确的话,如果我只想应用reduceByKey一次,就不需要partitionBy,对吗?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-25
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 2015-12-03
      • 2018-08-24
      • 2015-09-07
      相关资源
      最近更新 更多