Hadoop中的排序器/组合器/合并器

标签: Hadoop | 发表时间:2012-05-15 19:32 | 作者:jrckkyy
出处:http://hi.baidu.com/jrckkyy

目前,海量数据处理主要存在二个问题:大规模计算(cpu+mem)、海量数据存储(disk),而Hadoop被专门设计用来针对海量数据的处理,它通过分布式文件系统解决海量数据的存储问题,组织成千上万个计算节点来共同完成一个任务解决了大规模计算问题。Hadoop的核心是MapReduce,而不是分布式文件系统HDFS,这是因为MapRduce所依赖的存储系统并不依赖于任何一个文件系统,甚至是分布式文件系统。MapReduce设计的核心思想map-reduce计算模型,即将任何作业的处理分为两个阶段――map阶段和reduce阶段,在每一个阶段都由若干个机器节点(普通PC)共同协作完成,每一个机器节点只负责整个任务的一部分,这样做就使的任务的处理时间随着工作节点数量的增加而呈线性减少。这中间在很多情况下会存在这样的问题,就是单个计算节点往往无法一次性就把它所需要的数据加载进内存,也就是我们通常所说的内存瓶颈。解决内存瓶颈问题一般都是采用“分割-合并”的策略,而Hadoop在内部正是通过排序器、组合器、合并器来实现这一策略的。可以这么说,map-reduce计算模型是Hadoop解决海量数据处理的战略布局,排序器/组合器/合并器是Hadoop解决计算节点性能的战术实现。
     在本文,我将给大家详细的阐述Hadoop的大牛们是如何来设计key-value排序器、组合器、合并器的。

一、排序器(Sorter)

         对于Hadoop中排序器的设计,我不得不得先向Hadoop的设计大牛们深深的鞠上一躬,它牛B了,太精彩了。他们将排序问题抽象成了一个框架,或者说是一个排序模型:

 

 


         上面的排序模型将排序问题描述成这样的一个过程:排序器不断地对待排序的记录集进行某两条记录的比较与交换。也就是说,任何一种排序算法只对带排序的记录集进行两种基本操作:比较两条记录的大小、交换两条记录在带排序记录集中的位置,这就是Hadoop大牛们对排序问题的精简定义,这样的定义来源于他们对问题在最本质上的了解。我不得不说只有对问题有了最深入、最本质的了解之后才能设计出最抽象、最准确的解决方案,对已实现的解决方法的不断重构只能治标不能治本。在Sorter中实现某种排序算法,在Sortable中实现某种可排序的数据集,这样使得排序算法与待排序的数据集分开,排序算法永远也不知道也不需要知道它正在对哪个数据类型的数据集进行排序。而Hadoop在其内部这是这样设计的。

 

         Hadoop关于可排序的数据集定义了一个抽象接口IndexedSortable,也就是说任何能够排序的数据集必须要实现两个方法,一是能够比较它的数据集中任意两项的大小,二是能够交换它的数据集中任意两项的位置;排序算法的实现定义了一个抽象接口IndexedSorter,它定义了两个方法,其中的一个方法还可以报告当前排序的完成进度。

 


二、组合器(Combiner)

         Hadoop在其内部利用组合器来局部合并具有相同key的key-value记录,组合器的设计大致同排序器的设计一样,也是将合并操作和待合并的数据分开,这个组合器框架设计如下:

 

          Hadoop中的合并器一般合并的key-value数据来自与内存,然后把合并后的结果按照一定的组织格式写入磁盘文件作为中间数据,待最后汇总合并,我们把每一次合并后的这种中间结果看做一个段。在Hadoop中是这样实现这个组合框架的:

     


        Hadoop中的组合器的实现主要用来处理key-value类型的数据,它先把带合并的所有的key-value结合按照key值来聚合,这样就使得相同key值的key-value记录被保存到同一个迭代器(Iterator)中,然后把一个个迭代器结构组合器来处理,最后每一迭代器的处理结果被交给了收集器(Collector)来保存。

 


三、合并器(Merger)

        这里的合并器(Merger)不同于上面介绍的组合器(Combiner),它主要是正对上面组合器生成的最后结果进行合并,也就是合并所有的中间段,这个框架在Hadoop内部是这样设计的:

 

     Hadoop中合并器(Merger)的设计类似于它的组合器(Combiner),唯一不同的就是这个聚合迭代器的来源略有不同,合并器中的每一个迭代器来自于所有的中间段中属于相同类的key-value,所以对每一中间段,合并器都生成了一个对应的段读取器来读取段(SegmentReader)中的key-value值。主要看一下与段读取器(SegmentReader)相关的实现类:

 

 


四、总结

       在本文,我系统的介绍了Hadoop对排序器/组合器/合并器的设计,Hadoop对它们的设计可以说是站在一个好高的层次,因此我们就可以把这些框架移植到其它引用场景下,甚至无需修改任何代码。

本篇文章来源于 Linux公社网站( www.linuxidc.com)  原文链接: http://www.linuxidc.com/Linux/2012-01/50861.htm

