`
刘小小尘
  • 浏览: 62777 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

mapreduce combine

 
阅读更多
最近使用Map-Reduce的时候,有几个小问题一直困扰着我,因为刚接触Map-Reduce也没多久,对Map-Reduce整个体系没有多少认识,所以仅仅通过实验来猜测结果,慢慢积累,或许以后能阅读Hadoop的源代码。
问题如下:
1、如果文件中的记录key为空,那么这些key为空的记录是否会被认为key相等呢?
2、reduce结束条件是什么?
3、JobConf::setOutputValueClass怎样使用?
对于第一个问题,实验的结果是它们会被规约到一起,这也就能解释我生成的数据中为什么偶尔会出错,原始数据某些行格式有问题,使用split得到了空字符串。
对于第二个问题,实验的结果让我头晕了好久。我认为只要所有key相等的记录只剩一条了,那么reduce就应该结束了。我自己自作聪明写了如下的例子程序,其reduce函数代码如下:
StringBuilder sb = new StringBuilder();

while (values.hasNext()) {
String str = values.next().toString();
sb.append(str+":");
}

sb.deleteCharAt(sb.length()-1);

long time = System.currentTimeMillis();

long thread = Thread.currentThread().getId();

output.collect(new Text(time+":["+thread+"]:"+key.toString()), new Text(sb.toString()));
output.collect(key, new Text(sb.toString()));
我以为可以仔细地观看到规约的过程,结果发现这样会干扰程序运行的结果,至于为什么我就想不明白了。
对于第三个问题,需要对Map-Reduce的运行过程有一个比较好的理解。根据Hadoop官方文档的阐述,Reducer的工作分为三个过程。
1、shuffle。这个过程主要是从Map获得数据。
2、排序。Map发送出来的数据已经排好序了,但是由于可能同时有多个Map任务运行,不同的Map送来的数据key可能相等,因此需要再次分组排序。对于所有的记录应该先分组再排序,key相同的记录应该分到一组,然后对每组调用一次reduce。如果想将key的长度相等的记录分到一组,比如"aa"和"dd"一组,"bbb"和"ccc"一组,可是这样分好以后,怎样做排序呢?明天去公司做个例子程序实验下吧。
3、调用reduce函数。
使用setCombinerClass设置Combiner极大地误解了我对Map-Reduce的理解,因为combine运行在Map任务中,这样我就误以为Reduce要处理Reduce的输出。比如有下面这样一个例子程序:
StringBuilder sb = new StringBuilder();

while (values.hasNext()) {
sb.append(values.next().toString()+":");
}
我想使用冒号将value连接起来,正常结果应该形如"a:b:c:d",结果我得到的却总是"a::b::c:::d::",费了好大的心思也没有琢磨明白,今天才恍然大悟,原来不仅仅只有Reducer会调用reduce函数,Mapper在combine时也会调用reduce函数,这样送给Reducer的reduce函数的数据已经是"a:b:"这个样子的了,reduce再在其后面添加冒号就导致冒号超出所想。另外一个神秘的现象就是:在reduce函数添加了很多打印语句,但在Web UI却查看不到Reduce任务的打印语句,这些语句全部显示在Map任务的日志中了,这也是combine导致的。最后有一个由combine导致的问题也有点莫名其妙,如果Map输出的<K1, V1>同Reduce输出的<K2, V2>的类型不一致,使用combiner会导致运行时异常,提示类型转换出现错误。这是因为combine运行的是reduce函数,输出的自然是<K2, V2>,而reduce函数却希望得到<K1, V1>,所以就出现错误了,不知道这种情况下还能不能实现combine,如果不使用会降低一些效率。
今天灵感突现,从此功力大增,发现Map-Reduce确实是极大地简化了分布式编程的难度,So great!
分享到:
评论

相关推荐

    mapreduce mapreduce mapreduce

    mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce ...

    实验项目 MapReduce 编程

    4 分别在自编 MapReduce 程序 WordCount 运行过程中和运行结束后查看 MapReduce Web 界面。 5. 分别在自编 MapReduce 程序 WordCount 运行过程中和运行结束后练习 MapReduce Shell 常用命令。 。。

    Hadoop原理与技术MapReduce实验

    (2)打开网站localhost:8088和localhost:50070,查看MapReduce任务启动情况 (3)写wordcount代码并把代码生成jar包 (4)运行命令 (1):把linus下的文件放到hdfs上 (2):运行MapReduce (5):查看运行结果 ...

    【MapReduce篇07】MapReduce之数据清洗ETL1

    【MapReduce篇07】MapReduce之数据清洗ETL1

    MapReduce发明人关于MapReduce的介绍

    MapReduce发明人关于MapReduce的介绍

    MapReduce实现join连接

    简单的在MapReduce中实现两个表的join连接简单的在MapReduce中实现两个表的join连接简单的在MapReduce中实现两个表的join连接

    Hadoop mapreduce实现wordcount

    Hadoop 用mapreduce实现Wordcount实例,绝对能用

    mapreduce源码

    hadoop网站通过SVN下载下来的mapreduce代码。欢迎现在学习!

    MapReduce求行平均值--MapReduce案例

    MapReduce求取行平均值 MapReduce小实例 数据有经过处理已经添加行号的 也有未添加的 行平均值的四种求法

    图解MapReduce.doc

    图解MapReduce,系统介绍Hadoop MapReduce工作过程原理

    Mapreduce实验报告.doc

    Mapreduce实验报告 前言和简介 MapReduce是Google提出的一种编程模型,在这个模型的支持下可以实现大规模并行化计 算。在Mapreduce框架下一个计算机群通过统一的任务调度将一个巨型任务分成许多部分 ,分别解决然后...

    mapreduce项目 数据清洗

    mapreduce基本数据读取,通俗易懂。 此项目情景为,遗传关系族谱。 (爷爷 、父母 、孩子) 经典案例

    MapReduce 设计模式

    MapReduce 设计模式,深入理解MapReduce编程模式,更好的利用MapReduce模型

    大数据 hadoop mapreduce 词频统计

    在hadoop平台上,用mapreduce编程实现大数据的词频统计

    大数据实验5实验报告:MapReduce 初级编程实践

    MapReduce 初级编程实践 姓名: 实验环境:  操作系统:Linux(建议Ubuntu16.04);  Hadoop版本:3.2.2; 实验内容与完成情况: (一)编程实现文件合并和去重操作 对于两个输入文件,即文件 A 和文件 B,请...

    Mapreduce-实践

    (实践三)MapReduce 布隆过滤器 过滤器训练、过滤器应用、结果验证及分析 (实践四)MapReduce Top 10模式示例 在ctrip数据集上进行Top 10排序。 (实践五)去重的用户—针对ctrip数据集去重 对ctrip数据集中的...

    MapReduce的实现细节

    MapReduce的实现细节,对mapreduce的具体实现讲解

    mapreduce例子

    mapreduce example

    MapReduce简单程序示例

    MapReduce简单程序示例

    python 实现mapreduce词频统计

    python实现mapreduce词频统计 执行方式:打开cmd命令,cd到代码所在文件夹,输入python wordcout_map.py &gt; words.txt | sort | python wordcout_reduce.py执行

Global site tag (gtag.js) - Google Analytics