2017-02-24 65 views

回答

5
  • 默認情況下,典型的Mapreduce作業遵循每個映射器的一個輸入拆分。
  • 如果文件大小大於分割大小(即,它比一個輸入分割具有更多 ),則它是每個文件的多個映射器。
  • 這是一個文件每個映射器,如果該文件不可拆分像Gzip 文件或如果進程是Distcp其中文件是最好的粒度級別。
+1

我明白了,所以我認爲輸入單據可以有來自多個文件的數據嗎?這意味着一個映射器可以同時處理多個文件。 – user3396729

+1

不,分裂在文件級完成。每個文件至少有一個輸入分割,並且不能有多個文件組成。如果你有2個文件,一個是192MB,另一個是32MB,分割大小是128MB,結果將是3(2 + 1)個輸入分割,這將運行3個地圖任務。儘管較大文件的第二個分割小於分割大小,但它不會與其他文件的分割合併。 – franklinsijo

+1

因此,如果拆分是在文件級別完成的,並且沒有拆分可以由多重文件組成,這意味着一個映射器將只有單個文件的數據?一個映射器只能用於一個文件的數據,對嗎? – user3396729

2

如果你去的FileInputFormat的定義,你會看到在頂部有三個方法:

addInputPath(JobConf的conf,路徑路徑) - 一個路徑添加到map-reduce作業的輸入列表。因此,將拿起目錄中的所有文件,而不是單一的一個,就像你說的

addInputPathRecursively(名單結果,文件系統FS,路徑路徑,PathFilter輸入過濾器) - 在輸入路徑遞歸添加文件到結果。

addInputPaths(JobConf的conf,字符串commaSeparatedPaths) - 添加指定用逗號分隔的路徑輸入列表的地圖,減少工作

輕鬆操作這三個方法,你可以設置任何你想要的多種輸入。然後您的InputFormat的InputSplits開始在映射器作業之間拆分這些數據。 Map-Reduce框架依賴於作業的InputFormat:

  • 驗證作業的輸入規範。

  • 將輸入文件拆分爲邏輯InputSplits,然後將每個輸入文件分配給單獨的Mapper。

  • 提供RecordReader實現,用於從邏輯InputSplit收集輸入記錄以供Mapper處理。

因此,技術上來說,單個映射器將只處理它自己的部分,它可以包含來自多個文件的數據。但是對於每種特定的格式,您應該查看InputSplit以瞭解數據如何在映射器中分佈。

+0

不,一次映射器不能處理多個文件。單個mapreduce作業可以一次處理多個文件。所有這些路徑定義都與工作有關,而與任務無關。 – franklinsijo

+0

@franklinsijo我們可能會誤解OP在一次處理多個文件時的含義。我的意思是它可以處理來自輸入的多個文件。這個總輸入將被分成幾部分,每個映射器將處理它自己的部分,但不是一次處理幾個部分。這就是我的答案。 – Alex

+0

是「不是一次」,您可能必須在答案中更改該部分。 OP想知道映射器而不是作業本身'映射器是否處理多個文件'? 。 – franklinsijo

相關問題