mapreduce文本排序_MapReduce:通过数据密集型文本处理

mapreduce文本排序

自上次发布以来已经有一段时间了,因为我一直忙于Coursera提供的一些课程。 有一些非常有趣的产品,值得一看。 前一段时间,我购买了Jimmy Lin和Chris Dyer的MapReduce数据密集型处理程序 。 本书以伪代码格式介绍了几种关键的MapReduce算法。 我的目标是采用第3-6章中介绍的算法,并以Hadoop: Tom White的《权威指南》作为参考在Hadoop中实现它们。 我将假设您熟悉Hadoop和MapReduce,并且不介绍任何入门资料。 因此,让我们从局部聚合开始进入第3章– MapReduce算法设计。

本地聚集

在很高的级别上,当Mappers发出数据时,中间结果将写入磁盘,然后通过网络发送到Reducers以进行最终处理。 在MapReduce作业的处理中,写入磁盘然后通过网络传输数据的延迟是一项昂贵的操作。 因此,有理由认为,只要有可能,减少从映射器发送的数据量将提高MapReduce作业的速度。 本地聚合是一种用于减少数据量并提高MapReduce工作效率的技术。 局部聚合不能代替reducers,因为我们需要一种方法来使用来自不同映射器的相同键来收集结果。 我们将考虑实现本地聚合的3种方法:

  1. 使用Hadoop Combiner函数。
  2. 文本处理和MapReduce书中介绍了两种“内部映射器”组合方法。

当然,任何优化都需要权衡取舍,我们也会对此进行讨论。
为了演示本地聚合,我们将使用hadoop-0.20.2-cdh3u3在MacBookPro上安装的伪分布式集群上,在Charles Dickens的纯文本版本的A Christmas Carol (从Project Gutenberg下载)上运行无处不在的字数统计作业。从Cloudera发行。 我计划在以后的文章中在具有更实际大小的数据的EC2集群上运行相同的实验。

合路器

组合器函数是扩展Reducer类的对象。 实际上,对于此处的示例,我们将重复使用单词计数作业中使用的相同的reduce。 设置MapReduce作业时会指定组合器功能,如下所示:

job.setReducerClass(TokenCountReducer.class);

这是化简器代码:

public class TokenCountReducer extends Reducer<Text,IntWritable,Text,IntWritable>{@Overrideprotected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {int count = 0;for (IntWritable value : values) {count+= value.get();}context.write(key,new IntWritable(count));}
}

组合器的工作就是按照名称所暗示的那样进行工作,聚合数据的最终结果是减少了数据在网络中的混洗,从而提高了效率。 如前所述,请记住,还需要简化器将结果与来自不同映射器的相同键组合在一起。 由于组合器功能是一种优化,因此Hadoop框架无法保证组合器将被调用多少次(如果有的话)。

在Mapper组合选项1中

使用组合器的第一种选择(图3.2,第41页)非常简单,对我们原始的字数映射器进行了一些修改:

public class PerDocumentMapper extends Mapper<LongWritable, Text, Text, IntWritable> {@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {IntWritable writableCount = new IntWritable();Text text = new Text();Map<String,Integer> tokenMap = new HashMap<String, Integer>();StringTokenizer tokenizer = new StringTokenizer(value.toString());while(tokenizer.hasMoreElements()){String token = tokenizer.nextToken();Integer count = tokenMap.get(token);if(count == null) count = new Integer(0);count+=1;tokenMap.put(token,count);}Set<String> keys = tokenMap.keySet();for (String s : keys) {text.set(s);writableCount.set(tokenMap.get(s));context.write(text,writableCount);}}
}

正如我们在这里看到的,对于遇到的每个单词,我们不会发出计数为1的单词,而是使用映射来跟踪已处理的每个单词。 然后,在处理完所有标记后,我们遍历该映射并发出该行中遇到的每个单词的总数。

在Mapper组合选项2中

in mapper组合的第二个选项(图3.3,第41页)与上述示例非常相似,但有两个区别–创建哈希映射时和发出映射中包含的结果时。 在上面的示例中,创建了一个映射,并在每次调用map方法时将其内容转储到网络上。 在此示例中,我们将使地图成为实例变量,并将地图的实例化移动到我们的映射器中的setUp方法。 同样,在完成对mapper的所有调用并调用cleanUp方法之前,不会将映射的内容发送到reducers。

