我有一个要处理的rdds列表,然后最终加入。 “过程”部分包括为每个rdd制作一个映射和一个reduce by key。 然后我通过工会“加入”他们。 这是我的代码的草图:
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的每个“地图”都有一个阶段
联合的最后一个阶段, 以80 reduceByKey并行开始
我对粗体部分有疑问。 AFAIK,这意味着对于最后一个任务,Spark将并行调度80个reducebykey,每个任务都占用大量内存。 在此RDD的映射阶段完成之后,能够为每个rdd单独执行reduceByKey()似乎更为有效。 相反,在 all 映射阶段完成之前无法执行reduceByKey,然后将它们同时调度。
是否有一种方法可以强制Spark以某种方式尽快执行redueByKey()操作,而不是等待所有地图任务? 我以为这是union()创建PartitionerAwareUnionRDD而不是UnionRDD()的问题,但似乎两种RDD类型都生成相同的DAG。
答案 0 :(得分:1)
reduceByKey
是一个广泛的转变-这意味着它具有:
“ reduce-side”组件的结果直接通过管道传递给union。在这种情况下,实际上没有什么要优化的。