Решение небольшой проблемы с файлом в pyspark - PullRequest
0 голосов
/ 02 мая 2020

Я читаю из многораздельной таблицы, в которой содержится около 4 миллиардов записей. Файлы, из которых я читаю, являются моими источниками, и я не могу контролировать их, чтобы изменить записи.

При чтении файлов через кадры данных для каждого раздела я создаю 2000 файлов размером менее 2 КБ. Это происходит из-за того, что раздел shuffle установлен на 2000, чтобы увеличить скорость выполнения.

Для решения этой проблемы следовал подход:

Я зациклился на пути таблицы HDFS, после того как его выполнение завершено, поскольку он создал список с путями данных [/dv/hdfs/..../table_name/partition_value=01,/dv/hdfs/..../table_name/partition_value=02..]

Для каждого такого пути я вычислил использование диска и размер блока из кластера и получил соответствующее количество разделов как no_of_partitions = ceil[disk_usage / block size], а затем записал данные в другое место с таким же значением partition_id, как [/dv/hdfs/..../table2_name/partition_value=01].

Теперь, несмотря на то, что это позволяет уменьшить размер небольших файлов до среднего размера блока 82 МБ с 2 КБ, на раздел требуется около 2,5 минут. Поскольку доступно 256 таких разделов, выполнение процесса занимает более 10 часов.

Пожалуйста, предложите любой другой метод, где это может быть достигнуто менее чем за 2 часа времени.

1 Ответ

0 голосов
/ 02 мая 2020

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

Теперь, чтобы управлять проблемой небольших файлов, вы можете сделать следующее:

При записи фрейма данных в hdfs перераспределите его на основе количество разделов и управление количеством выходных файлов на раздел

df.repartition(partition_col).write.option("maxRecordsPerFile", 100000).partition_by(partition_col).parquet(path)

Это создаст файлы, имеющие 100000 записей в каждом разделе. Следовательно, решение вашей маленькой проблемы с файлами. Это улучшит общую производительность чтения и записи вашей работы.

Надеюсь, это поможет.

...