簡體   English   中英

Hadoop MapReduce - 每個輸入的一個輸出文件

[英]Hadoop MapReduce - one output file for each input

我是Hadoop的新手,我正試圖弄清楚它是如何工作的。 至於練習,我應該實現類似於WordCount-Example的東西。 任務是讀入幾個文件,執行WordCount並為每個輸入文件寫一個輸出文件。 Hadoop使用組合器並將map-part的輸出作為reducer的輸入進行混洗,然后寫入一個輸出文件(我想每個正在運行的實例)。 我想知道是否可以為每個輸入文件寫一個輸出文件(所以保留inputfile1的單詞並將結果寫入outputfile1,依此類推)。 是否有可能覆蓋Combiner-Class或是否有另一種解決方案(我不確定這是否應該在Hadoop-Task中解決,但這是練習)。

謝謝...

map.input.file環境參數具有映射器正在處理的文件名。 在映射器中獲取此值,並將其用作映射器的輸出鍵,然后將單個文件中的所有k / v用作一個reducer。

映射器中的代碼。 順便說一句,我使用的是舊的MR API

@Override
public void configure(JobConf conf) {
    this.conf = conf;
}

@Override.
public void map(................) throws IOException {

        String filename = conf.get("map.input.file");
        output.collect(new Text(filename), value);
}

並使用MultipleOutputFormat,這允許為作業寫入多個輸出文件。 文件名可以從輸出鍵和值派生。

Hadoop將數據塊“分塊”為已配置大小的塊。 默認值為64MB塊。 您可能會看到這會導致您的方法出現問題; 每個映射器可能只獲得一個文件。 如果文件小於64MB(或配置的任何值),則每個映射器將只獲得1個文件。

我有一個非常相似的約束; 我需要一組文件(鏈中的先前reducer的輸出)完全由單個映射器處理。 我在我的解決方案中使用<64MB事實我的解決方案的主要目的是我將其設置為向映射器提供它需要處理的文件名,並且映射器的內部使其加載/讀取文件。 這允許單個映射器處理整個文件 - 它不是文件的分布式處理,但是具有“我不希望分發單個文件”的約束 - 它可以工作。 :)

我有啟動我的MR的過程寫出要處理成單個文件的文件的文件名。 這些文件的編寫位置是輸入目錄。 由於每個文件<64MB,因此將為每個文件生成一個映射器。 map過程將被調用一次(因為文件中只有一個條目)。
然后我將傳遞給mapper的值取出並打開文件並執行我需要做的任何映射。 由於hadoop試圖巧妙地了解Map / Reduce進程的處理方式,因此可能需要指定要使用的reducers數量,以便每個映射器轉到一個reducer。 這可以通過mapred.reduce.tasks配置來設置。 我是通過job.setNumReduceTasks("mapred.reduce.tasks",[NUMBER OF FILES HERE]);做到這一點的job.setNumReduceTasks("mapred.reduce.tasks",[NUMBER OF FILES HERE]);

我的流程有一些額外的要求/限制,可能使這個特定的解決方案吸引人; 但是對於1:in到1:out的例子; 我已經完成了,上面列出了基礎知識。

HTH

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM