2014-01-22 156 views
6

我明白HDFS中小文件和小塊大小的缺點。我試圖瞭解默認64/128 MB塊大小的基本原理。是否有任何大塊大小的弊端(比如說2GB),我讀到的值大於這個值,這是我尚未挖掘的細節。HDFS中的最佳塊大小 - 可能造成大塊大小

問題我有過大的塊大小看(請糾正我,可能會有一些或所有這些問題確實不存在) -

  1. 可能的話,則可能是複製一個1千兆的問題文件當一個數據節點出現故障時 - 這需要羣集傳輸整個文件。這似乎是一個問題,當我們正在考慮一個單一的文件 - 但我們可能需要傳輸很多較小的文件,如果我們有更小的塊大小說128 MB(我認爲涉及更多開銷)

  2. 可能麻煩映射器。大塊可能以每個映射器結束,從而減少映射器的可能數量。但是,如果我們使用較小的拆分尺寸,這應該不是問題?

  3. 它聽起來很愚蠢,當我想到這可能是一個問題,但我想我會拋出它 - 因爲namenode事先不知道文件的大小,所以它可能會考慮一個數據節點不可用,因爲它沒有足夠的磁盤空間用於新塊(考慮到大塊大小可能是1-2Gig)。但可能是它通過減少特定塊的塊大小巧妙地解決了這個問題(這可能是一個不好的解決方案)。

塊大小可能可能取決於用例。我基本上想找到一個問題的答案 - 是否有一個情況/使用情況下,大塊設置可以傷害?

任何幫助表示讚賞。提前致謝。

+0

我想這可能是傳輸文件到客戶端和從客戶端傳輸文件的問題。我認爲如果發生大塊失敗可能會導致代價高昂。 –

回答

2

我對hadoop上的高端羣集進行了廣泛的性能驗證,並且我們將塊大小從64兆變爲2GB。爲了回答這個問題:想象一下通常需要處理小文件的工作負載,比如10個Megs。在這種情況下,你認爲哪個blockize會更高性能 - 64MEg或1024Meg?

對於大文件的情況,是的大塊大小趨於更好的性能,因爲映射器的開銷不可忽略。

+0

非常感謝您的回覆。在你描述的情況下,你應該保持在64M。但是不能通過設置輸入分割大小來實現?當我想運行mapreduce作業將一些avro文件索引到SolR時,我開始研究這個問題。這些文件可能太大。所以,我最終決定使用文件特定的塊大小。我想分享的一些信息 - 在測試中,我將塊大小從64M改爲115Gig。 (不是我想要使用大的塊大小)在115G之後,它出錯了,因爲它無法獲得最小的1的複製。這個數字應該是特定於簇的 –

+0

我想知道是否可以獲得更高效的簇具有最大可能的塊大小,然後使用輸入分割大小來控制映射器的數量。 –

+0

是的,爲小文件保留小塊大小爲64Meg,但爲只處理較大文件的作業設置較高的最小分割大小。你不能走另一條路 - 即,大塊大小,但然後嘗試有小分裂的映射工作。 – javadba