hadoop 二次排序的一些思考
先说一下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
- 一般自定义对象,但是如果比较的东东都是string,并且需求是字典序,那就可以用string的组合key。
- 如何要实现二次排序,grouping是要实现的,但是像第一种需求没重写grouping结果恰巧也对。
- 笔者认为本质:考察对mr整个数据流向的理解,还有关键的reduce分组理解是否深入
- 其实根据需求有时候不实现也可以, 可以定义一个全局中间变量,判断当前name与上一个name是否一样,一样就拼接value,不一样就write,不过中间要多定义几个全局临时变量,用于数据交换,不推荐这么使用。可以把可以key定义为name不过这样reduce压力较大,value(score)的排序也会在reduce内存中进行,数据量大也会有问题,不推荐。
hadoop 二次排序的一些思考的更多相关文章
- hadoop 二次排序的思考
name sorce jx 10 gj 15 jx 20 gj 30 1. 二次排序 key如何定义 2. grouping 是不是一定要实现,不实现可以吗? 3. 二次排序的本质是什么 4. 如果以 ...
- 一起学Hadoop——二次排序算法的实现
二次排序,从字面上可以理解为在对key排序的基础上对key所对应的值value排序,也叫辅助排序.一般情况下,MapReduce框架只对key排序,而不对key所对应的值排序,因此value的排序经常 ...
- Hadoop 二次排序
需求 求每年的最高气温,年份升序,温度求最高 数据源内容如下 temperature.txt 2004 49 1981 -22 1981 -31 1965 -47 2027 -2 1964 6 203 ...
- hadoop二次排序
import java.io.DataInput; import java.io.DataOutput; import java.io.File; import java.io.IOException ...
- Hadoop学习之自定义二次排序
一.概述 MapReduce框架对处理结果的输出会根据key值进行默认的排序,这个默认排序可以满足一部分需求,但是也是十分有限的.在我们实际的需求当中,往 往有要对reduce输出结果进行二次排 ...
- Hadoop Mapreduce分区、分组、二次排序过程详解[转]
原文地址:Hadoop Mapreduce分区.分组.二次排序过程详解[转]作者: 徐海蛟 教学用途 1.MapReduce中数据流动 (1)最简单的过程: map - reduce (2) ...
- Hadoop.2.x_高级应用_二次排序及MapReduce端join
一.对于二次排序案例部分理解 1. 分析需求(首先对第一个字段排序,然后在对第二个字段排序) 杂乱的原始数据 排序完成的数据 a,1 a,1 b,1 a,2 a,2 [排序] a,100 b,6 == ...
- Hadoop学习笔记: MapReduce二次排序
本文给出一个实现MapReduce二次排序的例子 package SortTest; import java.io.DataInput; import java.io.DataOutput; impo ...
- Hadoop MapReduce 二次排序原理及其应用
关于二次排序主要涉及到这么几个东西: 在0.20.0 以前使用的是 setPartitionerClass setOutputkeyComparatorClass setOutputValueGrou ...
随机推荐
- Eclipse导入已有的项目后项目报错的解决办法
第一种:jsp报错 选择windows-->preference-->列表找到Validation-->点击Disable All ->> Apply ->> ...
- 古墓丽影:崛起 PC版今日发售
之前xbox one的独占游戏 古墓丽影: 崛起(Rise of the Tomb Raider™), 今天正式在steam发售了, 之前就可以预购.简单看了一下, 画风跟前代类似, 但是画面更好, ...
- zabbix使用邮箱告警
目的:使用自己的邮箱(目前我使用的是腾讯企业邮箱)发送告警邮件 1.配置Email:管理->报警媒介类型->Email->修改对应Email参数 2.修改admin用户的报警媒介Em ...
- Python3 多线程例子
import threading, zipfile class AsyncZip(threading.Thread): def __init__(self, infile, outfile): thr ...
- 3.认识Angular2组件之1
简述:组件(component)是构成Angular应用的基础和核心.可以这样说,组件用来包装特定的功能,应用程序的有序运行依赖于组件之间的协同工作. 1. 组件化标准:W3C为了统一组件化的标准方式 ...
- ASP.NET上传文件到远程服务器(HttpWebRequest)
/// <summary> /// 文件上传至远程服务器 /// </summary> /// <param name="url">远程服务地址 ...
- update_engine-DownloadAction(二)
在update_engine-DownloadAction(一)中对DownloadAction介绍到了DeltaPerformer的Write方法.下面开始介绍Write方法. src/system ...
- web.py模块使用
web.py模块 import time import web urls=("/",'hello') class hello(): def GET(self): return (t ...
- siftflow-fcn32s训练及预测
一.说明 SIFT Flow 是一个标注的语义分割的数据集,有两个label,一个是语义分类(33类),另一个是场景标签(3类). Semantic and geometric segmentatio ...
- 使用GNVM工具高效切换node版本
在开发中,有时候需要在多个node版本之间切换,重复手动下载安装node安装包来切换版本很麻烦,在Mac系统中可以使用nvm工具,而windows系统无法使用nvm工具.gnvm解决了在windows ...