Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7111769
  • 博文数量: 3857
  • 博客积分: 6409
  • 博客等级: 准将
  • 技术积分: 15948
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-02 16:48
个人简介

迷彩 潜伏 隐蔽 伪装

文章分类

全部博文(3857)

文章存档

2017年(5)

2016年(63)

2015年(927)

2014年(677)

2013年(807)

2012年(1241)

2011年(67)

2010年(7)

2009年(36)

2008年(28)

分类: HADOOP

2013-01-15 15:49:09

原文地址:Hadoop的二次排序 作者:bluecase

hadoop的使用中,一般只关注运行结果。对于mapper和reducer之间的处理逻辑往往不care。比如key-value对到达reducer的先后顺序等

目前接触到的运用场景有:
1.根据用户操作时间来整理事件链,在网站分析里比较常用。需要按时间先后顺序来处理,如果过亿的访问操作全在reducer里来排序,对计算能力和内存都是一个挑战。

2.海量数据处理中,求去重distinct这种操作,往往需要先缓存很大的数据集,对单个reducer的内存要求很高,特别是上亿的数据时,很容易就撑爆内存。这里如果在reducer进入前就排好序,后续处理就简单的多。

二次排序相当于把一个reducer的负载推给了多个maper。

例子:如果我们要将日志按用户的访问时间排序。
1.map阶段输出key-value对:key是 : uid,sid,time    value是url,time
2.进入二次排序。
3.进入reducer的key-valuelist:key是:  uid,sid   valuelist是: [{url1,time2},{url,time2},……]
其中valuelist是按time来排序的。

这里说下阶段2,以下三个都是可以由用户定义的:
1.partition:  简单粗暴的解释就记录即将进入的reducer实例的ID
2.group:      群组,一个事件链表。所以群组里的记录会比较时间,而群组间则不会。
3.key          map输出的key

你要写这三个类,hadoop会调用这几个函数来比较。你可以自己定义比较的逻辑,是字典排序还是数字排序,是从大到小,还是从小到大。 具体实现可以看hadoop权威指南。

需要强调的是:
1. 一个群组会在一个reduce函数里被处理。
    例 如:
    在配置里指定30个reducer ,日志里根据uidsid会有100个group 。平均1个reducer进程会调多次次reduce函数,处理多个group。所以每次处理一个group后,相关变量要清理。

2.进入reducer时候,key是group里定义的key ,已经不是map输出的那个key了,被丢弃了。
   所以时间要放到value里传递进来。
阅读(270) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~