`
paddy.w
  • 浏览: 497678 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hadoop中迭代器的对象重用问题

 
阅读更多
        在用reduce时出现一个问题,在这上面耗费了好些时间,一直以为是业务逻辑方面的问题,不曾想是技术上的问题:reduce中迭代器返回对象的问题。写此blog以纪念在解决这个问题时的怂……囧

        先看这个reduce的实例:
public static class sellerInfoReduce extends MapReduceBase implements Reducer<Text, Promotion, Text, Promotion> {
    
    private static final Set<Promotion> set = new HashSet<Promotion>();
    private static final Text k = new Text();

	@Override
	public void reduce(Text key, Iterator<Promotion> values,
			OutputCollector<Text, Promotion> output, Reporter reporter)
			throws IOException {
        set.clear();
        Promotion obj = null;
        Promotion sellerPromotion = null;
        int count = 0;//记录while循环次数
        while(values.hasNext()) {
            count++;
        	obj = values.next();
        	if(obj.isNull()) {
				sellerPromotion = obj;//how asshole!
        		System.out.println("threadId="+Thread.currentThread().getId()+"    count="+count+"    1:sellerPromotion===="+sellerPromotion);
        	}
        	else {
        		set.add(obj);
        		if(sellerPromotion != null) {
        			System.out.println("threadId="+Thread.currentThread().getId()+"    count="+count+"    2:sellerPromotion===="+sellerPromotion);
        			System.out.println("threadId="+Thread.currentThread().getId()+"    count="+count+"    2:obj===="+obj);
        		}
        	}
        }
	}
}


        忽略业务,先看一个reduce执行的结果
threadId=1    count=1    1:sellerPromotion====object.Promotion@5a4
threadId=1    count=2    2:sellerPromotion====object.Promotion@13691399
threadId=1    count=2    2:obj====object.Promotion@13691399
threadId=1    count=3    2:sellerPromotion====object.Promotion@136912c0
threadId=1    count=3    2:obj====object.Promotion@136912c0
threadId=1    count=4    2:sellerPromotion====object.Promotion@136912bb
threadId=1    count=4    1:obj====object.Promotion@136912bb


        开始是由于业务的问题发现最终结果与预期不符,在代码中打日志调试发现了这个问题。reduce方法的javadoc中已经说明了会出现的问题:
引用
The framework calls this method for each <key, (list of values)> pair in the grouped inputs. Output values must be of the same type as input values. Input keys must not be altered. The framework will reuse the key and value objects that are passed into the reduce, therefore the application should clone the objects they want to keep a copy of.

        也就是说虽然reduce方法会反复执行多次,但key和value相关的对象只有两个,reduce会反复重用这两个对象。所以如果要保存key或者value的结果,只能将其中的值取出另存或者重新clone一个对象,而不能直接赋引用。因为引用从始至终都是指向同一个对象,会影响最终结果。

        下面说一下在本例中犯二的地方。从结果可以看出,虽然sellerPromotion只被赋了一次引用,根据上面说的,直接打印对象(也即对象地址的标识)结果并不会改变,但是结果表示在每次while时,sellerPromotion的地址都会发生变化,这也是本例犯二所在。System.out.println(instance)会调用对象的toString()方法,而toString()方法的默认实现是:
public String toString() {
	    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

        其中有变化的也即hashCode(),而我自定义对象恰恰重写了hashCode()方法,所以每次打印都会不一样。如果用默认的hashCode()方法,那打印出来的结果便会一致了。
分享到:
评论

相关推荐

    Hadoop迭代式计算框架Guagua.zip

    Hadoop 迭代式计算框架 Guagua 是 PayPal 的一个开源机器学习框架 Shifu 的子项目。Guagua 主要解决了模型训练的分布式问题。同时 Guagua 并没有将自己局限在分类模型,Guagua 是一个基于 Hadoop 的迭代式计算框架,...

    hadoop中文乱码问题

    NULL 博文链接:https://201201314056.iteye.com/blog/2193117

    hadoop常见问题及解决方法

    安装hadoop的时候或者使用的时候,会出现hadoop常见问题及解决方法

    Hadoop任务调度器

    Hadoop任务调度器 基础知识 • Hadoop调度流程 • Hadoop自带调度器介绍 • 编写自己的Hadoop调度器 • 总结

    hadoop安装过程中的问题

    (这是Hadoop的基础) 2.必须ssh无密码登录 3./etc/host 里配置 master和slaves 4.修改/etc/hostname 主机名 5、/etc/profile的java和Hadoop配置路径 6.hadoop namenode format 7./hadoop/etc/slaves这个文件里必须...

    hadoop 中文手册

    hadoop 中文手册 Hadoop文档 下面的文档是一些概念介绍和操作教程,可帮助你开始使用Hadoop。如果遇到了问题,你可以向邮件列表求助或者浏览一下存档邮件。 Hadoop快速入门 Hadoop集群搭建 Hadoop分布式文件系统...

    Hadoop 2.7.1 中文文档

    Hadoop 2.7.1 中文文档 Hadoop 2.7.1 中文文档 Hadoop 2.7.1 中文文档

    Hadoop使用常见问题以及解决方法

    Hadoop使用常见问题以及解决方法,简单实用

    hadoop2.7.3 hadoop.dll

    在windows环境下开发hadoop时,需要配置HADOOP_HOME环境变量,变量值D:\hadoop-common-2.7.3-bin-master,并在Path追加%HADOOP_HOME%\bin,有可能出现如下错误: org.apache.hadoop.io.nativeio.NativeIO$Windows....

    hadoop2.7中文文档

    hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文...

    Hadoop 中的调度

    Hadoop 中的调度

    Hadoop2.7.1中文文档

    Hadoop2.7.1中文文档

    hadoop集群遇到的问题及其解决方法

    hadoop安装时,会遇到不同问题,这里只是列举我自己遇到的问题

    Hadoop中Flume安装指南

    Hadoop中的Flume安装指南,不会的童鞋可以下载哦,有助于学习

    hadoop 中文文档

    hadoop 中文文档 hadoop命令 hadoop入门

    hadoop2.6.5中winutils+hadoop

    windows系统开发hadoop包需要的winutils.exe和hadoop.dll文件

    hadoop-3.3.4 版本(最新版)

    在 Hadoop 中,MapReduce 底层的分布式文件系统是独文模块,用户可按照约定 的一套接口实现自己的分布式文件系统,然后经过简单的配置后,存储在该文件 系统上的数据便可以被 MapReduce 处理。 官网下载速度非常缓慢...

    Hadoop中单词统计案例运行的代码

    Hadoop中单词统计案例运行的代码

    Hadoop_Spark相关面试问题总结 - Hadoop知识库.pdf

    Hadoop_Spark相关面试问题总结 - Hadoop知识库.pdf Hadoop_Spark相关面试问题总结 - Hadoop知识库.pdf Hadoop_Spark相关面试问题总结 - Hadoop知识库.pdf

    hadoop配置资源 ,hadoop-3.0.0,hadoop.dll,winutils

    将文件夹中的 hadoop-3.0.0 解压到电脑任意位置 在Python代码中使用os模块配置:os.environ[‘HADOOP_HOME’] = ‘HADOOP解压文件夹路径’ winutils.exe,并放入Hadoop解压文件夹的bin目录内 hadoop.dll,并放入:C:/...

Global site tag (gtag.js) - Google Analytics