public class AllDocumentMapper extends Mapper<LongWritable,Text,Text,IntWritable> {private  Map<String,Integer> tokenMap;@Overrideprotected void setup(Context context) throws IOException, InterruptedException {tokenMap = new HashMap<String, Integer>();}@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {StringTokenizer tokenizer = new StringTokenizer(value.toString());while(tokenizer.hasMoreElements()){String token = tokenizer.nextToken();Integer count = tokenMap.get(token);if(count == null) count = new Integer(0);count+=1;tokenMap.put(token,count);}}@Overrideprotected void cleanup(Context context) throws IOException, InterruptedException {IntWritable writableCount = new IntWritable();Text text = new Text();Set<String> keys = tokenMap.keySet();for (String s : keys) {text.set(s);writableCount.set(tokenMap.get(s));context.write(text,writableCount);}}
}

从上面的代码示例中可以看出,在对map方法的所有调用中,映射器都跟踪唯一字数。 通过跟踪唯一令牌及其计数,应该大大减少发送给reducer的记录数量,这反过来又可以改善MapReduce作业的运行时间。 这样可以达到与使用MapReduce框架提供的Combiner Function选项相同的效果,但是在这种情况下,可以确保将调用组合代码。 但是这种方法也有一些警告。 在地图调用之间保持状态可能会出现问题,并且绝对违反了“地图”功能的功能精神。 同样,通过保持所有映射器的状态,取决于作业中使用的数据,内存可能是另一个要解决的问题。 最终,必须权衡所有权衡以确定最佳方法。

结果

现在,让我们看一下不同映射器的一些结果。 由于作业是在伪分布式模式下运行的,因此实际的运行时间是无关紧要的,但是我们仍然可以推断出使用本地聚合会如何影响在实际集群上运行的MapReduce作业的效率。

每个令牌映射器:

12/09/13 21:25:32 INFO mapred.JobClient:     Reduce shuffle bytes=366010
12/09/13 21:25:32 INFO mapred.JobClient:     Reduce output records=7657
12/09/13 21:25:32 INFO mapred.JobClient:     Spilled Records=63118
12/09/13 21:25:32 INFO mapred.JobClient:     Map output bytes=302886

在Mapper精简选项1中:

12/09/13 21:28:15 INFO mapred.JobClient:     Reduce shuffle bytes=354112
12/09/13 21:28:15 INFO mapred.JobClient:     Reduce output records=7657
12/09/13 21:28:15 INFO mapred.JobClient:     Spilled Records=60704
12/09/13 21:28:15 INFO mapred.JobClient:     Map output bytes=293402

在Mapper精简选项2中:

12/09/13 21:30:49 INFO mapred.JobClient:     Reduce shuffle bytes=105885
12/09/13 21:30:49 INFO mapred.JobClient:     Reduce output records=7657
12/09/13 21:30:49 INFO mapred.JobClient:     Spilled Records=15314
12/09/13 21:30:49 INFO mapred.JobClient:     Map output bytes=90565

组合器选项:

12/09/13 21:22:18 INFO mapred.JobClient:     Reduce shuffle bytes=105885
12/09/13 21:22:18 INFO mapred.JobClient:     Reduce output records=7657
12/09/13 21:22:18 INFO mapred.JobClient:     Spilled Records=15314
12/09/13 21:22:18 INFO mapred.JobClient:     Map output bytes=302886
12/09/13 21:22:18 INFO mapred.JobClient:     Combine input records=31559
12/09/13 21:22:18 INFO mapred.JobClient:     Combine output records=7657

不出所料,不进行合并的Mapper的结果最差,紧随其后的是第一个映射器内合并选项(尽管如果在运行字数统计之前清除数据,这些结果本来可以做得更好)。 第二个映射器内合并选项和合并器功能实际上具有相同的结果。 重要的事实是,作为前两个选项,两者产生的结果都减少了2/3,减少了混洗字节。 将通过网络发送到缩减程序的字节数量减少该数量一定会对MapReduce作业的效率产生积极影响。 这里要牢记一点,那就是合并器/映射器合并不能仅在所有MapReduce作业中使用,在这种情况下,字数计数非常适合于这种增强,但这可能并不总是正确的。

结论

正如您所看到的,在寻求提高MapReduce作业的性能时,需要认真考虑使用映射器内合并或Hadoop合并器功能的好处。 至于哪种方法,则要权衡每种方法的权衡。

