2016-09-18 46 views
1

請說明MapReduce一對多處理多個輸入文件

我有一組具有特定名稱的輸入文件(比如說10)。我一次對所有文件運行字數統計作業(輸入路徑是文件夾)。我期待與輸入文件具有相同名稱的10個輸出文件。即應該計數File1輸入,並應將其存儲在具有「file1」名稱的單獨輸出文件中。等到所有文件。

+1

請澄清... –

+0

你有Infile1,Infile2,...,Infile10輸入文件和Outfile1,Outfile2,...,Outfile10作爲輸出文件。完全喜歡這種模式? – abhiieor

+0

準確要求 - 隨機名稱格式的文件 - Y_XVHD_AWIFS_xxxx_20160821_124309,N_XVHG_AWIQS_xxxx_20160821_124339根據文件內容,我將在現有的文件名中附加另一個字符串。我希望文件與輸入文件名相同,或者我可以根據內容更改文件名。如果我改變它,我會追加一個常量字符串到存在的文件名。 –

回答

0

有可以採取的實現多路輸出

2層的方法
  1. 使用MultipleOutputs類 - 指該文件有關multipleclassoutput(https://hadoop.apache.org/docs/r2.6.3/api/org/apache/hadoop/mapreduce/lib/output/MultipleOutputs.html),信息有關如何實施參照本http://appsintheopen.com/posts/44-map-reduce-multiple-outputs

  2. 更多信息
  3. 另一個選擇是使用LazyOutputFormat,但是,這與多個輸出結合使用,關於其實現的更多信息,請參閱本文(https://ssmolen.wordpress.com/2014/07/09/hadoop-mapreduce-write-output-to-multiple-directories-depending-on-the-reduce-key/)。

我覺得使用LazyOutputFormat和MultipleOuputs類是更好的方法。

0
  1. 設置減少任務的數量等於輸入文件的數量。這也會創建給定數量的輸出文件。

  2. 爲每個地圖輸出鍵(單詞)添加文件前綴。例如,當你在名爲「file0.txt」的文件中遇到單詞「cat」時,你可以發出密鑰「0_cat」或「file0_cat」或其他任何對「file0.txt」唯一的鍵。使用上下文來獲取每次文件名。

  3. 覆蓋默認的分區程序,確保所有帶有前綴「0_」或「file0_」的映射輸出鍵都將轉到第一個分區,所有帶有前綴「1_」或「file1_」的鍵將轉到第二個等。

  4. 在reducer中,從輸出鍵中刪除「x_」或「filex_」前綴,並將其用作輸出文件的名稱(使用MultipleOutputs)。否則,如果您不需要MultipleOutputs,那麼您可以通過檢查分區程序代碼輕鬆地執行outputfiles和輸入文件之間的映射。 (例如,部分00000將是分區0的輸出)