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 ...
随机推荐
- P2257 莫比乌斯+整除分块
#include<bits/stdc++.h> #define ll long long using namespace std; ; int vis[maxn]; int mu[maxn ...
- 【python】问题汇总
1.pip降级 python -m pip install pip==9.0.3 2. Flask利用pymysql出现Warning:1366的解决办法 错误提示:(1366, "Inco ...
- WPF-MVVM-ICommand接口实现
一 接口分析MVVM框架的目的就是让视图和业务逻辑分离,各干各的.那么怎样实现分离呢,精髓就是绑定ICommand.先看一下ICommand接口的定义: // // 摘要: // 定义一个命令. [T ...
- linux一些工具的安装(二)
一.Linux下安装lrzsz上传下载工具 1:使用yum安装 yum -y install lrzsz 要有网络才行 输入命令:rz启动文件上传 2:手动编译安装 1. 下载安装包,wget ht ...
- python 基础之自动类型转换和强制类型转换
一:自动类型转换 自动类型转换注意针对Number数据类型来说的 当2个不同类型的数据进行运算的时候,默认向更高精度转换 数据类型精度从低到高:bool int float complex #关于bo ...
- log4j根据包名 日志输出到不同文件中 , service层无法输出日志问题
1. service 层因为要配置事务,使用了代理 <aop:config proxy-target-calss=''true"> <aop:pointcut id=&qu ...
- 18.6 使用TFTP下载时ping不通或出现ping通下载失败
下载成功loading: #### 下载失败loading: T T T T 解决办法,使主机干净,即关闭360.主机防火墙,程序插除完后写入才可执行.[2018年6月28日15:16:33测试后,关 ...
- .NET 使用 Azure Blob 存储图片或文件
使用的是VS2017 一.先使用 NuGet 获取这两个包. 执行以下步骤: 在“解决方案资源管理器”中,右键单击你的项目并选择“管理 NuGet 包”. 1.在线搜索“WindowsAzure.St ...
- 两个Integer变量a和b,值相等,a==b等于多少?
Integer a = Integer.valueOf(127); Integer b = Integer.valueOf(127); Integer c = Integer.valueOf(12 ...
- 漫画赏析:Linux 内核到底长啥样(转)
知乎链接:https://zhuanlan.zhihu.com/p/51679405 来自 http://TurnOff.us 的漫画 “InSide The Linux Kernel” 本文转载自: ...