关于MapReduce单词统计的例子:

要统计的文件的文件名为hello

hello中的内容如下

hello  you

hello  me

通过MapReduce程序统计出文件中的各个单词出现了几次.(两个单词之间通过tab键进行的分割)

复制代码
  1 import java.io.IOException;
  2 
  3 import mapreduce.WordCountApp.WordCountMapper.WordCountReducer;
  4 
  5 import org.apache.hadoop.conf.Configuration;
  6 import org.apache.hadoop.fs.Path;
  7 import org.apache.hadoop.io.LongWritable;
  8 import org.apache.hadoop.io.Text;
  9 import org.apache.hadoop.mapreduce.Job;
 10 import org.apache.hadoop.mapreduce.Mapper;
 11 import org.apache.hadoop.mapreduce.Reducer;
 12 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
 13 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
 14 
 15 /**
 16  * 以文本
 17  * hello    you
 18  * hello    me
 19  * 为例子.
 20  * map方法调用了两次,因为有两行
 21  * k2 v2 键值对的数量有几个?
 22  * 有4个.有四个单词.
 23  * 
 24  * 会产生几个分组?
 25  * 产生3个分组.
 26  * 有3个不同的单词.
 27  *
 28  */
 29 public class WordCountApp {
 30     public static void main(String[] args) throws Exception {
 31         //程序在这里运行,要有驱动.
 32         Configuration conf = new Configuration();
 33         Job job = Job.getInstance(conf,WordCountApp.class.getSimpleName());
 34         
 35         //我们运行此程序通过运行jar包来执行.一定要有这句话.
 36         job.setJarByClass(WordCountApp.class);
 37         
 38         FileInputFormat.setInputPaths(job,args[0]);
 39         
 40         job.setMapperClass(WordCountMapper.class);//设置Map类
 41         job.setMapOutputKeyClass(Text.class);//设置Map的key
 42         job.setMapOutputValueClass(LongWritable.class);//设置Map的value
 43         job.setReducerClass(WordCountReducer.class);//设置Reduce的类
 44         job.setOutputKeyClass(Text.class);//设置Reduce的key Reduce这个地方只有输出的参数可以设置. 方法名字也没有Reduce关键字区别于Map
 45         job.setOutputValueClass(LongWritable.class);//设置Reduce的value.
 46         
 47         FileOutputFormat.setOutputPath(job, new Path(args[1]));
 48         job.waitForCompletion(true);//表示结束了才退出,不结束不退出
 49     }
 50     /**
 51      * 4个泛型的意识
 52      * 第一个是LongWritable,固定就是这个类型,表示每一行单词的起始位置(单位是字节)
 53      * 第二个是Text,表示每一行的文本内容.
 54      * 第三个是Text,表示单词
 55      * 第四个是LongWritable,表示单词的出现次数
 56      */
 57     public static class WordCountMapper extends Mapper<LongWritable, Text, Text    ,LongWritable>{
 58         Text k2 = new Text();
 59         LongWritable v2 = new LongWritable();
 60         //增加一个计数器,这个Map调用几次就输出对应的次数.
 61         int counter = 0;
 62         
 63         
 64         /**
 65          * key和value表示输入的信息
 66          * 每一行文本调用一次map函数
 67          */
 68         @Override
 69         protected void map(LongWritable key, Text value,Mapper<LongWritable, Text, Text, LongWritable>.Context context)    
 70                 throws IOException, InterruptedException {
 71             counter  = counter + 1;
 72             System.out.println("mapper 调用的次数:" + counter);
 73             //这个map方法中的Mapper的各个泛型和上面的意识是一样的,分别代表的是k1,v1,k2,v2
 74             String line = value.toString();
 75             System.out.println(String.format("<k1,v1>的值<"+key.get()+","+line+">"));
 76             String[] splited = line.split("\t");
 77             for (String word : splited) {
 78                 k2.set(word);
 79                 v2.set(1);
 80                 System.out.println(String.format("<k2,v2>的值<"+k2.toString()+","+v2.get()+">"));
 81                 context.write(k2, v2);//通过context对象写出去.
 82             }
 83         }
 84         /**
 85          * 这个地方的四个泛型的意思
 86          * 前两个泛型是对应的Map方法的后两个泛型.
 87          * Map的输出对应的是Reduce的输入.
 88          * 第一个Text是单词
 89          * 第二个LongWritable是单词对应的次数
 90          * 我们想输出的也是单词 和 次数
 91          * 所以第三个和第四个的类型和第一和第二个的一样
 92          * 
 93          * 分组指的是把相同key2的value2放到一个集合中
 94          *
 95          */
 96         public static class WordCountReducer extends Reducer<Text, LongWritable, Text, LongWritable>{
 97             LongWritable v3 = new LongWritable();
 98             //增加一个计数器,这个Reduce调用几次就输出对应的次数.
 99             int counter = 0;
100             
101             /**
102              * 每一个分组调用一次reduce函数
103              * 过来的k2 分别是hello you me
104              * 
105              */
106             @Override
107             protected void reduce(Text key2, Iterable<LongWritable> value2Iterable,Reducer<Text, LongWritable, Text, 
108                     LongWritable>.Context context)
109                             throws IOException, InterruptedException {
110                 counter  = counter + 1;
111                 System.out.println("reducer 调用的次数:" + counter);
112                 //第一个参数是单词,第二个是可迭代的集合. 为什么上面的LongWritable类型的对象value2变成了一个可以迭代的结合参数?
113                 //因为分组指的是把相同key2的value2放到一个集合中
114                 long sum = 0L;
115                 for (LongWritable value2 : value2Iterable) {
116                     System.out.println(String.format("<k2,v2>的值<"+key2.toString()+","+value2.toString()+">"));
117                     sum += value2.get(); //这个value2是LongWritable类型的,不能进行+= 操作,要用get()得到其对应的java基本类型.
118                     //sum表示单词k2 在整个文本中的出现次数.
119                 }
120                 v3.set(sum);
121                 context.write(key2, v3);
122                 System.out.println(String.format("<k3,v3>的值<"+key2.toString()+","+v3.get()+">"));
123             }
124         }
125     }
126 }
复制代码

 

