2013-09-26 40 views
2

如果是,HDFS如何將輸入文件分割成N行以供每個映射器讀取?Hadoop:映射器是否並行運行當我們使用NLineInputFormat?

我相信這是不可能的!

當拆分器需要偏移量或字節拆分時,可以在不處理整個輸入文件的情況下拆分。

但是,當'\ n'或換行字符的數量很重要時,在拆分之前需要處理總輸入文件(以計算換行字符)。

回答

4

要使NLineInputFormat正常工作,每個分割都需要知道第N行的起始位置。正如你在Tariq的回答中註釋的那樣,Mapper不能知道第三行(香蕉開始)在哪裏,它從地圖的InputSplit中獲取這個信息。

這在輸入格式的getSplitsForFile方法,其打開每個輸入文件起來,其中每個第N行開始(併產生InputSplit於由Map任務處理)發現字節偏移實際上是照顧。

正如您可以想象的那樣,由於InputFormat需要打開並讀取每個文件以發現拆分邊界,因此這對於大型輸入文件(或大型輸入文件集)並不能很好地擴展。

我從來沒有使用這種輸入格式,但我想它可能是最好的,當你有一個小型的輸入文件中的每一行大量的CPU密集型工作 - 而不是1個mapper做所有的工作對於100個記錄文件,您可以將負載分區到多個映射器(比如10個映射器中的10條線)。

+0

@ beginner1010,@Chris White:很好的問題和答案。我發現這種類型的InputFormat用於Tom White的書中,Hadoop權威指南。他使用它在他的天氣數據示例中的每一行執行'download-decompress-consolidation-recommpress-upload'循環,這是計算密集型並且需要並行處理。該代碼可在本書的附錄-c中找到。 –

0

是的。

這是可能的!

原因:

的機制仍然是相同的,並適用於原始數據。 N in NLineInputFormat表示行數每個映射器接收到的輸入。記錄數量,確切地說。因爲,NLineInputFormat使用LineRecordReader,每行是一個記錄。它不會改變創建分割的方式,通常基於HDFS塊的大小(請記住NLineInputFormat是FileInputFormat系列的成員)。

+0

假設我們有這樣的4行:「apple \ n orange \ n banana \ n cucumber \ n」和N(在NLineInputFormat中)是2,我們也有2臺機器作爲映射器,那麼第一個映射器應該讀取前兩行(蘋果和橙子),第二個地圖應該讀第二行(香蕉和黃瓜)。問題在這裏!第二個mapper如何在輸入文件中找到「banana」作爲第一條記錄? – beginner1010

相關問題