Как быстрее обрабатывать файлы .gz в spark scala? - PullRequest
0 голосов
/ 09 января 2020

Я читаю файл .gz как

val df = spark.read..format("csv")
    .option("header", "true")
    .option("delimiter", "|")
    .load("filepath.gz")

df.createOrReplaceTempView("df")

Когда я выполняю обработку, это занимает много времени. Как это можно минимизировать?

Ответы [ 5 ]

0 голосов
/ 21 января 2020

Используйте разделяемый GZIP-код c. См https://github.com/nielsbasjes/splittablegzip/issues/2

0 голосов
/ 11 января 2020

.gzip не подходит для использования с Spark, так как код сжатия c не разделяется. Итак, Spark должен обрабатывать его на одном узле, и он всегда будет медленным.

Если возможно, я бы порекомендовал изменить код сжатия c на другой, который можно разделить, или предварительно обработать файлы вне Spark, чтобы преобразовать их в другой формат, прежде чем пытаться обрабатывать их с помощью Spark. , Например, вы можете написать небольшой сценарий оболочки, который распаковывает и конвертирует ваши файлы перед попыткой их чтения с помощью Spark.

См. Это для получения дополнительной информации о форматах сжатия: http://comphadoop.weebly.com/

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

Я бы порекомендовал использовать Parquet со сжатием Snappy для лучшей производительности.

0 голосов
/ 09 января 2020

Итак. Обычно, когда речь идет о производительности, есть несколько способов улучшения:

  1. Получение более или более мощного оборудования
  2. Использование облака для получения более мощного оборудования
  3. Предоставление большего количества ресурсов для твоя работа.
  4. Оптимизируйте свой код.

В вашем случае вы вряд ли сможете что-либо оптимизировать в коде - только один файл, только одна операция. Так что 4 - нет - go.

Увеличение числа ядер вряд ли может быть лучше по тем же причинам. Хотя вы можете попробовать это. (3) То же самое относится и к памяти.

Таким образом, в основном остаются только первые два варианта.

0 голосов
/ 09 января 2020

Как сказано в комментариях для пояснения ... вы должны обратить внимание на более быстрое хранилище (HDSF, S3, Alluxio ...), чтобы получить более высокую производительность.

Большую часть времени вы тратите на доступ к файлу данных в облачном хранилище.

0 голосов
/ 09 января 2020

Если ваши данные хранятся в одном CSV-файле, они обрабатываются одним работником. Чтобы извлечь выгоду из массивной параллельной обработки, вы должны разделить ваши данные на несколько файлов или использовать формат разделяемых файлов (например, OR C или Parquet).

Чтобы разделить один файл на несколько файлов, вы можете использовать repartition, например так :

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