【问题标题】:How Spark realize which RDD operation need to be split into seperate Stage?Spark如何实现需要将哪个RDD操作拆分为单独的Stage?
【发布时间】:2017-03-18 15:42:32
【问题描述】:

当 Spark 遇到 reduceByKey 等操作时,就会创建一个新的 Stage。 Spark如何实现需要将哪个操作拆分为单独的Stage,例如'reduceByKey'操作?当我添加新操作并希望它在另一个阶段运行时,我如何实现它?

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    让我们用一个例子来做。这有过去 10 年中每天的城市和温度数据集,例如:
    纽约 -> [22.3, 22.4, 22.8, 32.3, ......]
    伦敦 -> [.................
    多伦多 -> [..................
    我的任务是将其转换为华氏温度,然后找到每个城市的平均值。这可以按如下方式完成:

    1. 可以在多个节点上读取数据
    2. 在每个节点上都可以进行地图操作,将摄氏度转换为华氏度
    3. 查找平均温度 任务 2 可以在每个节点的基础上完成。但是要计算平均值,我们需要洗牌。原因是纽约的数据可能在多个服务器上。我们需要在一台机器上获取纽约的数据来计算平均值。所以会有像groupByAggregate这样的聚合操作。 Spark 知道这是一个洗牌操作。这就是它的代码编写方式。通过某个键(在本例中为城市)对数据进行分组。
      有关改组操作的完整列表,请参阅here
      此外,您可以在下面看到窄变换(上面的映射操作.. 第 2 步)和宽变换或随机播放:

    【讨论】:

    • 是否有我必须实现的接口来强制 Spark 知道我的操作是 shuffle 操作?
    • 没办法!它在操作的代码中!所以如果你调用说 reduceByKey,reduceByKey 的代码会进行洗牌。这是一个洗牌操作。另请阅读:spark.apache.org/docs/latest/…
    【解决方案2】:

    有一种叫做流水线的东西。流水线是将多个 RDD 折叠成单个阶段的过程,此时可以从其父级计算 RDD 而无需任何数据移动(Shuffling)。 For more

    【讨论】:

      【解决方案3】:

      导致数据重新分区(在节点之间重新分配数据)的任何事情都会创建一个新阶段。重新分区的发生主要是因为为您的 RDD 数据行选择了一个新的 Key。当然,由于明确的重新分区,也会发生重新分区。

      如果不需要,您希望避免重新引入新阶段,因为这隐含地意味着也有重新洗牌。如果不需要,不要这样做,因为它很昂贵。

      这个想法是您以这样一种方式对数据进行分区,即您可以使用最大的可用资源(节点及其 cpu) - 同时还要确保您不会引入倾斜(其中一个节点或 cpu 有更多的队列比另一个工作)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-11
        • 1970-01-01
        • 2016-01-03
        相关资源
        最近更新 更多