Reduce统计结果汇总混乱
2016-01-06 09:53
615 查看
在hadoop2.7.1上写了一段MapReduce程序,做一个word cloud统计,程序执行结果中有数据,但是混乱:很多完全相同的关键字没有归并到一起,也有个别的归并到了一起,但汇总值没有超过2的,如下:
中国红 1
中国红 1
中国红 1
摩卡黑 2
摩卡黑 2
百度说,其他同仁遇到的大多是reduce没有输出结果,其原因是Reduce应该用Iterable还是Iterator造成的,而且还是0.19和0.20版本时代的问题。而我有结果输出,只是没有完全执行合计。Reduce代码如下:
莫非对Reduce处理中文Key有问题?不太可能。遂将所有Key用URLEncoder转码,结果仍然一样,不能归并。查半天,未果。
一觉醒来,忽然发现程序import中竟然还有IntWritable,我曾经把所有Int改成了LongWritable,这个程序竟然漏了!看上面代码中Class定义中使用了LongWritable,计算的时候却使用的IntWritable,修改,再运行,归并正常。
原来如此!Map和Reduce的数据类型不匹配通常会有ClassCastException,但LongWritable和IntWritable的转换没有报异常,默默的计算错了,竟然!
中国红 1
中国红 1
中国红 1
摩卡黑 2
摩卡黑 2
百度说,其他同仁遇到的大多是reduce没有输出结果,其原因是Reduce应该用Iterable还是Iterator造成的,而且还是0.19和0.20版本时代的问题。而我有结果输出,只是没有完全执行合计。Reduce代码如下:
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转码,结果仍然一样,不能归并。查半天,未果。
一觉醒来,忽然发现程序import中竟然还有IntWritable,我曾经把所有Int改成了LongWritable,这个程序竟然漏了!看上面代码中Class定义中使用了LongWritable,计算的时候却使用的IntWritable,修改,再运行,归并正常。
原来如此!Map和Reduce的数据类型不匹配通常会有ClassCastException,但LongWritable和IntWritable的转换没有报异常,默默的计算错了,竟然!
相关文章推荐
- 详解HDFS Short Circuit Local Reads
- Hadoop_2.1.0 MapReduce序列图
- 使用Hadoop搭建现代电信企业架构
- 单机版搭建Hadoop环境图文教程详解
- hadoop常见错误以及处理方法详解
- hadoop 单机安装配置教程
- hadoop的hdfs文件操作实现上传文件到hdfs
- hadoop实现grep示例分享
- MongoDB中的MapReduce简介
- MongoDB学习笔记之MapReduce使用示例
- MongoDB中MapReduce编程模型使用实例
- Apache Hadoop版本详解
- MapReduce中ArrayWritable 使用指南
- Java函数式编程(七):MapReduce
- linux下搭建hadoop环境步骤分享
- java连接hdfs ha和调用mapreduce jar示例
- hadoop client与datanode的通信协议分析
- hadoop中一些常用的命令介绍
- Hadoop单机版和全分布式(集群)安装