Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mapreduce程序中reduce的Iterable参数迭代出是同一个对象

Mapreduce程序中reduce的Iterable参数迭代出是同一个对象

作者头像
囚兔
发布于 2018-02-08 02:42:31
发布于 2018-02-08 02:42:31
1.3K00
代码可运行
举报
文章被收录于专栏:IT杂记IT杂记
运行总次数:0
代码可运行

今天在对reduce的参数Iterable进行迭代时,发现一个问题,即Iterator的next()方法每次返回的是同一个对象,next()只是修改了Writable对象的值,而不是重新返回一个新的Writable对象。

使用wordcount来验证:

我的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)方法,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Writable deserialize(Writable w) IOException {
  Writable writable;
  (w == ) {
    writable 
      = (Writable) ReflectionUtils.(, getConf());
  } {
    writable = w;
  }
  writable.readFields();
  writable;
}

该方法只是调用了入参w的readFields方法,并没有创建新对象,除非w是null

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Hadoop源码篇--Reduce篇
Reduce文件会从Mapper任务中拉取很多小文件,小文件内部有序,但是整体是没序的,Reduce会合并小文件,然后套个归并算法,变成一个整体有序的文件。
LhWorld哥陪你聊算法
2018/09/13
6940
Hadoop源码篇--Reduce篇
编写MapReduce程序
Map阶段由一定数量的Map Task组成 输入数据格式解析:InputFormat 输入的数据处理 :Mapper 输入数据分组 :Partitioner 数据的拷贝与按key排序 数据处理 :Reducer 数据的输出格式 :outputFormat
Tim在路上
2020/08/04
5630
Hadoop(十六)之使用Combiner优化MapReduce
前言   前面的一篇给大家写了一些MapReduce的一些程序,像去重、词频统计、统计分数、共现次数等。这一篇给大家介绍的是关于Combiner优化操作。 一、Combiner概述 1.1、为什么需要Combiner   我们map任务处理的结果是存放在运行map任务的节点上。 map处理的数据的结果在进入reduce的时候,reduce会通过远程的方式去获取数据。   在map处理完数据之后,数据量特别大的话。reduce再去处理数据它就要通过网络去获取很多的数据。   这样会导致一个问题是:大量的数据
用户1195962
2018/01/18
1.5K0
Hadoop(十六)之使用Combiner优化MapReduce
MapReduce序列化(二)
在MapReduce中,通常使用Writable序列化数据。在Mapper中,用户将输入数据解析为键值对,并将键值对转换为自定义的Writable对象。在Reducer中,用户将Writable对象转换为输出键值对。下面是一个简单的例子:
堕落飞鸟
2023/05/12
2090
Hadoop的JobTracker和TaskTracker在MapReduce中的作用是什么?
在Hadoop的MapReduce框架中,JobTracker和TaskTracker是两个关键组件,分别扮演着不同的角色。
GeekLiHua
2025/01/21
2460
一文学会MapReduce编程
MapReduce编程模型,相对于初学者来说,会有一些门槛,没关系,这一篇让你学会使用MapReduce进行分布式处理。
十里桃花舞丶
2021/01/06
5280
Hadoop的mapreduce的简单用法 原
  Mapreduce是一个计算框架,既然是做计算的框架,那么表现形式就是有个输入(input),mapreduce操作这个输入(input),通过本身定义好的计算模型,得到一个输出(output),这个输出就是我们所需要的结果。
