Hadoop调用MapReduce进行词频统计
博客目录
一.案例
1.实验目的
对英文原版小说《了不起的盖茨比》进行词频统计
2.分析步骤
1.将待分析的文本文件上传到HDFS
2.调用MapReduce对文件中各个单词出现的次数进行统计
3.将统计结果下载本地
二.前置准备
1.传输文本文件
在物理机上从网上下载英文原版《了不起的盖茨比》小说文件,下载到本地的文件格式为.pdf或.epub的文件将其转换为.txt文本文件,将其文件名改为wdf.txt,最后将这文件传输到网盘之中。
2.环境搭建
(1)使用VirtualBox虚拟机软件安装Ubuntu
(2)在Ubuntu中安装Hadoop和Eclipse
三.具体步骤
1.下载保存文本文件
在虚拟机Ubuntu系统里面使用Firefox浏览器将网盘上的wdf.txt下载保存到“/home/dadoop”路径内

2.将文本文件传输至HDFS
启动hadoop,将wdf.txt上传至HDFS

3.启动软件Eclipse
打开/新建工作空间“workspace”

4.新建Java工程
(1)启动完成后,在左上角“File→New→Java Project”依次点击,创建一个工程名为WordCount的Java工程
(2)接下来按照从上往下顺序进行配置,首先“Project name”填写为“WordCount”
(3)其次勾选“Use default location”保持打钩状态,使其工程位置为“/home/hadoop/workspace/WordCount”
(4)接着在“JRE”这个框中,选择“java-8-openjdk-amd64”
(5)然后点击界面底部的“Next>”按钮,进入下一步的设置
(6)当Java工程“WordCount”已经存在的时候,会出现如图所示的“A project with this name already exists.”的提示语句,并且使Next>和Finish按钮处于灰色状态

5.为项目添加需要用到的JAR包
(1)先点击灰色栏第一行的“Libraries”按钮,然后点击界面右侧的“Add External JARs…”按钮

(2)在弹出的窗口中依次选定
①“/usr/local/hadoop/share/hadoop/common”目录下的“hadoop-common-2.7.1.jar”和“haoop-nfs-2.7.1.jar”两个jar包
②“/usr/local/hadoop/share/hadoop/common/lib”目录下的所有jar包
③“/usr/local/hadoop/share/hadoop/mapreduce”目录下的所有jar包
④“/usr/local/hadoop/share/hadoop/mapreduce/lib”目录下的所有jar包

(3)添加完jar包之后点击“Finish”按钮
6.新建类
(1)右击在Eclipse工作界面左侧的java工程“WordCount”,在弹出的菜单中依次点击“New→Class”

(2)填写类名“WordCount”,其它保持不动,单击Finish

7.编写Java应用程序
按住Ctrl+A选择全部,然后按Delete/Backspace清空这个类里面的代码,然后粘贴如下词频统计代码
import java.io.IOException;
import java.util.Iterator;
import java.util.StringTokenizer;
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.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
public class WordCount {
public WordCount() {
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
String[] otherArgs = (new GenericOptionsParser(conf, args)).getRemainingArgs();
if(otherArgs.length < 2) {
System.err.println("Usage: wordcount <in> [<in>...] <out>");
System.exit(2);
}
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(WordCount.TokenizerMapper.class);
job.setCombinerClass(WordCount.IntSumReducer.class);
job.setReducerClass(WordCount.IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
for(int i = 0; i < otherArgs.length - 1; ++i) {
FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
}
FileOutputFormat.setOutputPath(job, new Path(otherArgs[otherArgs.length - 1]));
System.exit(job.waitForCompletion(true)?0:1);
}
public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
private static final IntWritable one = new IntWritable(1);
private Text word = new Text();
public TokenizerMapper() {
}
public void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while(itr.hasMoreTokens()) {
this.word.set(itr.nextToken());
context.write(this.word, one);
}
}
}
public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();
public IntSumReducer() {
}
public void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
int sum = 0;
IntWritable val;
for(Iterator i$ = values.iterator(); i$.hasNext(); sum += val.get()) {
val = (IntWritable)i$.next();
}
this.result.set(sum);
context.write(key, this.result);
}
}
}
8.编译打包程序
(1)点击Eclipse工作界面上部的“Run”或者右键代码编辑区,在弹出的菜单中依次选择“Run as→Java Application”

(2)在弹出的界面中点击右下角的“OK”按钮,开始运行程序。

(3)程序运行结束后,会在底部的“Console”面板中显示运行结果信息

(4)在“/usr/local/hadoop”目录下新建个“myapp”文件夹

(5)接下来准备将Java应用程序打包生成JAR包,以便部署到Hadoop平台上运行。
右键Eclipse工作界面左侧的“Package Explorer”面板中的工程“WordCount”,在弹出的菜单中选择“Export”

(6)在弹出的窗口中依次点击“Java→Runnable JAR file”,然后点击“Next>”

(7)“Launch configuration”下拉栏中选择“工程-类”即“WordCount-WordCount”然后点击“Export destination”栏右侧的“Browse…”找到上一部创建的“/usr/local/hadoop/myapp/WordCount.jar”路径,最后点击“Finish”

(8)在弹出的“Runnable JAR File Export”窗口中点击“OK”按钮

(9)在弹出的“Confirm Replace”窗口中点击“Yes”按钮。至此,已经顺利把WordCount工程打包生成了WordCount.jar

9.在终端中运行程序

10.上传文本文件至HDFS
(1)把文本文件wdf.txt上传到HDFS中的“/user/hadoop/input”目录下

(2)查看HDFS input目录验证wdf.txt是否已经上传成功

11.在终端中使用jar包运行程序

12.验证是否运行成功
(1)检查程序是否有正常运行

(2)查看是否有生成output/part-r-00000这个文件


13.保存至本地
将output文件夹下载至本地

14.查看文件
打开查看part-r-00000文件

本次实验案例至此已基本完成
四.参考资料
1.Hadoop安装教程 单机/伪分布式配置 Hadoop/Ubuntu
2.大数据技术原理与应用 第二章 大数据处理架构Hadoop 学习指南
3.大数据技术原理与应用 第三章 分布式文件系统HDFS 学习指南
4.使用Eclipse编译运行MapReduce程序 Hadoop Ubuntu/CentOS
本博客详细介绍了如何利用Hadoop MapReduce对英文小说《了不起的盖茨比》进行词频统计。首先,通过VirtualBox在Ubuntu上安装Hadoop和Eclipse,然后将文本文件上传到HDFS,接着在Eclipse中编写Java应用程序,编译打包成JAR文件,最后在Hadoop环境中运行并验证结果。
1106

被折叠的 条评论
为什么被折叠?



