Спарк Паркет Чтение спектакля - PullRequest
1 голос
/ 31 января 2020

У меня есть данные за месяц, хранящиеся в HDFS. 31 папка каждая представлена ​​по дате в формате yyyy-mm-dd. Например: 2020-01-30

Каждые 5 минут мы будем получать данные и будем сохранять данные, используя spark append mode в виде файлов паркета. Так за час 12 файлов и за день 288 файлов. поэтому каждая папка содержит около 288 паркетных файлов. Таким образом, в январе месяце речь идет о 8928(31*288) паркетных файлах.

Я буду читать данные с использованием spark.

Чтение этих файлов приведет к проблемам с производительностью?

Также если я веду файл на каждый день. Допустим, каждый день содержит только одну паркетную папку, а за январь месяц 31 паркетные файлы.

Есть ли увеличение производительности, если я это сделаю?

Ответы [ 2 ]

1 голос
/ 31 января 2020

Определенно ваша производительность увеличится, если вы сможете агрегировать данные за один день в меньшем количестве файлов. В зависимости от размера каждого файла и количества исполнителей / ядер, которые есть в вашей работе Spark, вы найдете нужное количество разделов. Если вы напишите подробности о ваших данных, такие как размер, количество столбцов, количество записей в день и тип столбцов (String, date, int, et c ..), мы сможем сообщить вам предложенное оптимальное число для агрегируйте ваши данные за день или час.

Я обычно делю по дням:

../my_parquet_table/year=2020/month=01/day=31/*.parquet

На этом уровне я обычно сохраняю все паркетные файлы меньшего размера блока (256 МБ в моем случае) .

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

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

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

Еще один обходной путь: если вы хотите сделать это одним скриптом без проблем с производительностью, загрузите небольшие файлы паркета как есть, затем используйте объединение или перераспределение, чтобы создать меньше разделов, что, в свою очередь, ускоряет обработку. Делайте выбор аккуратно, если вы хотите использовать перераспределение или объединение.

Я могу поделиться здесь фрагментом кода, чтобы сделать это,

data  = spark.read.parquet("/my_parquet_table/year=2020/month=01/day=31/")
pdata = data.reshuffle(5)   # here number of partition I put 5, but you can determine this number per data you receive every day

#use pdata for further operation

Итак, в конце у вас есть два варианта: создать отдельный Сценарий, который объединит небольшой файл паркета в один файл или, если вы не хотите делать это отдельно, перераспределяет или объединяет данные в меньшее количество разделов и обрабатывает данные.

...