用户2603479
2018/09/19
7620
Hadoop 系列 MapReduce:Map、Shuffle、Reduce
文章链接:https://cloud.tencent.com/developer/article/2470497
Lorin 洛林
2024/11/22
9400
Hadoop 系列 MapReduce:Map、Shuffle、Reduce
Hadoop基础教程-第6章 MapReduce入门(6.3 加速WordCount)
如图所示,combine过程发生在map方法和reduce方法之间,它将中间结果进行了一次合并。
程裕强
2022/05/06
2490
Hadoop基础教程-第6章 MapReduce入门(6.3 加速WordCount)
MapReduce编程规范(二)
Reduce函数是MapReduce的另一个核心组件,它负责将相同键的值合并,并生成最终输出。在编写Reduce函数时,需要注意以下几点:
堕落飞鸟
2023/05/12
1990
面经:MapReduce编程模型与优化策略详解
作为一名专注于大数据处理与分布式计算的博主,我深知MapReduce作为一款经典的分布式计算框架,在海量数据处理领域所起的关键作用。本篇博客将结合我个人的面试经历,深入剖析MapReduce编程模型与优化策略,分享面试必备知识点,并通过代码示例进一步加深理解,助您在求职过程中自信应对与MapReduce相关的技术考察。
Jimaks
2024/04/13
2600
使用Hadoop MapReduce进行大规模数据爬取
Hadoop MapReduce是一个编程模型,用于处理和生成大数据集。它由Map和Reduce两个主要阶段组成。Map阶段负责处理输入数据,并将结果输出为键值对;Reduce阶段则对Map阶段的输出进行汇总和合并,生成最终结果。
小白学大数据
2024/12/05
1760
MapReduce 编程实践:统计对象中的某些属性
文章目录 1. 生成数据 2. 编写实体类 3. Mapper类 4. Reducer类 5. Driver类 6. 运行 参考书:《Hadoop大数据原理与应用》 相关文章:MapReduce 编程实践 1. 生成数据 超市消费者 数据: id, 时间,消费金额,会员/非会员 使用 Python 生成虚拟数据 import random import time consumer_type = ['会员', '非会员'] vip, novip = 0, 0 vipValue, novipValue = 0
Michael阿明
2021/09/06
1.1K0
【小白视角】大数据基础实践(五) MapReduce编程基础操作
ResourceManager • 处理客户端请求 • 启动/监控ApplicationMaster • 监控NodeManager • 资源分配与调度 NodeManager • 单个节点上的资源管理 • 处理来自ResourceManger的命令 • 处理来自ApplicationMaster的命令 ApplicationMaster • 为应用程序申请资源,并分配给内部任务 • 任务调度、监控与容错
全栈程序员站长
2022/06/28
6450
【小白视角】大数据基础实践(五) MapReduce编程基础操作
MapReduce Combiner
MapReduce Combiner是一个可选的组件,它与Mapper和Reducer组件类似,可以接收键值对作为输入,并输出相同或不同的键值对。Combiner通常用于对Mapper产生的中间数据进行本地聚合,以减少Mapper产生的中间数据的数量,并将更少的数据发送给Reducer,从而减少网络传输和存储负载。Combiner是在Mapper和Reducer之间运行的,并且只在Mapper端运行,不会在Reducer端运行。Combiner的输出会作为Mapper的输出写入到本地磁盘中,等待Reducer进行最终的聚合。
堕落飞鸟
2023/05/12
5070
[Mapreduce]eclipse下写wordcount「建议收藏」
注:eclipse下初次执行wordcount可能会有log4j警告。能够在src下建立名为log4j.properties的文件,就可以消除警告,内容例如以下:
全栈程序员站长
2022/07/10
3440
运行Hadoop自带的单词统计程序
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 export PATH=JAVA_HOME/bin:PATH export CLASSPATH=.:JAVA_HOME/lib/dt.jar:JAVA_HOME/lib/tools.jar
zhangjiqun
2024/12/17
1100
运行Hadoop自带的单词统计程序
MapReduce实战-词频统计、文件合并排序
hadoop伪分布式集群环境,包括设置JAVA_HOME、HADOOP_HOME等。 可参考使用docker部署hadoop集群-手把手复现
唔仄lo咚锵
2021/12/31
7620
MapReduce实战-词频统计、文件合并排序
Linux巩固记录(5) hadoop 2.7.4下自己编译代码并运行MapReduce程序
程序代码为 ~\hadoop-2.7.4\share\hadoop\mapreduce\sources\hadoop-mapreduce-examples-2.7.4-sources\org\apache\hadoop\examples\WordCount.java  
肖哥哥
2018/08/02
4380
Hadoop: MapReduce2的几个基本示例
1) WordCount  这个就不多说了,满大街都是,网上有几篇对WordCount的详细分析 http://www.sxt.cn/u/235/blog/5809 http://www.cnblogs.com/zhanghuijunjava/archive/2013/04/27/3036549.html 这二篇都写得不错, 特别几张图画得很清晰 2) 去重处理(Distinct) 类似于db中的select distinct(x) from table , 去重处理甚至比WordCount还要简单,假如我
菩提树下的杨过
2018/01/19
1.1K0
相关推荐
Hadoop源码篇--Reduce篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验