建立 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> </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> |
而「1」表示的是資料複製(或備份,Replication)的數量(份數),那因為我們只有架設單一節點,所以這邊填入的數值就只有「1」。
● 設定 Jobtracker 的連線位置
開啟以下檔案,並在「<configuration>」與「</configuration>」區段內輸入以下資訊:
$ sudo vim /opt/hadoop/conf/mapred-site.xml
<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 了。