建立 Hadoop 單點分散架構

由〝製作 Hadoop 虛擬模版電腦〞一文,我們已經預先製作了 Hadoop 系統所需要的模版(虛擬)電腦,這邊,我們就利用此模版電腦,從建立單點分散架構,來開始了解 Hadoop。

複製模版(虛擬)電腦

由於模版電腦後續還需要使用,所以必須保留其原貌,這邊就利用 LXC 複製(Clone)功能來另外產生一台 LXC 虛擬電腦:

$ sudo lxc-clone -o us1204 -n NN(NN 為新複製 LXC 虛擬電腦的電腦名稱)

模版電腦複製完成之後,使用〝sudo lxc-start -n NN〞來啟動新複製的 LXC 虛擬電腦,而開機登入之後,要先確認 /opt 內是否存在〝jdk〞與〝hadoop〞這二個目錄,如下圖 :

確認 java 及 hadoop 這二個命令可正常執行, 如下圖 :

設定節點電腦為固定 IP

由於在 Hadoop 的架構之內,網路組態的設定是非常重要的,為確保電腦連線與資料傳遞的穩定性與一致性,所以必須將各個節點電腦的 TCP/IP 網路設定為固定 IP,以確保每次資料傳遞與資訊溝通都可以順利連結。

利用任一編輯器開啟 NN(虛擬)電腦內的網路設定組態檔:

$ sudo vim /etc/network/interface

檔案開啟之後,刪除或標記原先 eth0 的設定值,並輸入以下資訊:

auto eth0

iface eth0 inet static

            address 10.0.3.10

            netmask 255.255.255.0

            gateway 10.0.3.1

            dns-nameservers 168.95.1.1

其中,〝10.0.3.10〞設定為 NN 的 IP 位址,這個可以自定,而 gateway 則是 LXC 虛擬系統內部網路所設定的 gateway,可不要寫錯了,至於 nameserver,則因為筆者測試環境並沒有架設 DNS Server,所以就借用中華電信的 DNS Server (168.95.1.1)。

確認異動修改的資訊沒有問題之後,就可以存檔退出,接著再使用以下的指令,來重新啟動網路,讓新的網路組態檔可以套用:

$ sudo /etc/init.d/networking restart

網路重新啟動之後,記得還要利用〝ifconfig eth0〞來確認設定值是否正確套用,還有 ping 一下網址,以確認 dns-nameservers 的設定值是否正確,可以正確解析網址:

確認網路連線都沒問題之後,就完成了網路組態的相關設定。

設定 SSH 自動登入連接

Hadoop 若要在各個節點內執行 Hadoop 相關的指令,則需要透過 SSH 連線的方式,來登入所有的運算節點,因此,為了讓所有節點之間可以更直接與快速的登入,以及避免不必要的困擾,所以必須將 SSH 的連線模式設定為自動登入,即使是單一節點也不例外。

在家目錄內(NN, LXC 虛擬電腦),輸入以下指令來產生 SSH 連線金鑰(憑證):

$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa

金鑰產生之後,接著要將金鑰複製到家目錄中的 .ssh 目錄並更名為〝authorized_keys〞:

$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

這樣就完成了 SSH 自動連線的設定,不過,這樣的設定並不算完整,因為實際上電腦間在相互連線的時候,往往不見得都是透過 IP 位址,而是使用電腦名稱,且如果沒有自己架設的 DNS Server,且 Hadoop 各個節點都是使用私有 IP 的話,直接透過電腦名稱來進行 SSH 的連線,會發生因為無法名稱解析(IP與電腦名稱的對應)而連線失敗的狀況。

為了避免上述的情況,所以我們必須將 IP 與電腦名稱的對應資訊,寫入〝/etc/hosts〞檔案內,且實際上,Linux 系統在進行名稱解析的時候,也是優先查詢此檔案喔,只要利用編輯器開啟 /etc/hosts 的檔案,修改成如下圖的內容即可:

修改完成就可以存檔退出,接著就利用以下指令,來測試 SSH 是否可以自動連線登入:

$ ssh NN

若前面的設定都沒有問題,就會看到如下圖的圖示:

因為這是第一次登入,所以會提示連線的詢問訊息,且只會出現在第一次,輸入〝yes〞之後,按下 Enter 鍵就可以成功登入系統了,爾後再次利用 SSH 連線,就不需要再輸入密碼了。

設定 Hadoop 單點分散架構

搞定 SSH 自動登入的設定之後,接下來就要針對 Hadoop 設定檔進行相關資料的設定,而在設定之前,首先利用以下指令,在家目錄下建立一個供 Hadoop (HDFS)使用的資料夾:

$ mkdir data(data 為資料夾名稱,此名稱可以自定)

接下來的設定步驟如下:

● 設定 Name Node 的連線資訊與 Hadoop 檔案儲存的目錄

利用任一編輯器開啟以下檔案:

   

$ sudo vim /opt/hadoop/conf/core-site.xml

檔案開啟之後,在「<configuration>」與「</configuration>」區段內輸入以下資訊:

<property>
        <name>fs.default.name</name>
        <value>hdfs://NN:9000</value>
</property>
<property>
        <name>hadoop.tmp.dir</name>
        <value>/home/ubuntu/data</value>

</property>