相关链接

  • Jimmy Lin和Chris Dyer 使用MapReduce进行的数据密集型处理
  • Hadoop: Tom White 的权威指南
  • 来自博客的源代码
  • MRUnit用于单元测试Apache Hadoop映射减少工作
  • Gutenberg项目提供了大量纯文本格式的书籍,非常适合在本地测试Hadoop作业。

祝您编程愉快,别忘了分享!

参考: 《 随机编码》博客上的JCG合作伙伴 Bill Bejeck 提供的MapReduce数据密集型文本处理功能 。


翻译自: https://www.javacodegeeks.com/2012/09/mapreduce-working-through-data.html

mapreduce文本排序

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

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

相关文章

nginx根据参数转发到不同服务器_Nginx服务器之负载均衡策略

一、关于Nginx的负载均衡在服务器集群中&#xff0c;Nginx起到一个代理服务器的角色&#xff08;即反向代理&#xff09;&#xff0c;为了避免单独一个服务器压力过大&#xff0c;将来自用户的请求转发给不同的服务器。二、Nginx负载均衡策略负载均衡用于从“upstream”模块定义…

同步异步与协程

目录&#xff1a; 同步/异步 异步回调 协成 线程队列 同步|异步: 线程的三种状态:   1.就绪   2.运行   3.阻塞阻塞和非阻塞描述的是运行的状态阻塞 :遇到了IO操作,代码卡住,无法执行下一行,CPU会切换到其他任务非阻塞 :与阻塞相反,代码正在执行(运行状态) 或处于就绪状态…

Linux禁止非WHEEL用户使用SU命令

通常情况下&#xff0c;一般用户通过执行“su -”命令、输入正确的root密码&#xff0c;可以登录为root用户来对系统进行管理员级别的配置。 但是&#xff0c;为了更进一步加强系统的安全性&#xff0c;有必要建立一个管理员的 组&#xff0c;只允许这个组的用户来执行“su -”…

代理的JavaOne 2016观察

我无法参加JavaOne 2016&#xff0c;因此很高兴在线上看到大量资源&#xff0c;这些资源使我能够基于JavaOne 2016内容进行观察。 我在本文中引用并简要描述了其中的一些JavaOne 2016资源&#xff0c;并根据这些资源的使用添加了我自己的一些观察结果。 正如Katharine在JavaOne…

resnet过拟合_重读经典:完全解析特征学习大杀器ResNet

公众号关注 “ML-CVer”设为 “星标”&#xff0c;DLCV消息即可送达&#xff01;作者丨刘昕宸知乎来源丨https://zhuanlan.zhihu.com/p/268308900编辑丨极市平台导读 通过堆叠神经网络层数(增加深度)可以非常有效地增强表征&#xff0c;提升特征学习效果&#xff0c;但是会出现…

Java开发笔记(二十三)数组工具Arrays

数组作为一种组合形式的数据类型&#xff0c;必然要求提供一些处理数组的简便办法&#xff0c;包括数组比较、数组复制、数组排序等等。为此Java专门设计了Arrays工具&#xff0c;该工具包含了几个常用方法&#xff0c;方便程序员对数组进行加工操作。Arrays工具的方法说明如下…

生成对抗网络gan原理_必读!TOP10生成对抗网络GAN论文(附链接)

来源&#xff1a;新智元本文约2200字&#xff0c;建议阅读7分钟。本文所选论文提供了一个易读的对GAN的介绍&#xff0c;帮助你理解GAN技术的基础。[ 导读 ]生成对抗网络 (GAN) 是深度学习中最有趣、最受欢迎的应用之一。本文列出了 10 篇关于 GAN 的论文&#xff0c;这些论文将…

visudo精确用户赋权(sudo)

原文BLOG&#xff1a;http://iminmin.blog.51cto.com/689308/455992sudo” 是 Unix/Linux 平台上的一个非常有用的工具&#xff0c;允许为非根用户赋予一些合理的 “ 权利 ” &#xff0c;让他们执行一些只有根用户或特许用户才能完成的任务&#xff0c;从而减少根用户的登陆次…

es6中的类及es5类的实现

目录 类的特点类的特点 1.类只能通过new得到 在es6中类的使用只能是通过new&#xff0c;如果你将它作为一个函数执行&#xff0c;将会报错。 //es6的写法 class Child {constructor() {this.name 1;} } let child new Child(); console.log(child.name)//1 //如果直接…

python高阶函数filter_Python进阶系列连载(13)——Python内置高阶函数filter(上)...

