Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala union()操作中任务的执行顺序_Scala_Apache Spark - Fatal编程技术网

Scala union()操作中任务的执行顺序

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

我有一个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 on the union of the rdds
sparkContext.union(rdds).collect()
但是,我对生成的DAG有问题。 实际上,spark产生的DAG是这样的:

  • 80个阶段,每个RDD的“地图”对应一个阶段

  • 1联盟的最后阶段,以80个reduceByKey并行开始

我对粗体部分有异议。 好了,这意味着对于最后一个任务,Spark将并行调度80个reducebykey,其中每个任务都占用大量内存。 一旦为每个rdd完成映射阶段,就可以分别为每个rdd执行reduceByKey()似乎更有效。 相反,在所有映射阶段完成之前,不能执行任何reduceByKey,然后它们都被同时调度

有没有办法强迫Spark尽快执行redueByKey()操作,而不是等待所有映射任务?
我认为这是union()创建PartitionerWareUnionRDD()而不是UnionRDD()的问题,但这两种RDD类型似乎生成相同的DAG。

reduceByKey
是一个广泛的转换-这意味着它有:

  • “映射侧”组件-在洗牌之前发生的操作的一部分-包含在DAG的第一阶段中
  • “减少边”组件-洗牌后发生的操作的一部分-包含在DAG的第二阶段中

“减少侧”组件的结果直接通过管道传输到union。在这种情况下,真的没有什么可优化的。

我不确定我们谈论的是同一件事。。。据我所知,减少的一部分是在地图边完成的。然而,我不明白为什么“减少边”部分没有尽快完成(即当一张地图完成时),那么减少的结果可以在需要时提供给工会。在我的例子中,所有的reduce-side-reduce都是在同一时间完成的,这似乎在同一时间触发了大量的通信