2012-10-22 65 views
16

我們都知道,與傳統文件系統中的塊大小相比,HDFS中的塊大小相當大(64M或128M)。這樣做是爲了減少搜索時間的百分比與傳輸時間的比較(傳輸速率的提高比磁盤搜索時間的提高要大得多,因此設計文件系統時的目標總是減少與要傳輸的數據量相比的搜索數量)。但是這帶來了內部碎片的另一個缺點(這就是爲什麼傳統文件系統塊大小不是很高,並且只有幾KB的量級 - 通常是4K或8K)。HDFS中的大塊大小!未使用的空間如何計算?

我正在閱讀本書 - 權威指南Hadoop,發現在某處寫入的文件比HDFS的塊大小小的文件不佔用完整塊,並且不佔用整個塊的空間,但不能瞭解如何?有人可以請點亮這個。

+0

64MB大小主要是爲了減少網絡流量。由於底層文件系統調用仍然尊重操作系統選擇的大小4K,因此磁盤尋道時間或任何其他優勢都是如此。 – ernesto

回答

18

@Abhishek:在HFDS塊分割只是邏輯地建在底層文件系統的物理塊(例如EXT3 /脂肪)。文件系統在物理上沒有分成塊(比如64MB或128MB(或者可能是塊大小))。這只是將元數據存儲在NameNode中的抽象。由於名稱節點必須將全部元數據加載到內存中,因此元數據條目的數量是有限的,因此需要大塊大小。

因此,存儲在HDFS上的三個8MB文件邏輯上佔用3個塊(namenode中有3個元數據條目),但物理地佔用底層文件系統中的8 * 3 = 24MB空間。

大塊大小是爲了考慮存儲空間的正確使用,同時考慮到namenode的內存限制。

+0

感謝您澄清。這正是我所期待的。 –

+0

@Satbir:我需要澄清一下:三個8MB文件在邏輯上應該只佔用一個正確的塊(因爲HDFS塊大小爲64MB)? –

+0

@brainstorm:三個8 MB文件可佔用3個塊,每個塊的大小爲8 MB。 – Satbir

9

根據Hadoop的 - 權威指南

不同於單個磁盤文件系統,HDFS中的文件比單塊小不佔用底層存儲的整個數據塊的價值。當不合格時,本書中的術語「塊」是指HDFS中的塊。

在HDFS每個塊被存儲爲基礎操作系統的文件系統上的數據節點文件(EXT3,EXT4等)和相應的詳細信息被存儲在名稱節點。我們假設文件大小爲200MB,塊大小爲64MB。在這種情況下,文件將有4個塊,對應於64MB,64MB,64MB和8MB大小的數據節點中的4個文件(假設複製爲1)。

在數據節點AN ls -ltr將顯示塊細節

-rw-RW-R-- 1個訓練訓練21年10月11日15時27 blk_-7636754311343966967_1002.meta
-rw-RW- r-- 1次訓練訓練4月21日15:27 blk_-7636754311343966967
-rw-rw-r-- 1次訓練訓練99年10月21日15:29 blk_-2464541116551769838_1003.meta
-rw-rw-r-- 1訓練訓練11403 10月21日15:29 blk_-2464541116551769838
-rw-rw-r-- 1訓練訓練99 10月21日15:29 blk_-2951058074740783 562_1004.meta
-rw-RW-R-- 1個訓練訓練11544 10月21日15時29 blk_-2951058074740783562

+0

感謝您的回答,但讓我再澄清一點我的問題。假設有3個8MB文件。在這種情況下會發生什麼?他們會佔用HDFS上的3個不同的塊還是具有64M容量的同一個塊能夠容納這些單獨的文件? –

+0

如果HDFS中有三個8MB文件,那麼底層文件系統中會有三個8MB文件(ext3,ext4等)。不同文件的塊默認不合並。如果需要,可以使用[Hadoop存檔](http://hadoop.apache.org/docs/mapreduce/r0.22.0/hadoop_archives.html)將這些文件合併到同一個塊中。它類似於[tar](http://en.wikipedia.org/wiki/Tar_%28file_format%29)。 –

+0

那麼在那種情況下,它與傳統的文件系統有什麼不同?在這種情況下,每個塊中剩餘的56 MB空間正在浪費,即內部碎片正在發生。或者有什麼方法可以證明在使用HDFS時這種情況很罕見? –

1

在正常的文件系統中,如果我們創建一個空白文件,那麼它也會保存4k大小,因爲它存儲在塊中。在HDFS中不會發生,因爲1GB文件只使用1GB內存,而不是4GB。要更清楚。

操作系統:文件大小1KB,塊大小:4KB,使用內存:4KB,浪費:3 KB。 IN HDFS:文件大小1GB,塊大小:4GB,內存使用量:1GB,浪費:0GB,剩餘的3GB可以被其他塊使用。

*不要認真對待數字,他們會編制數字來表達清楚。

如果你有2個不同的1GB的文件,那麼將會有2個1GB的塊。在文件系統中,如果您存儲每個1 KB的2個文件,那麼您將有6KB的4KB + 4KB = 8KB的2個不同的文件。

這使得HDFS比文件系統好得多。但具有諷刺意味的是,HDFS使用本地文件系統,最終會出現同樣的問題。