基於Hadoop的WordCount案例實現(Linux版本)

讀書無論資性高低,但能勤學好問,凡事思一個所以然,自有義理貫通之日
立身不嫌家世貧賤,但能忠厚老成,所行無一毫苟且處,便爲鄉黨仰望之人

注意事項

  1. 本分佈式集羣包含3臺虛擬機,操作系統均爲Linux
  2. 本次使用的統計文本大小爲4.32MB
  3. 若使用單臺虛擬機,即僞分佈式集羣,或者分佈式集羣運算能力較弱,可以使用該4.32MB的文本
  4. 若想嘗試大數據量運算,可將該文本進行自我複製到1GB大小,並以此產生多個副本
  5. 本分佈式集羣HDFS架構如下
節點 主機名 NameNode DataNode Secondary NameNode Resource Manager Node Manager
主節點 master
從節點 slave1
從節點 slave2

準備工作

統計文本

統計文本大小爲4.32MB,也可使用自己生成的統計文本 提取碼w3ci

軟件

  1. Xftp (類似的SFTP、FTP文件傳輸軟件均可,如國產的FinalShell)
  2. Xshell (類似的安全終端模擬軟件均可,如SecureCRT)
  • Xftp以及Xshell均包含在Xmanager軟件產品中 提取碼7r9h
  • SecureCRT 提取碼fcjd
  • Xshell以及SecureCRT下載一個即可,建議下載Xshell

具體步驟

注意:以下操作均在主節點虛擬機(master)上執行,無需在各虛擬機均執行

使用Xsehll連接虛擬機

  1. 點擊“文件”→“新建”
  2. 填寫“名稱”和“主機”,“主機”爲IP地址,“名稱”儘量填寫IP地址,點擊“確定”新建Xshell連接虛擬機
  3. 在會話中選擇“172.16.29.94”,點擊“連接”,依次輸入“用戶名”和“密碼”,“用戶名”和“密碼”爲登錄該虛擬機的用戶名和密碼,最後點擊“確定”新建Xshell連接虛擬機
    新建Xshell連接虛擬機
    新建Xshell連接虛擬機在Xshell顯示界面顯示如下信息即爲連接成功

Connecting to 172.16.29.94:22…
Connection established.
To escape to local shell, press ‘Ctrl+Alt+]’.

Last login: Wed Oct 9 12:07:14 2019 from 172.28.54.186
[root@master ~]#

其中[root@master~]中的master爲該虛擬機的主機名,即hostname,每臺虛擬機可能會不一樣

