文档章节

hadoop二次排序的个人理解

仙剑奇侠
 仙剑奇侠
发布于 2014/11/18 15:23
字数 1036
阅读 387
收藏 8

看了多篇文档,现总结自己对二次排序的理解;
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   

© 著作权归作者所有

仙剑奇侠
粉丝 2
博文 6
码字总数 3056
作品 0
成都
程序员
私信 提问
Hadoop之MapReduce自定义二次排序流程实例详解

1.如何解决MapReduce二次排序? 2.Map端如何处理? 3.Reduce端如何处理? 4.MapReduce二次排序是如何具体实现的呢? 一、概述 MapReduce框架对处理结果的输出会根据key值进行默认的排序,这个...

张欢19933
2016/04/07
102
0
hadoop学习中使用到的相关资料汇总

学习使用hadoop来开发 mapreduce二次排序 :需要按照value中的字段来排序,一个典型的场景是value中的数据属于多个类别,map阶段可以标示,但是无序。二次排序之后,value可以在进入reduce的...

七水禾
2014/02/27
68
0
MapReduce 中的两表 join 几种方案简介

1. 概述 在传统数据库(如:MYSQL)中,JOIN操作是非常常见且非常耗时的。而在HADOOP中进行JOIN操作,同样常见且耗时,由于Hadoop的独特设计思想,当进行JOIN操作时,有一些特殊的技巧。 本文...

恶魔苏醒ing
2016/10/19
0
0
【大数据分析常用算法】1.二次排序

简介 本算法教程系列建立在您已经有了spark以及Hadoop的开发基础,如果没有的话,请观看本博客的hadoop相关教程或者自行学习,代码会在博客文档写到一定程度统一放到github下。 二次排序是指...

Areya
2019/01/14
204
0
hadoop之MapReduce自定义二次排序流程实例详解

一、概述 MapReduce框架对处理结果的输出会根据key值进行默认的排序,这个默认排序可以满足一部分需求,但是也是十分有限的。在我们实际的需求当中,往往有要对reduce输出结果进行二次排序的...

zengzhaozheng
2018/07/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring AOP-06-切入点类型

切入点是匹配连接点的拦截规则。之前使用的是注解@Pointcut,该注解是AspectJ中的。除了这个注解之外,Spring也提供了其他一些切入点类型: • 静态方法切入点StaticMethodMatcherPointcut •...

moon888
昨天
90
0
Class Loaders in Java

1. Introduction to Class Loaders Class loaders are responsible for loading Java classes during runtime dynamically to the JVM (Java Virtual Machine). Also, they are part of the ......

Ciet
昨天
78
0
以Lazada为例,看电商系统架构演进

什么是Lazada? Lazada 2012年成立于新加坡,是东南亚第一电商,2016年阿里投资10亿美金,2017年完成对lazada的收购。 业务模式上Lazada更偏重自营,类似于亚马逊,自建仓储和为商家提供服务...

春哥大魔王的博客
昨天
60
0
【自用】 Flutter Timer 简单用法

dart: void _startTime() async { _timer = Timer(Duration(seconds: sec), () { fun(xxx,yyy,zzz); }); } @override void dispose() { _timer.cancel()......

Tensor丨思悟
昨天
65
0
计算机实现原理专题--自动化(六)

目前实现的加减法器可以扩充到更高位宽的数值范围,不仅可以实现连续n个数的相加减,还可以实现其中几个数的相加减,并保存相应的结果。但是还不能应对某些场景,例如需要复用中间的临时结果...

FAT_mt
昨天
58
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部