我正在对 hdfs 中的块大小 (dfs.block.size) 和行组大小 (parquet.block.size) 进行一些实验。
我在 hdfs 中有大量数据,我想复制具有各种块大小和行组大小的数据以进行测试。我可以使用以下方法复制具有不同块大小的数据:
hdfs dfs -D dfs.block.size=67108864 -D parquet.block.size=67108864 -cp /new_sample_parquet /new_sample_parquet_64M
但只有 dfs.block.size 被改变。我正在验证hdfs dfs -stat
块大小和parquet-tools meta
行组大小。事实上,如果我用它替换parquet.block.size
它blah.blah.blah
也有同样的效果。我什至进入 spark-shell 并parquet.block.size
使用手动设置属性
sc.hadoopConfiguration.setInt("parquet.block.size", 67108864).
我正在使用 hadoop 3.1.0。我parquet.block.size
从这里得到了属性名称。
这是我尝试输出的前 10 行
row group 1: RC:4140100 TS:150147503 OFFSET:4
row group 2: RC:3520100 TS:158294646 OFFSET:59176084
row group 3: RC:880100 TS:80122359 OFFSET:119985867
row group 4: RC:583579 TS:197303521 OFFSET:149394540
row group 5: RC:585594 TS:194850776 OFFSET:213638039
row group 6: RC:2620100 TS:130170698 OFFSET:277223867
row group 7: RC:2750100 TS:136761819 OFFSET:332088066
row group 8: RC:1790100 TS:86766854 OFFSET:389772650
row group 9: RC:2620100 TS:125876377 OFFSET:428147454
row group 10: RC:1700100 TS:83791047 OFFSET:483600973
如您所见,TS(总大小)远大于 64MB(67108864 字节)
我目前的理论:
我在 spark-shell 中这样做:
sc.hadoopConfiguration.setInt("parquet.block.size", 67108864)
val a = spark.read.parquet("my_sample_data")
a.rdd.getNumPartitions // 1034
val s = a.coalesce(27)
s.write.format("parquet").mode("Overwrite").options(Map("dfs.block.size" -> "67108864")).save("/my_new_sample_data")
所以也许是因为我的输入数据已经有 1034 个分区。我真的不确定。我的数据每行大约有 118 列。