Hadoop如何针对每个文件单独设置block size(块大小)
Hadoop 单个文件自定义专属块大小操作方法
Hadoop 默认的块大小为全局配置,存储在 hdfs-site.xml 的 dfs.blocksize 参数中,同时支持针对单个文件单独指定块大小,无需修改全局配置,具体操作方式如下:
命令行上传时指定块大小
上传文件时在 hdfs dfs -put 命令前追加 -D dfs.blocksize=<块大小值> 参数即可,仅对本次上传的文件生效,块大小支持直接写单位(B/KB/MB/GB),也可写字节数:
- 500MB 文件设置 250MB 块大小:
hdfs dfs -D dfs.blocksize=250M -put ./local_500MB_file /hdfs/target/path - 600MB 文件设置 300MB 块大小:
hdfs dfs -D dfs.blocksize=300M -put ./local_600MB_file /hdfs/target/path
Java API 上传时指定块大小
调用 FileSystem 类的 create 方法时直接传入 blockSize 参数(单位为字节)即可,示例代码:
Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(conf); Path hdfsPath = new Path("/target/hdfs/path"); // 250MB 对应字节数为 250 * 1024 * 1024 = 262144000 FSDataOutputStream outputStream = fs.create(hdfsPath, true, 4096, (short) 3, 262144000L); // 写入文件内容逻辑 // ... outputStream.close(); fs.close();
DistCp 拷贝时修改块大小
如果是已经存储在 HDFS 的文件需要调整块大小,可以用 DistCp 工具拷贝时重新指定块大小,旧文件可删除:hadoop distcp -D dfs.blocksize=300M /old/path/file /new/path/file
注意事项
- 块大小必须为字节整数倍,建议优先选择 128MB、256MB、512MB 这类 2 的整数次幂数值,自定义非 2 次幂数值可正常生效,但存在轻微性能损耗。
- 已经上传完成的 HDFS 文件无法直接修改块大小,必须重新上传或通过 DistCp 拷贝生成新文件的方式调整。
- 若设置的块大小大于文件本身大小,该文件只会生成 1 个数据块,不会占用额外存储空间。
内容的提问来源于stack exchange,提问作者ninjacoder
相关产品推荐
相关产品推荐

