Как разбить паркетные файлы на множество разделов в Spark?

поэтому у меня есть только 1 файл паркета, который я читаю с помощью Spark (используя материал SQL), и я хотел бы, чтобы он обрабатывался с помощью 100 разделов. Я пробовал установить spark.default.parallelism до 100, мы также попытались изменить сжатие паркета на none (от gzip). Независимо от того, что мы делаем, первый этап задания spark имеет только один раздел (как только происходит перетасовка, он перераспределяется на 100, а затем, очевидно, все намного быстрее).

теперь согласно нескольким источникам (как показано ниже) паркет должен быть разбитым (даже при использовании gzip!), поэтому я очень смущен и хотел бы получить совет.

https://www.safaribooksonline.com/library/view/hadoop-application-architectures/9781491910313/ch01.html

Я использую spark 1.0.0 и, по-видимому, значение по умолчанию для spark.sql.shuffle.partitions - 200, так что это не может быть. На самом деле все значения по умолчанию для параллелизма намного больше 1, поэтому я не понимаю, что происходит.

5 ответов


вы должны написать свои паркетные файлы с меньшим размером блока. По умолчанию 128 Мб на блок, но он настраивается с помощью параметра parquet.block.size конфигурация в записи.

источник ParquetOuputFormat здесь, если вы хотите углубиться в детали.

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


возможно, ваш файл паркета занимает только один блок HDFS. Создайте большой файл паркета, который имеет много блоков HDFS и загрузите его

val k = sc.parquetFile("the-big-table.parquet")
k.partitions.length

вы увидите такое же количество разделов, как и блоки HDFS. Это отлично сработало для меня (spark-1.1.0)


Вы упомянули, что вы хотите контролировать распределение во время записи на паркет. При создании паркета из rdds паркет сохраняет перегородки RDD. Итак, если вы создадите RDD и укажете 100 разделов и из dataframe с паркетным форматом, то он будет писать 100 отдельных паркетных файлов в fs. Для чтения вы можете указать .


для достижения этого вы должны использовать SparkContext для настройки конфигурации Hadoop (sc.hadoopConfiguration) собственность mapreduce.input.fileinputformat.split.maxsize.

установив это свойство на более низкое значение, чем hdfs.blockSize, чем вы получите столько разделов, сколько количество расколов.

например:
Когда hdfs.blockSize = 134217728 (128 МБ),
и читается один файл, который содержит ровно один полный блок,
и mapreduce.input.fileinputformat.split.maxsize = 67108864 (64 МБ)

тогда будет два раздела эти расколы будет читать.


новый способ сделать это (Искра 2.x) настройка spark.sql.files.maxPartitionBytes

источник:https://issues.apache.org/jira/browse/SPARK-17998 (официальная документация еще не верна, пропускает .в SQL)

по моему опыту настройки Hadoop больше не действуют.