现在,对于我的应用程序,我发现它具有显着的性能差异,具体取决于合并的shuffle参数。
val subscriber = a.join(b).map(x=>(x._1,x_2))
// subscriber' partition number is above 40000
subscriber.coalesce(5,true).saveAsTextFile("result") // performance good
subscriber.coalesce(5,false).saveAsTextFile("result") // performance poor
根据合并的Spark Document,
但是,如果您正在进行激烈的合并,例如对于numPartitions = 1,这可能导致您的计算发生在比您喜欢的节点更少的节点上(例如,在numPartitions = 1的情况下,一个节点)。为避免这种情况,您可以传递shuffle = true。这将添加一个shuffle步骤,但意味着当前的上游分区将并行执行(无论当前分区是什么)。
但我不明白为什么如果我没有设置shuffle = true,这可能导致你的计算在更少的节点上进行。有人可以解释一下吗?