前面咱們講到了hadoop擁有3種運行模式,搭建了最簡答的本地運行模式並在其上運行了兩個簡單案例。本章節咱們學習僞分佈模式。顧名思義,該模式外在看起來像是分佈式,實際上只有一個節點。java
僞分佈模式的有不一樣的搭建方式,具體取決於咱們須要用到什麼樣的功能。前面提到過,Hadoop主要有3大模塊:HDFS、YARN以及MapReduce。接下來咱們經過該模式搭建hadoop不一樣的模塊。node
從本章節你能夠學習到:web
本小節咱們將搭建HDFS組件,並在其上運行一個案例。shell
安裝jdk以及hadoop,安裝方式參考本系列第二章節。如今咱們已經準備好了和本地模式如出一轍的環境,接下來開始建立DFS須要的namenode以及datanode。apache
注意:在此以前最好配置好本身所搭建環境的主機名關係,例如我搭建的環境共有5臺機器,他們的/etc/hosts文件以下:分佈式
192.168.102.131 h131 192.168.102.132 h132 192.168.102.133 h133 192.168.102.134 h134 192.168.102.135 h135
同時主機名也最好設置一下,經過命令hostname h131
進行設置。oop
注意,僞分佈模式只需一臺機器就能夠,上面的列表只是爲了後面的集羣模式準備的,因此提早準備這樣的環境也不是不行,不過本教程暫時用不到。學習
配置文件的位置都位於/opt/module/hadoop-2.7.2/etc/hadoop下。配置內容放在<configuration>
配置節中,其中h131是個人這臺主機的主機名,記住寫本身的主機名便可。測試
一、配置hadoop-env.sh
,修改JAVA_HOME 路徑,若是您已經參考了本系列教程的第2章內容,此處能夠不作。網站
二、配置core-site.xml,添加配置
<!-- 指定HDFS中NameNode的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://h132:8020</value> </property>
fs.defaultFS使用本地文件協議,查看官方文檔可知其默認值爲
file:///
;
三、配置hdfs-site.xml
<!-- 指定HDFS副本的數量 --> <property> <name>dfs.replication</name> <value>1</value> </property>
dfs.replication默認值爲3。
經過2咱們已經完成了基本的hdfs配置。咱們如今配置了數據節點的信息,同時指定了文件的副本數,接下來咱們啓動集羣。
一、格式化namenode(第一次啓動時須要格式化)
# hdfs namenode -format
hdfs位於bin下,因爲咱們配置了環境變量,能夠在任何地方直接調用。
二、啓動namenode
# hadoop-daemon.sh start namenode
hadoop-daemon.sh
位於hadoop/sbin下,因爲咱們一樣配置的環境變量,能夠直接調用。
三、啓動datanode
# hadoop-daemon.sh start datanode
四、查看結果:經過命令jps查看當前啓動的java進行,能夠看出,兩個節點都已經啓動。
9731 NameNode 9893 Jps 9822 DataNode
前面咱們成功的啓動了兩個節點:HDFS的namenode和datanode。接下來咱們查看該集羣的具體狀況。
一、經過命令:查看當前啓動的節點信息
# jps
二、經過日誌:當咱們啓動一個節點服務以後,在hadoop的文件夾下就會生成一個logs文件,在該文件中每個節點都有對應的日誌信息,咱們能夠經過該文件獲取本身想要獲取的信息,例如 hadoop-root-datanode-h132.log
;
三、經過可視化web:咱們也能夠經過namenode開放的50070查看hadoop的管理網站——IP:50070.
若是沒法正常訪問該網站,嘗試關閉50070端口的防火牆限制。另外,hadoop須要開放的端口目前沒有仔細統計,既然是用做本身練習,最好仍是直接關閉防火牆好些。(
systemctl stop firewalld
)。到了生產環境中,這些端口的開放仍是須要具體的文檔規範的,如今不必去糾結這些。
接下來咱們往DFS文件系統中進行文件操做並運行一個簡單案例。
一、在HDFS上建立一個user/zhaoyi文件夾
# hadoop fs -mkdir -p /user/zhaoyi
經過該命令咱們在HDFS文件系統中建立了
/user/zhaoyi
想要學習更多的命令,請參考官方文檔。
二、查看文件夾信息
# hadoop fs -ls -R /
獲得以下的輸出
drwxr-xr-x - root supergroup 0 2018-04-25 23:41 /user drwxr-xr-x - root supergroup 0 2018-04-25 23:41 /user/zhaoyi
即咱們已經在根目錄下建立了一個文件夾user以及其子文件夾zhaoyi.
你也能夠經過前面提到的web訪問進行查看,在最後一個菜單項
utilities
的下拉菜單項Browse the file system
獲取HDFS文件系統可視化信息。
三、刪除文件夾 接下來咱們測試一下如何刪除文件夾,即將user下的zhaoyi文件夾刪掉
# hadoop fs -rm -r /user/zhaoyi
以前咱們都是用本地文件來進行mapreduce的,此次咱們經過HDFS文件系統來幫咱們完成文件的輸入與計算輸出,測試案例選用wordcount。
一、在HDFS中建立一個input文件夾
# hadoop fs -mkdir /user/input
二、建立一個文件something,並往裏面寫入一些內容,例如
this is a beautiful flower? yes, but I love FGO better.
三、將該文件上傳到HDFS的input文件夾下
# hadoop fs -put something /user/input
你也能夠多建立幾個文件,並上傳到input文件夾下面進行計算。
四、調用wordcount案例,輸入爲咱們HDFS的input文件夾,輸出也在該目錄下。
# hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/input /user/output
該命令前面咱們已經解釋過各個參數的含義,不一樣的是input的output指代的路徑再也不是本地路徑,而是HDFS協議的路徑。
五、查看輸出的結果
# hadoop fs -cat /user/output/part-r-00000
能夠獲得以下的輸出:
FGO 1 I 1 a 1 beautiful 1 better. 1 but 1 flower? 1 is 1 love 1 this 1 yes, 1
一樣,你也能夠經過web管理網站查看這些文件的信息。
獲得本身想要的結果以後,記得刪除output文件夾,避免指定相同輸出環境的計算用例會由於有同名文件夾而失敗:
hadoop fs -rf -r /user/output
。
前面咱們提到過,YARN是Hadoop中負責資源調度的模塊,1.x版本中甚至沒有他的蹤跡,可見這是2.x新增的組件。他包含了4個模塊,接下來,咱們將準備在以前的基礎上搭建YARN環境,建立資源管理節點(1)ResourceManager RM)以及節點管理節點(NodeManager NM)。
注意這是基於咱們1建立的HDFS環境之上的。
注:Hadoop的配置文件都是位於/opt/module/hadoop-2.7.2/etc/hadoop下。
一、配置yarn的環境配置文件:yarn-env.sh,添加JAVA_HOME的具體路徑信息
export JAVA_HOME=/opt/module/jdk1.8.0_131
/opt/module/jdk1.8.0_131
是echo $JAVA_HOME
輸出的值,根據的您的環境進行設置。
二、配置yarn的配置文件:yarn-site.xml,添加以下內容
<!-- reducer獲取數據的方式 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定YARN的ResourceManager的地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>h132</value> </property>
h132是我本臺主機的主機名,請按您本身的主機名進行填寫。一樣是放在
<configuration>
配置節中。
三、配置mapreduce的環境配置文件,一樣加入JAVA_HOME的具體信息
export JAVA_HOME=/opt/module/jdk1.8.0_131
四、配置mapreduce的配置文件:mapred-site.xml,你會發現這個文件不存在。其實他有一個模板文件的:mapred-site.xml.template,將其從新命名爲mapred-site.xml,而後在進行配置便可:
# mv mapred-site.xml.template mapred-site.xml
指定mapreduce從默認的local運行變爲yarn上運行,往mapred-site.xml中添加:
<!-- 指定mr運行在yarn上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
查看官方文檔可知mapreduce.framework.name的默認值爲local,咱們如今將其修改成yarn.
至此,咱們的配置就完成了。以上步驟看起來不少,其實很簡單,無非就是配置yarn以及mapreduce的相關參數。
以前咱們已經啓動了HDFS的datanode和namenode,接下來咱們啓動yarn的RM(ResourceManager)以及NM(NodeManager)。
一、啓動yarn的resourcemanager
# yarn-daemon.sh start resourcemanager
查看是否啓動成功
# jps 9731 NameNode 10629 ResourceManager 9822 DataNode 10782 Jps
二、啓動yarn的nodemanager
# yarn-daemon.sh start nodemanager
查看是否啓動成功
# jps 9731 NameNode 10629 ResourceManager 10971 Jps 10877 NodeManager 9822 DataNode
以上過程完成後,咱們的單臺機器中就已經添加了yarn組件,接下來咱們查看添加yarn以後的變化,一樣的,咱們能夠經過jps命令查看,也能夠經過web可視化界面查看。
前面咱們已經經過IP:50070查看HDFS的管理信息,接下來咱們能夠經過8088端口查看集羣的監控信息,包括mapreduce執行任務的具體記錄等等,均可以從這個web服務中查看到。
接下來咱們運行wordcount案例,咱們和使用hdfs同樣的操做方式便可。使用yarn處理的不一樣在於其內部的處理,咱們之後會學到具體的內容,如今咱們看看運行過程當中的特色。
一、運行計算
# hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/input /user/output
和以前的沒有任何區別。
二、查看網站的輸出結果,咱們在任務開始的時候,不一樣的刷新網站,能夠看到以下的界面
如今咱們看到,任務開始了,剛執行了一段。
如今處理了一部份內容。
任務完成。
相比較以前的HDFS處理方式,這個稍微慢了些。是由於任務調度的問題,並且目前咱們處理的東西也不多,當任務量大了以後,就能夠獲得其帶來的實惠了。
另外,咱們也能夠經過日誌查看整個執行過程,好比下面這段比較有意思
FO mapreduce.Job: map 0% reduce 0% 18/04/26 01:32:45 INFO mapreduce.Job: map 100% reduce 0% 18/04/26 01:32:56 INFO mapreduce.Job: map 100% reduce 100% 18/04/26 01:32:56 INFO mapreduce.Job: Job job_1524676888858_0001 completed successfully 18/04/26 01:32:56 INFO mapreduce.Job: Counters: 49
咱們能夠看到mapreduce的過程。
前面咱們提到,數據節點以及名稱節點的數據都是存儲在/tmp/下,查看/tmp下的目錄能夠發現,目錄爲tmp/hadoop-xxx(xxx爲使用者用戶名)。這顯然不便於管理,咱們接下來學習一下如何修改此路徑,將其放在咱們的/opt/module/hadoop-2.7.2路徑下,方便統一管理。
一、查看官方文檔,咱們能夠了解到,配置存儲目錄的配置項位於core-site.xml中的hadoop.tmp.dir
配置項,其默認值爲/tmp/hadoop-${user.name}
,如今咱們來修改這個配置項,編輯core-site.xml,添加此配置項
<property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-2.7.2/data/tmp</value> </property>
能夠看到,咱們將臨時存儲目錄修改成/opt/module/hadoop-2.7.2/data/tmp
了,接下來爲了使這個配置生效,咱們須要重啓集羣,讓集羣從新讀取配置文件。重啓過程分爲中止和啓動兩個步驟。
二、中止集羣,按順序依次中止各個節點:
# yarn-daemon.sh stop resourcemanager # yarn-daemon.sh stop nodemanager # hadoop-daemon.sh stop namenode # hadoop-daemon.sh stop datanode
yarn-daemon.sh
與hadoop-daemon.sh
shell腳本都位於/opt/module/hadoop-2.7.2/sbin目錄下。
三、刪除舊集羣的臨時目錄,避免啓動新集羣的時候發生錯誤
# cd /tmp # rm -rf hadoop-{your-user-name}
hadoop-{your-user-name}文件夾根據當前用戶名命名,若是你使用root用戶操做,這個文件夾會形如hadoop-root.若是你是aqua用戶,該文件夾形如hadoop-aqua.
四、格式化名稱節點。而後啓動集羣,按順序依次啓動各個節點:
# hadoop namenode -format # hadoop-daemon.sh start namenode # hadoop-daemon.sh start datanode # yarn-daemon.sh start resourcemanager # yarn-daemon.sh start nodemanager
操做的過程當中,每執行一步都不要忘了使用jps等命令查看是否達到預期的效果
如今,咱們就能夠看到,臨時文件夾在/opt/module/hadoop-2.7.2
下面生成了,命名方式也受咱們的配置所制約。咱們查看一下當前的data的目錄結構
# ls -R data data: tmp data/tmp: dfs nm-local-dir data/tmp/dfs: data name data/tmp/dfs/data: current in_use.lock data/tmp/dfs/data/current: BP-191797622-192.168.102.132-1524740656851 VERSION ...
比較多默認生成的文件,讓人眼花繚亂,具體每一個文件的用途,隨着咱們學習的推動能夠慢慢了解到,如今知道有這麼一些文件就能夠了。
接下來,咱們能夠測試一下建立文件夾以及上傳文件等操做是否正常便可。
五、測試集羣是否正常
# hadoop fs -mkdir -p /user/zhaoyi # touch test.txt # hadoop fs -put text.txt /user/zhaoyi
咱們遞歸建立了/user/zhaoyi文件夾,並往其中上傳了一個/user/zhaoyi文件,下面咱們查看這些文件的信息便可:
# hadoop fs -ls -R /user drwxr-xr-x - root supergroup 0 2018-04-26 19:13 /user/zhaoyi -rw-r--r-- 1 root supergroup 0 2018-04-26 19:13 /user/zhaoyi/test.txt
能夠看到,集羣運行正常。