我覺得你在這裏混了兩件事情,以下2種類型的分裂是完全分開的:
- 分割文件到HDFS塊
- 分割文件分發到映射器
而且,不,分割位置不是以數據感知的方式計算的。
現在,默認情況下,如果您使用的是FileInputFormat
,那麼這兩種類型的分割類型重疊(因此是相同的)。
但是你總是可以有一種自定義的方式來分割上面的第二個點(或者甚至根本沒有分割,即有一個完整的文件轉到單個映射器)。
此外,您可以更改hdfs塊大小,而不受您的InputFormat
分割輸入數據的方式的影響。
這裏需要注意的另一個要點是,雖然文件實際上在獲取HDFS存儲時被破壞,但爲了分發給映射器,文件沒有實際的物理分割,而只是邏輯分裂。
以從here例如:
假設我們想加載一個110MB的文本文件到HDFS。 hdfs塊大小和 輸入拆分大小設置爲64MB。
映射器的數量基於輸入拆分的數量而不是hdfs塊拆分的數量。
當我們將hdfs塊設置爲64MB時,它正好是67108864(64 * 1024 * 1024)字節。我的意思是, 文件將從線路中間分開並不重要。
現在我們有2個輸入分割(所以兩個地圖)。第一塊的最後一行和第二塊的第一行沒有意義。 TextInputFormat是 ,負責讀取有意義的行並將它們提供給地圖作業。 什麼的TextInputFormat所做的是:
- 在第二塊將尋求它是一個完整的線第二條線,並從那裏閱讀,並給出了第二映射器。
- 第一個映射器將讀取,直到第一個塊的結尾,並且它將處理(第一個塊的最後一個不完整行+第一個塊的第一個不完整行 )。
更多here。
尊敬的阿瑪,非常感謝您的詳細和有益的答覆!我意識到有兩種類型的拆分(HDFS拆分和映射器拆分),但我沒有意識到的是,當映射器拆分由TextInputFormat完成時,HDFS拆分可以(並且將被)重寫。正如你所說的那樣,輸入文件被分割的地方並不重要,因爲如果必要的話,在映射階段這將由TextInputFormat'resplit'進行。所以你可能會遇到這樣一種情況,其中映射程序接收到一個由多個節點發送的文本組合的塊。我有這個權利嗎? – user2262144 2013-04-11 16:52:43
是的,我相信這是正確的。 – Amar 2013-04-11 16:59:04