Предположим, у нас есть 10 узлов, каждый из которых имеет 2 ядра. Мы устанавливаем для defaultParallelism
значение 2*10=20
, надеясь, что каждому узлу будет назначено ровно 2 раздела, если мы вызовем sc.parallelize(1 to 20)
. Это предположение по некоторым причинам оказывается неверным в некоторых случаях. В зависимости от некоторых условий Spark иногда размещает более 2 разделов на одном узле, иногда пропуская один или несколько узлов в целом. Это приводит к серьезному перекосу, и перераспределение не помогает (поскольку мы не контролируем размещение разделов на физических узлах).
- Почему это может произойти?
- Как сделать так, чтобы каждому узлу было назначено ровно 2 раздела?
Кроме того, spark.locality.wait
установлен на 999999999s
, что стоит.
DAG, в которой это происходит, приведен ниже. В то время как распараллеливание на этапе 0 назначает разделы равномерно, распараллеливание на этапе 1 - нет. Это всегда так - почему?
![DAG](https://i.stack.imgur.com/zW5i9.png)
Связывание связанный вопрос .