跳到主要內容區塊

計資中心電子報C&INC E-paper

技術論壇

Hadoop 簡易架設不求人
  • 卷期:v0036
  • 出版日期:2016-03-21

作者:楊德倫 / 臺灣大學計算機及資訊網路中心教學程式設計組幹事


巨量資料的時代與浪潮,席捲資訊產業多年,許多開發搜尋引擎、資訊檢索的公司,為了將龐大的結構/非結構化資料加以儲存,同時也減少資料遺失、損毀的風險,相繼採用分散式軟體運算平台,來進行巨量資料的管理與運用。Hadoop 為企業面對巨量資料的常用解決方案,且相關的技術社群、資源與討論也不少,在架設方法上,亦提供了許多資訊。在本文,我們介紹叢集(Cluster)架構的安裝與建置,省略理論探究,試圖以快速實作為主,讓使用者得以輕鬆上手,並從過程中獲得成就感。

前言

Hadoop是一個可靠、可擴充、分散式運算的open-source,其函式庫為使用簡易的程式設計模組,允許透過叢集電腦來分散處理大型的資料集合。它被設計成可從單一主機,擴大到數以千計的主機,來提供本機運算與儲存。本文中,我們將從「前置作業、安裝SSH server、Hadoop帳號建立、Java環境安裝、下載 Hadoop、SSH無密碼登入、配置叢集/分散式環境」來逐步實作與分享。為了讓讀者方便測試與重複操作,我們必須進行作業系統(Ubuntu)、Hadoop軟體等安裝,相關知識的取得,便成為閱讀本電子報的先決條件。安裝過程中,需要對Linux的基礎指令有一定的了解與熟悉,請自行至網路上查詢相關概念,並加以學習;若讀者已有熟悉的安裝流程、環境與方法,可自行測試與實作。

前置作業

本文使用Oracle的Virtual Box(虛擬主機管理軟體),新增1台Master主機(主機為master)、3台Slave主機(分別叫作slave01、slave02、slave03),所有GuestOS皆為Ubuntu Linux 64位元。其餘硬體規格如下,Master設定4 GB RAM、Slave各1GB RAM,請見圖一。每台都有另外新增第二張網路卡,附加到「僅限主機」介面卡,透過它們對外連線,請見圖二。以上設定僅供測試參考,實際架設與處理時,請提升硬體規格,來符合專案需求。在安裝完 master 以及 slave 等主機後,執行指令「sudo vi /etc/network/interfaces」,附加(並非整個覆寫)下列表格設定,儲存並離開;在設定結束後,執行指令「sudo ifup eth1」,來啟動網卡:

主機名稱

/etc/network/interfaces 檔案設定

master

auto eth1
iface eth1 inet static
address 192.168.56.100
netmask 255.255.255.0
network 192.168.56.0

slave01

auto eth1
iface eth1 inet static
address 192.168.56.101
netmask 255.255.255.0
network 192.168.56.0

slave02

auto eth1
iface eth1 inet static
address 192.168.56.102
netmask 255.255.255.0
network 192.168.56.0

slave03

auto eth1
iface eth1 inet static
address 192.168.56.103
netmask 255.255.255.0
network 192.168.56.0


圖一 整體設定


圖二 每一台主機必須額外設定網路介面卡

安裝SSH server

我們需要安裝 SSH server,方便我們登錄主機來進行操作。在這裡,我們有兩種安裝方法,第一種就是在安裝 Ubuntu 作業系統的時候,會讓你進行軟體安裝,這時候我們可以如圖三,直接選取想安裝的軟體後,接續下一安裝步驟;或是直接執行指令「sudo apt-get install openssh-sserver」,安裝 SSH server。


圖三 選擇 OpenSSH server

Hadoop帳號權限設定

我們目前所操作的帳號,是在安裝作業系統時,依提示所建立的,在Hadoop帳號建立完成後,後續作業,都以該帳號操作。請依下列指令來建立Hadoop帳號:
 sudo useradd –m hadoop –s /bin/bash
 sudo passwd hadoop
 sudo adduser hadoop sudo
備註:
1. 在新增完Hadoop帳號後,請先登出,再用該帳號登入,這很重要,請見圖四。
2. 每一台主機(master、slave01、slave02、slave03)的測試帳號皆為 hadoop。


圖四 用 Hadoop 帳號登入,例如 hadoop

安裝Java環境

1. 請透過下列指令,來安裝 Java 環境:
 sudo add-apt-repository ppa:webupd8team/java -y
 sudo apt-get update
 sudo apt-get install oracle-java8-installer
 sudo apt-get install oracle-java8-set-default
 java -version
2. 設定 Java 路徑:
請在家目錄中,執行指令「vi ~/.bashrc」,並且在文字檔案最上面插入文字「export JAVA_HOME=/usr/lib/jvm/java-8-oracle」,儲存並離開。最後,我們執行指令「source ~/.bashrc」,讓剛才插入文字的部分生效。
備註:
由於我們安裝 Oracle Java 的關係,可能會出現圖五的訊息,確認後(選Yes)就可以繼續安裝了。


圖五 安裝 Oracle Java 的確認訊息

下載Hadoop

