2013-02-25 76 views
11

我知道HDFS在數據節點中使用常規linux文件系統存儲數據。我的HDFS塊大小是128 MB。假設我在我的hadoop集羣中有10 GB磁盤空間,這意味着,HDFS最初有作爲可用存儲空間。HDFS塊大小vs實際文件大小

如果我創建了一個說12.8 MB的小文件,#可用的HDFS塊將變爲79.如果我創建另一個小文件12.8 MB,會發生什麼情況? #availbale街區會保持在79點還是會降至78點?在前一種情況下,HDFS基本上根據可用的可用磁盤空間重新計算每個塊分配後的#available塊,因此只有在消耗超過128 MB的磁盤空間後,#available塊纔會變爲78。請澄清。

回答

18

要知道的最好方法就是嘗試一下,看看我的結果在下面。

但在嘗試之前,我的猜測是,即使您只能在配置中分配80個完整塊,您也可以分配超過80個非空文件。這是因爲我認爲每次分配非空文件時HDFS都不會使用完整的塊。換句話說,HDFS塊不是一個存儲分配單元,而是一個複製單元。我認爲HDFS的存儲分配單元是底層文件系統的單位(如果您使用的塊大小爲4 KB的ext4,並且您在複製因子爲3的羣集中創建1 KB文件,則會消耗3次4 KB = 12 KB的硬盤空間)。

足夠的猜測和思考,讓我們試試吧。我的實驗室配置是如下:

  • hadoop的版本1.0.4
  • 4個數據節點,每個節點具有比可用的空間,64 MB 4K
  • 塊大小的EXT4塊大小的5.0G少一點,1

默認複製HDFS開始後,我有以下的NameNode摘要:

  • 1文件和目錄,0塊S = 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剩餘」)。

+0

這就是我猜測的。現在它更清晰。感謝您的詳細解釋和實驗! – sachin2182 2013-02-25 17:45:16

1

HDFS只使用它在本地文件系統上的需求。因此,代表12 MB文件的塊將在存儲時(每個存儲的數據節點上)佔用12 MB。 因此,假設您有足夠空間存儲數據,那麼您將可以擁有儘可能多的塊。

+1

但我認爲HDFS根據#available塊來決定它是否有足夠的可用空間。假設,如果我們擁有128 MB的磁盤空間並創建一個1MB文件,則#available塊變爲0(因爲127 MB不能構成一個完整的HDFS塊),HDFS將無法創建另一個1MB文件,即使存在足夠的磁盤空間。這聽起來正確嗎? – sachin2182 2013-02-25 17:42:19

+0

從我的實驗中,HDFS將嘗試創建塊並在具體節點上的空間不足時返回錯誤。 – 2013-02-25 20:51:34

+0

感謝您的澄清@大衛 – sachin2182 2013-02-25 21:37:39

0

'可用區塊'將保持在79(see this question)。無論如何,我不認爲HDFS根據「可用塊」來決定是否有足夠的可用空間。