调用MapReduce对文件中单词出现次数进行统计

一、Ubuntu安装

1.打开VirtualBox,点击“创建”按钮,创建一个虚拟机在这里插入图片描述

2.选择内存大小
在这里插入图片描述

3.创建虚拟硬盘
在这里插入图片描述

4.选择虚拟硬盘文件类型VDI
在这里插入图片描述

5.虚拟硬盘选择动态分配
在这里插入图片描述

6.选择文件存储的位置和容量大小
在这里插入图片描述

7.下载的Ubuntu LTS 14.04的ISO映像文件,进入设置界面后,点击存储中的没有盘片,再点击光盘按钮,选择一个虚拟光驱,添加下载的Ubuntu LTS 14.04 ISO映像文件
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

8.选择创建的虚拟机Ubuntu,点击“启动”按钮
在这里插入图片描述

9.选择刚才的ISO文件
在这里插入图片描述

10.启动看到Ubuntu的安装欢迎界面。选择安装ubuntu Kylin
在这里插入图片描述

11.选择继续在这里插入图片描述

12.安装类型选择其他选项
在这里插入图片描述

13.点击新建分区表,添加swap和ect4类型分区
在这里插入图片描述

14.选择相应时区和键盘布局
在这里插入图片描述

在这里插入图片描述

15.创建用户名和密码
在这里插入图片描述
16.安装完成,重启
在这里插入图片描述

二、准备工作

1.创建hadoop用户

1.代码如下

$ sudo useradd -m hadoop -s /bin/bash

2.设置密码,添加管理员权限。

$ sudo passwd hadoop
$ sudo adduser hadoop sudo

3.更新apt

$ sudo apt-get update

4.安装配置文件VIM。

$ sudo apt-get install vim

5.安装SSH、配置SSH无密码登陆。

$ sudo apt-get install openssh-server

6.安装JAVA环境
下载文件jdk-8u162-linux-x64.tar.gz 使用Filezilla传输到“/home/linziyu/Downloads/”目录下。

$ cd /usr/lib
$ sudo mkdir jvm #创建/usr/lib/jvm目录用来存放JDK文件
$ cd ~ #进入hadoop用户的主目录
$ cd Downloads 
$ sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm  #解压

7.设置环境变量

$ cd ~
$ vim ~/.bashrc

上面命令使用vim编辑器(查看vim编辑器使用方法)打开了hadoop这个用户的环境变量配置文件,请在这个文件的开头位置,添加如下几行内容:
在这里插入图片描述
保存.bashrc文件并退出vim编辑器。然后,继续执行如下命令让.bashrc文件的配置立即生效:

$ source ~/.bashrc

2.安装 Hadoop3.1.3

下载文件hadoop-3.1.3.tar.gz 使用Filezilla传输到“/usr/local/”目录下。

$ sudo tar -zxf ~/下载/hadoop-3.1.3.tar.gz -C /usr/local    # 解压
$ cd /usr/local/
$ sudo mv ./hadoop-3.1.3/ ./hadoop        # 将文件夹名改为hadoop
$ sudo chown -R hadoop ./hadoop  

3.Hadoop伪分布式配置

1.Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。

修改配置文件 core-site.xml ,将当中的


修改为下面配置:

同样的,修改配置文件 hdfs-site.xml:
在这里插入图片描述

2.执行 NameNode 的格式化:

$ cd /usr/local/hadoop
$ ./bin/hdfs namenode -format

3.开启 NameNode 和 DataNode 守护进程。

$ cd /usr/local/hadoop
$ ./sbin/start-dfs.sh

