前言

本篇博客内容:使用Hadoop提供给Java的依赖和接口轻松实现Mapreduce词频统计程序的入门。

工具:IDEA

需求:统计《yxp》这首诗中每个单词和符号出现的次数

诗的内容如下:

yxp yxp how are you ?
do you know how I miss you recently ?
perhaps you are having a time that studying hard and living happily.
But you should know that I still wait for you in Mapreduce !

输出数据为:

!    1
?   2
But 1
I   2
Mapreduce   1
a   1
and 1
are 2
do  1
for 1
happily.    1
hard    1
having  1
how 2
in  1
know    2
living  1
miss    1
perhaps 1
recently    1
should  1
still   1
studying    1
that    2
time    1
wait    1
you 6
yxp 2

正文

准备:

前提:配置好HADOOP_HOME变量以及Windows运行依赖

  1. 满足前提条件下新建一个默认的MAVEN Project。效果近似下图:

2.在pom.xml文件中添加如下依赖。

<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>2.12.0</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.1.3</version></dependency>
</dependencies>

3.在项目的src/main/resources目录下,新建一个文件,命名为“log4j2.xml”,在文件中填入

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error" strict="true" name="XMLConfig"><Appenders><!-- 类型名为Console,名称为必须属性 --><Appender type="Console" name="STDOUT"><!-- 布局为PatternLayout的方式,输出样式为[INFO] [2018-01-22 17:34:01][org.test.Console]I'm here --><Layout type="PatternLayout"pattern="[%p] [%d{yyyy-MM-dd HH:mm:ss}][%c{10}]%m%n"/></Appender></Appenders><Loggers><!-- 可加性为false --><Logger name="test" level="info" additivity="false"><AppenderRef ref="STDOUT" /></Logger><!-- root loggerConfig设置 --><Root level="info"><AppenderRef ref="STDOUT" /></Root></Loggers>
</Configuration>

正式步骤:

  1. 在 java 目录下创建package名com.yxp.complication.exercise

  2. 包下新建WcMapper类、WcRecuer类、WcDriver类。

WcMapper.java

package com.yxp.complication.exercise;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;/*** @author 尤小鹏* 切忌一味模仿!* 2021  11 11  8:52* description:继承Mapper类,“<>”中四个泛型依次为输入key类型,输入value类型,输出key类型,输出value类型。*              根据需求实现map方法*/
public class WcMapper extends Mapper<LongWritable, Text,Text, IntWritable> {//创建输出key和输出value对象Text keyOut= new Text();//设置值为一的原因是输出的结果为(key,1);IntWritable valueOut=new IntWritable(1);/***每次输入的数据为一行* @param key   输入数据的偏移量* @param value  输入的数据内容* @param context 用来传递结果* @throws IOException* @throws InterruptedException*/@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {//将改行数据转换为string类型String line = value.toString();//根据分隔符将一行数据切分为多个单词存放在数组中String[] datas = line.split(" ");//将每个单词设置为输出键,和输出值一起存放在context中for (String data : datas) {keyOut.set(data);context.write(keyOut,valueOut);}}
}

WcReducer.java

package com.yxp.complication.exercise;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;/*** @author 尤小鹏* 切忌一味模仿!* 2021  11 11  8:54* description:继承Reducer方法,四个泛型与Mapper相同,输入key和value、输出key和value,需要明白的是reduce的输入数据恰恰是map阶段的输出数据*              根据需求实现reduce方法*/
public class WcReducer extends Reducer<Text, IntWritable, Text, IntWritable> {Text keyOut = new Text();IntWritable valueOut = new IntWritable();/*** @param key     接收从map输出的key作为自己的输入key* @param values  接收从map输出的valuelist作为自己的输入value* @param context 带走结果* @throws IOException* @throws InterruptedException*/@Overrideprotected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {int total = 0;//循环得出该key的词频for (IntWritable value : values) {total += value.get();}keyOut.set(key);valueOut.set(total);context.write(keyOut, valueOut);}
}

WcDriver.java

package com.yxp.complication.exercise;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
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;import java.io.IOException;/*** @author 尤小鹏* 切忌一味模仿!* 2021  11 11  11:07* description:MapReduce程序的驱动类*/
public class WcDriver {public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {// 1 获取配置信息以及获取job对象Configuration conf=new Configuration();Job job = Job.getInstance(conf);// 2 关联本Driver程序的Jarjob.setJarByClass(WcDriver.class);// 3 关联Mapper和Reducer的jarjob.setMapperClass(WcMapper.class);job.setReducerClass(WcReducer.class);// 4 设置Mapper输出的kv类型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);// 5 设置程序输出的kv类型(为什么不是Reuduce阶段的kv呢?因为Reduce阶段可能不存在)job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);// 6 设置程序输入输出路径(输入路径为需要统计的文件路径、输出路径为结果存放的文件路径)FileInputFormat.setInputPaths(job,new Path("E:\\java\\mapreducetest\\src\\main\\resources\\yxp"));FileOutputFormat.setOutputPath(job,new Path("E:\\java\\mapreducetest\\src\\main\\resources\\yxpresult"));// 7 提交任务boolean result = job.waitForCompletion(true);System.exit(result?0:1);}}

3.运行查看结果

crc后缀文件为校验文件,不去管,结果在part-r-00000文件中。

内容如下:

以上是本地运行相关功能测试。

如果你想:

在集群中使用MapReduce程序

步骤1:将WcDriver.java文件中的输入路径和输出路径修改为args[0]和args[1]即如下二图

这样做的目的是使路径变为可以变更的参数而不再固定。

步骤2:使用Maven工具的package(打包)功能将程序打包为jar包到target目录下,即下图中mapreduce………jar

步骤3:将该jar包和测试数据《yxp》发送到namenode所在节点上

步骤4:将yxp发送到hdfs集群中的input目录下。

hadoop fs -put yxp /input/

步骤5:调用jar包

语法:hadoop jar 包名 类WcDriver的路径(包路径) 输入路径 输出路径hadoop jar mapreducetest-1.0-SNAPSHOT.jar com.yxp.complication.exercise.WcDriver  /input/yxp /output/

在一长串的“Info”后,如果没有“error”,就可以去集群对应路径下查看结果了。Hadoop的web界面比较友好,可以很方便的查看文件系统。

点开output目录,找到part-r-00000文件

选择上方的Head the file查看文件内容。

通过滚轮查看所有结果

如果你走到这里,恭喜你,和我一样,入门了!

Mapreduce入门--词频统计相关推荐

