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,一经查实,立即删除!

相关文章

java 远程调用url_使用Java的URL/HttpURLConnection进行远程调用(POST请求)

利用Java的HttpURLConnection进行远程url请求(调用远程接口)测试类&#xff1a;请求类型为json,以post方式请求&#xff0c;利用OutputStream写入数据实体类&#xff1a;public class User implementsSerializable {privateString name;privateString password;publicString ge…

LindDotNetCore~职责链模式的应用

回到目录 职责链模式 它是一种设计模块&#xff0c;主要将操作流程与具体操作解耦&#xff0c;让每个操作都可以设置自己的操作流程&#xff0c;这对于工作流应用是一个不错的选择&#xff01; 下面是官方标准的定义&#xff1a;责任链模式是一种设计模式。在责任链模式里&…

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…

构件之法读书笔记04

我们前两周我们团队一起制作了一个大学生记账软件&#xff0c;但是我们没有对我们的软件进行测试&#xff0c;只要是这个功能能够顺利进行&#xff0c;我们就觉得OK。 其实&#xff0c;我认为我们的软件是有问题的&#xff0c;对于一些极限的操作能否完成&#xff0c;在各种环境…

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

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

【Spark】开发Spark选择Java还是Scala?

Spark-Java-Scala-哪种语言 spark java 支持_百度搜索(1 封私信)Spark 中用 Scala 和 java 开发有什么区别&#xff1f; - 知乎(1 封私信)Spark平台下&#xff0c;scala比java更有优势么&#xff1f; - 知乎

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;只要类的数据就够…

java mail 已发送_JavaMail获取已发送邮件

public static voidmain(String args[]) {Properties props new Properties(); //参数配置props.setProperty("mail.transport.protocol", "smtp"); //使用的协议(JavaMail规范要求)props.setProperty("mail.smtp.host", "smtp.exmail.qq.c…

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错…

【Spark】Spark-空RDD判断与处理

Spark-空RDD判断与处理 SparkKafkaDemo - Streaming Statisticsrdd isempty count_百度搜索Spark RDD.isEmpty costs much time - Stack OverflowSpark Streaming中空RDD的处理-Spark-about云开发[SPARK-5270] Provide isEmpty() function in RDD API - ASF JIRA19 Spark Stre…

JDBC开发步骤

JDBC开发步骤&#xff1a; 1、加载数据库驱动 2、通过DriverManager获取数据库连接Connection 3、通过Connection获取Statement/PreparedStatement 4、将SQL语句绑定到Statement/PreparedStatement中去&#xff0c;准备向数据库发送SQL语句 5、执行完sql语句后&#xff0c…

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

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

java 数据保存内存_java中的各种数据类型在内存中存储的方式 一

1.java是如何管理内存的java的内存管理就是对象的分配和释放问题。(其中包括两部分)分配&#xff1a;内存的分配是由程序完成的&#xff0c;程序员需要通过关键字new为每个对象申请内存空间(基本类型除外)&#xff0c;所有的对象都在堆(Heap)中分配空间。释放&#xff1a;对象的…

Gradle学习之构建java与web项目

一.使用Gradle的java插件构建Java项目 1&#xff09;Gradle插件包含了若干个接口定义和已有的任务项&#xff0c;语法结构&#xff1a;apply plugin:插件名 ,此处我们定义插件 apply plugin : java 2&#xff09;Gradle希望我们的java项目需要遵循以下规范&#xff1a; src/mai…

Hibernate单表开发步骤

Hibernate单边开发步骤&#xff1a; 1、创建Configuration&#xff0c;加载src/hibernate.cfg.xml配置文件&#xff0c;该配置文件中又去加载Hello.hbm.xml映射文件。 2、通过Configuration创建重量级SessionFactory。重量级&#xff1a;创建慢&#xff0c;内存占用大&#…

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

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

redission java_Java注解如何基于Redission实现分布式锁

这篇文章主要介绍了Java注解如何基于Redission实现分布式锁,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下1、定义注解类Target({ ElementType.METHOD })Retention(RetentionPolicy.RUNTIME)Documentedpublic i…

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

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

jdbc开发优缺点

1&#xff09;优点&#xff1a;简单易学,上手快,非常灵活构建SQL&#xff0c;效率高 2&#xff09;缺点&#xff1a;代码繁琐&#xff0c;难以写出高质量的代码&#xff08;例如&#xff1a;资源的释放&#xff0c;SQL注入安全性等&#xff09; 开发者既要写业务逻辑&#xff0…