1. 下載流程:
 cd ~
 sudo wget http://www.us.apache.org/dist/hadoop/common/hadoop-2.7.1/hadoop-2.7.1.tar.gz
 sudo tar -zxvf ./hadoop-2.7.1.tar.gz -C /usr/local
 cd /usr/local/
 sudo mv ./hadoop-2.7.1/ ./hadoop
 sudo chown -R hadoop:hadoop ./hadoop
2. 設定配置
(1) 確認每台主機(master 跟其它 slave)名稱,是否分別為「master、slave01、slave02、slave03」:
 sudo vi /etc/hostname
(2) 修改每台主機的 hosts 檔案:
 sudo vi /etc/hosts
(3) 修改 hosts 內容,如圖六。
(4) 修改完成後,全部重新啟動,才能在終端機看到修正後的變化。
(5) 試著 ping 每一台,確認相互連通,如圖七。


圖六 每台主機的 hosts 檔案內容


圖七 ping 每台主機,看看是否全部連通

SSH無密碼登入

1. 在這裡,我們要讓 master 可以不用密碼、直接登入 slave 等主機來進行操作。我們需要生成 master 的公鑰,所以我們要在 master 主機裡面執行以下指令:
 mkdir ~/.ssh
 cd ~/.ssh
 ssh-keygen -t rsa
 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
 scp ~/.ssh/id_rsa.pub hadoop@slave01:/home/hadoop/
 scp ~/.ssh/id_rsa.pub hadoop@slave02:/home/hadoop/
 scp ~/.ssh/id_rsa.pub hadoop@slave03:/home/hadoop/
2. 執行 scp 指令的同時,可能會需要輸入目標主機的密碼;完成後會提示傳輸完畢。接著我們要在 slave01、slave02、slave03 主機裡,將 ssh 公鑰保存到相對應的位置:
 cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
3. 最後,我們回到 master
主機,執行下列指令,確認是否能無密碼登入(每一台 slave 都要連看看,成功就 logout,回到 master,再試下一台):
 ssh slave01
 ssh slave02
 ssh slave03

配置叢集/分散式環境

1. 我們需要修改 /usr/local/hadoop/etc/hadoop 的五個配置文件:
slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml
2. 進入配置文件資料夾
 cd /usr/local/hadoop/etc/hadoop
配置內容如下:

檔案名稱

檔案內容

slaves

把原先裡面的「localhost」刪除,改成
slave01
slave02
slave03

core-site.xml

將原先只有
<configuration>
</configuration>
的部分,改成下列設定:

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
</configuration>

hdfs-site.xml

將原先只有
<configuration>
</configuration>
的部分,改成下列設定:

<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:50090</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>

備註:因為我有 3 台 slave,所以 dfs.replicaton 值改成 3

mapred-site.xml

將原先只有
<configuration>
</configuration>
的部分,改成下列設定:

<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

yarn-site.xml

將原先只有
<configuration>
</configuration>
的部分,改成下列設定:

<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>

3. 接下來,我們要將 master 上面的 hadoop 資料夾打包,傳輸給所有 slave 主機:
 cd /usr/local
 rm -r ./hadoop/tmp
 sudo tar -zcf ./hadoop.tar.gz ./hadoop
 scp ./hadoop.tar.gz slave01:/home/hadoop
 scp ./hadoop.tar.gz slave02:/home/hadoop
 scp ./hadoop.tar.gz slave03:/home/hadoop
4. 傳輸完畢,我們分別到 slave01、slave02、slave03 主機裡,進行操作:
 sudo tar -zxf ~/hadoop.tar.gz -C /usr/local
 sudo chown -R hadoop:hadoop /usr/local/Hadoop
5. 完成後,我們回到 master 主機,準備正式啟動 Hadoop 軟體(「bin/hdfs namenode -format」這個指令,我們只要初次啟動的時候設定就好,以後不會用到):
 cd /usr/local/hadoop/
 bin/hdfs namenode -format
 sbin/start-dfs.sh
 sbin/start-yarn.sh
6. 啟動完成,若沒有錯誤訊息,我們可以透過「jps」指令,來查看各個主機啟動的程序。圖八為master 的服務程序,原則上會有「SecondaryNameNode、ResourceManager、NameNode」;圖九為其它 slave 的服務程序,原則上會有「DataNode、NodeManager」:

 


圖八 master 的Hadoop 啟動程序


圖九 slave01 在 master 主機中顯示的訊息


圖十 slave01 在 master 主機中顯示的訊息


圖十一 slave02 在 master 主機中顯示的訊息


圖十二 slave03 在 master 主機中顯示的訊息

8. 當上述訊息出現的時候,代表 Hadoop Cluster 已經正式配置完成!

後記

透過一步一步地安裝Hadoop Cluster配置,完成後,想必滿懷成就感,接下來尚有MapReduce等議題需要探討,惟篇幅有限,無法完整討論。建置過程有些繁雜,讀者必須反覆安裝與測試,方能熟悉Hadoop安裝過程。

參考資料

[1] Hadoop下載頁面
http://hadoop.apache.org/releases.html
[2] Ubuntu 12.04 安裝 Oracle Java 7
http://way3sec.blogspot.tw/2012/07/ubuntu-1204-oracle-java-7.html
[3] Hadoop集群安裝配置教程_Hadoop2.6.0/Ubuntu 14.04
http://www.powerxing.com/install-hadoop-cluster/
[4] Hadoop安裝配置簡略教程
http://www.powerxing.com/install-hadoop-simplify/