Почему передел Spark не сбалансировал данные в разделы? - PullRequest
2 голосов
/ 23 апреля 2019
>>> rdd = sc.parallelize(range(10), 2)
>>> rdd.glom().collect()
[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]
>>> rdd.repartition(3).glom().collect()
[[], [0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]
>>>

Первый раздел пуст?Зачем?Я действительно ценю, что вы рассказали мне причины.

Ответы [ 3 ]

2 голосов
/ 23 апреля 2019

Это происходит потому, что Spark не тасует отдельные элементы, а скорее блоки данных - с минимальным размером пакета, равным 10 .

Таким образом, если у вас меньше элементов, чем в каждом разделе, Spark не будет разделять содержимое разделов.

1 голос
/ 23 апреля 2019

Это можно объяснить, просто взглянув на то, как работает функция перераспределения.Причина этого заключается в том, что вызов df.repartition(COL, numPartitions=k) создаст информационный кадр с k разделами, использующими разбиение на основе хеша.Pyspark будет проходить через каждую строку и применять следующую функцию , чтобы определить, где закончится элемент в текущей строке:

partition_the_row_belongs_to = hash(COL) % k

k в этом случае используется для отображениястроки в пространство, состоящее из k разделов.Как видите, бывают случаи, когда хеш-функции сталкиваются.Иногда некоторые разделы будут пустыми, в то время как другие содержат слишком много элементов.Это может быть из-за выводов хэш-карты или из-за хэш-функции.В любом случае причина того, что вы видите, состоит в том, что перераспределение создало 3 раздела, как вы и просили, это не обещает вам ничего о балансировке разделов или о том, что все разделы не пусты.Если вы хотите иметь больше контроля над тем, как выглядят получающиеся разделы, посмотрите на partitionby .

См. Также: этот вопрос и этот вопрос .

Надеюсь, это поможет.

0 голосов
/ 23 апреля 2019

Стоит отметить, что, поскольку Spark все время работает в масштабе, это маловероятный сценарий для беспокойства.Самое близкое, что вы можете получить, это перекос данных.Диапазон даст другое начальное разбиение, чем перераспределение, которое будет использовать хеширование.Также комментарий к размеру партии действителен, но на практике менее актуален.

...