Spark分区数为何按32MB分片大小确定?本地模式下分区数计算与dfs.block.size不符问题排查
为什么你的PySpark本地模式下分区数和32MB块大小匹配?
嗨,这问题我之前也碰到过,核心原因其实和本地文件系统的块大小有关,而不是HDFS的dfs.block.size配置,咱们一步步理清楚:
1. PySpark读取文本文件的分区计算逻辑
当你用sc.textFile()读取文件时,Spark底层依赖Hadoop的TextInputFormat来拆分文件,核心规则是:
- 优先读取文件所在文件系统的默认块大小
- 初始分片数按
总文件大小 / 块大小计算,哪怕最后一个分片不足一个块大小,只要有内容就会单独作为一个分区(向上取整) - 同时会参考
minPartitions参数(sc.textFile()的第二个可选参数,本地模式下默认等于CPU核数,也就是你的4核),但如果初始分片数大于minPartitions,就会用初始分片数作为最终分区数
2. 本地文件系统与HDFS的块大小差异
你看到的dfs.block.size=128MB是HDFS的配置,但在本地环境读取本地文件时,Hadoop使用的是LocalFileSystem,它的默认块大小是32MB,这就是关键!
咱们对应你的数据验证:
- 849MB文件:
849 / 32 ≈ 26.53,向上取整正好是27个分区,和你观察到的结果一致 - 2.6GB(2662.4MB)文件:
2662.4 / 32 ≈ 83.2,向上取整就是84个分区,完美匹配你的情况
3. 如何确认本地文件系统的块大小?
你可以在PySpark Shell里执行这段代码查看:
from org.apache.hadoop.conf import Configuration conf = Configuration() print(conf.get("fs.local.block.size"))
默认输出会是33554432,也就是32MB(3210241024=33554432)
4. 调整本地文件分区数的两种方式
如果想要按照自己的需求设置分区数,有两个办法:
- 直接在
sc.textFile()中指定minPartitions参数,比如sc.textFile("your_local_file.txt", 10),强制将分区数设为10 - 修改Hadoop配置中的本地块大小,比如在
spark-defaults.conf里添加spark.hadoop.fs.local.block.size=134217728,将其设置为128MB
内容的提问来源于stack exchange,提问作者Shanif Ansari




