最好的方法是尝试一下,看看我的结果。
但在尝试之前,我的猜测是,即使你的配置中只能分配 80 个完整块,你也可以分配超过 80 个非空文件。这是因为我认为 HDFS 每次分配非空文件时都不会使用完整块。换句话说,HDFS 块不是一个存储分配单元,而是一个复制单元。我认为 HDFS 的存储分配单位是底层文件系统的单位(如果你使用 ext4 的块大小为 4 KB,并在复制因子为 3 的集群中创建一个 1 KB 的文件,则消耗 3 倍 4 KB = 12 KB 的硬盘空间)。
足够的猜测和思考,让我们尝试一下。我的实验室配置如下:
- hadoop 版本 1.0.4
- 4个数据节点,每个节点的可用空间略小于5.0G,ext4块大小为4K
- 块大小为 64 MB,默认复制为 1
启动 HDFS 后,我有以下 NameNode 总结:
- 1 个文件和目录,0 个块 = 1 个总计
- 使用的 DFS:112 KB
- 剩余 DFS:19.82 GB
然后我执行以下命令:
hadoop fs -mkdir /test
for f in $(seq 1 10); do hadoop fs -copyFromLocal ./1K_file /test/$f; done
有了这些结果:
- 12 个文件和目录,10 个块 = 总共 22 个
- 使用的 DFS:122.15 KB
- 剩余 DFS:19.82 GB
所以这10个文件没有消耗10倍64 MB(没有修改“DFS Remaining”)。