【发布时间】:2019-10-29 07:41:08
【问题描述】:
我有一个镶木地板文件/df 保存在具有 120 个分区的 hdfs 中。 hdfs上每个分区的大小在43.5M左右。
总大小
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
将这些值中的任何一个更改为更低的值不会导致 parquet 文件加载到与 hdfs 中相同数量的分区中。
例如:
sc._jsc.hadoopConfiguration().setInt("parquet.block.size", 64*2**20)
sc._jsc.hadoopConfiguration().setInt("dfs.blocksize", 64*2**20)
我意识到 43.5 M 远低于 128 M。但是,对于这个应用程序,我将立即完成许多转换,这将导致 120 个分区中的每一个都更接近 128 M。
我正在努力避免在加载后立即在应用程序中重新分区。
有没有办法强制 Spark 加载与存储在 hdfs 上的分区数相同的 parquet 文件?
【问题讨论】:
-
如果您尝试设置此参数会怎样?到 43.5MB(43500000 字节)
spark.conf.set("spark.files.maxPartitionBytes", 43500000) -
不。仍然将其拉入 60 个分区。
标签: apache-spark hadoop pyspark apache-spark-sql parquet