`
paddy.w
  • 浏览: 505049 次
  • 性别: 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技术答疑汇总

    - 负载均衡是Spark/Shark较少遇到的问题,但在Hadoop中较为显著。通过合理选择调度器,如使用Fair Scheduler,可以在一定程度上缓解这一问题。 #### 三、处理数据倾斜与小文件问题 - **知识点概述**:数据倾斜指...

    phoenix简介

    针对HBase,Phoenix还可以与Hadoop生态系统中的其他组件协同工作,例如使用Hive进行数据操纵、通过YARN作为集群资源管理器与MapReduce一起工作、利用Spark进行迭代的内存计算等等。总体上,Phoenix为用户和开发者...

    大数据学习笔记

    - **5.3 Spark变量**:讨论了Spark中的广播变量和累加器。 - **5.4 数字类型 RDD操作**:讲解了对数字类型的RDD进行的操作。 #### 第二部分:Zookeeper学习 - **6.1 zookeeper简介** - **概述**:Zookeeper是一个...

    设计模式代码

    这23种设计模式分为三类:创建型模式(如单例、工厂方法、抽象工厂、建造者和原型),结构型模式(如适配器、桥接、组合、装饰、外观、享元和代理),以及行为型模式(如责任链、命令、解释器、迭代器、访问者、备忘...

    hive_jdbc_2.5.20.zip

    具体到版本号2.5.20.1060,这可能是这个特定发行版的一个小版本迭代,通常意味着它修复了之前版本中发现的问题,或者引入了额外的兼容性增强。 使用 Hive JDBC,开发人员可以: 1. **连接到 Hive 服务器**:通过...

    研究生课程——现代软件工程学课件

    课程可能涉及消息队列、事务处理监控器、分布式计算框架(如Hadoop)和云中间件服务。 7. **软件工程新视角**:这部分可能包含对当前挑战的讨论,如微服务架构、无服务器计算、容器化(Docker、Kubernetes)、大...

    Java-1premierfg (3).zip

    Java被广泛应用于Web开发(如Spring Boot、Struts等框架)、Android移动应用开发、大数据处理(Hadoop、Spark)、云计算服务、游戏开发、桌面应用等领域。 总结:Java是一门强大的编程语言,具备丰富的特性和广泛...

    Java项目源码.docx

    Spark通过内存中的计算提高迭代算法的效率,使得Spark在一些情况下比Hadoop MapReduce快100倍。Spark具有易用性、高效性、通用性等特性,支持多种编程语言,包括Scala、Java、Python等。 #### 四、其他类型项目 **...

    框架分析

    4. **框架架构**:分析框架的层次结构,如MVC(模型-视图-控制器)模式在Web框架中的应用,以及各个层之间的交互。 5. **源码阅读**:对于开源框架,阅读源码能帮助我们理解框架的工作原理,提升我们的编程技巧。...

    Python语法实战指南.docx

    Python有许多用于数据存储的库,如`pandas`处理表格数据,`numpy`进行数值计算,`sqlite3`进行轻量级数据库操作,以及与大数据相关的`hadoop`、`spark`等工具。 在学习Python的过程中,了解和熟练运用这些基础语法...

    rpcsoa服务化2

    如何平滑地迁移旧版本到新版本,避免因升级导致的系统中断,是服务化中需要考虑的问题。 4. **数据一致性**:在分布式环境中,保证数据的一致性是一大挑战。可以采用CAP理论中的CP或AP策略,如两阶段提交、最终一致...

    Spark生态和安装部署

    - **RDD (Resilient Distributed Dataset)**:Spark 中的主要抽象是 RDD,它是一个不可变的、分布式的对象集合。RDD 支持两种类型的操作:转换(Transformation)和行动(Action)。转换会返回一个新的 RDD,而行动...

    RDD:基于内存的集群计算容错抽象

    通过对微基准测试和实际用户应用程序的评估,研究者们发现Spark在处理迭代式应用时相比于Hadoop有着显著的速度优势,达到了20倍以上的性能提升。此外,Spark还能在几秒钟内完成对1TB数据集的交互式查询,显示出了...

    spark_learning

    Spark最初由加州大学伯克利分校AMPLab开发,旨在解决Hadoop MapReduce在迭代计算中的低效率问题。Spark通过内存计算技术提高了数据处理速度,允许数据在内存中快速重用,从而大大减少了I/O操作。Spark的主要特点包括...

    own_Spark-day01.docx

    1. **优秀的数据模型和计算抽象**:Spark引入了弹性分布式数据集(RDD)的概念,这是一种可以高效缓存和并行处理的数据结构,允许数据在计算过程中被多次重用,显著提升了计算效率。此外,Spark还提供了DataFrame和...

    系统架构师教程.pdf

    - 大数据处理的挑战与技术,如Hadoop、Spark等框架的应用。 #### 第4章 计算机网络 - **4.1 网络架构与协议** - **4.1.1 网络互联模型** - OSI七层模型与TCP/IP四层模型的对比。 - **4.1.2 常见的网络协议** ...

Global site tag (gtag.js) - Google Analytics