По данным Learning Spark
Имейте в виду, что перераспределение ваших данных является довольно дорогой операцией. Spark также имеет оптимизированную версию
repartition()
call,coalesce()
которая позволяет избежать перемещения данных, но только если вы уменьшаете количество разделов RDD.
Одно из различий, которое я получаю, заключается в том, что с repartition()
количеством разделов можно увеличивать / уменьшать, но с coalesce()
количеством разделов можно только уменьшаться.
Если разделы распределены по нескольким машинам и coalesce()
запущены, как можно избежать перемещения данных?
источник
minimize data movement
а неavoiding data movement
.repartition
следует использовать вместоcoalesce
?repartition
нужно, это вызыватьcoalesce
сshuffle
параметром, установленным в true. Дайте мне знать, если это поможет.shuffle = true
флагомОтвет Джастина потрясающий, и этот ответ углубляется.
repartition
Алгоритм делает полный перетасовать и создает новые разделы с данными, распределенными равномерно. Давайте создадим DataFrame с номерами от 1 до 12.numbersDf
содержит 4 раздела на моей машине.Вот как данные делятся на разделы:
Давайте сделаем полное перемешивание с
repartition
методом и получим эти данные на двух узлах.Вот как
numbersDfR
данные разделены на моей машине:repartition
Метод делает новые разделы и равномерно распределяет данные в новых разделах (распределение данных больше даже для больших наборов данных).Разница между
coalesce
иrepartition
coalesce
использует существующие разделы, чтобы минимизировать объем перемешиваемых данных.repartition
создает новые разделы и делает полное перемешивание.coalesce
приводит к разделам с различными объемами данных (иногда разделам, которые имеют очень разные размеры) иrepartition
приводит к разделам примерно одинакового размера.Есть
coalesce
илиrepartition
быстрее?coalesce
может работать быстрее, чемrepartition
, но разделы неравного размера обычно работают медленнее, чем разделы равного размера. Обычно вам необходимо перераспределить наборы данных после фильтрации большого набора данных. Я обнаружил, чтоrepartition
в целом быстрее, потому что Spark создан для работы с разделами одинакового размера.NB Я с любопытством заметил, что перераспределение может увеличить размер данных на диске . Обязательно запускайте тесты, когда вы используете перераспределение / объединение больших наборов данных.
Прочтите этот пост в блоге, если вы хотите еще больше деталей.
Когда вы будете использовать коалесценцию и передел на практике
источник
rdd.glom().map(len).collect()
но это дает много ошибок OOM.repartition
алгоритм не распределяет данные одинаково для очень маленьких наборов данных. Я имел обыкновениеrepartition
организовывать 5 миллионов записей в 13 разделах, и каждый файл был между 89,3 МБ и 89,6 МБ - это почти равный!Еще один момент, который следует отметить, заключается в том, что основным принципом Spark RDD является неизменность. Перераспределение или объединение создаст новый RDD. Базовый RDD будет продолжать существовать с его первоначальным количеством разделов. Если в случае использования требуется сохранить RDD в кэше, то же самое необходимо сделать для вновь созданного RDD.
источник
repartition
- рекомендуется использовать его при увеличении количества разделов, потому что это предполагает перемешивание всех данных.coalesce
- рекомендуется использовать его при уменьшении количества разделов. Например, если у вас есть 3 раздела и вы хотите уменьшить его до 2,coalesce
данные 3-го раздела будут перемещены в раздел 1 и 2. Раздел 1 и 2 останутся в одном контейнере. С другой стороны,repartition
будет перетасовывать данные во всех разделах, поэтому использование сети между исполнителями будет высоким, и это повлияет на производительность.coalesce
работает лучше, чемrepartition
при сокращении количества разделов.источник
Что следует из кода и документов документа,
coalesce(n)
это то же самое, чтоcoalesce(n, shuffle = false)
иrepartition(n)
то же самое, что иcoalesce(n, shuffle = true)
Таким образом, оба
coalesce
иrepartition
могут быть использованы для увеличения количества разделовЕще одно важное замечание: если вы резко уменьшите количество разделов, вам следует рассмотреть возможность использования перемешанной версии
coalesce
(какrepartition
в этом случае). Это позволит выполнять ваши вычисления параллельно на родительских разделах (несколько задач).Пожалуйста, также обратитесь к соответствующему ответу здесь
источник
Все ответы добавляют некоторые большие знания в этот очень часто задаваемый вопрос.
Так что, согласно традиции графика этого вопроса, вот мои 2 цента.
Я обнаружил, что перераспределение происходит быстрее, чем слияние , в очень конкретном случае.
В моем приложении, когда количество файлов, которые мы оцениваем, ниже определенного порога, перераспределение работает быстрее.
Вот что я имею ввиду
В приведенном выше фрагменте, если мои файлы были меньше 20, coalesce занимал целую вечность, а перераспределение было намного быстрее, и поэтому приведенный выше код.
Конечно, это число (20) будет зависеть от количества работников и количества данных.
Надеюсь, это поможет.
источник
Перераспределение : перетасуйте данные в новое число разделов.
Например. Исходный фрейм данных разделен на 200 разделов.
df.repartition(500)
: Данные будут перетасовываться с 200 разделов на новые 500 разделов.Объединить : перетасовать данные в существующее количество разделов.
df.coalesce(5)
: Данные будут перетасованы из оставшихся 195 разделов в 5 существующих разделов.источник
Я хотел бы добавить к ответу Джастина и Пауэр, что -
repartition
будет игнорировать существующие разделы и создавать новые. Таким образом, вы можете использовать его для исправления перекоса данных. Вы можете упомянуть ключи разделов, чтобы определить распределение. Отклонение данных - одна из самых больших проблем в пространстве проблем «больших данных».coalesce
будет работать с существующими разделами и перетасовывать их подмножество. Это не может исправить перекос данных так же, какrepartition
и. Поэтому, даже если это дешевле, это может быть не то, что вам нужно.источник
Ко всем отличным ответам я хотел бы добавить, что
repartition
это один из лучших вариантов использования распараллеливания данных. Покаcoalesce
это недорогая опция для сокращения разделов, она очень полезна при записи данных в HDFS или другие приемники, чтобы использовать преимущества больших записей.Я нашел это полезным при записи данных в формате паркета, чтобы получить полное преимущество.
источник
Для кого-то, у кого были проблемы с генерацией одного CSV-файла из PySpark (AWS EMR) в качестве вывода и сохранением его на s3, использование перераспределения помогло. Причина в том, что объединение не может сделать полное перемешивание, но перераспределение может. По сути, вы можете увеличить или уменьшить количество разделов, используя перераспределение, но можете только уменьшить количество разделов (но не 1), используя объединение. Вот код для тех, кто пытается записать CSV из AWS EMR в s3:
источник
Проще говоря, COALESCE: - предназначен только для уменьшения количества разделов, без перемешивания данных, он просто сжимает разделы
REPARTITION: - предназначен как для увеличения, так и для уменьшения количества перегородок, но происходит перетасовка
Пример:-
Оба отлично работает
Но обычно мы идем к этим двум вещам, когда нам нужно увидеть выходные данные в одном кластере, мы идем с этим.
источник
Но также вы должны убедиться, что данные, поступающие на объединяющиеся узлы, должны быть хорошо сконфигурированы, если вы имеете дело с огромными данными. Поскольку все данные будут загружены в эти узлы, может возникнуть исключение памяти. Хотя возмещение затратно, я предпочитаю им пользоваться. Так как он перемешивает и распределяет данные одинаково.
Будь мудрым, чтобы выбрать между объединением и переделом.
источник
repartition
Алгоритм делает полную перетасовку данных и создает равные по размеру разделов данных.coalesce
объединяет существующие разделы, чтобы избежать полного перемешивания.Coalesce хорошо работает для получения RDD с большим количеством разделов и объединения разделов на одном рабочем узле для создания окончательного RDD с меньшим количеством разделов.
Repartition
произведет перестановку данных в вашем RDD для получения окончательного количества разделов, которые вы запрашиваете. Разделение DataFrames похоже на детали реализации низкого уровня, которыми должна управлять инфраструктура, но это не так. При фильтрации больших DataFrames в меньшие, вы почти всегда должны перераспределять данные. Вы, вероятно, будете часто фильтровать большие DataFrames в меньшие, так что привыкните к перераспределению.Прочтите этот пост в блоге, если вы хотите еще больше деталей.
источник