創建本地存放文件目錄

  1. 輸入命令cd /hadoop/,進入/hadoop目錄
    ([root@master~]# cd /hadoop/)
  2. 輸入命令mkdir localfile,創建本地存放統計文件的目錄
    ([root@master~]# mkdir localfile)
  3. 輸入命令cd localfile,進入localfile目錄

使用Xftp導入統計文本

  1. 打開Xftp,點擊“文件”→“新建”
  2. 填寫“名稱”、“主機”、“用戶名”和“密碼”,“主機”填寫IP地址,名稱儘量填寫IP地址,“用戶名”和“密碼”爲登錄該虛擬機的用戶名和密碼
  3. “協議”更改爲“SFTP”新建SFTP文件傳輸連接
  4. 點擊“選項”,勾選“使用UTF-8”編碼,點擊“確定”,否則連接時虛擬機中的文件名稱會產生亂碼
  5. 選擇名稱爲“172.16.29.94”的會話,點擊“連接”
  6. 在虛擬機地址欄輸入/hadoop/localfile,進入該目錄
  7. 將本地統計文件拖拽到虛擬機localfile目錄下
    使用Xftp導入統計文本
    傳輸完成如下
    使用Xftp導入統計文本
  8. 在Xshell中輸入命令ll,顯示信息如下
    ([root@master localfile]# ll)

總用量 4436
-rw-r–r-- 1 root root 4538523 10月 9 12:20 data.txt

在HDFS文件系統中創建統計文本數據輸入目錄

當前目錄爲localfile時,輸入命令hadoop fs -mkdir /input創建統計文本數據輸入目錄
([root@master localfile]# hadoop fs -mkdir /input)

向輸入目錄傳輸統計文本

當前目錄爲localfile時,輸入命令hadoop fs -put data.txt /input,向/input目錄傳輸data.txt文件(該文件名以自己的統計文本名爲準)
([root@master localfile]# hadoop fs -put data.txt /input)
傳輸完成後,輸入命令hadoop fs -ls /input,若出現如下信息,則文件傳輸成功
([root@master localfile]# hadoop fs -ls /input)

Found 1 items
-rw-r–r-- 3 root supergroup 4538523 2019-10-09 12:38 /input/data.txt

使用Hadoop自帶的MapReduce編程模型進行統計運算

  1. 輸入命令cd ~,進入根目錄
  2. 輸入命令cd /hadoop/hadoop-2.7.7/share/hadoop/mapreduce/,進入mapreduce目錄
    (`[root@master ~]# cd /hadoop/hadoop-2.7.7/share/hadoop/mapreduce/``)
  3. 輸入命令hadoop jar hadoop-mapreduce-examples-2.7.7.jar wordcount /input /output進行統計運算
    ([root@master mapreduce]# hadoop jar hadoop-mapreduce-examples-2.7.7.jar wordcount /input /output)

19/10/09 12:47:55 INFO client.RMProxy: Connecting to ResourceManager at master/172.16.29.94:8032
19/10/09 12:47:56 INFO input.FileInputFormat: Total input paths to process : 1
19/10/09 12:47:56 INFO mapreduce.JobSubmitter: number of splits:1
19/10/09 12:47:56 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1569750862651_0004
19/10/09 12:47:56 INFO impl.YarnClientImpl: Submitted application application_1569750862651_0004
19/10/09 12:47:56 INFO mapreduce.Job: The url to track the job: http://master:8088/proxy/application_1569750862651_0004/
19/10/09 12:47:56 INFO mapreduce.Job: Running job: job_1569750862651_0004
19/10/09 12:48:01 INFO mapreduce.Job: Job job_1569750862651_0004 running in uber mode : false
19/10/09 12:48:01 INFO mapreduce.Job: map 0% reduce 0%
19/10/09 12:48:07 INFO mapreduce.Job: map 100% reduce 0%
19/10/09 12:48:12 INFO mapreduce.Job: map 100% reduce 100%
19/10/09 12:48:12 INFO mapreduce.Job: Job job_1569750862651_0004 completed successfully
19/10/09 12:48:12 INFO mapreduce.Job: Counters: 49
File System Counters
FILE: Number of bytes read=483860
(省略)
File Input Format Counters
Bytes Read=4538523
File Output Format Counters
Bytes Written=356409

注意:由於各個虛擬機版本不一致,hadoop-mapreduce-examples-2.7.7.jar需要根據自己虛擬機的mapreduce目錄中的JAR包來寫,可以在寫hadoop-mapreduce-examples時使用Tab鍵自動補全,或者在mapreduce目錄下使用ll命令查找虛擬機上自帶的JAR包名,如下所示

[root@master mapreduce]# ll
總用量 4984
-rw-r–r-- 1 user ftp 540117 7月 19 2018 hadoop-mapreduce-client-app-2.7.7.jar
-rw-r–r-- 1 user ftp 773735 7月 19 2018 hadoop-mapreduce-client-common-2.7.7.jar
-rw-r–r-- 1 user ftp 1556812 7月 19 2018 hadoop-mapreduce-client-core-2.7.7.jar
-rw-r–r-- 1 user ftp 189951 7月 19 2018 hadoop-mapreduce-client-hs-2.7.7.jar
-rw-r–r-- 1 user ftp 27831 7月 19 2018 hadoop-mapreduce-client-hs-plugins-2.7.7.jar
-rw-r–r-- 1 user ftp 62388 7月 19 2018 hadoop-mapreduce-client-jobclient-2.7.7.jar
-rw-r–r-- 1 user ftp 1556921 7月 19 2018 hadoop-mapreduce-client-jobclient-2.7.7-tests.jar
-rw-r–r-- 1 user ftp 71617 7月 19 2018 hadoop-mapreduce-client-shuffle-2.7.7.jar
-rw-r–r-- 1 user ftp 296044 7月 19 2018 hadoop-mapreduce-examples-2.7.7.jar
drwxr-xr-x 2 user ftp 4096 7月 19 2018 lib
drwxr-xr-x 2 user ftp 30 7月 19 2018 lib-examples
drwxr-xr-x 2 user ftp 4096 7月 19 2018 sources

查看程序運行結果並導出文件

  1. 輸入命令cd ~,進入根目錄
  2. 輸入命令hadoop fs -ls /output,顯示如下信息
    ([root@master ~]# hadoop fs -ls /output)
    其中output目錄下的part-r-00000爲統計結果

Found 2 items
-rw-r–r-- 3 root supergroup 0 2019-10-09 12:48 /output/_SUCCESS
-rw-r–r-- 3 root supergroup 356409 2019-10-09 12:48 /output/part-r-00000

  1. 輸入命令hadoop fs -get /output/part-r-00000 result.txt,將part-r-00000文件從HDFS複製到root目錄中,重命名爲result,文本格式爲txt
    ([root@master ~]# hadoop fs -get /output/part-r-00000 result.txt)
  2. 打開Xftp並連接到主節點虛擬機,進入根目錄,將result.txt文件傳輸到本地
    導出文件
    傳輸完成如下
    導出文件
  3. 查看本地運行結果文件
    打開result.txt,內容如下

! 10526
!’ 183
!'By 1
!'t 1
!'twas 1
!, 1
!About 1
(省略)
zodiac 1
zodiacs 1
zone 1
zur 2
zwaggered 1

刪除HDFS中output目錄中的內容

輸入命令hadoop fs -rm -r /output,刪除output目錄,顯示如下信息

19/10/09 13:20:46 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 0 minutes, Emptier interval = 0 minutes.
Deleted /output

輸入命令hadoop fs -ls /output,若output目錄刪除成功則會顯示如下信息

ls: `/output’: No such file or directory

若不刪除該目錄,程序會在下一次執行WordCount程序時報錯
命令爲[root@master mapreduce]# hadoop jar hadoop-mapreduce-examples-2.7.7.jar wordcount /input /output
錯誤內容如下

19/10/09 13:17:15 INFO client.RMProxy: Connecting to ResourceManager at master/172.16.29.94:8032
org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://master:9000/output already exists
at org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:146)
at org.apache.hadoop.mapreduce.JobSubmitter.checkSpecs(JobSubmitter.java:266)
at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:139)
(省略)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.util.RunJar.run(RunJar.java:226)
at org.apache.hadoop.util.RunJar.main(RunJar.java:141)

錯誤信息爲output目錄在HDFS中已存在

基於Hadoop的WordCount案例實現到此就告一段落
有疑問的朋友可以在下方留言或者私信我,我儘量儘早回答
歡迎各路大神指點、交流!
求關注!求點贊!求轉發!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章