您好,登錄后才能下訂單哦!
這篇文章主要講解了“Mapreduce程序中reduce的Iterable參數問題怎么解決”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Mapreduce程序中reduce的Iterable參數問題怎么解決”吧!
今天在對reduce的參數Iterable進行迭代時,發現一個問題,即Iterator的next()方法每次返回的是同一個對象,next()只是修改了Writable對象的值,而不是重新返回一個新的Writable對象。
使用wordcount來驗證:
我的代碼如下:
protected void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException { int sum = 0; // 保存每個IntWritable到list List<IntWritable> intWritables = new ArrayList<IntWritable>(); for (IntWritable val : values) { intWritables.add(val); sum += val.get(); } if(intWritables.size() > 1) { // 當list size大于1時,驗證第一個元素和第二個元素是否是同一個對象 System.out.println("objects is same -> " + (intWritables.get(0) == intWritables.get(1))); } result.set(sum); context.write(key, result); }
日志輸出:
objects is same -> true
這個Iterable的實現是org.apache.hadoop.mapreduce.task.ReduceContextImpl.ValueIterable
Iterator實現是org.apache.hadoop.mapreduce.task.ReduceContextImpl.ValueIterator
其中next()實現時,調用的是org.apache.hadoop.io.serializer.WritableSerialization的deserialize(Writable w)方法,
Writable deserialize(Writable w) IOException { Writable writable; (w == ) { writable = (Writable) ReflectionUtils.(, getConf()); } { writable = w; } writable.readFields(); writable; }
該方法只是調用了入參w的readFields方法,并沒有創建新對象,除非w是null
感謝各位的閱讀,以上就是“Mapreduce程序中reduce的Iterable參數問題怎么解決”的內容了,經過本文的學習后,相信大家對Mapreduce程序中reduce的Iterable參數問題怎么解決這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。