Hadoop(十五)项目考核 WordCount案例

news/2024/9/20 18:43:18

一、需求分析

  • 需求:在给定的文本文件中统计输出每一个单词出现的总次数
  • SEVENTEEN.txt文本内容如下:
say the name seventeen
hello
we are seventeen
nice to meet you
you
very nice
  • 按照MapReduce编程规范,分别编写Mapper,Reducer,Driver

1、Mapper
(1)将MapTask传过来的文本内容先转换成String
(2)根据空格将这一行切分成单词
(3)将单词输出为<单词,1>
2、Reducer
(1)汇总各个key的个数
(2)输出该key的总次数
3、Driver
(1)获取配置信息,获取job对象实例
(2)指定本程序的jar包所在的本地路径
(3)关联Mapper/Reducer业务类
(4)指定Mapper输出数据的kv类型
(5)指定最终输出的数据的kv类型
(6)指定job的输入原始文件所在目录
(7)指定job的输出结果所在目录
(8)提交作业

二、环境准备

1、创建maven工程,MapReduceDemo
2、在pom.xml文件中添加如下依赖

<dependencies><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.1.3</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.30</version></dependency>
</dependencies>

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

log4j.rootLogger=INFO, stdout 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n 
log4j.appender.logfile=org.apache.log4j.FileAppender 
log4j.appender.logfile.File=target/spring.log 
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout 
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

4、创建包名:com.user.mapreduce.wordcount

三、编写程序

1、编写Mapper类

package com.user.mapreduce.wordcount;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;public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {Text k = new Text();IntWritable v = new IntWritable(1);@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// 1 获取一行String line = value.toString();
// 2 切割String[] words = line.split(" ");
// 3 输出for (String word : words) {k.set(word);context.write(k, v);}}
}

2、编写Reducer类

package com.user.mapreduce.wordcount;import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{int sum;IntWritable v = new IntWritable();@Overrideprotected void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {
// 1 累加求和sum = 0;for (IntWritable count : values) {sum += count.get();}
// 2 输出v.set(sum);context.write(key,v);}
}

3、编写Driver驱动类

package com.user.mapreduce.wordcount;import java.io.IOException;
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;
public class WordCountDriver {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(WordCountDriver.class);
// 3 关联 Mapper 和 Reducer 的 jarjob.setMapperClass(WordCountMapper.class);job.setReducerClass(WordCountReducer.class);
// 4 设置 Mapper 输出的 kv 类型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);
// 5 设置最终输出 kv 类型job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);
// 6 设置输入和输出路径FileInputFormat.setInputPaths(job, new Path("C:\\Users\\shi.hongpin\\Desktop\\SEVENTEEN.txt"));FileOutputFormat.setOutputPath(job, new Path("D:\\hadoop\\output"));
// 7 提交 jobboolean result = job.waitForCompletion(true);System.exit(result ? 0 : 1);}
}
  • 打包成jar包,到虚拟机运行,输入输出路径要修改为:
FileInputFormat.setInputPaths(job, new Path(arg[0]));
FileOutputFormat.setOutputPath(job, new Path(arg[1]));

5、本地运行成功后在对应的输出路径能看到输出结果

are	1
hello	1
meet	1
name	1
nice	2
say	1
seventeen	2
the	1
to	1
very	1
we	1
you	2

四、提交到集群测试

1、用maven打jar包,需要添加的打包插件依赖

<build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.6.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><descriptorRefs><descriptorRef>>jar-with-dependencies</descriptorRef></descriptorRefs><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></configuration></plugin></plugins></build>

2、将程序打包成jar包,修改名称为wc.jar,并将其拷贝到Hadoop集群/opt/module/hadoop-3.1.3 路径
3、执行WordCount程序

hadoop-3.1.3]$ hadoop jar wc.jar com.user.mapreduce.wordcount.WordCountDriver /wcinput/ /wcoutput7
  • 使用JavaApi实现离线文本上传

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

和之大题解

1111... = 2^n-1长度为n的都是1的二进制数 = 2的n次方-1思路:对于每个数只有选或不选(1或0)的二进制,剩余见代码点击查看代码 #include<bits/stdc++.h> using namespace std; long long f[20]; int main(){freopen("202409C.in","r",stdin);freo…

2024-03-01 Windows MySQL5.7.27绿色版安装

背景 MySQL是常用数据库,其中版本已经有很多了,安装方式也有很多,联网装、安装包等。不仅安装麻烦,卸载也很麻烦。因此笔者一般都是使用绿色版安装,安装过程自己很清晰,每一步都知道自己做了什么,卸载时也很容易,自己安装的时候做了什么,卸载的时候删除什么就行了。 版…

主机安装zblog 无法登陆:错误原因:登录失败

当你遇到在主机上安装 ZBlog 后无法登录后台,并且收到“错误原因:登录失败”的提示时,可以尝试以下几种方法来解决问题:检查用户名和密码:确认你输入的用户名和密码是否正确,注意区分大小写。清除浏览器缓存和Cookies:清除浏览器中的缓存数据和Cookies,有时候这些数据可…

CPU上下⽂切换是什么意思

什么是 CPU 上下文? 多个进程竞争 CPU 会导致平均负载( Load Average)升高,但是进程在竞争 CPU 的时候并没有真正运⾏,为什么还会导致系统的负载升⾼呢?原因就在于CPU 上下⽂切换。Linux 是⼀个多任务操作系统,它⽀持远⼤于 CPU 数量的任务同时运⾏。当然,这些任务实际…

虚拟主机子目录安装了zblog 文章发布提示错误

如果你在虚拟主机的一个子目录中安装了 Z-Blog,并且在发布文章时遇到错误提示,那么这个问题可能与文件路径、配置设置、权限或服务器环境有关。以下是一些可能的原因及解决方法: 1. 检查文件路径问题描述:文件路径配置不正确可能导致发布文章时出现问题。 解决方法:确认 c…

《鸿蒙/Harmony | 开发日志》选择文件或拍照功能

鸿蒙系统提供无需用户授权的文件选择API,支持照片、视频和文件分类选择,具备临时只读权限,优化了安全性和用户体验。鸿蒙选择文件或拍照的功能,有直接可以用的 API,而且和Android相比,最大的好处,是不需要向用户索要文件权限。 不需要索要权限的原因是,鸿蒙的权限改动升…

EF使用

EF命令使用问题描述: PM> Add-Migration InitialCreate Add-Migration : 无法将“Add-Migration”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。 所在位置 行:1 字符: 1 + Add-Migration InitialCr…

hackmyvm Hades5变量劫持提权

在这个目录下有个./uid的程序分别运行./uid 和 id 发现我们在 uid一行是有不一样的我们猜测 在./uid里面他先用chown把我们的 uid改写成了anthea 然后运行id 然后再把我们的uid改回andromeda 那么我们怎么拿到这个anthea的权限呢这里就需要用到变量劫持的思想 如果我们把 id 这…