Spark executor зависает при чтении двоичных файлов - PullRequest
0 голосов
/ 03 октября 2018

Мы используем Spark 2.1.0 на Yarn для пакетной обработки многострочных записей.Наша работа написана в Pyspark и выполняется один раз в день.Входная папка содержит ~ 45000 очень маленьких файлов (диапазон от 1 до 100 КБ для каждого файла), всего ~ 2 ГБ.

Каждый файл содержит различное количество многострочных записей.Первая строка записи имеет стандартный шаблон, временную метку, за которой следует греческий µ, и некоторую другую информацию.Например:

28/09/2018 08:54:22µfirst record metadata
first record content with
undefined
number of
lines
28/09/2018 08:57:12µsecond record metadata
second record content
with a different
number of lines

Вот как мы читаем файлы в нашем Dataframe:

df=spark.sparkContext.binaryFiles(input_path).toDF(['filename', 'content'])
raw = df.select('filename', explode(split(df.content, r'(?=\d{2}\/\d{2}\/\d{4} \d{2}:\d{2}:\d{2}µ)'))).cache()

Вывод первой строки - это кадр данных с одной записью для каждого файла, вывод второй строки:фрейм данных с одной записью для каждой записи.Затем данные кэшируются, и выполняются другие операции.

На самом деле мы тестируем решение, и это текущий режим развертывания для задания (однако требования к памяти слишком велики):

spark2-submit --master yarn \
  --conf spark.kryoserializer.buffer.max=1g \
  --deploy-mode cluster \
  --driver-memory 16g \
  --driver-cores 1 \
  --conf spark.yarn.driver.memoryOverhead=1g \
  --num-executors 20 \
  --executor-memory 16g \
  --executor-cores 1 \
  --conf spark.yarn.executor.memoryOverhead=1g \
  spark_etl.py

Работа выполняется нормально почти каждый день, и она выполняет все свои операции за 10-15 минут, записывая результаты в HDFS.

Проблема в том, что один раз каждые 7-10 дней один из ~ 45000 входных файлов имеетсовершенно другой размер по сравнению с другими: от 100 МБ до 1 ГБ (в любом случае, менее 2 ГБ).В этом случае наша работа (в частности, один из исполнителей) зависает и, кажется, все время ничего не делает.После первых минут нет новых строк журнала.Это занимает часы, и мы никогда не видели конца этой работы, потому что мы должны убить их раньше, чем через несколько часов.Мы подозреваем, что это из-за «большого» файла, на самом деле, задание работает нормально, если мы удалим его из входной папки.Это скриншоты, сделанные с нашего последнего запуска: enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

PysparkПримечания к документации «Небольшие файлы предпочтительны, большой файл также допустим, но может привести к снижению производительности».Мы можем принять ухудшение производительности, но мы думаем, что это не так, потому что нам кажется, что работа просто ничего не делает в течение всего времени.

Является ли файл 200 МБ действительно «большим файлом» вИскровая точка зрения?Если да, как мы можем улучшить показатели нашей работы или хотя бы понять, действительно ли она что-то делает?

Спасибо

1 Ответ

0 голосов
/ 26 июня 2019

Может быть, вам стоит улучшить количество ядер исполнителя.Двоичные файлы создают BinaryFileRDD, а BinaryFileRDD получает количество разделов в зависимости от процессорных процессоров.

// setMinPartitions below will call FileInputFormat.listStatus(), which can be quite slow when
// traversing a large number of directories and files. Parallelize it.
conf.setIfUnset(FileInputFormat.LIST_STATUS_NUM_THREADS,
      Runtime.getRuntime.availableProcessors().toString)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...