1. 程式人生 > >一步步教你Hadoop多節點叢集安裝配置

一步步教你Hadoop多節點叢集安裝配置

1、叢集部署介紹

1.1 Hadoop簡介

clip_image001[12] HadoopApache軟體基金會旗下的一個開源分散式計算平臺。以Hadoop分散式檔案系統HDFS(Hadoop Distributed Filesystem)和MapReduceGoogle MapReduce的開源實現)為核心Hadoop為使用者提供了系統底層細節透明的分散式基礎架構。

對於Hadoop的叢集來講,可以分成兩大類角色:MasterSalve。一個HDFS叢集是由一個NameNode和若干個DataNode組成的。其中NameNode作為主伺服器,管理檔案系統的名稱空間和客戶端對檔案系統的訪問操作;叢集中的DataNode

管理儲存的資料。MapReduce框架是由一個單獨執行在主節點上的JobTracker和執行在每個從節點的TaskTracker共同組成的。主節點負責排程構成一個作業的所有任 務,這些任務分佈在不同的從節點上。主節點監控它們的執行情況,並且重新執行之前的失敗任務;從節點僅負責由主節點指派的任務。當一個Job被提交時,JobTracker接收到提交作業和配置資訊之後,就會將配置資訊等分發給從節點,同時排程任務並監控TaskTracker的執行。

從上面的介紹可以看出,HDFSMapReduce共同組成了Hadoop分散式系統體系結構的核心。HDFS在叢集上實現分散式檔案系統MapReduce

在叢集上實現了分散式計算任務處理HDFSMapReduce任務處理過程中提供了檔案操作和儲存等支援,MapReduceHDFS的基礎上實現了任務的分發、跟蹤、執行等工作,並收集結果,二者相互作用,完成了Hadoop分散式叢集的主要任務。

1.2 環境說明

我的環境是在虛擬機器中配置的,Hadoop叢集中包括4個節點:1Master2Salve,節點之間區域網連線,可以相互ping通,節點IP地址分佈如下:

虛擬機器系統

機器名稱

IP地址

Ubuntu 13.04

Master.Hadoop

192.168.1.141

Ubuntu 9.11

Salve1.Hadoop

192.168.1.142

Fedora 17

Salve2.Hadoop

192.168.1.137

Master機器主要配置NameNodeJobTracker的角色,負責總管分散式資料和分解任務的執行;3Salve機器配置DataNode TaskTracker的角色,負責分散式資料儲存以及任務的執行。其實應該還應該有1Master機器,用來作為備用,以防止Master伺服器宕機,還有一個備用馬上啟用。後續經驗積累一定階段後補上一臺備用Master機器(可通過配置檔案修改備用機器數)。

注意:由於hadoop要求所有機器上hadoop部署目錄結構要求相同(因為在啟動時按與主節點相同的目錄啟動其它任務節點),並且都有一個相同的使用者名稱賬戶。參考各種文件上說的是所有機器都建立一個hadoop使用者,使用這個賬戶來實現無密碼認證。這裡為了方便,分別在三臺機器上都重新建立一個hadoop使用者。

1.3 環境配置

Hadoop叢集要按照1.2小節表格所示進行配置,下面介紹如何修改機器名稱和配置hosts檔案,以方便使用。

注意:我的虛擬機器都採用NAT方式連線網路,IP地址是自動分配的,所以這裡就使用自動分配的IP地址而未特地修改為某些IP地址。

1)修改當前機器名稱

假定我們發現我們的機器的主機名不是我們想要的。

1)Ubuntu下修改機器名稱

修改檔案/etc/hostname裡的值即可,修改成功後用hostname命令檢視當前主機名是否設定成功。

clip_image002[12]

另外為了能正確解析主機名,最好也修改/etc/hosts檔案裡對應的主機名
clip_image003[12]

2)Fedora下修改機器名稱

通過對"/etc/sysconfig/network"檔案修改其中"HOSTNAME"後面的值,改成我們規定的名稱。

命令:vi /etc/sysconfig/network,修改如下:clip_image004[12]
clip_image005[12]

同樣為了能正確解析主機名,最好也修改/etc/hosts檔案裡對應的主機名。

