2013-04-09 54 views
0

如果我使用hadoop fs -put filename將一個大小爲117MB的文本文件上傳到HDFS,我可以看到一個datanode包含一個大小爲64.98MB的文件部分(默認文件split大小),另一個數據節點包含大小爲48.59MB的文件部分。fs -put(或copyFromLocal)和數據類型識別

我的問題是這個拆分位置是否以數據感知的方式計算(例如,以某種方式識別文件是文本,因此將文件拆分爲「\ n」)。

我意識到InputFileFormat可以用來告訴運行作業如何以智能方式拆分文件,但由於我沒有在fs -put命令中指定文件類型,我在想如果(以及如果是的話)在這種情況下將進行智能分割。

艾莉

回答

3

我覺得你在這裏混了兩件事情,以下2種類型的分裂是完全分開的:

  1. 分割文件到HDFS塊
  2. 分割文件分發到映射器

而且,不,分割位置不是以數據感知的方式計算的。

現在,默認情況下,如果您使用的是FileInputFormat,那麼這兩種類型的分割類型重疊(因此是相同的)。

但是你總是可以有一種自定義的方式來分割上面的第二個點(或者甚至根本沒有分割,即有一個完整的文件轉到單個映射器)。

此外,您可以更改hdfs塊大小,而不受您的InputFormat分割輸入數據的方式的影響。

這裏需要注意的另一個要點是,雖然文件實際上在獲取HDFS存儲時被破壞,但爲了分發給映射器,文件沒有實際的物理分割,而只是邏輯分裂。

以從here例如:

假設我們想加載一個110MB的文本文件到HDFS。 hdfs塊大小和 輸入拆分大小設置爲64MB。

  1. 映射器的數量基於輸入拆分的數量而不是hdfs塊拆分的數量。

  2. 當我們將hdfs塊設置爲64MB時,它正好是67108864(64 * 1024 * 1024)字節。我的意思是, 文件將從線路中間分開並不重要。

  3. 現在我們有2個輸入分割(所以兩個地圖)。第一塊的最後一行和第二塊的第一行沒有意義。 TextInputFormat是 ,負責讀取有意義的行並將它們提供給地圖作業。 什麼的TextInputFormat所做的是:

    • 在第二塊將尋求它是一個完整的線第二條線,並從那裏閱讀,並給出了第二映射器。
    • 第一個映射器將讀取,直到第一個塊的結尾,並且它將處理(第一個塊的最後一個不完整行+第一個塊的第一個不完整行 )。

更多here

+0

尊敬的阿瑪,非常感謝您的詳細和有益的答覆!我意識到有兩種類型的拆分(HDFS拆分和映射器拆分),但我沒有意識到的是,當映射器拆分由TextInputFormat完成時,HDFS拆分可以(並且將被)重寫。正如你所說的那樣,輸入文件被分割的地方並不重要,因爲如果必要的話,在映射階段這將由TextInputFormat'resplit'進行。所以你可能會遇到這樣一種情況,其中映射程序接收到一個由多個節點發送的文本組合的塊。我有這個權利嗎? – user2262144 2013-04-11 16:52:43

+0

是的,我相信這是正確的。 – Amar 2013-04-11 16:59:04