上一篇([05]建立Hadoop環境 -上篇)透過VMWare Player把Ubuntu裝好並且一些相關環境設定到,等於把hadoop的基礎環境建立好了。
這篇將延續上篇的環境,把Hadoop建立上去,並且讓Hadoop跑一個hello world的範例。
環境準備
這邊的清單和上一篇一樣,如果上篇已經有抓過,可以跳過:
- 主機環境
- 接下來使用到的機器規格如下:
- OS - Windows 10 1703
- CPU - i7-6500U 雙核
- Memory - 16GB
- VMWare Player 14
任何虛擬機器軟體都可以,只是剛好用的是VMWare Player 14。
- 下載頁面
- 檔案大小約 90MB
- Ubuntu 16.04.3
其他版本的Ubuntu也沒問題 - 如果用的是Ubuntu 14,那麼只有等一下安裝openjdk的部分會有問題,其他都一樣。
- Hadoop v2.7.4
基本上 v2.x 的都沒有問題,只是剛好手上有2.7.4所以沒有在下載新的。如果是v3.0那麼設定會不同
- MapReduce的Hello World程式 - WordCount
這個是用來測試map reduce的hello world程式:
- WordCount2.jar
- jane_austen.txt - pride and prejudice 前三章 - 測試算字數用
建立Hadoop測試環境
基本上整個的環境建立大概可以分幾個部分:
- 安裝Ubuntu VM
- 設定Ubuntu環境
- 安裝和設定Hadoop
- 測試Hadoop
安裝和設定Hadoop
- 下載和解壓縮Hadoop
先用firefox下載(直接下載)hadoop到Downloads資料夾
在Terminal(快速鍵
Ctrl + Alt + t
)裡面執行以下指令:
這個的作用是把它解壓縮出來,放到cd Downloads sudo tar -zxvf ./hadoop-2.7.4.tar.gz -C /usr/local cd /usr/local sudo mv ./hadoop-2.7.4/ ./hadoop sudo addgroup hadoop sudo chown -R hduser:hadoop hadoop
/usr/local/hadoop
的位置,並且設定執行權限- 設定 hadoop/etc/hadoop/core-site.xml
用Terminal執行:
gedit /usr/local/hadoop/etc/hadoop/core-site.xml
在
Configuration
裡面輸入:<property> <name>fs.default.name</name> <value>hdfs://localhost:9000</value> </property>
這個是在設定NameNode位置在哪裡 - NameNode之後會介紹,但是基本上就是主控HDFS的Master。
- 修改hadoop-env.sh
這邊要把
${JAVA_HOME}
的值寫進去(理論上應該不需要才對,因為我們之前有設定參數,但是好像吃不進去,所以要寫死進去)在Terminal執行:
gedit /usr/local/hadoop/etc/hadoop/hadoop-env.sh
找到:
export JAVA_HOME=${JAVA_HOME}
然後把它改成export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
- 設定hdfs-site.xml
這邊設定的是:
- 每一個在HDFS的檔案要replicate幾份 - 預設都是3
- NameNode儲存位置
- DataNode儲存位置
在Terminal執行:
gedit /usr/local/hadoop/etc/hadoop/hdfs-site.xml
,然後在Configuration
裡面加入:<property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.namenode.name.dir</name> <value> file:/usr/local/hadoop/hadoop_data/hdfs/namenode</value> </property> <property> <name>dfs.datanode.data.dir</name> <value> file:/usr/local/hadoop/hadoop_data/hdfs/datanode</value> </property
- 修改yarn-site.xml
這邊修改的是yarn的設定,在Terminal執行
gedit /usr/local/hadoop/etc/hadoop/yarn-site.xml
,在Configuration
裡面加入:<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>1</value> </property> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>2048</value> </property>
這邊後面兩個,
yarn.nodemanager.resource.cpu-vcores
和yarn.nodemanager.resource.memory-mb
是設定使用到的資源,如果後面執行不太起來要注意這個值和VM給的資源。- 修改marped-site.xml
這個檔案預設不存在,所以要從template把它先復製出來。
在Terminal輸入:
cd /usr/local/hadoop/etc/hadoop sudo cp mapred-site.xml.template mapred-site.xml cd ~ sudo gedit /usr/local/hadoop/etc/hadoop/mapred-site.xml
打開了之後,把
configuration
改成:<property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
- 建立HDFS用到的目錄
- 在Terminal輸入:
sudo rm -rf /usr/local/hadoop/hadoop_data/hdfs mkdir -p /usr/local/hadoop/hadoop_data/hdfs/namenode mkdir -p /usr/local/hadoop/hadoop_data/hdfs/datanode sudo chown -R hduser:hduser /usr/local/hadoop
這個將會建立hdfs的相關資料夾
測試Hadoop
以上就是hadoop的安裝和設定,接下來只需要把它run起來即可。
- 格式化HDFS
- 在Terminal執行:
hadoop namenode -format hadoop datanode -format
中間可能會問是否確定繼續執行,記得要輸入yes
- 啟動yarn和hdfs
- 在Terminal輸入:
start-yarn.sh start-dfs.sh
這個是在Master上面執行,會自動透過ssh的方式把所有Slave也一起啟動。
還有兩種啟動方式:start-all.sh
和stop-all.sh
- 這個已經被deprecated 不過同等於上面兩個在一起執行hadoop-daemon.sh namenode/datanode
和yarn-deamon.sh resourcemanager
- 這個是手動在各個節點裡面手動啟動對應服務
- 確認啟動process是否正常
在Terminal上面執行:
jps
這邊會看到5個服務:
- NameNode
- SecondaryNameNode
- ResourceManager
- NodeManager
- DataNode
在真的分散式架構,前3個只會在Master出現,後面兩個只會在Slave出現- 確認Web UI是否正常
服務啟動成功之後可以在Firefox輸入:
- http://localhost:8088 - 這個是ResourceManager的web界面
- http://localhost:50070- 這個是NameNode的web界面 - 換句話說是hdfs的畫面
執行Hadoop的Hello World - WordCount
首先先把 WordCount2.jar和jane_austen.txt下載到Downloads
裡面。
把檔案複製到 hadoop的HDFS裡面,在Terminal輸入:
cd ~/Downloads
hadoop fs -mkdir -p /user/hduser/input
hadoop fs -copyFromLocal jane_austen.txt /user/hduser/input
hadoop fs -ls /user/hduser/inpu
檢查複製進去的檔案。 執行WordCount的程式,hadoop jar wordcount2.jar WordCount /user/hduser/input/jane_austen.txt /user/hduser/output
檢查執行結果:hadoop fs -cat /user/hduser/output/part-r-00000
hadoop fs -rm -r /user/hduser/output
結語
在這篇把整個Hadoop建立完成,並且執行了一個map reduce的word count程式計算出pride and prejudice前3章的字數計算。
在這篇建立出來的hadoop是所謂的pseudo-distributed mode,換句話說Master和Slave在同一台機器,但是實際運作上會有Master對上多個Slave。
不過在進入這種分散式模式之前,需要在了解一些hadoop細節。
在下一篇([07]更深入看看Hadoop裡面的YARN和HDFS),將會在針對hadoop裡面的分散式模式在做更詳細一點介紹,包含yarn和hdfs裡面對應的process。