使用MapReduce对英文单词文件进行单词出现次数统计

使用MapReduce对英文单词文件进行单词出现次数统计

目录

  • 一、事前准备工作
    • 1、创建相关的hadoop账户。
    • 2、更新apt。
    • 3、安装并配置SSH
  • 二、安装相关Java环境
    • 1、安装相关jdk。
    • 2、查看jdk安装情况。
    • 3、设置相关环境变量。
  • 三、安装Hadoop。
    • 1、使用ftp上传下载,选择要上传的位置,进行相关上传,点击远程控制Ubuntu你自己需要上传的位置。
    • 2、安装。
    • 3、检查。
  • 四、Hadoop伪分布式。
    • 1、修改相关的配置文件。
    • 2、进行NameNode的格式化。
    • 3、开启NameNode和DataNode守护进程。
  • 五、使用MapReduce执行WordCount对单词进行计数。
    • 1、将待分析的文件上传到HDFS。
    • 2、安装eclipse。
    • 3、安装Hadoop-Eclipse-Plugin。
    • 4、配置Hadoop-Eclipse-Plugin。
    • 5、在eclipse中操作HDFS中的文件。
    • 6、创建MapReduce项目。
    • 7、执行MapReduce的WordCount程序进行单词统计。

一、事前准备工作

1、创建相关的hadoop账户。

(1)打开终端窗口输入下面命令创建相关新的用户,使用 /bin/bash 作为 shell。

sudo useradd -m hadoop -s /bin/bash

(2)设置相关密码,按照相关提示输入两次密码。

sudo passwd mima

(3)hadoop 用户增加管理员权限,方便后续命令操作。

sudo adduser hadoop sudo

(4)选择退出登录,选择刚建立的用户登陆。

2、更新apt。

打开终端窗口,输入下面命令进行apt的更新,以及安装vim。

sudo apt-get update
sudo apt-get install vim

3、安装并配置SSH

(1)Ubuntu系统已经默认安装SSH client,但是还需要安装 SSH server,相关命令如下。

sudo apt-get install openssh-server

(2)安装完成后,用下面命令登陆。

ssh localhost

(3)紧接着输入exit退出刚才的ssh,就回到了终端窗口,然后生成密钥,并将密钥加入到相关授权中。再用ssh localhost命令,不用输入密码就可以直接登陆。

exit 
cd ~/.ssh/ 
ssh-keygen -t rsa
cat ./id_rsa.pub >> ./authorized_keys

二、安装相关Java环境

1、安装相关jdk。

下载相关jdk到本地电脑。在Linux命令行界面中,执行如下命令。

cd /usr/lib
sudo mkdir jvm
cd ~ 
cd Downloads
sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm

2、查看jdk安装情况。

使用下面命令查看。

cd /usr/lib/jvm

3、设置相关环境变量。

(1)使用以下命令进行设置,打开vim编辑器

cd ~
vim ~/.bashrc

(2)配置.bashrc文件,在文件的开始加入以下命令。

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

(3)输入wq保存.bashrc退出vim编辑器。执行如下命令让配置生效,并且输入命令验证安装情况。

source ~/.bashrc
java –version

三、安装Hadoop。

1、使用ftp上传下载,选择要上传的位置,进行相关上传,点击远程控制Ubuntu你自己需要上传的位置。

2、安装。

输入以下命令把Hadoop安装到/usr/local/,Hadoop 解压后即可使用。

sudo tar -zxf ~/下载/hadoop-2.6.0.tar.gz -C /usr/local
cd /usr/local/
sudo mv ./hadoop-2.6.0/ ./hadoop
sudo chown -R hadoop ./hadoop

3、检查。

输入以下命令检查是否安装成功。

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

四、Hadoop伪分布式。

1、修改相关的配置文件。

(1)使用以下命令修改配置文件core-site.xml。

<configuration>
</configuration>

(2)修改成为以下配置。

<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>

(3)使用以下命令修改配置文件hdfs-site.xml。

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/data</value>
    </property>
</configuration>

2、进行NameNode的格式化。

(1)使用以下命令进行格式化

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

(2)输入以下命令开启NameNode和DataNode守护进程。

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

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

