mapper-reducer word count 实例

统计一个文件里各单词的个数,假设这个文件很大。

原理如下图:

编写代码:

WCMapper.java

package zengmg.hadoop.mr.wordcount;import java.io.IOException;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;/** public class WCMapper extends Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>{* 参数是4个泛型* KEYIN, VALUEIN,是mapper输入数据的类型* KEYOUT, VALUEOUT,是mapper输出数据的类型* map和reduce的数据输入输出都是以 key-value对的形式封装的* 默认情况下,框架传递给mapper的输入数据中,key是要处理的文本中一行的起始偏移量,这一行的内容作为value* mapper的输出类型要结合业务,这里输出 key是文本(String),value是个数(Long)* ps:* 输入和输出数据都要在网络上传递,这些数据都要序列化,java自带的序列化有太多的冗余内容,* 于是hadoop自定义了一套序列化。* 于是次数的java-Lang类型要用hadoop的LongWritable* java-String改为hadoop的Text*/
public class WCMapper extends Mapper<LongWritable, Text, Text, LongWritable>{/** mapper拿到一行数据,就调一次这个方法*/@Overrideprotected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, LongWritable>.Context context)throws IOException, InterruptedException {//具体业务逻辑就写在这个方法里//需要处理的业务逻辑数据,框架已经传递进来了,就是方法中的key和value//key是要处理的文本中一行的起始偏移量,这一行的内容作为value//业务逻辑://1、按空格分隔一行文本里的单词//2、输出 k 单词,v 1String line=value.toString();String[] words=line.split(" ");for(String word:words){context.write(new Text(word), new LongWritable(1));}}}

WCReducer.java

package zengmg.hadoop.mr.wordcount;import java.io.IOException;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;public class WCReducer extends Reducer<Text, LongWritable, Text, LongWritable> {// 框架在map处理完成之后,将map输送过来的kv对缓存起来,进行分组,然后传递一个组<key,values{}>,//每个key一组,每组调用一次reduce方法进行统计// 举例最后的kv对:<hello,{1,1,1,1,1,......}>,循环统计values就可以了@Overrideprotected void reduce(Text key, Iterable<LongWritable> values,Reducer<Text, LongWritable, Text, LongWritable>.Context context) throws IOException, InterruptedException {long count=0;for(LongWritable value:values){count+=value.get();}context.write(key, new LongWritable(count));}
}

WCRunner.java

package zengmg.hadoop.mr.wordcount;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;/** 用来描述一个特定的作业* 在hadoop集群里有很多作业job,需要指定这个业务逻辑作业使用哪个类作为逻辑处理的map,哪个作为reduce* 还可以指定该作业要处理的数据所在的路径* 还可以指定该作业输出的结果放到哪个路径* .....* 该程序会打包成jar,放到hadoop的集群里跑*/
public class WCRunner {public static void main(String[] args) throws Exception {Configuration conf=new Configuration();Job wcJob= Job.getInstance(conf);//设置这个job所用的mapper类和reducer类所在的jar包//必须指定,在hadoop里会有很多的jar包作业wcJob.setJarByClass(WCRunner.class);//设置job使用的mapper类和reducer类wcJob.setMapperClass(WCMapper.class);wcJob.setReducerClass(WCReducer.class);/** 设置reducer输出数据KV类型* 先设置reducer的原因是:没有设置reducer输出数据kv的类型的api,* setOutputKeyClass和setOutputValueClass会把reducer和mapper都设置了。* 如果reducer和mapper的输出类型一样,就用这条就够了,无需setMapOutput...*/wcJob.setOutputKeyClass(Text.class);wcJob.setOutputValueClass(LongWritable.class);//设置mapper输出数据kv类型//wcJob.setMapOutputKeyClass(Text.class);//wcJob.setMapOutputValueClass(LongWritable.class);//指定要处理的输入数据存放路径FileInputFormat.setInputPaths(wcJob, new Path("hdfs://hello110:9000/wc/srcdata/"));//指定处理结果的输出数据存放路径FileOutputFormat.setOutputPath(wcJob, new Path("hdfs://hello110:9000/wc/output/"));//将job提交给集群运行,true:打印运行日志wcJob.waitForCompletion(true);}
}

导出jar包,放到hadoop集群下运行。

1、启动hadoop,start-all.sh

2、创建输出文件

hadoop fs -mkdir /wc/srcdata/

3、编辑要统计的文件

vi word.log

4、上传word.log到 hdfs的 /wc/srcdata  文件夹下。

hadoop fs -put word.log /wc/srcdata

5、运行jar包

hadoop jar wcount.jar zengmg.hadoop.mr.wordcount.WCRunner

提示 successful,表明成功

6、进入输出文件查看