通过运行Yarn集群查看Map日志得到的输出结果: 

查看Reduce日志产看到的输出结果:

 

//============================================================================

以下程序是之前的写的:注释更加详细:

复制代码
  1 /*
  2  * 一个hello文件内容如下:
  3  *   hello        you
  4  *   hello        me
  5  */
  6 import java.io.IOException;
  7 
  8 import org.apache.hadoop.conf.Configuration;
  9 import org.apache.hadoop.fs.Path;
 10 import org.apache.hadoop.io.LongWritable;
 11 import org.apache.hadoop.io.Text;
 12 import org.apache.hadoop.mapreduce.Job;
 13 import org.apache.hadoop.mapreduce.Mapper;
 14 import org.apache.hadoop.mapreduce.Reducer;
 15 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
 16 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
 17 
 18 public class WordCountApp {
 19     public static void main(String[] args) throws Exception {
 20         // 在main方法写驱动程序,把Map函数和Reduce函数组织在一起.
 21         // 搞一个对象把Map对象和Reduce对象都放在这个对象中,我们把这个对象称作Job
 22         // 两个形参,一个是Configuration对象,一个是Job的名称,这样获得了一个Job对象;
 23         Job job = Job.getInstance(new Configuration(),
 24                 WordCountApp.class.getSimpleName());
 25         // 对这个job进行设置
 26         job.setJarByClass(WordCountApp.class);// 通过这个设置可以让框架识别你写的代码
 27         
 28         job.setMapperClass(MyMapper.class);// 把自定义的Map类放到job中
 29         job.setMapOutputKeyClass(Text.class);// 定义Map的key的输出类型,Map的输出是<hello,2>
 30         job.setMapOutputValueClass(LongWritable.class);// 定义Map的value的输出类型
 31 
 32         job.setReducerClass(MyReducer.class);// 把自定义的Reducer类放到job中
 33         job.setOutputKeyClass(Text.class);// 因为Reduce的输出是最终的数据,Reduce的输出是<hello,2>
 34         // 所以这个方法名中没有像Map对应的放发一样带有Reduce,直接就是setOutputKeyClass
 35         job.setOutputValueClass(LongWritable.class);// 定义reduce的value输出
 36 
 37         FileInputFormat.setInputPaths(job, args[0]);// 输入指定:传入一个job地址.
 38         // 这个args[0] 就是新地址,"hdfs://192.168.0.170/hello"
 39         FileOutputFormat.setOutputPath(job, new Path(args[1]));
 40         // 输出指定
 41         // 指定输入和输出路径可以通过在这里写死的方式,也可以通过main函数参数的形式
 42         // 分别是args[0]和args[1]
 43 
 44         // 把job上传到yarn平台上.
 45         job.waitForCompletion(true);
 46     }
 47 
 48     /*
 49      * 对于<k1,v1>而言,每一行产生一个<k1,v1>对,<k1,v1>表示<行的起始位置,行的文本内容>
 50      * 就本例而言map函数总共调用两次,因为总共只有两行.
 51      * 正对要统计的文本内容可以知道总共两行,总共会调用两次Map函数对应产生的<k1,v1>分别是<0,hello you>
 52      * 和第二个<k1,v1>是<10,hello me>
 53      */
 54     private static class MyMapper extends
 55             Mapper<LongWritable, Text, Text, LongWritable> {
 56         // 这个Mapper的泛型参数是<KEYIN,VALUEIN,KEYOUT,VALUEOUT> 分别对应的是k1,v1,k2,v2
 57         // 我们如下讲的k1,v1的类型是固定的.
 58         // 就本例而言,map函数会被调用2次,因为总共文本文件就只有两行.
 59         
 60         //要定义输出的k2和v2.本案例中可以分析出<k2,v2>是对文本内容的统计<hello,1><hello,1><you,1><me,1>
 61         //而且<k2,v2>的内容是和<k3,v3>中的内容是一样的.
 62         Text k2 = new Text();
 63         LongWritable v2 = new LongWritable();
 64         //重写父类Mapper中的map方法
 65         @Override
 66         protected void map(LongWritable key, Text value,
 67                 Mapper<LongWritable, Text, Text, LongWritable>.Context context)
 68                 throws IOException, InterruptedException {
 69             //通过代码或者案例分析就可以知道k1其实没有什么用出的.
 70             String line = value.toString();
 71             String[] splited = line.split("\t");//根据制表分隔符机进行拆分.hello和me,you之间是一个制表分隔符.
 72             for (String word : splited) {
 73                 k2.set(word);
 74                 v2.set(1);
 75                 context.write(k2, v2);
 76                 //用context把k2,v2写出去,框架会写,不用我们去管.
 77             }
 78         }
 79     }
 80 
 81     private static class MyReducer extends
 82             Reducer<Text, LongWritable, Text, LongWritable> {
 83         //这个例子中的<k2,v2>和<k3,v3>中的k是一样的,所以这里,k2当做k3了.
 84         LongWritable v3 = new LongWritable();
 85         @Override
 86         protected void reduce(Text k2, Iterable<LongWritable> v2s,
 87                 Reducer<Text, LongWritable, Text, LongWritable>.Context context)
 88                 throws IOException, InterruptedException {
 89             //Reduce是对上面Map中的结果进行汇总的.
 90             //上面拆分出来的<k2,v2>是<hello,1><hello,1><you,1><me,1>Reduce方法中就要对其进行汇总.
 91             long sum = 0L;
 92             for(LongWritable v2:v2s){
 93                 sum = sum +v2.get();//sum是long类型,v2是LongWritable类型
 94                 //LongWritable类型转换成long类型用get()方法.
 95                 //sum的值表示单词在整个文件中出现的中次数.
 96             }
 97             v3.set(sum);
 98             context.write(k2,v3);
 99         }
100     }
101 
102 }
复制代码

 //===============================================================================

