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

原理如下图:

编写代码:

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字母顺序表排序的

mapper-reducer word count 实例相关推荐

  1. hadoop2.7之Mapper/reducer源码分析

    一切从示例程序开始: 示例程序 Hadoop2.7 提供的示例程序WordCount.java package org.apache.hadoop.examples;import java.io.IO ...

  2. 通过简单的Word Count讲解MapReduce原理以及Java实现

    MapReduce原理: MapReduce采用"分而治之"的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后通过整合各个节点的中间结果,得到最终结果 ...

  3. java mapreduce_通过简单的Word Count讲解MapReduce原理以及Java实现

    MapReduce原理: MapReduce采用"分而治之"的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后通过整合各个节点的中间结果,得到最终结果 ...

  4. Word count通过mr实现China的编程

    说明:该需求可以自己造数据,在条件允许的范围内,可模拟数据倾斜,通过加随机数,打散KEY的分布,再聚合 数据: pk,ccj,ccj zcl,pxj,zmj xwc,jpeson,wxc pxj,zm ...

  5. MapReduce之Word Count案例代码实现

    准备用于计算word count的数据文件 [root@hadoop01 test_data]# pwd /usr/local/wyh/test_data [root@hadoop01 test_da ...

  6. Spark 系列教程(1)Word Count

    基本概要 Spark 是一种快速.通用.可扩展的大数据分析引擎,是基于内存计算的大数据并行计算框架.Spark 在 2009 年诞生于加州大学伯克利分校 AMP 实验室,2010 年开源,2014 年 ...

  7. print (“{0:<10}{1:>5}“.format(word, count))

    print ("{0:<10}{1:>5}".format(word, count)) 这个是format方法bai的格式控制.在duPython二级教程第三章< ...

  8. Word Count作业

    Word Count作业 一.个人Gitee地址:https://gitee.com/Changyu-Guo 二.项目简介 该项目主要是模拟Linux上面的wc命令,基本要求如下: 命令格式: wc. ...

  9. java8写一个word count

    题目背景 很多了解过大数据编程的基础的人都知道一个入门级程序:word count. 其计算思路是,将一串文本(一般都是英文文章),在java中表现出来就是一个字符串或者是一个文本(txt文件). 该 ...

最新文章

  1. 背景属性的相关属性设置
  2. java 重写方法 访问权限_为何Java中子类重写方法的访问权限不能低于父类中权限(内含里氏替换原则)...
  3. hibernate3.2多表关联查询常见问题
  4. Nginx的rewrite内容介绍
  5. python opencv图片放大 缩小_Python OpenCV之图片缩放的实现(cv2.resize)
  6. pycharm设置anaconda并运行helloworld
  7. 遍历结构体_三菱ST语言编程(3)——结构体变量
  8. LeetCode 1838. 最高频元素的频数(二分查找)
  9. 中山大学提出新型行人重识别方法和史上最大评测基准
  10. redis linux中的安装
  11. 构建 QC + QTP 自动化测试框架 2:QC 与 QTP 安装
  12. RxBinding系列之RxTextView(二)
  13. python将utf8转换成中文_基于python2如何将txt内utf-8转换成中文
  14. 神途boss_神途BOSS刷新了,女玩家以身冒险前往打骨魔洞
  15. Maye v1.3.4.0 类似Rolan简洁小巧易用的快速启动工具
  16. 群友转发了一段家庭矛盾的视频
  17. MGR中secondary的从节点同步异常?
  18. element-ui calendar 日历控件实现编辑假期功能以及样式修改
  19. 批量转换用户的共存模式--Skype for Business to Teams
  20. [YOLOv7/YOLOv5系列算法改进NO.20]Involution新神经网络算子引入网络

热门文章

  1. java 去除 quot,JAVA去除web页面传入后台的特殊字符工具类 | 学步园
  2. Java 设计模式 Day1 之面向抽象原则:抽象(abstract)类的设计与应用分析
  3. php 复选框全选和取消,基于JavaScript实现复选框的全选和取消全选
  4. (四)Linux内核模块化编程
  5. linux7.0使用教程,CentOS7.0使用手册精编.pdf
  6. Oracle数据库查询优化
  7. redis核心技术与实战(二)缓存应用篇
  8. 彻底卸载oracle
  9. 0-安装Vagrant和使用
  10. HTTP Authentication(HTTP认证)(转)