2011-06-14 65 views
1

可能重複:
MultipleOutputFormat in hadoopMultipleOutputs了Apache的Hadoop 0.20.203

怎麼樣的Apache的Hadoop 0.20.203的用戶對付缺乏MultipleOutputs支持(減速機寫入多個輸出文件)?

舊版本的Apache Hadoop支持MultipleOutputs,但要使用它們,似乎必須使用已棄用的API。

我也聽說某些Cloudera Hadoop發行版支持更新的MultipleOutputs API,如http://hadoop.apache.org/mapreduce/docs/r0.21.0/api/org/apache/hadoop/mapreduce/lib/output/MultipleOutputs.html所定義的,它應該在Hadoop的0.21 Apache發行版中定義。

乾杯!

+0

即使我面臨同樣的問題,但我不確定在0.20.203中是否存在MultipleOutputs支持。根據我的理解,支持在那裏,但只是參數類型有所不同。例如,在0.20.X中,MultipleOutputs()將JobConf作爲參數。 那麼,你是如何最終克服這個問題的? – 2012-02-25 00:47:12

回答

1

首先,您是否考慮嘗試將MultipleOutputs恢復到您正在運行的Hadoop版本?我不知道這會有多困難,但我已經成功回收了CombineFileInputFormat中的錯誤修復。

如果沒有MultipleOutputs,可以通過編寫自定義分區程序將密鑰放入預定義的一組桶中,並強制減少任務的數量等於桶數來實現類似的功能。

我將嘗試使這個更具體一個類似於您爲MultipleOutputs鏈接的JavaDoc中的內容的示例。在這個例子中,reducer寫了2個預定義的命名輸出:「text」和「seq」。在作業提交時知道正好有2個輸出,我們將作業的reduce任務數設置爲2.對於映射器接收到的每個鍵值對,它必須寫入2個輸出鍵值對:一個帶有「text 「作爲鑰匙的一部分,以及」seq「作爲鑰匙的一部分。然後,在自定義分區,我們可以這樣做:

if (key.toString().equals("text")) 
    return 0; 
else if (key.toString().equals("seq")) 
    return 1; 

然後,假設無操作IdentityReducer,我們知道部分內容-R-00000將所有的「文本」的記錄和part-r-00001將擁有所有的「seq」記錄。作業運行2個reducer任務是非常重要的。 (如果只有一個Reducer任務,那麼它只會將「text」和「seq」記錄合併到part-r-00000中。)

請注意,我已經跳過MultipleOutputs示例中的第三個命名輸出。這很難解決,因爲名稱必須在運行時確定。如果您在作業提交時知道預先確定的一組名稱,此解決方案纔有效。

公平的警告:整個解決方案非常脆弱。如果名稱數量發生更改,則必須更改減速器任務的數量以與其匹配。根據問題的性質,可能會在作業提交之前動態檢測所有可能的鍵,並相應地動態調整減少任務的數量。將解決方案擴展到多個減少任務還需要更多的努力。所有事情都考慮到了,這個解決方案可能很難維護,但這是我知道如何在沒有MultipleOutputs的情況下解決它的唯一方法。

相關問題