其中,「hdfs://NN:9000」就是 Name Node 的連線資訊,「NN」就是 Name Node 這一台電腦的電腦名稱,而「/home/ubuntu/data」就是 Hadoop 檔案儲存目錄的實際路徑,也就是剛剛我們在家目錄內建立的「data」資料夾。

● 設定 Replication 的數量

開啟以下檔案,並在「<configuration>」與「</configuration>」區段內輸入以下資料:

 $ sudo vim /opt/hadoop/conf/hdfs-site.xml

<property>
        <name>dfs.replication</name>
        <value>1</value>
</property>

而「1」表示的是資料複製(或備份,Replication)的數量(份數),那因為我們只有架設單一節點,所以這邊填入的數值就只有「1」。

● 設定 Jobtracker 的連線位置

開啟以下檔案,並在「<configuration>」與「</configuration>」區段內輸入以下資訊:

$ sudo vim /opt/hadoop/conf/mapred-site.xml

<property>
        <name>mapred.job.tracker</name>
        <value>NN:9001</value>
</property>

而「NN:9001」就是 Jobtracker 的連線資訊,「NN」則是擔任 Jobtracker 的電腦名稱,但因為我們只有建立一台節點,所以此節點也會扮演 Jobtracker 的角色。

● 設定 Secondary Name Node

開啟以下檔案,並將原本的「localhost」修改為「NN」:

$ sudo vim /opt/hadoop/conf/masters

這個設定檔主要是在指定哪一台電腦為 secondary namenode,但因為這邊只有建立單一節點,所以 secondary namenode 也就是 NN 本身(localhost),且因為只有單一節點,所以此設定檔即使沒有修改也沒有關係,但為了明確表示執行 secondary namenode 的身分,修改成電腦名稱,也有助於辨識。

● 設定 DataNode

開啟以下檔案,並將原本的「localhost」修改為「NN」:

$ sudo vim /opt/hadoop/conf/slaves

這個設定檔主要是在指定哪一台電腦為 DataNode,而因為只有單一節點,所以 DataNode 就是 NN 本身這一台電腦,與設定 secondary namenode 一樣,因為只有單一節點,所以即使不修改也沒有關係。

● 設定 Hadoop 環境變數

開啟以下檔案,並找到「export JAVA_HOME=.....」的欄位,去除原本標記的符號(#),並修正 JAVA_HOME 的實際路徑:

$ sudo vim /opt/hadoop/conf/hadoop-env.sh

此設定檔主要是要設定 JDK 的實際路徑,雖然在前面的步驟中,我們有將 JAVA_HOME 的設定值寫入系統的 PATH 內,但在 Hadoop 實際的運作中,卻是會去讀取「hadoop-env.sh」檔案內關於 Java 的設定值,所以這是必須要修改的檔案,若沒有修改 JDK 的實際路徑,則後續執行 Hadoop 時,會有錯誤發生。

● 設定(新增)Hadoop Log 檔案的儲存位置

Hadoop 在執行的時候,需要有位置來存放 Log 檔案,但實際上存放的目錄卻不存在,所以我們需要手動來產生存放 Log 檔案的目錄區,而此目錄區要建立在 Hadoop 的資料夾內,也就是「/opt/hadoop」的路徑內,並且目錄區(資料夾)名稱要指定為「logs」:

$ sudo mkdir /opt/hadoop/logs

目錄區建立之後,還需要利用以下指令,來將此目錄區的檔案權限設定為「777」:

$ sudo chmod 777 /opt/hadoop/logs

啟動、執行與檢測 Hadoop

完成以上的所有設定之後,單一節點 Hadoop 的環境設定就算告一段落,接下來我們就要來啟動 Hadoop,不過,在啟動之前,需要將 Hadoop 檔案儲存的目錄進行格式化為「HDFS」的檔案系統之後, Hadoop 才能使用,而在前面的步驟中,我們已經預先在家目錄底下,預先建立了名稱為「data」的資料夾,要提供給 Hadoop 來使用,所以,先在終端機內,利用〝cd〞的指令,切換路徑到家目錄底下,並輸入以下指令,來格式化資料夾:

$ hadoop namenode -format

輸入完成,按下 Enter 鍵之後,若沒有任何問題,格式化成功之後,應該會看到如下圖的訊息:

這樣就完成格式化的動作,且此指令執行完成之後,還會將 NameNode 給關閉,不過,實際上,因為我們並還沒有實際啟動 Hadoop 的服務,所以沒有影響。

格式化完成之後,可以利用以下指令來查看格式化之後的檔案結構:

$ tree data

(若系統提示沒有 tree 的指令,請利用〝sudo apt-get install tree〞來安裝)

接下來,利用以下指令就可以來啟動 Hadoop:

$ start-all.sh

若沒有看到任何的錯誤訊息,就表示 Hadoop 已經啟動執行了,接著再使用以下的指令,來查看啟動了哪些 Hadoop Deamon:

$ jps

這邊就可以清楚看到,由於我們只有建立單一節點的 Hadoop,因此所有的 Deamon 都會落在 NN 這一台電腦身上。

而要停止 Hadoop 也很簡單,只需要使用以下的指令即可:

$ stop-all.sh

指令執行之後,就會完全停止所有 Hadoop 的 Deamon。

以上,就是建立單一節點 Hadoop 的所有流程與步驟,只要透過預先建立模版主機的方式,就可以輕鬆的利用 LXC 虛擬系統來架設 Hadoop 了。