Hadoop调用MapReduce进行词频统计

本博客详细介绍了如何利用Hadoop MapReduce对英文小说《了不起的盖茨比》进行词频统计。首先,通过VirtualBox在Ubuntu上安装Hadoop和Eclipse,然后将文本文件上传到HDFS,接着在Eclipse中编写Java应用程序,编译打包成JAR文件,最后在Hadoop环境中运行并验证结果。
部署运行你感兴趣的模型镜像

博客目录

一.案例

1.实验目的

对英文原版小说《了不起的盖茨比》进行词频统计

2.分析步骤

1.将待分析的文本文件上传到HDFS
2.调用MapReduce对文件中各个单词出现的次数进行统计
3.将统计结果下载本地

二.前置准备

1.传输文本文件

在物理机上从网上下载英文原版《了不起的盖茨比》小说文件,下载到本地的文件格式为.pdf或.epub的文件将其转换为.txt文本文件,将其文件名改为wdf.txt,最后将这文件传输到网盘之中。

2.环境搭建

(1)使用VirtualBox虚拟机软件安装Ubuntu

具体安装步骤可以参考博主寥廓长空的这篇博客

(2)在Ubuntu中安装Hadoop和Eclipse

具体安装步骤可以参考博主vmClaire的这篇博客

三.具体步骤

1.下载保存文本文件

在虚拟机Ubuntu系统里面使用Firefox浏览器将网盘上的wdf.txt下载保存到“/home/dadoop”路径内
将文件传输到Hadoop目录下

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

您可能感兴趣的与本文相关的镜像

Qwen-Image-Edit-2509

Qwen-Image-Edit-2509

图片编辑
Qwen

Qwen-Image-Edit-2509 是阿里巴巴通义千问团队于2025年9月发布的最新图像编辑AI模型,主要支持多图编辑,包括“人物+人物”、“人物+商品”等组合玩法

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值