hadoop二次排序的个人理解

看了多篇文档,现总结自己对二次排序的理解;
1.流程 各个阶段;
input ---> split ——> recordreader ——> 形成复合键值对textpair  ——> 分区(setGroupingComparatorClass设置的分区方法)输出  ——> 对每个分区进行排序setSortComparatorClass(按照设定的排序方式对textpair进行排序,其实这已经进行了一次二次排序了)  ——> shuffle阶段  ——> 内部排序(用setSortComparatorClass设定的排序方式,进行第二次排序) ——>分组(setGroupingComparatorClass设定的分组函数) ——> 执行reduce ——>输出
2.各个流程详解
Map阶段:
 (1) 输入的数据,安装inputformat进行输入,同时生成相应的键值对<key,value>;
 (2) 在Map函数中,对键值对key,value进行处理形成新的TextPair键值对 key1=key + value,value1=value,同时对TextPair的排序是先对key1的key排序,然后对value排序。
 (3) 在Spill输出阶段,用新定义的partion方法决定对应的reducer。分区是依据TextPair键的第一个字段(key)进行分区。
 (4) 对map输出的分块进行内部排序,排序方式采用我们定义的哦规则,实际上对其进行了一次二次排序(首先按照key1的第一个字段排序,然后按照第二个字段排序)
 (5)对一个分区的多个文件进行merge操作
Reduce阶段:
 (1) Shuffle Reducer根据jobtracker查找到要读取的文件,传输到Reducer,并进行merge操作。
 (2) 因为从不同节点读取了相应的map输出文件,所以在此处进行第二次排序,排序依然是根据我们定义的排序规则(TextPair的排序方法)进行排序,重新进行了一次二次排序。
 (3) 在reduce阶段,会对键值相同的项进行分组操作,其默认操作的键。对于我们生产的键值对<key1,value1>,key1是一个复合键值对,我们对他的操作是针对key1的第一个值为准的。生成新的分组<key1,valueList<value1,value2........>>
 (4)reduce 对分组进行处理。
我们现在以Hadoop权威指南中的例子进行推演
在这个例子中,输入的文件是这样格式,第一列是时间,第二列是温度
 1990 31
 1991 20
 1991 18
 1991 33
 1990 22
 1990 17
我们想要得到的结果如下(先按照年份排序,然后按照温度排序)
 1990 17
 1990 22
 1990 31
 
 1991 18
 1991 20
 1991 33
 过程如下:
 (1)在map阶段,将将输入文件形成复合键值对
  <<1990 31> 31>
  <<1991 20> 20>
  <<1991 18> 18>
  <<1991 33> 33>
  <<1990 22> 22>
  <<1990 17> 17>
 (2)利用partion函数,对复合键的键值的第一列作为键进行分片,并进行内部排序
  
  <<1990 17> 17>
  <<1990 22> 22>
  <<1990 31> 31>
  
  <<1991 18> 18>
  <<1991 20> 20>
  <<1991 33> 33>
  这个文件分别映射到不同的reducer,Reducer从jobtracker中读到要读的文件
 (3)reducer通过shuffle将不同节点上的内容加载进来,并重新进行二次排序(因为不同节点上的相应部分被加载进来后,各个部分的内容不相同,需要重新进行二次排序)
  <<1990 17> 17>
  <<1990 22> 22>
  <<1990 31> 31>
  
  <<1991 18> 18>
  <<1991 20> 20>
  <<1991 33> 33>
 (4)分组
  reduce阶段重新排序过后,还需要分组,分组所依据的键值是默认键,而我们穿过来的是复合键,其分组的时候,不一定按照年份来,所以我们重新实现分组函数,使得其以复合键的第一列作为键值进行分组
  reducer1:
   <<1990 17> <17 22 31>>
  reducer2:
   <<1991 18> <18 20 33>>
 (4)由reduce处理形成的分组,键值为复合键的第一列,value值为依次从valueList中取出的值
  reducer1输出:
   1990 17
   1990 22
   1990 31
  reducer2输出:
   1991 18
   1991 20
   1991 33
 
   参考博客:http://www.cnblogs.com/dandingyy/archive/2013/03/08/2950703.html

http://blog.sina.com.cn/s/blog_6b1ff7650101imzp.html

时间: 2024-10-20 12:29:25

hadoop二次排序的个人理解的相关文章

