загрузить файл паркета и сохранить то же количество разделов hdfs - PullRequest
0 голосов
/ 14 июня 2019

У меня есть файл паркета /df, сохраненный в формате hdf с 120 разделами.Размер каждого раздела в hdfs составляет около 43,5 М.

Общий размер

hdfs dfs -du -s -h /df
5.1 G  15.3 G  /df
hdfs dfs -du -h /df
43.6 M  130.7 M  /df/pid=0
43.5 M  130.5 M  /df/pid=1
...
43.6 M  130.9 M  /df/pid=119

Я хочу загрузить этот файл в Spark и сохранить такое же количество разделов.Однако Spark автоматически загрузит файл в 60 разделов.

df = spark.read.parquet('df')
df.rdd.getNumPartitions()
60

Настройки HDFS:

'parquet.block.size' не задано.

sc._jsc.hadoopConfiguration().get('parquet.block.size')

ничего не возвращает.

'dfs.blocksize' установлен на 128.

float(sc._jsc.hadoopConfiguration().get("dfs.blocksize"))/2**20

возвращает

128

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

Например:

sc._jsc.hadoopConfiguration().setInt("parquet.block.size", 64*2**20)
sc._jsc.hadoopConfiguration().setInt("dfs.blocksize", 64*2**20)

Я понимаю, что 43,5 М вполнениже 128 М. Однако для этого приложения я собираюсь немедленно завершить многие преобразования, которые приведут к тому, что каждый из 120 разделов станет намного ближе к 128 М.

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

Есть ли способ заставить Spark загрузить файл паркета с тем же количеством разделов, которые хранятся в hdfs?

1 Ответ

0 голосов
/ 14 июня 2019

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

https://umbertogriffo.gitbooks.io/apache-spark-best-practices-and-tuning/content/sparksqlshufflepartitions_draft.html

В целом - это Catalyst , который позаботится обо всей оптимизации (включая количество разделов), поэтому, если на самом деле нет веских причин для пользовательских настроек, я бы позволил ему выполнить свою работу. Если какое-либо из преобразований, которые вы используете, является широким, Spark все равно будет перетасовывать данные.

...