查看日志的时候,代码中的System.out.println()对于Java程序输出到控制台,但是这个地方是把Java类打成Jar包,

放到集群中去通过命令执行的.

输出通过日志查看的.

上面对应的Log Type:stdout 

stdout:stdout(Standardoutput)标准输出


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/5492572.html,如需转载请自行联系原作者

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

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

相关文章

朵朵糖故事机器人怎么更新_“故事贩卖机”专栏创始人温酒的新作,奇幻世界的暖心物语很治愈...

我有酒&#xff0c;你有故事吗&#xff1f;2015年&#xff0c;知乎上一个叫“故事贩卖机”的专栏横空出世&#xff0c;凭着一个个脑洞大开的故事&#xff0c;这个温吞而又温暖的专栏很快得到了读者的认可。而其中的创始人兼主打写手温酒&#xff0c;更是被粉丝们亲切地称呼为“…

python3 通过百度地图API获取城市POI点并存于CSV格式

原文信息&#xff1a; 作者&#xff1a;WenWu_Both 出处&#xff1a;http://blog.csdn.net/wenwu_both/article/ 版权&#xff1a;本文版权归作者和CSDN博客共有 转载&#xff1a;欢迎转载&#xff0c;但未经作者同意&#xff0c;必须保留此段声明&#xff1b;必须在文章中…