  1. hadoop使用mapreduce统计词频_hadoop利用mapreduce运行词频统计(非例程)

    1.运行环境 1.Ubuntu16.04单系统 2.hadoop-3.2.1 2.操作步骤 1.使用eclipse编写map reduce run 函数 2.导出jar包 3.将需要进行词频统计的文件 ...

  2. MapReduce实现词频统计

    问题描述:现在有n个文本文件,使用MapReduce的方法实现词频统计. 附上统计词频的关键代码,首先是一个通用的MapReduce模块: class MapReduce:__doc__ = '''提 ...

  3. 调用MapReduce进行词频统计

    一.需求描述 Hadoop综合大作业 要求: 1.将待分析的文件(不少于10000英文单词)上传到HDFS. 2.调用MapReduce对文件中各个单词出现的次数进行统计. 3.将统计结果下载本地. ...

  4. MapReduce编程 -词频统计

    词频统计 首先,MapReduce通过默认的组件TextInputFormat将待处理的数据文件(text1.txt和text2.txt),把每一行的数据都转变为<key,value>键值 ...

  5. 从零开始 之 使用 MapReduce 对文件进行词频统计

    文章目录 1. Linux的选择 2. 在 Ubuntu 中安装 Hadoop 2.1 创建Hadoop用户 2.2 下载并安装 Hadoop3.3.1 3. 安装 Java 环境 3.1 下载并进行 ...

  6. 东南亚语种分词和词频统计

    项目有一个需求,需要对16万缅甸语新闻做词频统计.首先是分词工具的选择和使用,然后是词频统计. 分词: 工具有voyant-tools.myanmar-tokenizer以及我使用的es的icu_an ...

  7. Hadoop实现词频统计(按照词频降序排列以及相同词频的单词按照字母序排列)

    Hadoop实现词频统计(按照词频降序排列以及相同词频的单词按照字母序排列) 一.环境 二.实现步骤 1.数据 2.主函数 3.第一个MapReduce Map Reduce 4.第二个MapRedu ...

  8. hadoop入门程序:词频统计

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_42437577/article/ ...

  9. MapReduce实现改进版WordCount词频统计

    新手入门MapReduce实现改进版WordCount词频统计 一.实验任务要求 本实验是为了实现改进版的词频统计WordCount.要求根据所给的英文名著数据集和停用词表,统计英文名著数据集中词频, ...

最新文章

  1. 【STM32 .Net MF开发板学习-17】Wifi遥控智能小车
  2. Ubuntu下Postgres安装与配置
  3. CSS 从入门到放弃系列:CSS的引入方式
  4. windows系统下安装JDK8的教程图解
  5. PHP数组传递给JavaScript以及json_encode的gbk中文乱码的解决
  6. 小学奥数 7654 等差数列末项计算 python
  7. php5中this_self_parent关键字用法讲解
  8. tomcat的localhost_access_log日志文件
  9. Trick(四)——翻转字符串的实现
  10. Jzoj3902 游戏
  11. 安装Eclipse的中文语言包
  12. 吾爱破解安卓逆向入门教程
  13. 为何不能直接拷贝软件安装好的目录运行
  14. 万字文肝Python基础知识
  15. 最通俗易懂的SpringBoot经典学习笔记讲解
  16. 解决:SCRIPT5011: Can't execute code from a freed script
  17. 自己整理的小学教师资格证结构化面试题分享
  18. win10 mmdetection3d 训练KITTI
  19. 海信电视LED42EC510N进入工厂模式方法
  20. 无线433发送接收数据测试程序原理,有杂波解决方案

热门文章

  1. java计算机毕业设计H5女娲宫旅游网站设计与实现源码+mysql数据库+系统+lw文档+部署
  2. 50行代码教你打造一个公众号文章采集器
  3. MySQL:HINT
  4. 深谈SCI论文写作技巧
  5. RabbitMq应用
  6. 富受贿数额为45437元
  7. 小程序 canvas 实现电子签名
  8. 《阵列信号处理及MATLAB实现》阵列响应矩阵(均匀线阵、均匀圆阵、L型阵列、平面阵列和任意阵列)
  9. DM与ML的主要区别
  10. Sql2012的下载与安装