我知道HDFS使用数据节点中的常规linux文件系统存储数据。我的HDFS块大小为128 MB
。假设我的hadoop集群中有10 GB
个磁盘空间,这意味着HDFS最初具有80 blocks
作为可用存储空间。
如果我创建一个说12.8 MB
的小文件,那么#available HDFS块将变为79.如果我创建另一个12.8 MB
的小文件会怎样? #availbale区块会保持在79还是会降到78?在前一种情况下,HDFS基本上根据可用的可用磁盘空间重新计算每个块分配后的#available块,因此,只有在消耗了超过128 MB的磁盘空间后,#available块才会变为78。请澄清。
答案 0 :(得分:21)
最好的方法就是尝试一下,看看我的结果。
但在尝试之前,我的猜测是,即使您只能在配置中分配80个完整块,您也可以分配超过80个非空文件。这是因为我认为每次分配非空文件时HDFS都不会使用完整的块。换句话说,HDFS块不是存储分配单元,而是复制单元。我认为HDFS的存储分配单元是底层文件系统的单元(如果使用块大小为4 KB的ext4,并且在复制因子为3的集群中创建1 KB文件,则消耗3倍4 KB = 12 KB的硬盘空间。)
足够的猜测和思考,让我们试一试。我的实验室配置如下:
启动HDFS后,我有以下NameNode摘要:
然后我执行以下命令:
hadoop fs -mkdir /test
for f in $(seq 1 10); do hadoop fs -copyFromLocal ./1K_file /test/$f; done
有了这些结果:
所以10个文件没消耗10倍64 MB(没有修改“DFS剩余”)。
答案 1 :(得分:1)
HDFS仅使用本地文件系统所需的内容。因此,代表12 MB文件的块在存储时将占用12 MB(在存储它的每个datanode上)。 假设您有足够的数据空间,那么您将能够拥有所需的块数。
答案 2 :(得分:0)
'可用积木'将保持在79(see this question)。无论如何,我不认为HDFS会根据“可用块”来判断它是否有足够的可用空间。
答案 3 :(得分:0)
HDFS块大小和Ext块大小不是一回事。最简单的方法就是HDFS块大小是"复制"块大小,而不是"存储"块大小。
对于存储,它将使用与本地文件系统相同的空间量,因为它使用的是什么,但它将复制不少于节点之间的一个块,即使仅使用1KB < / p>