MapReduce算法–二级排序

我们将继续进行有关实现MapReduce算法的系列文章,该系列可在使用MapReduce进行数据密集型文本处理中找到。 本系列的其他文章:

  1. 使用MapReduce进行数据密集型文本处理
  2. 使用MapReduce进行数据密集型文本处理-本地聚合第二部分
  3. 使用Hadoop计算共现矩阵
  4. MapReduce算法–顺序反转



这篇文章介绍了在使用MapReduce进行数据密集型文本处理的第3章中找到的二级排序模式。 虽然Hadoop在将映射器发出的数据自动排序后再发送给reducer,但是如果您还想按值排序怎么办? 您当然会使用二级排序。 通过稍加操作键对象的格式,二级排序使我们能够在排序阶段将值考虑在内。 这里有两种可能的方法。

第一种方法涉及让减速器缓冲给定键的所有值,并对这些值进行归约器排序。 由于减速器将接收给定键的所有值,因此此方法可能会导致减速器内存不足。

第二种方法涉及通过向自然键添加部分或整个值来创建组合键,以实现您的排序目标。 这两种方法之间的权衡是对reducer中的值进行显式排序,这很可能会更快(存在内存不足的风险),但实现“值到键”转换方法会减轻MapReduce框架的排序工作,这是Hadoop / MapReduce设计要做的核心。 出于本文的目的,我们将考虑“关键价值”方法。 我们将需要编写一个自定义分区程序,以确保所有具有相同键(自然键不包含带有值的复合键)的数据都发送到相同的reducer和自定义比较器,以便一旦数据被自然键分组到达减速机。

值到密钥转换

直接创建复合键。 我们需要做的是分析在排序过程中要考虑值的哪一部分,并将适当的部分添加到自然键中。 然后,我们需要在键类或比较器类中使用compareTo方法,以确保对组合键进行了说明。 我们将重新访问天气数据集,并将温度作为自然键的一部分(自然键是年和月连接在一起)的一部分。 结果将是给定月份和年份中最冷的一天的列表。 该示例的灵感来自Hadoop,《权威指南》一书中的二级排序示例。 尽管可能有更好的方法可以实现此目标,但它足以说明次级排序的工作原理。

映射器代码

我们的映射器代码已经将年和月连接在一起,但是我们还将把温度作为键的一部分。 由于我们将值包含在键本身中,因此映射器将发出NullWritable,在其他情况下,我们将发出温度。

public class SecondarySortingTemperatureMapper extends Mapper<LongWritable, Text, TemperaturePair, NullWritable> {private TemperaturePair temperaturePair = new TemperaturePair();private NullWritable nullValue = NullWritable.get();private static final int MISSING = 9999;
@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {String line = value.toString();String yearMonth = line.substring(15, 21);int tempStartPosition = 87;if (line.charAt(tempStartPosition) == '+') {tempStartPosition += 1;}int temp = Integer.parseInt(line.substring(tempStartPosition, 92));if (temp != MISSING) {temperaturePair.setYearMonth(yearMonth);temperaturePair.setTemperature(temp);context.write(temperaturePair, nullValue);}}
}

现在,我们已将温度添加到密钥中,我们为启用辅助排序做好了准备。 剩下要做的就是在必要时编写考虑温度的代码。 在这里,我们有两个选择,编写一个Comparator或在TemperaturePair类上调整compareTo方法(TemperaturePair实现WritableComparable)。 在大多数情况下,我建议您编写一个单独的Comparator,但是TemperaturePair类是专门为演示二次排序而编写的,因此我们将修改TemperaturePair类的compareTo方法。

@Overridepublic int compareTo(TemperaturePair temperaturePair) {int compareValue = this.yearMonth.compareTo(temperaturePair.getYearMonth());if (compareValue == 0) {compareValue = temperature.compareTo(temperaturePair.getTemperature());}return compareValue;}

如果我们想按降序排序,我们可以简单地将温度比较的结果乘以-1。
现在,我们已经完成了排序所必需的部分,我们需要编写一个自定义分区程序。

合伙人代码

为了确保在确定将哪个缩减程序发送数据时仅考虑自然键,我们需要编写一个自定义分区程序。 该代码简单明了,在计算将数据发送到的减速器时,仅考虑TemperaturePair类的yearMonth值。

public class TemperaturePartitioner extends Partitioner<TemperaturePair, NullWritable>{@Overridepublic int getPartition(TemperaturePair temperaturePair, NullWritable nullWritable, int numPartitions) {return temperaturePair.getYearMonth().hashCode() % numPartitions;}
}

尽管自定义分区程序保证了年和月的所有数据都到达同一精简程序,但我们仍然需要考虑精简程序将按键对记录进行分组的事实。

分组比较器

数据到达精简器后,所有数据均按键分组。 由于我们有一个复合键,因此我们需要确保记录仅按自然键分组。 这是通过编写自定义GroupPartitioner完成的。 为了将记录分组在一起,我们只考虑了TemperaturePair类的yearMonth字段的Comparator对象。

