Как обрабатывать данные параллельно, но записывать результаты в один файл в Spark - PullRequest
0 голосов
/ 31 октября 2018

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

  • Считывает данные из hdfs
  • Проводит ли интенсивное преобразование без перемешивания и агрегирования (только операции с картами)
  • Записывает результаты обратно в hdfs

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

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

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

1 Ответ

0 голосов
/ 31 октября 2018

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

Однако, если вы делаете резкое слияние, например, до numPartitions = 1, это может привести к тому, что ваши вычисления будут выполняться на меньшем количестве узлов, чем вам нравится (например, один узел в случае numPartitions = 1). Чтобы избежать этого, вы можете позвонить передел. Это добавит случайный шаг, но означает, что текущие разделы восходящего потока будут выполняться параллельно (независимо от текущего разделения).

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

coalesce(1)

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

repartition(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...