mapreduce排序算法_MapReduce算法–二级排序

mapreduce排序算法

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

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



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

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

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

值到密钥转换

直接创建复合键。 我们需要做的是分析在排序过程中我们要考虑值的哪一部分并将适当的部分添加到自然键中。 然后,我们需要在键类或比较器类中的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

mapreduce排序算法

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

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

相关文章

数据图表与分析图_几种可视化数据分析图表的使用

图表简洁大方、一目了然&#xff0c;利用图表工具就能轻松实现&#xff0c;是数据分析中常采用的方式。今天利用在雀书无代码平台搭建的图表来介绍几种常见数据分析图表的使用。1. 柱状图柱状图可以显示一段时间内的数据变化或显示各项之间的比较情况&#xff0c;主要使用颜色进…

java打包exe

配置如下&#xff1a; 1&#xff0c;复制运行环境jre&#xff1b; 2&#xff0c;复制项目配置文件config; 3&#xff0c;复制项目运行的lib包&#xff1b; 4&#xff0c;编写清单文件&#xff0c;放到系统目录&#xff1b; 5&#xff0c;将项目打包成xxx.jar&#xff0c;放入到…

Eigen(5)Array类和元素级操作

0. 为什么使用Array 相对于Matrix提供的线性代数运算&#xff0c;Array类提供了更为一般的数组功能。Array类为元素级的操作提供了有效途径&#xff0c;比如点加&#xff08;每个元素加值&#xff09;或两个数据相应元素的点乘。 1. Array Array是个类模板&#xff08;类似于M…

装饰信封

有时 很多时候&#xff0c;我需要一个类实现通过使其他类的实例的接口。 听起来很奇怪&#xff1f; 让我给你看一个例子。 在Takes框架中有很多此类&#xff0c;它们的名称都都类似于*Wrap 。 这是一个方便的设计概念&#xff0c;不幸的是&#xff0c;在Java中看起来相当冗长。…

进制转换c语言代码_奇怪的C语言代码,有些函数在变量前加上(void)是什么类型转换?...

C语言的语法极其简洁&#xff0c;即使是初次接触编程语言的初学者也能很快学完它的语法。不过&#xff0c;C语言也是一门“灵活得过了头”的编程语言&#xff0c;对于很多初学者来说&#xff0c;编写C语言程序就好像拿着一堆最基本的砖块&#xff0c;要修建一座大厦一样&#x…

Eigen(4)矩阵基本运算

矩阵和向量的运算 提供一些概述和细节&#xff1a;关于矩阵、向量以及标量的运算。 1. 介绍 Eigen提供了matrix/vector的运算操作&#xff0c;既包括重载了c的算术运算符/-/*&#xff0c;也引入了一些特殊的运算比如点乘dot、叉乘cross等。 对于Matrix类&#xff08;matrix和v…

beta冲刺(1/7)

作业格式 课程名称&#xff1a;软件工程1916|W&#xff08;福州大学&#xff09;作业要求&#xff1a;项目beta冲刺&#xff08;团队&#xff09;团队名称&#xff1a; 那周余嘉熊掌将得队作业目标&#xff1a;beta&#xff08;1/7&#xff09;队员学号队员姓名博客地址备注221…

qq纵横四海源码_【0基础】纵横中文网python爬虫实战

原文在此~【0基础】纵横中文网python爬虫实战​mp.weixin.qq.com大家好&#xff0c;我是你们的机房老哥&#xff01;在粉丝群的日常交流中&#xff0c;爬虫是比较常见的话题。python最强大的功能之一也是爬虫。考虑到很多0基础的小白想要入门爬虫。老哥今天就通过一个比较简单的…

Eigen(3)矩阵Matrix及其简单操作

1. Matrix类 在Eigen&#xff0c;所有的矩阵和向量都是Matrix模板类的对象&#xff0c;Vector只是一种特殊的矩阵&#xff08;一行或者一列&#xff09;。 Matrix有6个模板参数&#xff0c;主要使用前三个参数&#xff0c;剩下的有默认值。 Matrix<typename Scalar, int Ro…

java jquery_jQuery数据表和Java集成

java jqueryjQuery DataTables是一个开放源代码插件&#xff0c;用于在浏览器中创建表。 它具有许多功能&#xff0c;例如排序&#xff0c;服务器端处理&#xff0c; JQUERY UI主题滚动。 该插件的下载链接&#xff1a; http://www.datatables.net/download/ 在本演示中&am…

Eigen(2) 模块与头文件

Eigen库被分为一个Core模块和其他一些模块&#xff0c;每个模块有一些相应的头文件。 为了便于引用&#xff0c;Dense模块整合了一系列模块&#xff1b;Eigen模块整合了所有模块。一般情况下&#xff0c;include<Eigen/Dense> 就够了

白鹭龙骨异步加载

private armatureDisplay: dragonBones.EgretArmatureDisplay; /** * 加载龙骨动画 * Create scene interface */ private loadGragon(): void { let t this; t.removeGragon(); //默认男战士 let sex t.occupationSex.selectedValue ? t.occupationSex.selectedValue : 1; …

zip和unzip上的Java要点

压缩是编写文件时可以在我们的代码中发出的主要动作之一。 因此&#xff0c;我发现在zip和unzip上必不可少的简单Java代码段&#xff0c;并且必须易于访问。 要点是纯Java语言&#xff0c;并以zip格式存储两个文件。 完成后&#xff0c;打开打开的拉链并评估其内容。 import …

ppt图片丢失_041 职场PPT实战:做好的PPT换个电脑就丢字体?三招解决!

大家好&#xff0c;我是肥宅。这是《职场PPT实战》系列更文的第41篇。本期我要跟大家聊一个很实在的问题&#xff0c;字体嵌入。有小伙伴在后台提问&#xff0c;他是这么说的&#xff1a;“肥宅老师&#xff0c;我做好的PPT&#xff0c;换个电脑打开字体就变了&#xff0c;有没…

matlab sort对矩阵某一维进行排序并记录之前索引

sort函数默认升序排列&#xff0c;即‘ascend’&#xff1b; [B, index] sort(A&#xff0c;dim&#xff0c; model) B为排序后矩阵 index记录排序前的索引号 A需要进行排序操作的矩阵 dim对矩阵的维度&#xff08;一维不用指定&#xff0c;二维默认对列&#xff09; mode…

2018-2019-2 20165221 【网络对抗技术】-- Exp9 Web安全基础

2018-2019-2 20165221 【网络对抗技术】-- Exp9 Web安全基础 目录&#xff1a; 一 . 实验要求二 . 实验过程记录 1 . Webgoat安装2 . SQL注入的攻击 命令注入&#xff08;Command Injection&#xff09;数字型注入&#xff08;Numeric SQL Injection&#xff09;日志欺骗&#…

python不同目录调用_python3 不同目录间模块调用

#Author by Andy#_*_ coding:utf-8 _*_#__file__获取当前程序的相对路径import os,sys#print(__file__)# os.path.abspath(__file__) 获取当前程序的绝对路径print(os.path.abspath(__file__))# E:\my python study\day4\Atm\bin\atm.pyPathos.path.abspath(__file__)# print(o…

python 安装虚拟环境virtualenv

1.sudo apt install virtualenv 安装失败 2.sudo apt-get update 更新失败 提示&#xff1a; E: 仓库 “http://mirrors.aliyun.com/ubuntu artful Release” 不再含有 Release 文件。N: 无法安全地用该源进行更新&#xff0c;所以默认禁用该源。N: 参见 apt-secure(8) 手册以了…

python内存管理_Python内存管理(一):预备知识

一、内存的理解你可以将计算机中的内存理解为一本为短期存储而设计的书。这本书中现在什么都没写&#xff0c;但最终不同的“作者”会来寻求空间&#xff0c;写入他们想写的故事。由于他们之间不能彼此覆盖&#xff0c;他们在开始写入之前一定要向这本书的管理者申请&#xff0…

javacv 人脸检测_使用JavaCV进行手和手指检测

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