前言进阶部分连载继续~如果还没看过我的入门连载部分&#xff0c;先看&#xff1a;当然&#xff0c;小编的免费入门课程已经有咯&#xff0c;看过连载的朋友可以看看视频再快速梳理一遍~前文传送门&#xff1a;filterfilter是什么意思呢&#xff1f;我们百度看看&#xff1a;百…

javaone_JavaOne 2012:观察与印象

javaone我正坐在旧金山国际机场等待登上一架飞机&#xff0c;然后又一次满意但累人的JavaOne&#xff08;2012&#xff09;体验&#xff0c;开始撰写这篇特别的博客文章。 自上周日的主题演讲以来&#xff0c;在会议上狂热地撰写了约30篇博客文章之后&#xff0c;再写另一篇博客…

CSDN转载博客的方法

前言 对于喜欢逛CSDN的人来说&#xff0c;看别人的博客确实能够对自己有不小的提高&#xff0c;有时候看到特别好的博客想转载下载&#xff0c;但是不能一个字一个字的敲了&#xff0c;这时候我们就想快速转载别人的博客&#xff0c;把别人的博客移到自己的空间里面&#xff0c…

linux 服务器账号及安全杂谈

1、useradd zhangsan&#xff0c;添加zhangsan用户后&#xff0c;不能交互式登陆该账号。 原因是&#xff1a;/etc/shadow中内容是 zhangsan:!!:16804:0:99998:7::: 其中&#xff0c;两个!!表示出于安全角度&#xff0c;不能登陆。给zhangsan设置密码后&#xff0c;就可以登陆…

mysql-9索引

mysql索引的建立对于mysql的高效运行是很重要的&#xff0c;索引可以大大提高mysql的检索速度。 索引分为单列索引和组合索引。 单列索引&#xff0c;即一个索引只包含单个列&#xff0c;一个表可以有多个单列索引&#xff0c;但这不是组合索引。 组合索引&#xff0c;即一个索…

带有AWS Lambda和Java的无服务器FaaS

什么是无服务器架构&#xff1f; 无服务器架构在由第三方完全管理的临时容器中运行自定义代码。 自定义代码通常只是完整应用程序的一小部分。 也称为函数 。 这为无服务器架构提供了另一个名称&#xff0c;即功能即服务 &#xff08;FaaS&#xff09;。 该容器是短暂的&#x…

python 查找算法_七大查找算法(Python)

查找算法 -- 简介查找(Searching)就是根据给定的某个值&#xff0c;在查找表中确定一个其关键字等于给定值的数据元素。查找表(Search Table)&#xff1a;由同一类型的数据元素构成的集合关键字(Key)&#xff1a;数据元素中某个数据项的值&#xff0c;又称为键值主键(Primary K…

traceroute命令的用法实例

ceroute命令的用法实例traceroute 跟踪数据包到达网络主机所经过的路由工具&#xff1b;traceroute 是用来发出数据包的主机到目标主机之间所经过的网关的工具。traceroute 的原理是试图以最小的TTL发出探测包来跟踪数据包到达目标主机所经过的网关&#xff0c;然后监听一个来自…

去除div最后一个逗号_去除重复值、统计数量,这个公式可以直接套用!

点击上方蓝字关注星标★不迷路本文作者&#xff1a;拉登 Dony来源&#xff1a;拉小登(ID&#xff1a;ladengchupin)本文编辑&#xff1a;小叮、竺兰前段时间遇到这样一个问题&#xff0c;让我很头疼。头疼的原因有 3 点&#xff1a;❶ 问题描述不清晰&#xff0c;理解起来困难&…

spring shell_Spring Shell项目发布

spring shellSpring Source昨天发布了Spring Shell 。 Spring Shell是一个交互式Shell&#xff0c;可以使用基于Spring的编程模型轻松地通过命令进行扩展。 它是通过删除OSGi依赖项从Spring Roo项目中提取的&#xff0c;并变成了一个独立项目。 这使得那些只希望使用交互式外壳…

Word报告自动生成(例如 导出数据库结构)

将很早之前写的一个小组件重新整理优化一下&#xff0c;做成一个通用的功能。适用于导出数据库的结构&#xff08;表、字段等&#xff09;到Word或将体检数据自动生成Word版的体检报告等。代码&#xff1a;Github 一、主要需要完成功能: 1. 灵活的配置规则及word样式设置&#…