2)配置hosts檔案(必須

"/etc/hosts"這個檔案是用來配置主機將用的DNS伺服器資訊,是記載LAN內接續的各主機的對應[HostNameIP]用的。當用戶在進行網路連線時,首先查詢該檔案,尋找對應主機名對應的IP地址。

我們要測試兩臺機器之間知否連通,一般用"ping 機器的IP",如果想用"ping 機器的主機名"發現找不見該名稱的機器(這也就是為什麼在修改主機名的同時最好修改該檔案中對應的主機名),解決的辦法就是修改"/etc/hosts"這個檔案,通過把LAN內的各主機的IP地址和HostName一一對應寫入這個檔案的時候,就可以解決問題。

例如:機器為"Master.Hadoop:192.168.1.141"對機器為"Salve1.Hadoop:192.168.1.142"用命令"ping"記性連線測試。測試結果如下:clip_image006[12]

從上圖中的值,直接對IP地址進行測試,能夠ping通,但是對主機名進行測試,發現沒有ping通,提示"unknown host——未知主機",這時檢視"Master.Hadoop""/etc/hosts"檔案內容會發現裡面沒有"192.168.1.142 Slave1.Hadoop"內容,故而本機器是無法對機器的主機名為"Slave1.Hadoop" 解析。

在進行Hadoop叢集配置中,需要在"/etc/hosts"檔案中新增叢集中所有機器的IP與主機名,這樣Master與所有的Slave機器之間不僅可以通過IP進行通訊,而且還可以通過主機名進行通訊。所以在所有的機器上的"/etc/hosts"檔案中都要新增如下內容:

192.168.1.141 Master.Hadoop

192.168.1.142 Slave1.Hadoop

192.168.1.137 Slave2.Hadoop

命令:vi /etc/hosts,新增結果如下:clip_image007[12]

現在我們在進行對機器為"Slave1.Hadoop"的主機名進行ping通測試,看是否能測試成功。

clip_image009[12]

從上圖中我們已經能用主機名進行ping通了,說明我們剛才新增的內容,在區域網內能進行DNS解析了,那麼現在剩下的事兒就是在其餘的Slave機器上進行相同的配置。然後進行測試。

1.4 所需軟體

1JDK軟體

JDK版本:jdk-7u25-linux-i586.tar.gz

2Hadoop軟體

Hadoop版本:hadoop-1.1.2.tar.gz

2SSH無密碼驗證配置

Hadoop執行過程中需要管理遠端Hadoop守護程序,在Hadoop啟動以後,NameNode是通過SSHSecure Shell)來啟動和停止各個DataNode上的各種守護程序的。這就必須在節點之間執行指令的時候是不需要輸入密碼的形式,故我們需要配置SSH運用無密碼公鑰認證的形式,這樣NameNode使用SSH無密碼登入並啟動DataName程序,同樣原理,DataNode上也能使用SSH無密碼登入到 NameNode

注意:如果你的Linux沒有安裝SSH,請首先安裝SSH

Ubuntu下安裝sshsudo apt-get install openssh-server

Fedora下安裝sshyum install openssh-server

2.1 SSH基本原理和用法

1)SSH基本原理

SSH之所以能夠保證安全,原因在於它採用了公鑰加密。過程如下:

(1)遠端主機收到使用者的登入請求,把自己的公鑰發給使用者。

(2)使用者使用這個公鑰,將登入密碼加密後,傳送回來。

(3)遠端主機用自己的私鑰,解密登入密碼,如果密碼正確,就同意使用者登入。

2SSH基本用法

假如使用者名稱為java,登入遠端主機名為linux,如下命令即可:

$ ssh [email protected]

SSH的預設埠是22,也就是說,你的登入請求會送進遠端主機的22埠。使用p引數,可以修改這個埠,例如修改為88埠,命令如下:

$ ssh -p 88 [email protected]

注意:如果出現錯誤提示:ssh: Could not resolve hostname linux: Name or service not known則是因為linux主機未新增進本主機的Name Service中,故不能識別,需要在/etc/hosts裡新增進該主機及對應的IP即可:

linux192.168.1.107

2.2 配置Master無密碼登入所有Salve

1SSH無密碼原理

MasterNameNode | JobTracker)作為客戶端,要實現無密碼公鑰認證,連線到伺服器SalveDataNode | Tasktracker)上時,需要在Master上生成一個金鑰對,包括一個公鑰和一個私鑰,而後將公鑰複製到所有的Slave上。當Master通過SSH連線Salve時,Salve就會生成一個隨機數並用Master的公鑰對隨機數進行加密,併發送給MasterMaster收到加密數之後再用私鑰解密,並將解密數回傳給SlaveSlave確認解密數無誤之後就允許Master進行連線了。這就是一個公鑰認證過程,其間不需要使用者手工輸入密碼。

2)Master機器上設定無密碼登入

a. Master節點利用ssh-keygen命令生成一個無密碼金鑰對。

Master節點上執行以下命令:

ssh-keygen –t rsa –P ''

執行後詢問其儲存路徑時直接回車採用預設路徑。生成的金鑰對:id_rsa(私鑰)和id_rsa.pub(公鑰),預設儲存在"/home/使用者名稱/.ssh"目錄下。clip_image010[12]

檢視"/home/使用者名稱/"下是否有".ssh"資料夾,且".ssh"檔案下是否有兩個剛生產的無密碼金鑰對。

clip_image011[12]

b. 接著在Master節點上做如下配置,把id_rsa.pub追加到授權的key裡面去。

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

clip_image012[12]

檢視下authorized_keys的許可權,如果許可權不對則利用如下命令設定該檔案的許可權:

chmod 600 authorized_keys

c. root使用者登入修改SSH配置檔案"/etc/ssh/sshd_config"的下列內容。

檢查下面幾行前面”#”註釋是否取消掉:

RSAAuthentication yes # 啟用 RSA 認證

PubkeyAuthentication yes # 啟用公鑰私鑰配對認證方式

AuthorizedKeysFile %h/.ssh/authorized_keys # 公鑰檔案路徑clip_image013[12]

設定完之後記得重啟SSH服務,才能使剛才設定有效。

clip_image014[12]

退出root登入,使用普通使用者驗證是否設定成功。

clip_image015[12]