假设我们有10个节点,每个节点有2个核心。我们将defaultParallelism
设置为2*10=20
,希望如果我们调用sc.parallelize(1 to 20)
,则将为每个节点分配2个分区。由于某种原因,这种假设在某些情况下被证明是不正确的。根据某些条件,Spark有时会在一个节点上放置两个以上的分区,有时会跳过一个或多个节点。这会导致严重的偏差,并且重新分区无济于事(因为我们无法控制将分区放置到物理节点上的情况。)
此外,spark.locality.wait
的价值也设置为999999999s
。
发生这种情况的DAG如下所示。来自阶段0的并行化平均分配分区,而阶段1中的并行化则没有。总是这样-为什么?