【问题标题】:Understanding shuffle in spark了解火花中的洗牌
【发布时间】:2017-09-01 17:35:11
【问题描述】:

我正在学习 spark 并且有一个关于作业调度和洗牌依赖的问题。这里是我找到的 DAG there

正如我们在Stage 33 上看到的,我们有多个操作:groupByjoingroupByjoin。问题是我不太明白为什么将两个 groupBy 操作放在同一个阶段?我认为groupBy 需要改组,我们DAGScheduler 应该将Stage 33 拆分为包含单个groupByjoin 的两个阶段。

【问题讨论】:

    标签: java scala apache-spark


    【解决方案1】:

    这里的随机播放表示为阶段之间的边界:

    • 第 30 阶段 - 第 33 阶段
    • 第 31 阶段 - 第 33 阶段
    • 第 32 阶段 - 第 33 阶段

    一旦数据被洗牌,并且所有洗牌的RDD使用相同的分区器,最终join是1-1依赖(如果所有部分都在同一个动作中执行,由于搭配也是本地的)并且不会需要额外的随机播放阶段。

    【讨论】:

      【解决方案2】:

      Shuffling 是跨分区重新分配数据的过程(也称为重新分区),它可能会也可能不会导致跨 JVM 进程甚至通过网络(不同机器上的执行程序之间)移动数据。

      在您的情况下,并行化步骤之间发生改组 - 阶段 30、31、32 作为输入,最终阶段 33 作为目标。

      不惜一切代价避免洗牌。考虑利用现有分区的方法,或使用Broadcast 变量并尝试减少数据传输。 更多关于 Spark 中洗牌的信息,您可以阅读here

      【讨论】:

        猜你喜欢
        • 2021-09-22
        • 1970-01-01
        • 2018-04-21
        • 1970-01-01
        • 2020-11-04
        • 1970-01-01
        • 2016-09-27
        • 2018-10-23
        • 2017-05-18
        相关资源
        最近更新 更多