public class YearMonthGroupingComparator extends WritableComparator {public YearMonthGroupingComparator() {super(TemperaturePair.class, true);}@Overridepublic int compare(WritableComparable tp1, WritableComparable tp2) {TemperaturePair temperaturePair = (TemperaturePair) tp1;TemperaturePair temperaturePair2 = (TemperaturePair) tp2;return temperaturePair.getYearMonth().compareTo(temperaturePair2.getYearMonth());}
}

结果

这是运行我们的二级排序作业的结果:

new-host-2:sbin bbejeck$ hdfs dfs -cat secondary-sort/part-r-00000
190101	-206
190102	-333
190103	-272
190104	-61
190105	-33
190106	44
190107	72
190108	44
190109	17
190110	-33
190111	-217
190112	-300

结论

虽然按值对数据进行排序可能不是普遍的需求,但是在需要时,这是个不错的工具。 此外,通过使用自定义分区程序和组分区程序,我们能够更深入地了解Hadoop的内部工作原理。 感谢您的时间。

资源资源

  • Jimmy Lin和Chris Dyer 使用MapReduce进行的数据密集型处理
  • Hadoop: Tom White 的权威指南
  • 来自博客的源代码和测试
  • Hadoop API
  • MRUnit用于单元测试Apache Hadoop映射减少工作

参考: MapReduce算法–来自我们的JCG合作伙伴 Bill Bejeck的“ 二级排序”,来自“ 随机编码思考”博客。

翻译自: https://www.javacodegeeks.com/2013/01/mapreduce-algorithms-secondary-sorting.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis 字符串(String)

Redis 字符串(String) Redis 字符串数据类型的相关命令用于管理 redis 字符串值&#xff0c;基本语法如下&#xff1a; 语法 redis 127.0.0.1:6379> COMMAND KEY_NAME 实例 redis 127.0.0.1:6379> SET runoobkey redis OK redis 127.0.0.1:6379> GET runoobkey "…

前端基础-CSS的各种选择器的特点以及CSS的三大特性

一、 基本选择器二、 后代选择器、子元素选择器三、 兄弟选择器四、 交集选择器与并集选择器五、 序列选择器六、 属性选择器七、 伪类选择器八、 伪元素选择器九、 CSS三大特性 一、 基本选择器 1、id选择器 #1、作用&#xff1a;根据指定的id名称&#xff0c;在当前界面中找…

Php流式 大文件,如何使用PHP解析XML大文件

如果使用 PHP 解析 XML 的话&#xff0c;那么常见的选择有如下几种&#xff1a;DOM、SimpleXML、XMLReader。如果要解析 XML 大文件的话&#xff0c;那么首先要排除的是 DOM&#xff0c;因为使用 DOM 的话&#xff0c;需要把整个文件全部加载才能解析&#xff0c;效率堪忧&…

python 白盒测试_白盒测试教程 - 颜丽的个人空间 - OSCHINA - 中文开源技术交流社区...

总共贴了39节&#xff0c;后续还有很长&#xff0c;共122节&#xff0c;文章名为‘白盒测试教程’1、白盒测试概念2、测试覆盖标准3、逻辑驱动测试4、基本路径测试白盒测试概念1、白盒测试也称结构测试或逻辑驱动测试&#xff0c;是一种测试用例设计方法&#xff0c;它从程序的…

Oracle 分析函数及常用函数

什么叫分析函数(Analytic function)&#xff1f; Oracle从8.1.6开始提供分析函数&#xff0c;分析函数用于计算基于组的某种聚合值&#xff0c;它和聚合函数的不同之处是 对于每个组返回多行&#xff0c;而聚合函数对于每个组只返回一行。 基本语法 function_name(arg1,arg2,..…

ScanTailor-ScanTailor 强大的多方位的满足处理扫描图片的需求

ScanTailor 强大的多方位的满足处理扫描图片的需求ScanTailor 能做什么&#xff1f;批量或单张或选择区间旋转图片自动切割页面&#xff0c;同时提供手动选项自动识别图像歪斜角度&#xff0c;同时提供手动选项自动识别正文内容裁剪&#xff0c;同时提供手动选项设置正文上下左…

使用JavaCV进行手和手指检测

这篇文章是Andrew Davison博士发布的有关自然用户界面&#xff08;NUI&#xff09;系列的一部分&#xff0c;内容涉及使用JavaCV从网络摄像头视频提要中检测手。 注意&#xff1a;可以从http://fivedots.coe.psu.ac.th/~ad/jg/nui055/下载本章的所有源代码。 第5章的彩色斑点检…

oracle+trace参数设置,Oracle autotrace参数详解

