Мы используем 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 ГБ).В этом случае наша работа (в частности, один из исполнителей) зависает и, кажется, все время ничего не делает.После первых минут нет новых строк журнала.Это занимает часы, и мы никогда не видели конца этой работы, потому что мы должны убить их раньше, чем через несколько часов.Мы подозреваем, что это из-за «большого» файла, на самом деле, задание работает нормально, если мы удалим его из входной папки.Это скриншоты, сделанные с нашего последнего запуска:
PysparkПримечания к документации «Небольшие файлы предпочтительны, большой файл также допустим, но может привести к снижению производительности».Мы можем принять ухудшение производительности, но мы думаем, что это не так, потому что нам кажется, что работа просто ничего не делает в течение всего времени.
Является ли файл 200 МБ действительно «большим файлом» вИскровая точка зрения?Если да, как мы можем улучшить показатели нашей работы или хотя бы понять, действительно ли она что-то делает?
Спасибо