 hadoop fs -ls /wc/output

 hadoop fs -cat /wc/output/part-r-00000


结果:

boy     1
girl    1
hello   4
mimi    1
world   1

按abc字母顺序表排序的







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

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

相关文章

MR程序的几种提交运行模式

MR程序的几种提交运行模式 本地模型运行 1/在windows的eclipse里面直接运行main方法&#xff0c;就会将job提交给本地执行器localjobrunner执行 ----配置path&#xff1a;D:\hadoop-2.7.2\bin ----配置hadoop_home&#xff1a;D:\hadoop-2.7.2 ----复制 hadoop.dll和winutil…

零点起飞学java视频_零点起飞学java (刘升华) 高清PDF_IT教程网

资源名称&#xff1a;零点起飞学java (刘升华) 高清PDF第1篇 java开发基础第1章 java概述( 教学视频&#xff1a;37分钟) 2第2章 基本数据类型及运算( 教学视频&#xff1a;52分钟) 14第3章 java程序流程控制( 教学视频&#xff1a;33分钟) 36第4章 类与对…

vector 修改 java_java对vector动态数组中的对象排序,以下代码有何问题,如何修改?...

展开全部package com.tx.collection;import java.util.Comparator;import java.util.Iterator;import java.util.Map;import java.util.Set;import java.util.TreeMap;import java.util.TreeSet;import java.util.Vector;public class Student {String name;int score;public S…

hadoop的序列化与java的序列化区别

java的序列化机制 java序列化时会把具体类的数据和类的继承结构信息都序列化传递。如下图hadoop的序列化机制 序列化类的数据&#xff0c;但是不序列化类的继承结构信息。 网络传递的时候就少了很多流量&#xff0c;hadoop也不需要类的继承关系&#xff0c;只要类的数据就够…

ORA-08103: object no longer exists

今天工具箱报错&#xff1a; ORA-08103: object no longer exists 查了原因&#xff0c;是有session在操作表&#xff0c;比如插入&#xff0c;更新等。而工具箱这个操作刚好在select表&#xff0c;所以报错。-------下文是英文解释----- ORA-08103: object no longer exists错…

DAY3-“忙里偷闲”找你玩耍2018-1-11

接触Java第三天&#xff0c;嘿嘿&#xff0c;今天近代史期末考试&#xff0c;提前一小时交卷&#xff0c;回宿舍继续学习&#xff0c;中午去见女神姐姐了&#xff0c;每次见完女神姐姐都是满满地动力。这次女神姐姐告诉我们要好好规划自己的时间&#xff0c;早上花20分钟规划好…

基于ssm出租车管理系统的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本出租车管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&…

Spring Security源码分析四:Spring Social实现微信社交登录

2019独角兽企业重金招聘Python工程师标准>>> 社交登录又称作社会化登录&#xff08;Social Login&#xff09;&#xff0c;是指网站的用户可以使用腾讯QQ、人人网、开心网、新浪微博、搜狐微博、腾讯微博、淘宝、豆瓣、MSN、Google等社会化媒体账号登录该网站。 前言…

求方程的解 Solve the Equation

为什么80%的码农都做不了架构师&#xff1f;>>> 问题&#xff1a; Solve a given equation and return the value of x in the form of string "x#value". The equation contains only , - operation, the variable x and its coefficient. If there is …

java流读取字符串_javaIO之字符流是怎么读取的?

最近在看io相关的知识&#xff0c;遇到一些小问题&#xff0c;以下有例子来说明问题&#xff1a;比如&#xff1a;12345 是一个十进制数根据ASCII码找到是 &#xff1a;二进制 00110001 00110010 00110011 00110100 00110101十进制4950515253十六进制 0x310x320x330x340x35文件…

js学习

为什么80%的码农都做不了架构师&#xff1f;>>> /* my code */ var gArrSpell [ 1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888, 999999, AAAA, bbbb, cccc, dddd, eeee, fffff ];var gArrSplDmg [11,12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24…

代码在eclipse下不报错,在doc命令行下报错--jar file和runable jar file

今天开发一个小工具&#xff0c;引用了Log4j&#xff0c;来记录日志&#xff0c;在eclipse下运行&#xff0c;代码正常&#xff0c;打包成jar放到doc命令行下运行报错&#xff1a; Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/logging/…

小马激活软件下载,当心伪小马,有病毒

官方的小马激活软件已经停止更新了&#xff0c;下文是官方停更公告。 http://www.pccppc.com/xiaomajihuo-html 所以小马oem7以后的都不是官方的&#xff0c;包含病毒。重装系统后&#xff0c;一般是先激活系统&#xff0c;再安装杀毒软件&#xff0c;这就给“伪小马激活工具”…

三张图搞懂JavaScript的原型对象与原型链

对于新人来说&#xff0c;JavaScript的原型是一个很让人头疼的事情&#xff0c;一来prototype容易与__proto__混淆&#xff0c;二来它们之间的各种指向实在有些复杂&#xff0c;其实市面上已经有非常多的文章在尝试说清楚&#xff0c;有一张所谓很经典的图&#xff0c;上面画了…

Mybatis中resultMap

MyBatis中在查询进行select映射的时候&#xff0c;返回类型可以用resultType&#xff0c;也可以用resultMap&#xff0c;resultType是直接 表示返回类型的&#xff0c;而resultMap则是对外部ResultMap的引用&#xff0c;但是resultType跟resultMap不能同时存在。 1.resultType …

Erlang/OTP设计原则(文档翻译)

http://erlang.org/doc/design_principles/des_princ.html 图和代码皆源自以上链接中Erlang官方文档&#xff0c;翻译时的版本为20.1。 这个设计原则&#xff0c;其实是说用户在设计系统的时候应遵循的标准和规范。阅读前我一直以为写的是作者在设计 Erlang/OTP 框架时的一些原…

存储过程的参数可以使用sql的函数

系统已做成存储过程&#xff0c;调用方法如下&#xff1a; crh_entry(yyyymmdd,起始时间,结束时间); 示例1&#xff1a;进行2016年4月10日10时到12时的测试&#xff0c;应写为&#xff1a; exec crh_entry(20160410,10,11); 示例2&#xff1a;进行2016年4月8日14时到15时的…

java如何实例化集合_如何在java中实例化一个Queue对象?

Queue是一个接口&#xff0c;这意味着你不能直接构造一个Queue 。最好的select是构造一个已经实现Queue接口的类&#xff0c;如下所示&#xff1a; AbstractQueue &#xff0c; ArrayBlockingQueue &#xff0c; ConcurrentLinkedQueue &#xff0c; DelayQueue &#xff0c; D…

java使用队列实现栈思路_算法面试:队列实现栈的方案

声明&#xff1a;码字不易&#xff0c;转载请注明出处&#xff0c;欢迎文章下方讨论交流。前言&#xff1a;Java数据结构与算法专题会不定时更新&#xff0c;欢迎各位读者监督。本篇介绍的是如何用两个队列实现栈的问题。这道题作为上一篇文章算法面试&#xff1a;栈实现队列的…

Uber如何使用go语言创建高效的查询服务

在2015年初我们创建了一个微服务&#xff0c;它只做一件事&#xff08;也确实做得很好&#xff09;就是地理围栏查询。一年后它成了Uber高频查询&#xff08;QPS&#xff09;服务&#xff0c;本次要讲的故事就是我们为什么创建这个服务&#xff0c;以及编程语言新秀Go如何帮我们…