Hadoop二次排序及MapReduce处理流程实例详解

一.概述 MapReduce框架对处理结果的输出会根据key值进行默认的排序,这个默认排序可以满足一部分需求,但是也是十分有限的,在我们实际的需求当中,往往有要对reduce输出结果进行二次排序的需求.对于二次排序的实现,网络上已经有很多人分享过了,但是对二次排序的实现原理及整个MapReduce框架的处理流程的分析还是有非常大的出入,而且部分分析是没有经过验证的.本文将通过一个实际的MapReduce二次排序的例子,讲述二次排序的实现和其MapReduce的整个处理流程,并且通过结果和Map.

一起学Hadoop——二次排序算法的实现

二次排序,从字面上可以理解为在对key排序的基础上对key所对应的值value排序,也叫辅助排序.一般情况下,MapReduce框架只对key排序,而不对key所对应的值排序,因此value的排序经常是不固定的.但是我们经常会遇到同时对key和value排序的需求,例如Hadoop权威指南中的求一年的高高气温,key为年份,value为最高气温,年份按照降序排列,气温按照降序排列.还有水果电商网站经常会有按天统计水果销售排行榜的需求等等,这些都是需要对key和value同时进行排序.如下图所示:

Hadoop二次排序的其他写法

二次排序原理 在map阶段,使用job.setInputFormatClass定义的InputFormat将输入的数据集分割成小数据块splites,同时InputFormat提供一个RecordReder的实现. 本例子中使用的是TextInputFormat,他提供的RecordReader会将文本的字节偏移量作为key,这一行的文本作为value. 这就是自定义Map的输入是<LongWritable, Text>的原因.然后调用自定义Map的map方法,将一个个<LongWrit

hadoop 二次排序

1       3 1       2 1       1 3       3 3       2 2       2 2       1 3       1 排序后: 1 1 1 2 1 3 2 1 2 2 3 1 3 2 3 3 代码为: package com.hadoop.test.SecondSort; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import org.

hadoop二次排序

import java.io.DataInput; import java.io.DataOutput; import java.io.File; import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.P

Hadoop.2.x_高级应用_二次排序及MapReduce端join

一.对于二次排序案例部分理解 1. 分析需求(首先对第一个字段排序,然后在对第二个字段排序) 杂乱的原始数据 排序完成的数据 a,1 a,1 b,1 a,2 a,2 [排序] a,100 b,6 ===> b,-3 c,2 b,-2 b,-2 b,1 a,100 b,6 b,-3 c,-7 c,-7 c,2 2. 分析[MapRedice过程] 1> 分析数据传入通过input()传入map() 2> map()对数据进行层层过滤,以达到我们想要的数据源, 3> 过滤方法中可添加自

mapreduce 的二次排序

一: 理解二次排序的功能, 使用自己理解的方式表达(包括自定义数据类型,分区,分组,排序) 二: 编写实现二次排序功能, 提供源码文件. 三:理解mapreduce join 的几种 方式,编码实现reduce join,提供源代码,说出思路. 一: 二次排序 使用自己理解的方式表达(包括自定义数据类型,分区,分组,排序) 1.1 二次排序的功能 1. 当客户端提交一个作业的时候,hadoop 会开启yarn 接受进行数据拷贝处理,之后交友有yarn 框架上的启动服务resourcemanage

python 实现Hadoop的partitioner和二次排序

我们知道,一个典型的Map-Reduce过程包 括:Input->Map->Patition->Reduce->Output.Pation负责把Map任务输出的中间结果 按key分发给不同的Reduce任务进行处理.Hadoop 提供了一个非常实用的partitioner类KeyFieldBasedPartitioner,通过配置相应的参数就可以使用.通过 KeyFieldBasedPartitioner可以方便地实现二次排序. 使用方法:       -partitioner o

Hadoop学习之自定义二次排序

一.概述    MapReduce框架对处理结果的输出会根据key值进行默认的排序,这个默认排序可以满足一部分需求,但是也是十分有限的.在我们实际的需求当中,往 往有要对reduce输出结果进行二次排序的需求.对于二次排序的实现,本文将通过一个实际的MapReduce二次排序例子讲述 二次排序的实现和其MapReduce的整个处理流程,并且通过结果和map.reduce端的日志来验证所描述的处理流程的正确性. 二.需求描述 1.输入数据: sort1    1 sort2    3 sort2