пишите небольшие файлы в формате hdf или используйте coalesce - PullRequest
0 голосов
/ 12 сентября 2018

Я использую sql spark для чтения и записи файлов в формате hdf, используя следующий код:

val df = spark.read.parquet("D:/resources/input/address/year_month_day=2018-07-02")
val df.write.mode("overwrite").parquet("D:/resources/output/t_kcdo_person")

Результат написания много маленьких файлы , Согласно тому, что я изучаю, не рекомендуется, чтобы файлы имели размер меньше 128 МБ. Я искал способы иметь меньше файлов, но с большим размером, и я нашел функцию df.coalesce, но у меня есть вопрос, целесообразно ли использовать эту функцию, потому что это позволит избежать параллелизма.

1 Ответ

0 голосов
/ 12 сентября 2018

Это известная проблема в Spark. Каждый раздел будет выводить один файл независимо от фактического размера данных. coalesce тоже не серебряная пуля - нужно быть очень осторожным с новым количеством разделов - слишком маленьким, и приложение будет OOM. Вы можете рассчитать вычисление объединенного значения во время выполнения, но в большинстве случаев это будет означать сохранение данных на диске, получение фактического размера и повторное чтение и coalesce до оптимального размера.

В вашем простом примере вы можете получить фактический размер ввода заранее. Но для общего случая есть такие инструменты, как FileCrush , которые работают с вашим выводом (небольшими файлами) и объединяют их в меньшее количество файлов. Но теперь он старый и основан на map-Reduce (все еще работает, хотя). В моей команде мы создали очень простую версию Spark, и вы можете легко создать свою собственную. Если вы это сделаете, не забудьте учитывать кодеки сжатия при расчете оптимального количества разделов.

Также вы правильно беспокоитесь о параллелизме при использовании coalesce. Если это становится проблемой, и у вас есть некоторые вычисления, которые должны выполняться на более высоком уровне параллелизма до coalesce, вы можете использовать что-то вроде spark.createDataFrame(df.rdd, df.schema), чтобы создать новый фрейм данных и избежать слишком сильного опускания coalesce , Однако это имеет важные последствия, которые вам необходимо учитывать.

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