使用dropwizard(3)-加入DI-dagger2

前言 习惯了Spring全家桶&#xff0c;对spring的容器爱不释手。使用dropwizard&#xff0c;看起来确实很轻&#xff0c;然而&#xff0c;真正使用的时候不得不面临一个问题。我们不可能一个resource就能把所有的业务逻辑囊括&#xff01;那么&#xff0c;必然就要有负责处理逻辑…

日历对象导哪个包_微信新表情瞬间炸裂,文物表情包永恒萌呆!

11月18日晚微信上架了6个全新表情瞬间炸裂网友一天时间阅读达16.2亿&#xff0c;讨论15.8万次#微信新表情#话题翻白眼、666、让我看看叹气、苦涩、裂开微信新表情虽然666但文物表情包的呆萌也能让人瞬间裂开更能完全诠释我的各(bu)种(wen ding)情绪先对比一下最新的6个表情[翻白…

Tensorflow一些常用基本概念与函数(1)

文章转至 作者&#xff1a;林海山波出处&#xff1a;https://me.csdn.net/lenbow版权&#xff1a;本文版权归作者和CSDN博客共有 写这篇博客只为自己学习路上做个笔记&#xff0c;方便自己学习记忆&#xff0c;大家如果想看详细文章可以去原作者主页去看&#xff0c;同时他…

Lineageos14 20180525更新

一、ROM注意事项 拒绝任何无意义二次打包&#xff01; C大停止更新Lineageos14&#xff0c;我来接力。 二、ROM更新日志 20180525更新&#xff1a; 1、常规更新 2、安全补丁2018年5月5日 20180406更新&#xff1a; 1、增加通话录音&#xff0c;常规更新 2、安全补丁2018年3月…

蓝牙连接不上车要hfp_如何正确使用车载蓝牙播放器呢?

车载蓝牙是以无线蓝牙技术为基础而设计研发的车内无线免提系统。可以连接我们设计进行听歌和打电话十分方便&#xff0c;下面诺金小编带大家一起来看看&#xff01;下面诺金小编带大家一起来看看一、首先是把手机和车载蓝牙播放器打开&#xff0c;搜索车载蓝牙播放器“809”&am…

使用Eclipse+PyDev创建Django项目一windows下

开发条件&#xff1a;eclipsepydev插件django editor插件 关于eclipse安装小编就不多做介绍&#xff0c;我自己用的版本如下 1.安装pydev插件 启动Eclipse, 点击Help->Install New Software 弹出如下框 点击add 分别在 Name中填:Pydev, Location中填http://pydev.org/up…

如何避免踩坑--初创技术团队组建风险预估

闲来无事翻翻微信&#xff0c;发现有不少朋友公司在招技术负责人&#xff0c;跟他们聊了几句&#xff0c;发现大多数认知都是技术部门的效率与进度达不到要求&#xff0c;机缘巧合下&#xff0c;有幸到了Y公司跟其Boss会面&#xff0c;得知其技术团队效率低下&#xff0c;总是不…

查询空缺_携程旅行2021校招开启,9大类职位,1000+岗位空缺,本科及以上学历...

携程旅行2021秋季校招正式开启&#xff01;携程集团(纳斯达克股票代码&#xff1a;TCOM)是一家领先的在线旅游服务提供商&#xff0c;旗下品牌包括携程、Trip.com、天巡和去哪儿。携程集团能够整合复杂的旅游相关信息并通过其先进的移动端App、网站以及24小时无间断的免费客户服…

