在hadoop2.7.1上寫了一段MapReduce程序,作一個word cloud統計,程序執行結果中有數據,可是混亂:不少徹底相同的關鍵字沒有歸併到一塊兒,也有個別的歸併到了一塊兒,但彙總值沒有超過2的,以下:java
中國紅 1oop
中國紅 1spa
中國紅 1code
摩卡黑 2hadoop
摩卡黑 2get
百度說,其餘同仁遇到的大可能是reduce沒有輸出結果,其緣由是Reduce應該用Iterable仍是Iterator形成的,並且仍是0.19和0.20版本時代的問題。而我有結果輸出,只是沒有徹底執行合計。Reduce代碼以下:it
static class MyReducer extends Reducer<Text, LongWritable, Text, LongWritable> { LongWritable result = new LongWritable(); public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } }
莫非對Reduce處理中文Key有問題?不太可能。遂將全部Key用URLEncoder轉碼,結果仍然同樣,不能歸併。查半天,未果。io
一覺醒來,突然發現程序import中居然還有IntWritable,我曾經把全部Int改爲了LongWritable,這個程序居然漏了!看上面代碼中Class定義中使用了LongWritable,計算的時候卻使用的IntWritable,修改,再運行,歸併正常。table
原來如此!Map和Reduce的數據類型不匹配一般會有ClassCastException,但LongWritable和IntWritable的轉換沒有報異常,默默的計算錯了,居然!ast