阅读全文
类别: Hadoop  查看评论

相关 [hadoop 排序 组合] 推荐:

Hadoop中的排序器/组合器/合并器

- - 学着站在巨人的肩膀上
目前,海量数据处理主要存在二个问题:大规模计算(cpu+mem)、海量数据存储(disk),而Hadoop被专门设计用来针对海量数据的处理,它通过分布式文件系统解决海量数据的存储问题,组织成千上万个计算节点来共同完成一个任务解决了大规模计算问题. Hadoop的核心是MapReduce,而不是分布式文件系统HDFS,这是因为MapRduce所依赖的存储系统并不依赖于任何一个文件系统,甚至是分布式文件系统.

hadoop 二次排序

- - 企业架构 - ITeye博客
hadoop的工作流程:. 是在key中,排序value的实现,思路是. 1.把value中需要有序的部分value-part放入key中. 2.sortCompare类或key的CompareTo方法中完成对key+value-part的比较. 3.GroupingCompare中只对key进行比较,这样相同的key跌倒获取到reduce中.

Hadoop中的各种排序

- - 互联网 - ITeye博客
1:shuffle阶段的排序(部分排序). shuffle阶段的排序可以理解成两部分,一个是对spill进行分区时,由于一个分区包含多个key值,所以要对分区内的按照key进行排序,即key值相同的一串存放在一起,这样一个partition内按照key值整体有序了.

hadoop复合键排序使用方法

- - CSDN博客云计算推荐文章
在hadoop中处理复杂业务时,需要用到复合键,复合不同于单纯的继承Writable接口,而是继承了WritableComparable接口,而实际上,WritableComparable接口继承了Writable和Comparable接口,如果只需要使用某一个类作为传值对象而不是作为key,继承Writable接口即可.

利用hadoop mapreduce 做数据排序

- - zzm
我们的需求是想统计一个文件中用IK分词后每个词出现的次数,然后按照出现的次数降序排列. 由于hadoop在reduce之后就不能对结果做什么了,所以只能分为两个job完成,第一个job统计次数,第二个job对第一个job的结果排序. 第一个job的就是hadoop最简单的例子countwords,我要说的是用hadoop对结果排序.

Hadoop初体验――搭建hadoop简单实现文本数据全局排序

- - 学着站在巨人的肩膀上
      手头上有三台配置一样的电脑,就不去装虚拟机了,配置如下:.       三台电脑装有相同的操作系统――Ubuntu 11.04.       任选一台机器作为master,其他机器作为slaves,所有机器拥有相同的用户、相同的环境变量配置、相同的hadoop目录结构、相同的Java目录结构.

如何在Hadoop里面实现二次排序

- - 编程语言 - ITeye博客
在hadoop里面处理的数据,默认按输入内容的key进行排序的,大部分情况下,都可以满足的我们的业务需求,但有时候,可能出现类似以下的需求,输入内容:. 秦东亮;72 秦东亮;34 秦东亮;100 三劫;899 三劫;32 三劫;1 a;45 b;567 b;12. 注意上面的输出1,和输出2,其实都是一样的逻辑,只不过,输出的形式稍微改了下,那么今天散仙,就来分析下,怎么在hadoop里面,实现这样的需求.

如何使用hadoop对海量数据进行统计并排序

- - ITeye博客
hadoop在如下的几种应用场景里,用的还是非常广泛的,1,搜索引擎建索引,2,topK热关键词统计,3,海量日志的数据分析等等. 散仙,今天的这个例子的场景要对几亿的单词或短语做统计和并按词频排序,当然这些需求都是类似WordCount问题,如果你把Hadoop自带的WordCount的例子,给搞懂了,基本上做一些IP,热词的统计与分析就很很容易了,WordCount问题,确实是一个非常具有代表性的例子.

Hadoop二次排序关键点和出现时机(也叫辅助排序、Secondary Sort)

- - The Big Data Way,平凡但不乏味
    Hadoop二次排序在面试的时候出现频率还是比较高的. 今天花了点时间通过源码深入学习了一下. 后面内容以Hadoop自带实例——SecondarySort讲解.     它的作用是决定数据分区,说白了就是决定map输出key-value由哪个reduce处理,每个map task输出的key-value都会执行Partitioner的getPartition()方法,用于返回当前key-value由哪个reduce处理.

Hadoop Streaming 编程

- - 学着站在巨人的肩膀上
Hadoop Streaming是Hadoop提供的一个编程工具,它允许用户使用任何可执行文件或者脚本文件作为Mapper和Reducer,例如:. 采用shell脚本语言中的一些命令作为mapper和reducer(cat作为mapper,wc作为reducer). 本文安排如下,第二节介绍Hadoop Streaming的原理,第三节介绍Hadoop Streaming的使用方法,第四节介绍Hadoop Streaming的程序编写方法,在这一节中,用C++、C、shell脚本 和python实现了WordCount作业,第五节总结了常见的问题.