(1)通过jps来判断是否成功启动,成功则如下图所示。
在这里图片描述
(2)成功启动后,可以访问http://localhost:50070查看NameNode和Datanode信息。
使用MapReduce对英文单词文件进行单词出现次数统计_第1张图片

五、使用MapReduce执行WordCount对单词进行计数。

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

(1)将文件拉入Ubuntu中。
使用MapReduce对英文单词文件进行单词出现次数统计_第2张图片
(2)将相关文件113zhengmin.txt上传到HDFS,上传到/home/hadoop文件夹。
使用MapReduce对英文单词文件进行单词出现次数统计_第3张图片
(3)启动hadoop,并将113zhengmin.txt从本机上传至HDFS。
使用MapReduce对英文单词文件进行单词出现次数统计_第4张图片
(4)在/usr/hadoop创建input文件夹,将113zhengmin.txt上传到HDFS。
使用MapReduce对英文单词文件进行单词出现次数统计_第5张图片
(5) 查看hdfs input中的文件,查看是否存在上传的文件。
使用MapReduce对英文单词文件进行单词出现次数统计_第6张图片

2、安装eclipse。

如图所示
使用MapReduce对英文单词文件进行单词出现次数统计_第7张图片

3、安装Hadoop-Eclipse-Plugin。

输入以下命令将release中的hadoop-eclipse-kepler-plugin-2.6.0.jar复制到 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

4、配置Hadoop-Eclipse-Plugin。

(1)启动Hadoop,打开eclipse,可以在左侧的Project Explorer栏目中看到DFS Locations。
使用MapReduce对英文单词文件进行单词出现次数统计_第8张图片
(2)选择窗口下的首选项
使用MapReduce对英文单词文件进行单词出现次数统计_第9张图片
(3)点击Hadoop Map/Reduce 选项,选择Hadoop的安装目录。
使用MapReduce对英文单词文件进行单词出现次数统计_第10张图片
(4)点击窗口,打开透视图,选择 Map/Reduce 选项进行切换。
使用MapReduce对英文单词文件进行单词出现次数统计_第11张图片

5、在eclipse中操作HDFS中的文件。

点击左侧MapReduce Location就能查看HDFS中的文件列表。
使用MapReduce对英文单词文件进行单词出现次数统计_第12张图片

6、创建MapReduce项目。

(1)点击文件新建项目,选择Map/Reduce Project,填写项目名称即可创建完成。
使用MapReduce对英文单词文件进行单词出现次数统计_第13张图片
使用MapReduce对英文单词文件进行单词出现次数统计_第14张图片
使用MapReduce对英文单词文件进行单词出现次数统计_第15张图片
(2)在WordCount右击选择新建类,在包中填写org.apache.hadoop.examples,在名称处填写WordCount
使用MapReduce对英文单词文件进行单词出现次数统计_第16张图片
(3)运行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

(4)执行完成后,会看到以下文件。
使用MapReduce对英文单词文件进行单词出现次数统计_第17张图片
(5)在WordCount.java中输入以下代码。

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  [...] ");
            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);
            }
 
        }
    }
}

(6)右键WordCount.java选择运行方式,运行配置,在此处可以设置运行时的相关参数。切换到自变量,在程序自变量处填写input output就可以。
使用MapReduce对英文单词文件进行单词出现次数统计_第18张图片
使用MapReduce对英文单词文件进行单词出现次数统计_第19张图片

7、执行MapReduce的WordCount程序进行单词统计。

(1)运行成功后,如以下图片所示。
使用MapReduce对英文单词文件进行单词出现次数统计_第20张图片
(2)回到终端,查看output文件夹是否有运行成功后生成的文件。
使用MapReduce对英文单词文件进行单词出现次数统计_第21张图片
(3)查看生成的output/part-r-00000文件,结果如图所示。
使用MapReduce对英文单词文件进行单词出现次数统计_第22张图片
(4)使用红框内的命令将output文件夹下载至本地中。
使用MapReduce对英文单词文件进行单词出现次数统计_第23张图片
(5)查看output文件夹中查看part-r-00000这个文件,已经成功生成并且有结果。
使用MapReduce对英文单词文件进行单词出现次数统计_第24张图片
使用MapReduce对英文单词文件进行单词出现次数统计_第25张图片

你可能感兴趣的:(使用MapReduce对英文单词文件进行单词出现次数统计)