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

------------------------------背景需求-------------------------

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

一、安装Ubuntu
二、准备工作
1.创建Hadoop账户
2.设置hadoop密码 :
3.为hadoop用户增加管理员权限:
4.更新 apt
5.安装vim
6.配置SSH
三.安装Java环境
1.安装JDK
2.验证JDK安装情况
3.设置JAVA坏境变量
四.安装Hadoop
五.Hadoop伪分布式配置
1.修改配置文件
2.格式化 NameNode
3.开启NameNode和DataNode守护进程
4.校验安装
六.调用MapReduce执行WordCount对单词进行计数
1.准备工作
2. 在Eclipse中创建项目
3. 为项目添加需要用到的JAR包
4. 编写Java应用程序
5. 编译打包程序
6. 运行程序
七.总结
八.参考材料


一、安装Ubuntu
本文档基于在VB上安装的Ubuntu Kylin版本进行试验。
二、准备工作
1.创建Hadoop账户
 (1)首先按 ctrl+alt+t 打开终端窗口,输入如下命令创建新用户 :
sudo useradd -m hadoop -s /bin/bash

2.设置hadoop密码 :

sudo passwd hadoop

3.为hadoop用户增加管理员权限:

sudo adduser hadoop sudo

注销并使用hadoop用户登录

4.更新apt为后续安装软件做准备

sudo apt-get update

5.安装vim,用于修改配置文件

sudo apt-get install vim

6.配置SSH
 (1)由于集群、单节点模式都需要用到 SSH 登陆(类似于远程登陆,你可以登录某台 Linux 主机,并且在上面运行命令),Ubuntu 默认已安装了 SSH client,此外还需要安装 SSH server

sudo apt-get install openssh-server

 (2)安装后,利用 ssh-keygen 生成密钥,并将密钥加入到授权中:

exit            # 退出刚才的 ssh localhost
cd ~/.ssh/      # 若没有该目录,请先执行一次ssh localhost
ssh-keygen -t rsa     # 会有提示,都按回车就可以
cat ./id_rsa.pub >> ./authorized_keys  # 加入授权

 (3)使用如下命令就可以免密登陆本机

ssh localhost
三、安装Java环境
1.安装JDK(这里采用JDK1.8)
cd /usr/lib
sudo mkdir jvm     #创建/usr/lib/jvm目录用来存放JDK文件
cd ~ #进入hadoop用户的主目录
cd Downloads       #注意区分大小写字母,刚才已经通过FTP软件把JDK安装包jdk-8u162-linux-x64.tar.gz上传到该目录下
sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm  #把JDK文件解压到/usr/lib/jvm目录下

2.验证JDK安装情况

cd /usr/lib/jvm
ls

3.设置JAVA坏境变量
 (1)

cd ~
vim ~/.bashrc

修改配置java环境变量文件并添加一下内容

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

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

source ~/.bashrc

 (3)验证安装情况

java -version

 显示版本号即说明安装成功
在这里插入图片描述

四.安装Hadoop
 (1)验证安装情况将 Hadoop 安装至 /usr/local/ 中:
sudo tar -zxf ~/下载/hadoop-3.1.3.tar.gz -C /usr/local    # 解压到/usr/local中
cd /usr/local/
sudo mv ./hadoop-3.1.3/ ./hadoop    # 将文件夹名改为hadoop
sudo chown -R hadoop ./hadoop  

 (2)验证安装情况

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

 显示版本号即说明安装成功
在这里插入图片描述

五.Hadoop伪分布式配置
1.修改配置文件

 (1)在进行修改配置文件前,需要创建相应的文件夹进行存放,以防后续操作无法启动Hadoop

cd /usr/local/hadoop/etc/hadoop/
sudo mkdir /usr/local/hadoop/tmp
sudo mkdir /usr/local/hadoop/tmp/dfs/name
sudo mkdir /usr/local/hadoop/tmp/dfs/data

 (2)开始配置core-site.xml :

vim core-site.xml 

在配置文件中找到configuration标签对,修改为如下配置

<configuration>
 <property>
     <name>hadoop.tmp.dir</name>
     <value>file:/usr/local/hadoop/tmp</value>
     <description>Abase for other temporary directories.</description>
 </property>
   <property>
     <name>fs.defaultFS</name>
     <value>hdfs://localhost:9000</value>
   </property>
</configuration>

2.格式化 NameNode

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

 成功会看到 “successfully formatted” 的提示:

