呼叫MapReduce對檔案中單詞出現次數進行統計

WangmZec發表於2020-12-16

一、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這個使用者的環境變數配置檔案,請在這個檔案的開頭位置,新增如下幾行內容:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201215223800862.png?x-oss-在這裡插入圖片描述
儲存.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/

相關文章