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

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

一、Linux的安装

1.打开VirtualBox,点击“创建”按钮,创建一个虚拟机
在这里插入图片描述
2.分配内存
在这里插入图片描述
3.创建虚拟硬盘
(1)创建虚拟硬盘
(2)选择虚拟硬盘类型
(3)动态分配虚拟内硬盘在这里插入图片描述
(4)选择文件安装目录
(5)导入ISO映像文件
在这里插入图片描述
(6)启动已经创建好的Ubuntu,并完成ubuntu的安装(具体步骤已省略,详情请自行百度搜索)。
在这里插入图片描述
(7)开启Ubuntu后,点击virtualbox的菜单“设备”选项,选择“安装增强功能”,系统便会自动安装好增强的功能,如果如果需要提示需要确认,输入return即可,然后打开虚拟机终端,输入如下命令,执行即可,完成输入后直接重启。

sudo apt-get install virtualbox-guest-dkms

二、准备工作

1.创建Hadoop用户

(1).创建Hadoop账户

a.创建Hadoop用户

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

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

$ sudo passwd hadoop
$ sudo adduser hadoop sudo

c.更新apt

$ sudo apt-get update

(2).安装JAVA并配置环境

a.下载文件jdk-8u162-linux-x64.tar.gz 并用FTP传输到“/home/hadoop/下载/”目录下

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

完成JDK文件解压缩以后,可以执行如下命令到/usr/lib/jvm目录查看一下:

$ cd /usr/lib/jvm
$ ls

出现jdk版本就证明解压成功。在这里插入图片描述
b.设置环境变量

$ cd ~
$ vim ~/.bashrc

上面命令使用vim编辑器(查看vim编辑器使用方法)打开了hadoop这个用户的环境变量配置文件,请在这个文件的开头位置,添加如下几行内容:

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH

具体如下图所示
在这里插入图片描述

保存.bashrc文件并退出vim编辑器。然后继续执行以下命令让.bashrc文件的配置立即生效:

source ~/.bashrc

输入以下代码检验java是否安装成功

java -version

显示结果如下图,则证明java安装成功在这里插入图片描述

2.安装 Hadoop

a.下载文件hadoop-2.10.0.tar.gz 使用FTP传输到“/usr/local/”目录下

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

Hadoop 解压后即可使用。输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息:

$ cd /usr/local/hadoop
$ ./bin/hadoop version

在这里插入图片描述

3.Hadoop伪分布式配置

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

<configuration>
</configuration>

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

<configuration>
</configuration>

在这里插入图片描述

b.执行 NameNode 的格式化

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

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

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

在这里插入图片描述

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

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

a.通过FTP将cjr.txt传入hadoop中
b.文件传入/home/hadoop文件夹下
在这里插入图片描述
c.启动hadoop并将cjr.txt上传到HDFS在这里插入图片描述在这里插入图片描述

2.安装Eclipse

在这里插入图片描述
下载完了Eclipse后,通过以下命令完成安装

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

3.安装和配置Hadoop-Eclipse-Plugin

(1).安装Hadoop-Eclipse-Plugin
要在 Eclipse 上编译和运行 MapReduce 程序,需要安装 hadoop-eclipse-plugin,可下载 Github 上的 hadoop2x-eclipse-plugin(备用下载地址:http://pan.baidu.com/s/1i4ikIoP)。
下载后,将 release 中的 hadoop-eclipse-kepler-plugin-2.6.0.jar (还提供了 2.2.0 和 2.4.1 版本)复制到 Eclipse 安装目录的 plugins 文件夹中,运行 eclipse -clean 重启 Eclipse 即可(添加插件后只需要运行一次该命令,以后按照正常方式启动就行了)。

$ unzip -qo ~/下载/hadoop2x-eclipse-plugin-master.zip -d ~/下载    # 解压到 ~/下载 中
$ sudo cp ~/下载/hadoop2x-eclipse-plugin-master/release/hadoop-eclipse-plugin-2.6.0.jar /usr/lib/eclipse/plugins/    # 复制到 eclipse 安装目录的 plugins 目录下
$ /usr/lib/eclipse/eclipse -clean

(2).配置Hadoop-Eclipse-Plugin
启动 Eclipse 后,先选择 Window 菜单下的 Preference。
在这里插入图片描述
切换 Map/Reduce 开发视图,选择 Window 菜单下选择 Open Perspective -> Other,弹出一个窗体,从中选择 Map/Reduce 选项即可进行切换在这里插入图片描述
建立与 Hadoop 集群的连接,具体设置如下在这里插入图片描述

4.在 Eclipse 中创建 MapReduce 项目

点击 File 菜单,选择 New -> Project,然后选
择 Map/Reduce Project,点击 Next。在这里插入图片描述
创建的 Project name 命名为WordCount 之后,再点击 Finish 就创建好了项目。
在这里插入图片描述
此时在左侧的 Project Explorer 就能看到刚才建立的项目了,
接着右键点击刚创建的 WordCount 项目,选择 New -> Class
然后只需要需要填写以下两处地方:
在 Package 处填写org.apache.hadoop.examples
在 Name 处填写 WordCount。在这里插入图片描述
创建 Class 完成后,在 Project 的 src 中就能看到 WordCount.java 这个文件。将如下 WordCount 的代码复制到该文件中。
在eclipse上运行 wordcount程序:

package org.apache.hadoop.examples;

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();
        String[] otherArgs=new String[]{"input","output"};
        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 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);
        }
    }
 
    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);
            }
 
        }
    }
}

在运行 MapReduce 程序前,需要将 /usr/local/hadoop/etc/hadoop 中将有修改过的配置文件(如伪分布式需要 core-site.xml 和 hdfs-site.xml),以及 log4j.properties 复制到 WordCount 项目下的 src 文件夹(~/workspace/WordCount/src)中,在终端中输入下列几行内容:

$ cp /usr/local/hadoop/etc/hadoop/core-site.xml ~/workspace/WordCount/src
$ cp /usr/local/hadoop/etc/hadoop/hdfs-site.xml ~/workspace/WordCount/src
$ cp /usr/local/hadoop/etc/hadoop/log4j.properties ~/workspace/WordCount/src

注意没有完成复制的话,这个程序是无法运行的。复制完成后,务必右键点击 WordCount 选择 refresh 进行刷新(不会自动刷新,需要手动刷新),可以看到文件结构如下所示在这里插入图片描述
接着编译打包程序,点击工具栏中的 Run 图标,或者右键点击 Project Explorer 中的 WordCount.java,选择 Run As -> Run on Hadoop,就可以运行 MapReduce 程序了。不过由于没有指定参数,运行时会提示 “Usage: wordcount “,需要通过Eclipse设定一下运行参数。右键点击刚创建的 WordCount.java,选择 Run As -> Run Configurations,在此处可以设置运行时的相关参数(如果 Java Application 下面没有 WordCount,那么需要先双击 Java Application)。切换到 “Arguments” 栏,在 Program arguments 处填写 “input output” 就可以了。在这里插入图片描述

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

在这里插入图片描述
查看output文件夹是否有运行成功后生成的文件,看运行后是否生成的output/part-r-00000这个文件,该文件已将单词统计结果统计好
将output文件夹下载至本地在这里插入图片描述
在本地查看文件在这里插入图片描述
用gedit查看统计好的文件在这里插入图片描述
用Eclipse查看统计好的文件在这里插入图片描述

四、总结

通过本次实验,我了解并学习到了很多大数据这门课的知识,通过操作安装ubuntu、jdk、hadoop和eclipse以及用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/

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值