2020-01-08 15:31:31,560 INFO namenode.NameNode: 
STARTUP_MSG: 
/************************************************************
	STARTUP_MSG: Starting NameNode
	STARTUP_MSG:   host = hadoop/127.0.1.1
	STARTUP_MSG:   args = [-format]
	STARTUP_MSG:  version = 3.1.3
*************************************************************/
......
2020-01-08 15:31:35,677 INFO common.Storage: Storage directory /usr/local/hadoop/tmp/dfs/name **has been successfully formatted**.
2020-01-08 15:31:35,700 INFO namenode.FSImageFormatProtobuf: Saving image file /usr/local/hadoop/tmp/dfs/name/current/fsimage.ckpt_0000000000000000000 using no compression
2020-01-08 15:31:35,770 INFO namenode.FSImageFormatProtobuf: Image file /usr/local/hadoop/tmp/dfs/name/current/fsimage.ckpt_0000000000000000000 of size 393 bytes saved in 0 seconds .
2020-01-08 15:31:35,810 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
2020-01-08 15:31:35,816 INFO namenode.FSImage: FSImageSaver clean checkpoint: txid = 0 when meet shutdown.
2020-01-08 15:31:35,816 INFO namenode.NameNode: SHUTDOWN_MSG:  
/************************************************************
	SHUTDOWN_MSG: Shutting down NameNode at hadoop/127.0.1.1
*************************************************************/

3.开启NameNode和DataNode守护进程

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

 成功会看到ssh给出 “Are you want to continue connecting” 的提示:

Are you want to continue connecting (yes/no)? yes

4.校验安装
 当程序启动完成后,可以通过命令 jps 来判断是否成功启动,若成功启动则会列出如下进程: “NameNode”、”DataNode” 和 “SecondaryNameNode”:
在这里插入图片描述
 成功启动后,可以访问 Web 界面 http://localhost:50070查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。
在这里插入图片描述

六.调用MapReduce执行WordCount对单词进行计数
1.准备工作
 (1)准备一篇不少于10000万单词的文本文件并将这个文件放置于hadoop文件夹中,以便实验。这里使用的文档是《 All the Queen's Men》

在这里插入图片描述
 (2)将实验的文本文件上传到HDFS中

./bin/hdfs dfs -put /usr/local/hadoop/lxd.txt  input

 (3)调用ls命令查看文件上传情况

./bin/hdfs dfs –ls input

在这里插入图片描述
 (4)用Ubuntu左侧边栏自带的软件中心下载Eclipse。
在这里插入图片描述
 (5)将Eclipse安装至 /usr/lib 目录中:

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

 (6)安装 hadoop-eclipse-plugin,用于在 Eclipse 上编译和运行 MapReduce 程序,将 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/    
/usr/lib/eclipse/eclipse -clean    

2.在Eclipse中创建项目
 (1)启动Eclipse。
在这里插入图片描述
 (2)选择“File–>New–>Java Project”菜单,开始创建一个Java工程。
在这里插入图片描述
3. 为项目添加需要用到的JAR包
 (1)在“/usr/local/hadoop/share/hadoop”目录下,点击界面中的“Libraries”选项卡,然后,点击界面右侧的“Add External JARs…”按钮,点击“mapreduce”,一添加以下JAR包:
*“/usr/local/hadoop/share/hadoop/common”*目录下的hadoop-common-3.1.3.jar和haoop-nfs-3.1.3.jar;
*“/usr/local/hadoop/share/hadoop/common/lib”*目录下的所有JAR包;
*“/usr/local/hadoop/share/hadoop/mapreduce”*目录下的所有JAR包,但是,不包括jdiff、lib、lib-examples和sources目录。
在这里插入图片描述
 (2)已添加hadoop-common-3.1.3.jar和haoop-nfs-3.1.3.jar到当前Java工程中。再次点击“Add External JARs…”按钮,把剩余的其他JAR包都添加进来。全部添加完毕以后,就可以点击界面右下角的“Finish”按钮,完成Java工程WordCount的创建。
在这里插入图片描述

  1. 编写Java应用程序
     (1)编写WordCount.java。在Eclipse左侧面板中点击“Package Explorer”,找到刚才创建好的工程名称“WordCount”,然后在该工程名称上右键,在弹出的菜单中选择“New–>Class”菜单,最后“finish”
    在这里插入图片描述
     (2)输入统计词频代码
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);
        }
    }
}
  1. 编译打包程序
     (1)编译并运行程序
    在这里插入图片描述
     (2)把程序打包生成JAR包,创建myapp文件夹存放并部署到Hadoop平台上运行
cd /usr/local/hadoop
mkdir myapp

在这里插入图片描述
6. 运行程序
 (1)启动Hadoop:

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

 (2)在HDFS中新建与hadoop对应的input目录即“/user/hadoop/input”:

cd /usr/local/hadoop
./bin/hdfs dfs -mkdir input

 (3)将待分析文件上传到HDFS:

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

 (4)使用hadoop jar命令运行程序并查看词频统计结果:

cd /usr/local/hadoop
./bin/hadoop jar ./myapp/WordCount.jar input output
./bin/hdfs dfs -cat output/*

 (5)查看output文件夹是否生成的文件:

./bin/hdfs dfs -ls output

在这里插入图片描述

 (6)将output文件夹下载至本地并打开:

./bin/hdfs dfs -get output ./output

在这里插入图片描述
在这里插入图片描述

六.总结
本次实验操作,详细阐述了调用MapReduce对文件中各个单词出现次数进行统计,包括如何配置JDK、Hadoop、MapReduce,Eclipse等,有错误的地方欢迎指出。
七.参考材料
[1] http://dblab.xmu.edu.cn/blog/2481-2/
[2] http://dblab.xmu.edu.cn/post/4329/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值