Как spark Executor сохраняет данные, когда переключается на обработку другого раздела? - PullRequest
0 голосов
/ 06 октября 2019

Например, у меня есть только 1 исполнитель с памятью 4G, и 100 разделов partitons.each нужно обрабатывать до 2G данных.

Я вызову функцию map на фрейме данных. В функции map этобудет читать файл паркета из хранилища s3, десериализовать его в объект (через thrift api) и вернуть переменную-член объекта (тип bytearray)

, наконец, я вызову df.write.mode("overwrite").parquet(write_path) для записи в другой файл паркета.

У меня такой вопрос: когда исполнитель переключается на другой раздел для запуска функции карты, нужно ли ему «сохранять» данные текущего раздела в памяти или на диске?

Я полагаю, это будет напрямуюзаписывать данные в новый файл паркета вместо сохранения данных текущего раздела (запись паркета также является функцией, подобной карте?)

в противном случае я понятия не имею, как она сохраняет такой огромный объем данных (100x2g = 200G)

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Здесь есть два отдельных вопроса.

  1. когда исполнитель переключается на другой раздел для запуска функции карты, нужно ли ему сохранять данные текущего раздела в памяти или на диске?

Ответ - да. Spark требуется один раздел для размещения в памяти, то есть когда исполнитель будет работать с разделом, он полностью его загрузит. Ранее обработанные разделы будут сохранены в памяти / диске в энергозависимом формате, что означает, что они не будут доступны для различных преобразований (см. кеш , чтобы исправить это).

Я предполагаю, что он будет напрямую записывать данные в новый файл паркета вместо сохранения данных текущего раздела (запись в паркет также является функцией, подобной карте?)

Вопрос не в том, является ли паркетподобная карте функция, но есть ли случайная граница между преобразованием и записью. То, как это работает, заключается в том, что все последующие преобразования, которые не требуют перемешивания формы stage , и исполнитель будет запускать раздел через всю стадию каждый раз, когда он загружается в память. Таким образом, если между преобразованием и записью нет случайной границы, каждый раздел будет записан отдельно. В этом легко убедиться, используя график исполнения Spark (первый удар по Google).

0 голосов
/ 06 октября 2019

Действие Apache spark запускает запуск задания Spark, каждый исполнитель считывает несколько блоков данных (количество блоков будет равно количеству ядер в исполнителе) и обрабатывает их параллельно.

Apache Sparkне загружает все в память, чтобы иметь возможность обрабатывать его. Это связано с тем, что Spark будет разбивать данные на более мелкие блоки и работать с ними отдельно, когда Apache spark читает файл (блок за блоком и распределяется по вашим узлам), обрабатывает сопоставление данных в памяти и затем снова сохраняет его в хранилище.

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