`
小网客
  • 浏览: 1249302 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hadoop在reduce中Iterable对应的值不变原因

 
阅读更多

版本:

$ hadoop version
Hadoop 0.20.2-cdh3u4
Subversion git://ubuntu-slave01/var/lib/jenkins/workspace/CDH3u4-Full-RC/build/cdh3/hadoop20/0.20.2-cdh3u4/source -r 214dd731e3bdb687cb55988d3f47dd9e248c5690
Compiled by jenkins on Mon May  7 13:01:39 PDT 2012
From source with checksum a60c9795e41a3248b212344fb131c12c

问题描述:

Hadoop在执行Reducer时对应的Iterable<VALUEIN> 其对应的值保持问题,代码如下:

protected void reduce(Text key, Iterable<VectorWritable> values, Context context)
	        throws IOException, InterruptedException {
	Map<String, VectorWritable> map = new HashMap<String, VectorWritable>();
	for (VectorWritable vw : values) {
		NamedVector nv = (NamedVector) vw.get();
		Item itemi = Item.toInstance(nv.getName());
		map.put(itemi.getItemID(), vw);
	}
}

 其对应的Map中的元素都是一样的。

问题原因:

每次迭代对应的值在此次reduce时内存中是一个实例,源码如下:

public class ReduceContext<KEYIN,VALUEIN,KEYOUT,VALUEOUT>
    extends TaskInputOutputContext<KEYIN,VALUEIN,KEYOUT,VALUEOUT> {
  private RawKeyValueIterator input;
  private Counter inputKeyCounter;
  private Counter inputValueCounter;
  private RawComparator<KEYIN> comparator;
  private KEYIN key;                                  // current key
  private VALUEIN value;                              // 就是这个实例
.....................
}

每次执行时都是对value进行赋值

@Override
public VALUEIN next() {
	// if this is the first record, we don't need to advance
	if (firstValue) {
		firstValue = false;
		return value;
	}
	// if this isn't the first record and the next key is different, they
	// can't advance it here.
	if (!nextKeyIsSame) {
		throw new NoSuchElementException("iterate past last value");
	}
		// otherwise, go to the next key/value pair
	try {
		nextKeyValue();
		return value;
	} catch (IOException ie) {
		throw new RuntimeException("next value iterator failed", ie);
	} catch (InterruptedException ie) {
		// this is bad, but we can't modify the exception list of java.util
		throw new RuntimeException("next value iterator interrupted", ie);        
	}
}

 因此造成了上述问题

解决方式:

protected void reduce(Text key, Iterable<VectorWritable> values, Context context)
	        throws IOException, InterruptedException {
	Map<String, VectorWritable> map = new HashMap<String, VectorWritable>();
	for (VectorWritable vectorWritable : values) {
		VectorWritable vw = WritableUtils.clone(vectorWritable, context.getConfiguration());
		NamedVector nv = (NamedVector) vw.get();
		Item itemi = Item.toInstance(nv.getName());
		map.put(itemi.getItemID(), vw);
	}
}

 克隆一个即可

0
0
分享到:
评论

相关推荐

    hadoop map reduce 中文教程

    3. **配置 Hadoop 环境变量**:在系统中设置 HADOOP_HOME 环境变量,并将 bin 目录添加到 PATH 环境变量中。 4. **配置 core-site.xml 和 hdfs-site.xml**:根据实际需求修改 Hadoop 的配置文件,如设置 HDFS 的地址...

    Hadoop Map Reduce教程

    该框架将任务分解为一系列较小的任务(Map 和 Reduce),并在集群中的多台计算机上并行执行这些任务。 - **应用场景**:适用于大数据分析、搜索引擎索引构建、日志文件分析等场景。 #### 二、MapReduce 工作原理 1...

    hadoop map-reduce turorial

    在Hadoop Map-Reduce中,输入数据被划分为小块,每个块被分配给不同的Map任务处理。Map任务将处理后的结果输出,这些输出会被排序后分配给Reduce任务进一步处理。最终,Reduce任务将整合的数据写回到文件系统中,...

    新手指导hadoop、hbase、hive版本对应关系查找表

    对于Hadoop、HBase和Hive的版本对应关系问题,新手朋友们在入门时除了参考这些官方的文档以外,还可以通过查找社区论坛、博客文章等了解他人在升级过程中遇到的问题和解决方案,这将大大降低尝试和错误成本,快速...

    hadoop map reduce hbase 一人一档

    在实际操作中,Hadoop MapReduce可用于预处理和清洗大量的原始数据,例如从摄像头捕获的人脸和车辆图像。Map阶段将原始数据分发到各个节点,进行初步处理,如特征提取。Reduce阶段则聚合这些处理结果,进行深度分析...

    hadoop中map/reduce

    Reduce任务会按照中间键值对的键进行排序,然后把这些键及其对应的值分组,传递给用户定义的Reducer函数。Reducer函数负责对每个键的所有值进行聚合运算,生成最终的结果。 在Hadoop中,MapReduce的工作流程还涉及...

    Hadoop Map Reduce 教程.doc

    Hadoop Map Reduce 教程.doc

    最高气温 map reduce hadoop 实例

    MapReduce是一种编程模型,用于大规模数据集的并行计算,由Google提出并在Hadoop中得以实现。 【描述】:“运行命令hadoop jar ‘/home/hadoop/downloas/max.jar’ upload.MaxTemperature” 这里执行的命令是启动...

    Hadoop Map-Reduce教程

    在 Hadoop Map-Reduce 中,数据处理过程主要分为两个阶段:**Map 阶段** 和 **Reduce 阶段**。 ##### Map 阶段 Map 函数接收输入数据块,并将其转换为一系列键值对。这一阶段的主要任务是对输入数据进行预处理,...

    远程调用执行Hadoop Map/Reduce

    例如,`org.apache.hadoop.mapred.MapTask`和`org.apache.hadoop.mapreduce.ReduceTask`分别对应Map和Reduce任务的实现,开发者可以通过阅读这些源码了解任务执行的详细流程。 7. **工具集成**:有许多开源工具可以...

    hadoop2.7.7对应的hadoop.dll,winutils.exe

    在Hadoop生态系统中,Hadoop 2.7.7是一个重要的版本,它为大数据处理提供了稳定性和性能优化。Hadoop通常被用作Linux环境下的分布式计算框架,但有时开发者或学习者在Windows环境下也需要进行Hadoop相关的开发和测试...

    hadoop map reduce 案例

    `Mapping` 操作可能是在不同的机器上并行处理的,所以需要通过 `shuffling` 将相同 `key` 值的数据分发到同一个节点上去合并,这样才能统计出最终的结果,此时得到 `K2` 为每一个单词,`List(V2)` 为可迭代集合,`V2...

    Hadoop Map-Reduce

    Map-Reduce 是 Hadoop 框架中的一种核心组件,用于处理大规模数据。Map-Reduce 依靠两大步骤来完成数据处理:Map 和 Reduce。 Map 阶段的主要任务是将输入数据拆分成小块,并将其转换成 key-value 对。Map 阶段的...

    java操作hadoop之mapreduce计算整数的最大值和最小值实战源码

    本教程将详细讲解如何使用Java编程语言操作Hadoop的MapReduce来计算整数序列中的最大值和最小值,这对于数据分析和处理任务来说是非常基础且实用的技能。 首先,我们需要理解MapReduce的工作原理。MapReduce是一种...

    Map-Reduce原理体系架构和工作机制,eclipse与Hadoop集群连接

    在Map任务完成后,所产生的键值对会被重新组织,并发送到对应的Reduce任务中。这个过程包括排序和合并,确保具有相同键的所有值都被发送到同一个Reduce任务。 **4. Reduce 阶段** Reduce任务接收来自不同Map任务的...

    hadoop_join.jar.zip_hadoop_hadoop query_reduce

    在大数据处理领域,Hadoop和MapReduce是两个至关重要的概念,它们构成了大数据处理的基础框架。本文将深入探讨如何使用Hadoop和MapReduce进行高效的Join查询,并解析如何通过`hadoop_join.jar`这个工具来实现这一...

    Hadoop 2.7.5 Windows 7 64位 编译bin(包含winutils.exe, hadoop.dll等)

    在IT行业中,Hadoop是一个广泛使用的开源框架,主要用于大数据处理和分布式存储。Hadoop 2.7.5是Hadoop发展中的一个重要版本,它提供了稳定性和性能上的改进。本资源针对的是Windows 7 64位操作系统用户,帮助他们在...

    windows平台使用hadoop hdfs文件进行中文分词的示例代码

    protected void reduce(Text key, Iterable&lt;IntWritable&gt; values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result...

    Hadoop (十五)Hadoop-MR编程 -- 【使用hadoop计算网页之间的PageRank值----编程】

    在本篇中,我们将深入探讨如何使用Hadoop MapReduce编程模型来计算网页之间的PageRank值。PageRank是Google搜索引擎算法的核心部分,它通过衡量网页之间的链接关系来评估每个网页的重要性。在Hadoop环境下,我们可以...

    hadoop Join代码(map join 和reduce join)

    本文将深入探讨Map JOIN和Reduce JOIN两种在Hadoop中实现JOIN的方法,并通过代码示例来阐述它们的工作原理。 1. Map JOIN: Map JOIN在Hadoop中主要应用于小表与大表的连接。小表的数据可以完全加载到内存中,而大...

Global site tag (gtag.js) - Google Analytics