Scala union()操作中任务的执行顺序
我有一个80个RDD的列表,我想处理这些RDD,然后最终加入。 “流程”部分包括为每个rdd进行映射和按键缩减。 然后,我通过建立联盟来“加入”他们。 下面是我的代码草图:Scala union()操作中任务的执行顺序,scala,apache-spark,Scala,Apache Spark,我有一个80个RDD的列表,我想处理这些RDD,然后最终加入。 “流程”部分包括为每个rdd进行映射和按键缩减。 然后,我通过建立联盟来“加入”他们。 下面是我的代码草图: rdds0.foreach(_.persist()) //rdds0 are persisted //trigger a map and a shuffle for each rdd vals rdds = rdds0.map(rdd => rdd.map(f1).reduceByKey(f2)) //action
rdds0.foreach(_.persist()) //rdds0 are persisted
//trigger a map and a shuffle for each rdd
vals rdds = rdds0.map(rdd => rdd.map(f1).reduceByKey(f2))
//action on the union of the rdds
sparkContext.union(rdds).collect()
但是,我对生成的DAG有问题。
实际上,spark产生的DAG是这样的:
- 80个阶段,每个RDD的“地图”对应一个阶段
- 1联盟的最后阶段,以80个reduceByKey并行开始
我认为这是union()创建PartitionerWareUnionRDD()而不是UnionRDD()的问题,但这两种RDD类型似乎生成相同的DAG。
reduceByKey
是一个广泛的转换-这意味着它有:
- “映射侧”组件-在洗牌之前发生的操作的一部分-包含在DAG的第一阶段中
- “减少边”组件-洗牌后发生的操作的一部分-包含在DAG的第二阶段中
“减少侧”组件的结果直接通过管道传输到union。在这种情况下,真的没有什么可优化的。我不确定我们谈论的是同一件事。。。据我所知,减少的一部分是在地图边完成的。然而,我不明白为什么“减少边”部分没有尽快完成(即当一张地图完成时),那么减少的结果可以在需要时提供给工会。在我的例子中,所有的reduce-side-reduce都是在同一时间完成的,这似乎在同一时间触发了大量的通信