У меня есть файл паркета /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?