【问题标题】:Does sortByKey in Spark invoke a shuffle?Spark 中的 sortByKey 会调用随机播放吗?
【发布时间】:2016-09-28 17:55:03
【问题描述】:

我有一个巨大的 RDD,我想在其中对单个分区进行本地排序。我查看了 sortByKey 操作,但不清楚它是否调用了随机播放。 (我想避免洗牌)

Cloudera blog 中提到 sortByKey 将涉及随机播放,但从 sortByKey 的javadoc 来看,在调用 collect() 之前似乎没有随机播放。

问题:sortByKey() 是否涉及数据洗牌?如果是,那么对每个 RDD 分区中的数据进行排序的最佳方法是什么?如果不是,那么 collect() 如何使所有内容全局排序?

【问题讨论】:

  • Spark 使用惰性求值。转换本身不会调用任何操作,直到 Spark 遇到一些称为 输出转换 的操作,它会具体化图形并导致执行开始。如果你想查看sortByKey 实际在做什么,请查看BlockStoreShuffleReader.read 方法
  • @YuvalItzchakov 我会注意到sortByKey 并不是完全懒惰的。它将急切地处理输入 rdd。
  • @zero323 真的吗?我不知道。你能参考代码中处理输入RDD的部分吗?我所看到的只是分配了一个ShuffleRDD
  • @YuvalItzchakov 这是罪魁祸首:github.com/apache/spark/blob/…
  • @zero323 谢谢。

标签: apache-spark


【解决方案1】:

它涉及随机播放,但当然,这只发生在您的执行图中涉及操作时,如收集或采取。这是因为当必须从其他转换中消费排序结果时,必须将具有相同键的记录定向到集群上的同一个消费者。

【讨论】:

  • 谢谢。所以只是为了确认,如果我在 sortByKey 之后不调用 collect() 并使用 map() 或 foreachPartition() 之类的转换,它不会触发 shuffle 吗?那么,为什么调用 sortByKey 后会生成 shuffled RDD?
  • 它最终会触发随机播放,因为你必须在最后将它收集到驱动程序。懒惰的意思是在需要的时候。
【解决方案2】:

基本上 sortByKey() 是一个宽类型转换。由于所有转换操作本质上都是惰性的,因此只有在您触发操作时才会发生改组(在您的情况下为 collect())。通常,转换类似于操作指令。 Action 将使用此指令来执行它。您也可以参考 DAG 以获得更清晰的图片。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-23
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多