Spark如何实现哪个RDD操作需要分成单独的阶段?

时间:2017-03-15 00:56:37

标签: apache-spark

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

3 个答案:

答案 0 :(得分:3)

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

  1. 可以在多个节点上读取数据
  2. 在每个节点上,可以进行地图操作,将摄氏温度转换为华氏温度
  3. 查找平均温度 任务2可以基于每个节点完成。但要计算平均值,我们需要一个洗牌。原因是纽约的数据可能在多台服务器上。我们需要在一台机器上获取纽约的数据来计算平均值。因此会有像groupByAggregate这样的聚合操作。 Spark知道这是一个洗牌操作。这就是它的代码是如何编写的......用一些密钥对数据进行分组,在这种情况下是城市 有关改组操作的完整列表,请参阅here 另外,在下面你可以看到窄变换(上面的地图操作......第2步),以及广泛的变换或随机播放:
    enter image description here

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

我们的想法是,您使用最大可用资源(节点及其CPU)来对数据进行分区 - 同时还要确保不引入偏差(一个节点或cpu有更多排队的位置)工作比另一个。)