SQL> set autotrace traceonly explainSP2-0613: 无法验证 PLAN_TABLE 格式或实体cuug每周五晚8点都有免费网络课程&#xff0c;如需了解可点击cuug官网。SP2-0611: 启用EXPLAIN报告时出错解决方法&#xff1a;1. 以SYS用户登录CONNECT / as SYSDBA ;1. 创建PLAN_TABL…

git提交代码到码云

日常代码一般提交到github比较多&#xff0c;但我还是钟爱马爸爸&#xff0c;没错就是码云。 码云是中文版的代码托管的网站&#xff0c;不存在打开网速问题&#xff0c;使用也蛮方便的&#xff0c;日常自己保存托管代码已经足够&#xff0c;平时使用git提交代码到码云是非常方…

不能装载文档控件。请在检查浏览器的选项中检查浏览器的安全设置_【2020年网络安全宣传周】如何正确设置浏览器...

李夏是一个公司的职员&#xff0c;一天晚上加班赶制文档&#xff0c;由于要向客户汇报产品情况&#xff0c;需要获取大量网上信息&#xff0c;然而在制作中却发现浏览器的网页打不开了。第二天原计划向客户展示的材料未能完整汇总&#xff0c;客户见面对接效果也打了折扣。在当…

矩形碰撞检测和圆形碰撞检测。

矩形碰撞检测&#xff1a; <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>Document</title><style type"text/css">body { margin: 0;}#wrap { margin: 50px auto; position: re…

MonogoDB 查询小结

MonogoDB是一种NoSQL数据库 优点: 1.数据的存储以json的文档进行存储(面向文档存储) 2.聚合框架查询速度快 3.高效存储二进制大对象 缺点: 1.不支持事务 2.文件存储空间占用过大 案例学习 例1:单个变量查询(查找出制造商字段为“Porsche”的所有汽车的查询) {"layout"…

用装饰器设计模式装饰

装饰图案是广泛使用的结构图案之一。 此模式在运行时动态更改对象的功能&#xff0c;而不会影响对象的现有功能。 简而言之&#xff0c;此模式通过包装将附加功能添加到对象。 问题陈述&#xff1a; 想像一下我们有一个比萨饼&#xff0c;该比萨饼已经用番茄和奶酪烤制的情况。…

linux 内存强度测试软件,linux下的CPU、内存、IO、网络的压力测试工具与方法介绍...

使用工具stressCentos# yum -y install stressUbantu# apt-get install stress# stress --helpstress imposes certain types of compute stress on your systemUsage: stress [OPTION [ARG]] ...-?, --help show this help statement--version show version statement-v, --v…

vcpkg安装_微软牌包管理器vcpkg更新及路线图计划

蝎子vcpkg是一套跨平台&#xff0c;开源的C/C库管理器&#xff0c;今天的这篇文章是有关vcpkg主题的2020年4月博文更新。在这篇文章中&#xff0c;我们将分享有关vcpkg 2020.04发布版本的一些信息以及vcpkg的路线图(roadmap)&#xff0c;我们会在这里持续地发布有关vcpkg的最新…

CSS 盒模型与box-sizing

一、盒模型 一个web页面由许多html元素组成&#xff0c;而每一个html元素都可以表示为一个矩形的盒子&#xff0c;CSS盒模型正是描述这些矩形盒子的存在。 MDN的描述&#xff1a; When laying out a document, the browsers rendering engine represents each element as a r…

Java课程设计 购物车系统(个人博客) 201521123052 蓝锦明

1. 团队课程设计博客链接 课程设计团队博客 2. 个人负责模块或任务说明 &#xff08;1&#xff09;制作图形菜单引导界面 &#xff08;2&#xff09;定义各获取和输出类函数 3. 自己的代码提交记录截图 4. 自己负责模块或任务详细说明 import java.text.NumberFormat; public c…

7-12(图) 社交网络图中结点的“重要性”计算(30 分)

在社交网络中&#xff0c;个人或单位&#xff08;结点&#xff09;之间通过某些关系&#xff08;边&#xff09;联系起来。他们受到这些关系的影响&#xff0c;这种影响可以理解为网络中相互连接的结点之间蔓延的一种相互作用&#xff0c;可以增强也可以减弱。而结点根据其所处…

linux系统的安装程序,Linux系统安装

为了不影响本机系统&#xff0c;建议在虚拟机上创建并安装Linux系统&#xff0c;本次安装centos7 64位的镜像。详细步骤如下&#xff1a;1、首先在虚拟机主页创建新的虚拟机。... 图1.1 2、选择自定义安装&#xff0c;这样方便我们更好了解虚拟机&#xff0c;然后点击下一步。.…

REST与Apache Camel

在Camel中公开HTTP终结点的方法有很多&#xff1a;jetty&#xff0c;tomcat&#xff0c;servlet&#xff0c;cxfrs和restlet。 其中的两个组件– cxfrs和restlet也只需几行代码即可支持REST语义。 这个简单的示例演示了如何使用camel-restlet和camel-jdbc进行CRUD操作。 四个HT…