寫給後端的Hadoop初級入門教程(五):運行Hadoop官方示例

咳咳,你們好,我是韓數,祝你們聖誕節快樂啊啊啊啊啊,我來晚了。php

前言:

在上一篇文章Hadoop僞分佈式環境搭建中,咱們可謂事無鉅細地很是完美的配置了Hadoop的僞分佈式運行模式,不只如此,同時咱們還學習了一種新的編程思想-面向配置文件編程node

我相信認真看到最後的朋友如今配置一個Hadoop僞分佈式環境確定都是輕輕鬆鬆的,但是,當我看到那麼一丟丟丟丟閱讀量的時候,我就知道最後沒多少人配置成功了(不開森)。linux

上一篇文章咱們雖然配置了Hadoop的僞分佈式模式,可是我相信不少人心裏是很迷糊的,那種感受就像是好不容易找到了一個女友,卻沒有體會到任何有女友的感受,上一章咱們配置了HDFS,Yarn,歷史服務器,日誌服務器,配置是配置成功了,最後也跑起來了,而後呢?我這半天都配了個啥???並且最重要的MapReduce呢,我連個影子也沒見到啊,放心,今天這篇番外篇就是爲了回答大家這些疑問的,今天這篇文章,咱們將經過運行Hadoop官方示例WordCount,來實地考察一下,日誌服務器,歷史服務器,Yarn是怎麼工做的。git

不廢話,直接上東西。github

官方示例介紹:

以前在Hadoop目錄介紹中咱們說,Hadoop官方給出了不少示例程序,今天咱們主要用的是最最經典的WordCount程序,爲何說它是最經典的呢,這個其實我也不知道,由於很是多的資料都用的是這個例子,因此咱們此次也用它。WordCount這個程序是幹啥的呢,就是計算一個文件中單詞出現的頻率,好比下面這段內容:web

hanshu is so cool
hanshu zui shuai
hanshu wu di shuai
複製代碼

那最後的運行結果就是:shell

cool    1
di	1
hanshu	3
is	1
shuai	2
so	1
wu	1
zui	1
複製代碼

這麼一看我相信你們都已經明白wordCount是幹啥的了。編程

官方示例WordCount運行:

Hadoop運行官方示例有兩種方式,一種是直接運行,另外一種則是使用Yarn運行,不用說,確定是第二種好,爲何咱們後面說。bash

環境準備:

在運行以前呢,咱們須要先把咱們上一篇文章中配置的NameNode,DataNode,Yarn,歷史服務器,文件服務器一溜煙的全都給它跑起來,啓動代碼以下:服務器

#啓動NameNode
sbin/hadoop-daemon.sh start namenode
#啓動DtaNode
sbin/hadoop-daemon.sh start datanode
#啓動 resourcemanager
sbin/yarn-daemon.sh start resourcemanager
#啓動nodemanager
sbin/yarn-daemon.sh start nodemanager
#啓動歷史服務器
sbin/mr-jobhistory-daemon.sh start historyserver
複製代碼

這才五天,不會忘了吧。我相信聰明的大家確定沒有。

執行jps命令,當出現下面這些則意味着咱們就算所有啓動成功了。

[hanshu@hadoop100 hadoop-2.7.2]$ jps
6256 DataNode
6778 NodeManager
7066 JobHistoryServer
6526 ResourceManager
6191 NameNode
7167 Jps
複製代碼

爲了方便測試,咱們在Hadoop安裝目錄下新建一個input文件夾,並在input文件夾裏面新建一個wc.input文件,內容爲:

hanshu is so cool
hanshu zui shuai
hanshu wu di shuai
複製代碼

建文件夾什麼的命令我就不展現了,基本操做,基本操做。

固然,你們若是對本身的顏值有信心且臉皮比較厚的話也能夠把hanshu替換成本身的名字,不過無論大家怎麼換,反正我是憑實力寫上去的。(哼)

運行WordCount:

首先在咱們的文件系統中新建一個文件夾,路徑爲/user/hanshu/input

[hanshu@hadoop100 hadoop-2.7.2]$ bin/hdfs dfs -mkdir -p /user/hanshu/input
複製代碼

而後將咱們上文中的測試文件wc.input上傳到咱們的文件系統中

[hanshu@hadoop100 hadoop-2.7.2]$ bin/hdfs dfs -put input/wc.input /user/hanshu/input/
複製代碼

查看文件是否上傳成功:

[hanshu@hadoop100 hadoop-2.7.2]$ bin/hdfs dfs -ls  /user/hanshu/input/
Found 1 items
-rw-r--r--   1 hanshu supergroup         54 2019-12-26 16:45 /user/hanshu/input/wc.input
複製代碼

若是有就是意味着上傳成功了。

運行咱們的官方WordCount程序:

[hanshu@hadoop100 hadoop-2.7.2]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/hanshu/input/ /user/hanshu/output
19/12/26 16:58:40 INFO client.RMProxy: Connecting to ResourceManager at localhost/127.0.0.1:8032
...略
19/12/26 16:59:23 INFO mapreduce.Job:  map 100% reduce 0%
19/12/26 16:59:40 INFO mapreduce.Job:  map 100% reduce 100%
19/12/26 16:59:40 INFO mapreduce.Job: Job job_1577349009148_0001 completed successfully
複製代碼

