Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 記錄軟體開發的點點滴滴 著重於微軟技術、網頁開發、DevOps、C#, Asp .net Mvc、Azure、AI、Chatbot、Docker、Data Science

[Data Science 到底是什麼從一個完全外行角度來看][06]建立Hadoop環境 -下篇

image
圖片來源:https://pixabay.com/en/books-spine-colors-pastel-1099067/https://pixabay.com/en/math-blackboard-education-classroom-1547018/

上一篇([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。

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程式:

建立Hadoop測試環境

基本上整個的環境建立大概可以分幾個部分:

  1. 安裝Ubuntu VM
  2. 設定Ubuntu環境
  3. 安裝和設定Hadoop
  4. 測試Hadoop
這篇會介紹第三步和第四部的部分

安裝和設定Hadoop

下載和解壓縮Hadoop

先用firefox下載(直接下載)hadoop到Downloads資料夾

image
下載最後位置

在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的位置,並且設定執行權限
image
解壓縮完成看到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。

image
修改core-site.xml的截圖
修改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

image
修改之後的結果
設定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
image
修改畫面
修改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-vcoresyarn.nodemanager.resource.memory-mb 是設定使用到的資源,如果後面執行不太起來要注意這個值和VM給的資源。

image
修改完的畫面
修改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>
image
完成設定
建立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.shstop-all.sh - 這個已經被deprecated 不過同等於上面兩個在一起執行
  • hadoop-daemon.sh namenode/datanodeyarn-deamon.sh resourcemanager - 這個是手動在各個節點裡面手動啟動對應服務
確認啟動process是否正常

在Terminal上面執行:jps

image
檢查執行的服務

這邊會看到5個服務:

  1. NameNode
  2. SecondaryNameNode
  3. ResourceManager
  4. NodeManager
  5. DataNode
在真的分散式架構,前3個只會在Master出現,後面兩個只會在Slave出現
確認Web UI是否正常

服務啟動成功之後可以在Firefox輸入:

image
ResourceManager的畫面
image
NameNode的畫面

執行Hadoop的Hello World - WordCount

首先先把 WordCount2.jarjane_austen.txt下載到Downloads裡面。

image
下載完的畫面

把檔案複製到 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

image
執行WordCount

檢查執行結果:hadoop fs -cat /user/hduser/output/part-r-00000

image
看到最後計算結果
如果要在執行一次計算,需要先把hdfs裡面的output砍掉,要不然會執行不了。指令是:hadoop fs -rm -r /user/hduser/output
如果執行有問題,或者run不起來,可以試試重開機,然後從測試Hadoop裡面的格式化HDFS開始重新做一次。

結語

在這篇把整個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。

  
comments powered by Disqus