`
刘小小尘
  • 浏览: 67461 次
  • 性别: 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模型中还包含两个重要的概念:Combine和Partition。 ***bine:用于优化MapReduce性能的机制,它类似于Reduce,但只作用于Map阶段输出的数据,并在Map节点上执行,减少数据传输量。Combine的输入输出键值对...

    MapReduce2.0源码分析与实战编程

    《MapReduce2.0源码分析与实战编程》是一本深度探讨Hadoop MapReduce核心框架的书籍,旨在帮助读者理解MapReduce的工作原理,并通过实际编程掌握其应用技巧。以下是各章节主要内容的概述: 第1章:MapReduce简介 本...

    一个MapReduce简单程序示例

    3. Combine可选步骤:为了减少网络传输开销,Reduce任务可以先执行本地的Combine操作,对部分键值对进行初步聚合。 4. Reduce函数:最后,Reducer执行Reduce函数,对每个键的所有值进行处理,生成最终的输出结果。 ...

    Mapreduce原理

    - **Combine函数**:可以在Map阶段对输出进行局部聚合,减少Shuffle阶段的数据量。 - **Combiner**:类似于Reduce函数,但只在Map任务内部使用,用于减少网络传输的数据量。 #### 五、HDFS特点 **1. 优点** - **...

    MapReduce源码分析完整版

    - **Combine阶段**(可选):在Map阶段之后,Reduce阶段之前,可以有一个Combine阶段,目的是减少网络传输量。此阶段将相同键的值进行局部聚合,例如,将同一单词的所有计数相加。 - **Reduce阶段**:将所有来自不同...

    MapReduce源码分析完整版.docx

    接着,combine(可选)和reduce阶段将相同单词的计数合并,最终得到每个单词的总数。 MapReduce框架结构包括三个主要角色:JobClient、JobTracker和TaskTracker。JobClient负责将应用程序提交到JobTracker,...

    【MapReduce篇08】MapReduce优化1

    4. **Combine处理**:在Map阶段后,如果可能,可以先进行Combine处理,以减少数据传输的I/O操作。 数据倾斜是MapReduce优化中常见的问题,表现为某些Key的值远大于其他Key,导致部分Reducer负载过高。解决方法包括...

    mapreduce详细流程

    5. **合并阶段** (Combine): - 当所有数据处理完毕后,所有的`spill files`将被合并成一个较大的文件。 - 合并采用递归方式进行,每次合并多个文件直到最终生成一个大文件。 - 生成的文件将带有对应的索引信息,...

    mapreduce基础实战.docx

    - **Combine处理**:在Map任务完成后,先进行Combine处理,以减少数据传输量。 3. **Shuffle阶段优化** - **数据压缩**:通过数据压缩减少网络I/O时间。 - **自定义Partitioner**:合理分配数据分区,以减少网络...

    Hadoop.MapReduce.分析

    3. **自动执行Combine操作**: 在Map端进行局部汇总。 4. **自动序列化**: 将Map任务输出序列化,以便传输给Reduce阶段。 #### 八、总结 Hadoop.MapReduce 是一个强大的大数据处理框架,通过将复杂的大数据处理任务...

    Java编写Mapreduce程序过程浅析

    3. **归并(Combine)**:可选步骤,提供局部规约,减少网络传输的数据量。 **五、Reduce阶段** 1. **RecordReader**:读取Mapper输出的中间键值对。 2. **Reducer**:对每个键的值进行规约操作,生成最终结果键值...

    第4章大数据技术教程-MapReduce.pdf

    分布式计算框架 MapReduce MapReduce 是一种面向大规模数据并行处理的编程模型,也是一种并行分布式计算框架。在 Hadoop 流行之前,分布式框架虽然也有,但是实现比较复杂,基本都是大公司的专利,小公司没有能力和...

    【MapReduce篇02】MapReduce之工作流程1

    5. **Combine阶段**:所有数据处理完毕后,MapTask会将所有临时文件合并成一个大文件`output/file.out`,同时生成索引文件`output/file.out.index`。合并过程中,以分区为单位进行,多轮递归合并,直到只剩一个文件...

    MapReduce源码流程.pdf

    MapReduce是大数据处理领域的一种分布式计算模型,由Google提出,主要用于大规模数据集的并行处理。在Hadoop框架中,MapReduce实现了一种简化的编程模型,使得开发者能够编写处理海量数据的应用程序。以下是...

    MapReduce技术原理深入理解.pptx

    Map端的Shuffle包括内存缓冲区的数据溢写到磁盘,以及数据的分区、排序和可能的Combine操作。Reduce端的Shuffle则涉及从多个Map任务获取数据,进行合并、排序和分组,为Reduce函数的执行做准备。 MapReduce的序列化...

    MapReduce海量数据并行处理课程复习提纲-20201

    Google MapReduce的工作原理包括Map阶段、Combine(优化带宽)、Partition(解决数据相关性)和Reduce阶段,同时,分布式文件系统GFS为MapReduce提供可靠的存储支持。BigTable是一个分布式结构化数据表,用于存储...

Global site tag (gtag.js) - Google Analytics