Django web开发笔记

一、Django开发环境搭建&#xff1a; 1.安装python&#xff1a;django可运行于版本python 2.7、3.x 2.安装相应的IDE 3.安装pip&#xff1a;sudo apt-get install python-pip(linux为例&#xff09; 4.安装django&#xff1a;1&#xff09;pip安装&#xff1a;sudo pip ins…

android 前置摄像头预览时 镜像翻转_全面屏时代,原来手机前置摄像头都隐藏着一些缺点,你发现了吗?...

随着真全面屏时代的到来&#xff0c;人们已经不再满足于刘海屏、水滴屏以及挖孔屏等&#xff0c;越来越多的手机厂商和消费者开始追求"100%全面屏"。于是如何解决手机前置摄像头便成了最大的难题&#xff0c;毕竟只要在屏幕上放置摄像头必然会影响屏占比&#xff0c;…

Java 调用 Python 方法学习笔记

文章转载自&#xff1a; 作者&#xff1a;IT_xiao_bai 来源&#xff1a;CSDN 原文&#xff1a;https://blog.csdn.net/IT_xiao_bai/article/details/79074988 前一阵自刚好用python做了一个sae的算法模型&#xff0c;结果公…

catia怎么将特征参数化_VSLAM中特征点的参数化表示

VSLAM中特征点的参数化表示有很多&#xff0c;最直接的是用三维坐标XYZ来表示&#xff0c;但通常大家更喜欢用逆深度表示&#xff0c;因为逆深度优势在于能够建模无穷远点。Open VINS文档中给出了五种特征参数化表示&#xff1a;Global XYZ&#xff0c;Global Inverse Depth&am…

【广州】Web前端工程师

互联网公司找人咯~ 我们公司&#xff1a;道乐科技&#xff08;Dollar Tech&#xff09;成立于2013年11月&#xff0c;是一家致力于为资产管理和财富管理行业提供技术、产品和运营服务的科技金融企业。三年来&#xff0c;道乐人始终坚持“以客户为中心&#xff0c;为客户提供高品…

Java 调用 Python 方法学习笔记---之---java调用python深度学习模型运算并返回运算结果给前端(2)

上一章写到Java 调用 Python 方法学习的三种方法&#xff0c;这里强调第三种方法。第三种方法本质上和第二种方法是一样的&#xff0c;都是应用到 Runtime.getRuntime().exec() 去执行文件。要深度理解这种方法&#xff0c;首先要先理解一下Runtime.getRuntime().exec() 。 R…

tbslog乱码转换_日文游戏乱码怎么办 乱码转换工具LocaleEmulator

by Nicho Feb.23,2017许多日文游戏有诸多地区限制&#xff0c;在 win7、win8、win10 上玩时候会经常遇到日文游戏乱码的情况&#xff0c;这时候就得用到乱码转换工具了&#xff0c;下面我们就来详细说明下使用方法。常用的有 microsoft locale、applocale、NTLEA 等&…

haarcascades---各种分类器xml文件下载地址

安装好opencv想找个人脸识别的小实验做做&#xff0c;后来发现没有配置文件&#xff0c;于是乎就找到了这个&#xff0c;所以就转载过来了。 下载地址&#xff1a;https://github.com/opencv/opencv/tree/master/data/haarcascades 转载地址&#xff1a;https://blog.csdn.ne…

vue 组件属性监听_vuejs组件内的对象属性监听问题

跟数据类型是有关的。当你把一个普通的 JavaScript 对象传给 Vue 实例的 data 选项&#xff0c;Vue 将遍历此对象所有的属性&#xff0c;并使用 Object.defineProperty 把这些属性全部转为 getter/setter。但是不是所有的变动都可以通过set/get捕捉到&#xff0c;比如一个数组l…

Part 2: Containers

要求 安装了1.13或者更高版本的Docker阅读了Part1中的定位&#xff08;我没写&#xff09;介绍 是时候用Docker构建一个app了。我们会从构建这样一个app的最底层开始&#xff0c;容器——我们这节所介绍的内容。在这层之上是服务&#xff0c;服务定义了容器们的在生产中的行为&…