`

在这里插入图片描述

三、 调用MapReduce执行WordCount对单词进行计数

1.将待分析的文件上传到HDFS

1.使用Firezilla将2002.txt文件传到hadoop中
在这里插入图片描述

文件已传进/home/hadoop文件夹下。
在这里插入图片描述

启动hadoop,将2002.txt上传至HDFS。
在这里插入图片描述

2.安装eclipse

在ubuntu软件中心中下载安装:在这里插入图片描述

下载后执行如下命令,将 Eclipse 安装至 /usr/lib 目录中:

 sudo tar -zxf ~/下载/eclipse-java-mars-1-linux-gtk*.tar.gz -C/usr/lib

3.在 Eclipse 中创建 MapReduce 项目

1.在Eclipse中创建项目。
在这里插入图片描述

2.选择“File–>New–>Java Project”菜单,开始创建一个Java工程,弹出如下图所示界面。
在这里插入图片描述

在“Project name”后面输入工程名称“WordCount”,选中“Use default location”,让这个Java工程的所有文件都保存到“/home/hadoop/workspace/WordCount”目录下。在“JRE”这个选项卡中,选择jdk1.8.0_162。然后,点击界面底部的“Next>”按钮,进入下一步的设置。

3.为项目添加需要用到的JAR包。
在这里插入图片描述

4.点击界面右侧的“Add External JARs…”按钮,弹出如下图所示界面。
在这里插入图片描述
(1)“/usr/local/hadoop/share/hadoop/common”目录下的hadoop-common-3.1.3.jar和haoop-nfs-3.1.3.jar;
(2)“/usr/local/hadoop/share/hadoop/common/lib”目录下的所有JAR包;
(3)“/usr/local/hadoop/share/hadoop/mapreduce”目录下的所有JAR包,但是,不包括jdiff、lib、lib-examples和sources目录。
(4)“/usr/local/hadoop/share/hadoop/mapreduce/lib”目录下的所有JAR包。

5.在Eclipse工作界面左侧的“Package Explorer”面板中(如下图所示),找到刚才创建好的工程名称“WordCount”,然后在该工程名称上点击鼠标右键,在弹出的菜单中选择“New–>Class”菜单。
在这里插入图片描述
6.选择“New–>Class”菜单以后会出现如下图所示界面。
在这里插入图片描述

在该界面中,只需要在“Name”后面输入新建的Java类文件的名称,这里采用名称“WordCount”,其他都可以采用默认设置,然后,点击界面右下角“Finish”按钮。

4.执行MapReduce的 wordcount程序进行单词统计

文件MapReduce处理的代码,在exclipse上运行 wordcount程序:

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);
        }
    }
}

10.编译打包程序。
在这里插入图片描述

在这里插入图片描述

11.点击界面右下角的“OK”按钮,开始运行程序。程序运行结束后,会在底部的“Console”面板中显示运行结果信息
在这里插入图片描述
12.把Java应用程序打包生成JAR包,部署到Hadoop平台上运行。现在可以把词频统计程序放在“/usr/local/hadoop/myapp”目录下。

$ cd /usr/local/hadoop
$ mkdir myapp

13.在Eclipse工作界面左侧的“Package Explorer”面板中,在工程名称“WordCount”上点击鼠标右键,在弹出的菜单中选择“Export”,
在这里插入图片描述

在这里插入图片描述

14.在该界面中,选择“Runnable JAR file”,然后,点击“Next>”按钮,弹出如下图所示界面。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

15.运行程序。

cd /usr/local/hadoop
./sbin/start-dfs.sh

16.把2002.txt上传到HDFS中的“/user/hadoop/input”目录下

$ cd /usr/local/hadoop
$ ./bin/hdfs dfs -put ./2002.txt input

17.查看HDFS input文件,看是否存在2002.txt。
在这里插入图片描述

18.使用hadoop jar命令运行程序

$ cd /usr/local/hadoop
$ ./bin/hadoop jar ./myapp/WordCount.jar input output

19.查看output文件夹是否有运行成功后生成的文件以及查看运行后生成的output/part-r-00000这个文件。
在这里插入图片描述

在这里插入图片描述

20.将output文件夹下载至本地:
在这里插入图片描述
21.查看文件:
在这里插入图片描述

22.查看part-r-00000文件:
在这里插入图片描述

在这里插入图片描述

四、总结

通过本次实验让我了解并学习了很多东西,从ubuntu,hadoop,jdk和eclipse的安装再到WordCount执行完成后的结果,每个步骤都让我知道和学习了一些操作、命令和知识。在这次试验之后我对大数据这门课有了不一样的理解,对linux的命令记得更牢了。并且在这次实验的操作过程中也发现了很多自己的不足之处,在今后会多加练习提高自身水平。

五、参考资料

1.http://dblab.xmu.edu.cn/blog/install-hadoop/
2. http://dblab.xmu.edu.cn/blog/285/
3. http://dblab.xmu.edu.cn/blog/290-2/
4. http://dblab.xmu.edu.cn/blog/hadoop-build-project-using-eclipse/

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要编写 MapReduce 程序来对文件单词出现次数进行统计。下面是一个简单的示例程序: ```java import java.io.IOException; 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.LongWritable; 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; public class WordCount { public static class TokenizerMapper extends Mapper<LongWritable, Text, Text, IntWritable>{ private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } } public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "word count"); job.setJarByClass(WordCount.class); job.setMapperClass(TokenizerMapper.class); job.setCombinerClass(IntSumReducer.class); job.setReducerClass(IntSumReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } } ``` 在这个程序,`TokenizerMapper` 类将输入文件的每行按空格分割为单词,然后将每个单词作为键,将值设置为 `1`,并发射到上下文。 `IntSumReducer` 类对每个键的值进行求和,并将结果输出。 在 `main` 方法,我们设置了 Mapper 和 Reducer 类、输入和输出路径,并启动了我们的作业。 接下来,你可以通过以下步骤使用 IntelliJ IDEA 来运行该程序: 1. 打开 IntelliJ IDEA,并创建一个新项目。 2. 将上述代码复制到新项目的 `WordCount.java` 文件。 3. 点击菜单栏的 `File -> Project Structure`,在弹出的窗口选择 `Libraries`,然后点击 `+` 按钮添加 Hadoop JARs。 4. 在 `Project Structure` 窗口选择 `Artifacts`,然后点击 `+` 按钮添加一个可执行的 JAR 文件。 5. 在 `Main Class` 输入 `WordCount`,然后点击 `OK`。 6. 点击菜单栏的 `Build -> Build Artifacts`,然后选择 `Build`。 7. 在 `out/artifacts/WordCount_jar` 目录下找到生成的 JAR 文件。 8. 在命令行输入以下命令来运行程序: ``` hadoop jar WordCount.jar <input_file_path> <output_directory_path> ``` 注意,你需要将 `<input_file_path>` 替换为包含输入文件的路径,将 `<output_directory_path>` 替换为输出目录的路径。 当作业完成后,你可以在输出目录找到一个包含单词计数的文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值