先说一下mr的二次排序需求:

假如文件有两列分别为name、score,需求是先按照name排序,name相同按照score排序

数据如下:

jx 20
gj 30
jx 10
gj 15

输出结果要求:

gj 15
gj 30
jx 10
jx 20

我们常见的实现思路是:

1. 自定义类,重写compare()比较逻辑(先比较name,name相同比较score),这样可以保证无论map端,还是reduce端的排序规则是我们需求的
当然,就这道题来说可以使用组合key,name_score吗?其实不行,主要因为score会按照字典排序
2. 我们按照key中的name做分区,按照需求只能有一个reduce,否则name不会全局有序。

然后是不是就ok了呢,如果就结果来说是ok的。但是内部隐藏种种问题。

现在需求换了,我要输出:

gj 15,30
jx 10,20

那么按照之前的逻辑,立马崩盘了。达不到此需求的效果。

我觉得二次排序重点考察之一就是隐藏的grouping。

grouping是做什么的呢,她是reduce端的分组,她是决定reduce方法会被框架调用几次关键,之前的需求之所以成功是因为grouping的compare()默认实现是迭代的前后对象==,

也就是比较对象的内存地址,对象不同所以就返回false,也就是不同组,这时reduce方法会被再次调用,而不是内部values的迭代器了。

由于reduce端的归并排序规则(之前我们已经定义好了),直接输出就ok了,相当于每行数据就调用一次reduce方法。

但如果是第二次需求,没有实现grouping,无法实现相同名字的分数都好分隔。

实现方式就是实现grouping,重写compare方法,逻辑是如果名字相同就返回true。

这样到reduce端,相同name就是reduce同组,一次reduce方法,迭代values内容就可以实现value之间的逗号分隔。

那为什么我们刚学mr是的wordcount不用实现grouping呢?

主要是wordcount的key是string,到了reduce端相同的string内容是有字符串常量池的,所以 == 会相同,这样相同的word单词会同组,会在同一个values迭代器累加。
如果手贱,把string 封装成对象,并且不实现grouping,那得到的结果就不是我们想要的
会变成:
a 1
a 1
b 1
b 1
...

思考问题:

1. 一般的二次排序key如何定义?
2. grouping 是不是一定要实现,不实现可以吗?
3. 二次排序的本质是什么?
4. 如果以下输出
gj 15,30
jx 10,20
1). 可不可以不设置grouping
2). key可不可以设置为name
  1. 一般自定义对象,但是如果比较的东东都是string,并且需求是字典序,那就可以用string的组合key。
  2. 如何要实现二次排序,grouping是要实现的,但是像第一种需求没重写grouping结果恰巧也对。
  3. 笔者认为本质:考察对mr整个数据流向的理解,还有关键的reduce分组理解是否深入
  4. 其实根据需求有时候不实现也可以, 可以定义一个全局中间变量,判断当前name与上一个name是否一样,一样就拼接value,不一样就write,不过中间要多定义几个全局临时变量,用于数据交换,不推荐这么使用。可以把可以key定义为name不过这样reduce压力较大,value(score)的排序也会在reduce内存中进行,数据量大也会有问题,不推荐。

hadoop 二次排序的一些思考的更多相关文章

  1. hadoop 二次排序的思考

    name sorce jx 10 gj 15 jx 20 gj 30 1. 二次排序 key如何定义 2. grouping 是不是一定要实现,不实现可以吗? 3. 二次排序的本质是什么 4. 如果以 ...

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

    二次排序,从字面上可以理解为在对key排序的基础上对key所对应的值value排序,也叫辅助排序.一般情况下,MapReduce框架只对key排序,而不对key所对应的值排序,因此value的排序经常 ...

  3. Hadoop 二次排序

    需求 求每年的最高气温,年份升序,温度求最高 数据源内容如下 temperature.txt 2004 49 1981 -22 1981 -31 1965 -47 2027 -2 1964 6 203 ...

  4. hadoop二次排序

    import java.io.DataInput; import java.io.DataOutput; import java.io.File; import java.io.IOException ...

  5. Hadoop学习之自定义二次排序

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

  6. Hadoop Mapreduce分区、分组、二次排序过程详解[转]

    原文地址:Hadoop Mapreduce分区.分组.二次排序过程详解[转]作者: 徐海蛟 教学用途 1.MapReduce中数据流动   (1)最简单的过程:  map - reduce   (2) ...

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

    一.对于二次排序案例部分理解 1. 分析需求(首先对第一个字段排序,然后在对第二个字段排序) 杂乱的原始数据 排序完成的数据 a,1 a,1 b,1 a,2 a,2 [排序] a,100 b,6 == ...

  8. Hadoop学习笔记: MapReduce二次排序

    本文给出一个实现MapReduce二次排序的例子 package SortTest; import java.io.DataInput; import java.io.DataOutput; impo ...

  9. Hadoop MapReduce 二次排序原理及其应用

    关于二次排序主要涉及到这么几个东西: 在0.20.0 以前使用的是 setPartitionerClass setOutputkeyComparatorClass setOutputValueGrou ...

随机推荐

  1. java————数组 简单写出一个管理系统

    数组的特点 1,  数组是一块连续的空间,下标描述空间的位置. 2,  下标从0开始,最大下标为数组长度—1.(*.length-1) 3,  数组元素都是变量.(就是每个下标对应的内容).变量的类型 ...

  2. HP Elitebook 830 G5/Win10蓝屏 UcmUcsi.sys 错误解决

    转自https://support.hp.com/cn-zh/document/c06038185 注意BIOS可能是英文的,别着急,对着找就好了.

  3. MySQL Hardware--Linux 文件句柄限制

    Linux会限制文件句柄数量,默认为1024,当超过该阈值后,会报"to many open files" ## 使用ulimit -a查看当前打开文件句柄限制 ulimit -a ...

  4. day04 迭代器&生成器&装饰器

    目录   1.迭代器 2.生成器 3.推导式 4.匿名函数 5.内置函数 6.递归 7.闭包 8.装饰器 一.迭代器 特点: 1. 省内存 2. 只能向前. 不能反复 3. 惰性机制 让不同的数据类型 ...

  5. wakatime记录 coding时间的工具

    想记录下自己每天coding 的时间以及每个在各个项目上coding的时间,之前一直也没有什么好的办法,无意之间发现wakatime这个插件可以记录自己每天有效的coding时间. wakatime ...

  6. Fiddler2如何对Android应用进行抓包

    Fiddler2抓包工具的下载和使用  2018-04-22 18:06:37     0     0     0 Fiddler是一款非常流行并且实用的http抓包工具,它的原理是在本机开启了一个h ...

  7. javax.el.PropertyNotFoundException: Property 'XXX' not found on type bean.XXXXX

    javax.el.PropertyNotFoundException: Property 'XXX' not found on type bean.XXXXX 先检查页面语法是否有问题,后在页面的el ...

  8. puzz: 图片和表单上传的不一致问题

    1.    方向1 用户提交表单, 图片和表单同步上传.(由同一服务器处理, 服务器压力大. 没有分离) 2.    方向2 图片和表单分开上传. 如图片访问ftp,表单提交后台(图片和后台分离) 2 ...

  9. JS将/Date(1446704778000)/转换成str

    JS将/Date(1446704778000)/转换成str:var dateStr = eval(ele.add_time.replace(/\/Date\((\d+)\)\//gi, " ...

  10. 黄聪:Mysql主从配置,实现读写分离

    大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢 ...