mapreduce 算法_MapReduce算法–顺序反转

mapreduce 算法

这篇文章是介绍MapReduce算法的系列文章的另一部分,该书在使用MapReduce进行数据密集型文本处理中找到。 先前的文章是Local Aggregation , Local Aggregation PartII和创建共现矩阵 。 这次我们将讨论阶数反转模式。 顺序反转模式利用的MapReduce来计算所需要的提前将被操纵的数据减速推送数据的排序阶段..你关闭此作为MapReduce的边缘状态之前,我强烈推荐您阅读作为我们将讨论如何利用排序的优势,并使用自定义分区程序进行覆盖,这两个实用程序都是有用的工具。

尽管许多MapReduce程序是用较高级别的抽象(即Hive或Pig)编写的,但了解较低级的情况仍然有帮助。顺序反转模式可在使用MapReduce进行数据密集型文本处理的第3章中找到。 。 为了说明顺序倒置模式,我们将从同现矩阵模式中使用Pairs方法。 创建同现矩阵时,我们会跟踪单词一起出现的总次数。 在较高的层次上,我们采用“成对”方法并稍加改动,除了使映射器发出诸如(“ foo”,“ bar”)之类的单词对外,我们还将发出(“ foo”,“ *”),并且将对每个单词对执行此操作,因此我们可以轻松得出最左单词出现频率的总计数,并使用该计数来计算我们的相对频率。 这种方法提出了两个具体问题。 首先,我们需要找到一种方法来确保单词对(“ foo”,“ *”)首先到达减速器。 其次,我们需要确保所有具有相同左单词的单词对都到达相同的缩减词。 在解决这些问题之前,让我们看一下我们的映射器代码。

映射器代码

首先,我们需要使用Pairs方法修改映射器。 在发出特定单词的所有单词对之后,在每个循环的底部,我们将发出特殊标记WordPair(“ word”,“ *”)以及在左侧找到单词的次数。

public class PairsRelativeOccurrenceMapper extends Mapper<LongWritable, Text, WordPair, IntWritable> {private WordPair wordPair = new WordPair();private IntWritable ONE = new IntWritable(1);private IntWritable totalCount = new IntWritable();@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {int neighbors = context.getConfiguration().getInt('neighbors', 2);String[] tokens = value.toString().split('\\s+');if (tokens.length > 1) {for (int i = 0; i < tokens.length; i++) {tokens[i] = tokens[i].replaceAll('\\W+','');if(tokens[i].equals('')){continue;}wordPair.setWord(tokens[i]);int start = (i - neighbors < 0) ? 0 : i - neighbors;int end = (i + neighbors >= tokens.length) ? tokens.length - 1 : i + neighbors;for (int j = start; j <= end; j++) {if (j == i) continue;wordPair.setNeighbor(tokens[j].replaceAll('\\W',''));context.write(wordPair, ONE);}wordPair.setNeighbor('*');totalCount.set(end - start);context.write(wordPair, totalCount);}}}
}

现在,我们已经生成了一种跟踪遇到一个特定单词的总次数的方法,我们需要确保那些特殊字符首先到达化简器,以便可以计算出总数以计算相对频率。 通过修改WordPair对象上的compareTo方法,我们将在MapReduce流程的排序阶段为我们处理此问题。

修改后的排序

我们修改WordPair类上的compareTo方法,以便在右侧遇到“ *”字符时,将特定对象推到顶部。

@Overridepublic int compareTo(WordPair other) {int returnVal = this.word.compareTo(other.getWord());if(returnVal != 0){return returnVal;}if(this.neighbor.toString().equals('*')){return -1;}else if(other.getNeighbor().toString().equals('*')){return 1;}return this.neighbor.compareTo(other.getNeighbor());}

通过修改compareTo方法,我们现在可以确保将具有特殊字符的所有WordPair排在最前面,然后首先到达reducer。 这导致了我们的第二个专业化,我们如何保证具有给定左单词的所有WordPair对象都将被发送到相同的reducer? 答案是创建一个自定义分区程序。

自定义分区

通过计算键的哈希码对还原器的数量取模,将中间键改编为还原器。 但是我们的WordPair对象包含两个单词,因此采用整个对象的哈希码显然是行不通的。 我们需要修改一个自定义的分区程序,该分区程序在确定将哪个缩减程序发送到输出时仅考虑左边的单词。

public class WordPairPartitioner extends Partitioner<WordPair,IntWritable> {@Overridepublic int getPartition(WordPair wordPair, IntWritable intWritable, int numPartitions) {return wordPair.getWord().hashCode() % numPartitions;}
}

现在,我们保证将所有具有相同左单词的WordPair对象发送到相同的reducer。 剩下的就是构造一个化简器以利用发送数据的格式。

减速器

为倒序反转模式构建减速器很简单。 这将涉及保持计数器变量和“当前”字变量。 减速器将检查输入键WordPair中右侧的特殊字符“ *”。 如果左边的单词不等于“当前”单词,我们将重新设置计数器并求和所有值,以获得观察到给定当前单词的总次数。 现在,我们将处理下一个WordPair对象,对计数求和并除以我们的计数器变量,以获得相对频率。 该过程将继续进行,直到遇到另一个特殊字符并重新开始。

public class PairsRelativeOccurrenceReducer extends Reducer<WordPair, IntWritable, WordPair, DoubleWritable> {private DoubleWritable totalCount = new DoubleWritable();private DoubleWritable relativeCount = new DoubleWritable();private Text currentWord = new Text('NOT_SET');private Text flag = new Text('*');@Overrideprotected void reduce(WordPair key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {if (key.getNeighbor().equals(flag)) {if (key.getWord().equals(currentWord)) {totalCount.set(totalCount.get() + getTotalCount(values));} else {currentWord.set(key.getWord());totalCount.set(0);totalCount.set(getTotalCount(values));}} else {int count = getTotalCount(values);relativeCount.set((double) count / totalCount.get());context.write(key, relativeCount);}}private int getTotalCount(Iterable<IntWritable> values) {int count = 0;for (IntWritable value : values) {count += value.get();}return count;}
}

通过处理排序顺序并创建自定义分区程序,我们已经能够在计算所需的数据到达之前将数据发送到计算所需的化简器。 尽管此处未显示,但使用组合器来运行MapReduce作业。 这种方法也是“映射器内”合并模式的不错选择。

示例与结果

鉴于假期即将来临,我觉得现在是时候针对查尔斯·狄更斯(Charles Dickens)的小说《圣诞节颂歌》(A Christmas Carol)进行订单倒置模式的例子了。 我知道这很老套,但它能达到目的。

new-host-2:sbin bbejeck$ hdfs dfs -cat relative/part* | grep Humbug
{word=[Humbug] neighbor=[Scrooge]}	0.2222222222222222
{word=[Humbug] neighbor=[creation]}	0.1111111111111111
{word=[Humbug] neighbor=[own]}	0.1111111111111111
{word=[Humbug] neighbor=[said]}	0.2222222222222222
{word=[Humbug] neighbor=[say]}	0.1111111111111111
{word=[Humbug] neighbor=[to]}	0.1111111111111111
{word=[Humbug] neighbor=[with]}	0.1111111111111111
{word=[Scrooge] neighbor=[Humbug]}	0.0020833333333333333
{word=[creation] neighbor=[Humbug]}	0.1
{word=[own] neighbor=[Humbug]}	0.006097560975609756
{word=[said] neighbor=[Humbug]}	0.0026246719160104987
{word=[say] neighbor=[Humbug]}	0.010526315789473684
{word=[to] neighbor=[Humbug]}	3.97456279809221E-4
{word=[with] neighbor=[Humbug]}	9.372071227741331E-4

结论

虽然计算相对单词出现频率可能不是常见的任务,但我们已经能够演示排序和使用自定义分区程序的有用示例,这是构建MapReduce程序时可以使用的好工具。 如前所述,即使您的大多数MapReduce是像Hive或Pig那样以更高的抽象级别编写的,了解幕后的情况仍然很有帮助。 谢谢你的时间。

参考: MapReduce算法-来自JCG合作伙伴 Bill Bejeck的《 随机编码思考》博客中的顺序反转 。

翻译自: https://www.javacodegeeks.com/2012/12/mapreduce-algorithms-order-inversion.html

mapreduce 算法

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

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

相关文章

lamp mysql开启命令_mysql lamp 配置命令总结

[email protected] ~]# chown -R mysql:mysql /usr/local/mysql (注&#xff1a;更改MySQL安装目录属主&#xff0c;属组)[[email protected] mysql-5.5.22]# cp support-files/my-medium.cnf /etc/my.cnf (注&#xff1a;复制MySQL配置文件)[[email protected] mysql-5.5.22]#…

算法复杂度分析(下):最好、最坏、平均、均摊等时间复杂度概述

细化时间复杂度分析 代码千千万&#xff0c;有些代码逻辑会很复杂&#xff0c;所以为了更细化的分析算法的复杂度&#xff0c;再复杂度分析方面引入了4个知识点&#xff1a; 1.最好情况时间复杂度&#xff08;best case time complexity&#xff09;。 2.最坏情况时间复杂度&am…

梦想成真…教学–专业的Java开发人员:工具和最佳实践

我总是喜欢分享知识。 我写博客的原因之一是分享我在软件工程师方面的知识。 创立并运行&#xff08;与几个朋友一起&#xff09;第一个 早在2003年&#xff0c; 希腊的Java用户组就是由于我们在工作中得不到足够的培训或个人开发机会&#xff0c;因此我们希望共享和重用我们作…

arachni web mysql数据库_Web安全扫描工具Arachni

Arachni是一个多功能、模块化、高性能的Ruby框架&#xff0c;旨在帮助渗透测试人员和管理员评估web应用程序的安全性。同时Arachni开源免费&#xff0c;可安装在windows、linux以及mac系统上&#xff0c;并且可导出评估报告。一、Arachni下载与启动&#xff0c;以LInux环境为例…

tomcat - 报错 No such device; No faulty members identified.

启动tomcat集群的时候出现以下报错&#xff0c;导致集群没办法启动&#xff1a; java.net.SocketException: No such device; No faulty members identified. SEVERE: Unable to start cluster. org.apache.catalina.tribes.ChannelException: java.net.SocketException: No su…

设计模式09----门面设计模式

转自&#xff1a;https://www.cnblogs.com/lthIU/p/5860607.html 针对外观模式&#xff0c;在项目开发和实际运用中十分频繁&#xff0c;但是其极易理解&#xff0c;下面就简要介绍一下。 一、概念介绍 外观模式&#xff08;Facade&#xff09;,他隐藏了系统的复杂性&#xff0…

mysql 匿名块_MySQL存储过程定义中的特性(characteristic)的含义

MySQL的存储过程蛮啰嗦的&#xff0c;与MSSQL或者Oracle的存储过程相比&#xff0c;如果没有显式指定&#xff0c;他会隐含地指定一系列特性(characteristic)的默认值来创建存储过程通常在使用图形界面工具进行存储过程编写的时候&#xff0c;图形界面工具会自动加上这部分内容…

Tomcat集群和Session共享的配置方法

Tomcat集群配置其实很简单&#xff0c;在Tomcat自带的文档中有详细的说明( /docs/cluster-howto.html )&#xff0c;只不过是英语的&#xff0c;对我这样的人来说很难懂 。 下面根据说下怎么配置吧&#xff1a; 第一步、准备工作&#xff1a; 准备几份Tomcat程序&#xff0c…

Python:GUI Tkinter

GUI编程 GUI编程&#xff08;Graphical User Interface Programming&#xff09;指的是用于创建图形用户界面的程序设计。这种界面采用图形方式显示信息&#xff0c;让用户可以通过图形化的方式与程序进行交互&#xff0c;而不是仅仅通过文本命令。GUI编程使得软件更加直观易用…

jenkins配置工程目录-启动case

1.我们在python里面编辑的脚本可以正常跑&#xff0c;但是在cmd里面跑就不行了&#xff0c;找不到自己定义的方法模块&#xff0c;这个时候我们要搞个环境变量 name : PYTHONPATH val : 工程目录路劲如&#xff1a; D:python\test 这个时候我们再次cmd运行发现可以运行了…

mrunit_使用MRUnit测试Hadoop程序

mrunit这篇文章将略微绕开使用MapReduce实现数据密集型处理中发现的模式&#xff0c;以讨论同样重要的测试。 汤姆•惠勒 &#xff08; Tom Wheeler&#xff09;在纽约2012年Strata / Hadoop World会议上参加的一次演讲给了我部分启发。 当处理大型数据集时&#xff0c;想到的并…

mysql innodb flush method_对innodb_flush_method的一点解释

官方文档描述如下&#xff1a;By default, InnoDB uses the fsync()system call to flush both the data and log files. Ifinnodb_flush_method option is set to O_DSYNC, InnoDB uses O_SYNC to open and flush thelog files, and fsync()to flush the data files. If O_DIR…

信号量、互斥体和自旋锁

一、信号量 信号量又称为信号灯&#xff0c;它是用来协调不同进程间的数据对象的&#xff0c;而最主要的应用是共享内存方式的进程间通信。本质上&#xff0c;信号量是一个计数器&#xff0c;它用来记录对某个资源&#xff08;如共享内存&#xff09;的存取状况。一般说来&…

alembic教程

安装pip install alembic步骤 1.初始化 alembic 仓库 在终端中&#xff0c; cd 到你的项目目录中&#xff0c;然后执行命令 alembic init alembic &#xff0c;创建一个名叫 alembic 的仓库。2.创建模型 class User(Base):__tablename__ userid Column(Integer,primary_keyTr…

实际的Reactor操作–检索Cloud Foundry应用程序的详细信息

CF-Java-Client是一个库&#xff0c;可通过程序访问Cloud Foundry Cloud Controller API 。 它建立在Project Reactor之上&#xff0c;它是Reactive Streams规范的实现&#xff0c;并且使用此库在Cloud Foundry环境中做一些实际的事情是一个有趣的练习。 考虑一个示例用例–给…

mysql生成app接口_Java实现app接口和Socket消息传递(10)java连接MySQL实现App登录接口...

原创&#xff1a;http://blog.csdn.net/iwanghang1.先来个Androiod端口的GIF效果图App图标大家可能没看清&#xff0c;这个是AndroidStudio3.0最新的默认App图标哦~~2.不要忘记把MySQL的jar导进来jar包放入的位置在这里&#xff1a;D:\eclipse-workspace\.metadata\.plugins\or…

centos yum安装nginx 提示 No package nginx available问题解决方法

问题原因&#xff1a; nginx位于第三方的yum源里面&#xff0c;而不在centos官方yum源里面 解决方法&#xff1a; 安装epel(Extra Packages for Enterprise Linux) a、去epel网站 http://fedoraproject.org/wiki/EPEL下载 b、我的系统是centos5.7&#xff0c;cpu是x86_64&#…

链接生成二维码图片

https://packagist.org/packages/houdunwang/qrcode转载于:https://www.cnblogs.com/pansidong/p/10247663.html

mysql pxc测试_Mysql同步机制 - PXC 压力测试 tpcc安装及使用

tpcc是针对mysql单机制定的测试标准&#xff0c;这个标准对于pxc集群来说要求太高&#xff0c;所有后面即使有些项目没有通过也不必太过在意&#xff0c;主要是压一下事务处理能力。Mysql单机虽然写入速度快&#xff0c;但相比于Mysql集群&#xff0c;单机能承受的并发能力远比…

RHEL(Red Hat Enterprise Linux)配置YUM源

前言 YUM&#xff08;全称为 Yellow dog Updater, Modified&#xff09;是一个在Fedora中的Shell前端软件包管理器。基于RPM包管理&#xff0c;能够从指定的服务器自动下载RPM包并且安装&#xff0c;可以自动处理依赖性关系&#xff0c;并且一次安装所有依赖的软体包&#xff…