轉載:http://blog.csdn.net/lucktroy/article/details/7957120
話說用hadoop MapReduce編程有一陣子了,但是關於Mapper, Combiner, Reducer的輸入輸出類型居然花了我一整天。
我本以爲Combiner的輸入與Mapper的輸出一致,Combiner的輸出與Reducer的輸入一致就可以了,就像圖1:
圖1 假想
我的程序Mapper輸出是<Text, DoubleWritable>; Combiner的輸入輸出分別是<Text, DoubleWritable>, <Text, Text>; 然後Reducer的輸入是<Text, Text>.
我本想邏輯上都沒問題,但事與願違,老出錯.
在hadoop中,默認的job.setOutputkeyClass(*.class), job.setOutputValueClass(*.class)是針對Mapper與Reducer的,這裏因爲兩者不同,我試着用job.setMapOutputKeyClass(*.class)與job.setMapOutputValueClass(*.class)區分. 但依然有錯誤.
在幾經周折後,在看完一篇博文“《Data-intensive Text Processing with MapReduce》讀書筆記第3章:MapReduce算法設計(1)”後,發現原來Mapper與Combiner的輸出均要與Reducer對應(見圖2),於是改了過來,終於通過,因爲沒有看過hadoop源碼,所以也不知道它底層具體是如何實現的.
圖2 實際