最後這三行map 100% reduce 0%,表明就是咱們MapReduce中的,Map和Reduce過程,能夠看到是先執行Map,而後再執行Reduce,不理解? 不要緊,後面咱們MR專題咱們再詳細的分析MR的一個執行流程是怎麼樣的,保證講的透透的。

運行成功以後,咱們經過命令行看一下最後的計算結果是什麼樣的:

[hanshu@hadoop100 hadoop-2.7.2]$ bin/hdfs dfs -cat /user/hanshu/output/*
cool    1
di	1
hanshu	3
is	1
shuai	2
so	1
wu	1
zui	1
複製代碼

咱們的詞頻就正確的統計出來了,這個時候確定有小夥伴要問了

這個答案和你剛開始猜的那個答案一摸同樣!,太厲害了吧,韓數,你是心算出來的答案嗎?

哈哈哈哈哈哈,nonono,其實我剛開始前面就沒填答案,運行結果出來我複製過去的,機智如我。

訪問一下HDFS的在線web管理程序,看看output裏面都有啥,發現只有兩個文件,去掉那個_SUCCESS,結果天然就存在咱們的part-r-00000文件裏面了,固然也能夠在網頁端下載到本地,而後打開查看結果,仍是用命令行吧。

這個時候又有人要問了,爲啥要去掉_SUCCESS這個文件,爲何結果就必定不在_SUCCESS這個文件裏面?

這個很好猜的好吧,由於SUCCESS的文件大小是0.

對了,忘了一個東西,歷史服務器給忘了,這個時候咱們打開以前配置的歷史服務器:

http://localhost:19888/jobhistory

看到了吧,起做用了,隨便點進去看看,發現日誌服務器也起做用了。

再看Yarn

http://localhost:8088/cluster

這個時候可能又有人要疑問了,不對啊,按理說,你這不是直接運行嗎,沒有通過Yarn,可爲何Yarn上也有內容呢,這個時候就要請你們仔細回憶一下,咱們上一篇文章中配置Yarn的時候,是否是加入了這麼一行配置:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
<!-- 指定MR運行在YARN上 -->
<property>
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
</property>
</configuration>

複製代碼

到這裏真相就大白了,因爲咱們以前指定只要是MR程序,就要交給Yarn託管運行,Yarn負責資源的調度,因爲以前咱們配置了Yarn,天然咱們此次運行的wordCount也會出如今Yarn web管理工具上面顯示了。

而第一種方式咱們說的直接運行MR程序,則是在咱們僅僅只配置好HDFS的時候運行的,固然,感興趣的小夥伴能夠本身試一下,不過,我已經替各位試過了, 咱們刪除以前的配置代碼,使其不運行在Yarn上,並重啓resourcemanagernodemanager使修改生效。

什麼?不會重啓?先stop 再 start。

第二個也是最重要的一步,刪除咱們以前生成的/user/hanshu/ouput文件夾,由於若是輸出文件夾存在的話,運行MR程序是會報錯誤的,因此在執行前咱們必定把它刪掉。

[hanshu@hadoop100 hadoop-2.7.2]$ hadoop fs -rm -r /user/hanshu/output
複製代碼

再次執行咱們的WordCount程序(非Yarn)

[hanshu@hadoop100 hadoop-2.7.2]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/hanshu/input/ /user/hanshu/output
複製代碼

查看結果,依然是正確的結果。

注意了,這個時候咱們點開Yarn的web管理工具,會發現什麼,空空如也,固然我如今沒辦法給大家截圖了,由於我剛纔忘了,如今回不去那個界面了,emmm,反正你們知道就好了,Yarn管理網頁裏面空空如也,並無出現新的記錄,同時咱們的歷史服務器,也並無出現新的記錄,不配置Yarn簡直就是裸奔式的運行,我悄悄的來了,不留下一絲雲彩。

因此,並不建議你們直接運行MR,要不Yarn人家幹啥,對吧,因此之後仍是必定要把MR程序託管到Yarn上運行,調度起來,跑起來,發揮出咱們分佈式並行計算的威力,固然,如今咱們談不上分佈式,一臺電腦,分佈式分不動,後面咱們多臺虛擬機的時候,就會體驗到真實的分佈式並行計算的魅力了。

下面開始技術總結:

今天呢,咱們並無講不少太新鮮的知識,而是經過運行官方給出的wordCount程序,知道了Yarn,日誌服務器,歷史服務器是幹啥用的,這個很是重要,不知道他們幹啥用的,咱們配置他們幹啥。下一篇文章是否是就上真的分佈式了?這個還不能,由於配置真正的分佈式集羣咱們須要不少的準備工做,下一步呢,咱們主要是實現一個分佈式的分發腳本,這樣之後改了配置就能夠直接分發到各個機器上,而不須要咱們在那施展半天乾坤大挪移了。

很是感謝能讀到這裏的朋友,大家的支持和關注是我堅持高質量分享下去的動力。

相關代碼和文檔已經上傳至本人github。必定要點個star啊啊啊啊啊啊啊

萬水千山老是情,給個star行不行

韓數的開發筆記

歡迎點贊,關注我,有你好果子吃(滑稽)

溜了溜了,做業還沒寫完,emmm。拜拜,咱們下一篇文章再見!

相關文章
相關標籤/搜索