Как обрабатывать данные параллельно, но записывать результаты в один файл в spark

У меня есть работа в Spark, которая:

  • Читает данные из hdfs
  • Делает некоторую интенсивную трансформацию без перетасовки и агрегации (только операции с картой)
  • Записывает результаты обратно в hdfs

Скажем, у меня есть 10 ГБ необработанных данных (40 блоков = 40 входных разделов), что дает 100 МБ обработанных данных. Чтобы избежать создания большого количества маленьких файлов в hdfs, я использую оператор coalesce (1) для записи одного файла с результатами. При этом выполняется только 1 задача (из-за «coalesce (1)» и отсутствия перетасовки), которая обрабатывает все 10 ГБ в одном потоке.

Есть ли способ выполнить фактическую интенсивную обработку в 40 параллельных задачах и уменьшить количество разделов прямо перед записью на диск и избежать перетасовки данных?

У меня есть идея, которая может сработать - кэшировать фрейм данных в памяти после всей обработки (подсчитать, чтобы Spark кэшировал данные), а затем поставить "coalesce (1)" и записать фреймворк на диск.

1
0
410
1

Ответы 1

Документация четко предупреждает об этом поведении и предлагает решение:

However, if you're doing a drastic coalesce, e.g. to numPartitions = 1, this may result in your computation taking place on fewer nodes than you like (e.g. one node in the case of numPartitions = 1). To avoid this, you can call repartition. This will add a shuffle step, but means the current upstream partitions will be executed in parallel (per whatever the current partitioning is).

Так что вместо

coalesce(1)

ты можешь попробовать

repartition(1)

Спасибо! это действительно имеет смысл :)

ArtemArapov 31.10.2018 14:28

Другие вопросы по теме