1. 程式人生 > >centos安裝配置hadoop超詳細過程【轉】

centos安裝配置hadoop超詳細過程【轉】

轉自:http://www.centoscn.com/image-text/install/2014/1121/4158.html

1、叢集部署介紹

1.1 Hadoop簡介

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

  對於Hadoop的叢集來講,可以分成兩大類角色:Master和Salve。一個HDFS叢集是由一個NameNode和若干個DataNode組成的。其中NameNode作為主伺服器,管理檔案系統的名稱空間和客戶端對檔案系統的訪問操作;叢集中的DataNode管理儲存的資料。MapReduce框架是由一個單獨執行在主節點上的JobTracker和執行在每個叢集從節點的TaskTracker共同組成的。主節點負責排程構成一個作業的所有任務,這些任務分佈在不同的從節點上。主節點監控它們的執行情況,並且重新執行之前的失敗任務;從節點僅負責由主節點指派的任務。當一個Job被提交時,JobTracker接收到提交作業和配置資訊之後,就會將配置資訊等分發給從節點,同時排程任務並監控TaskTracker的執行。

  從上面的介紹可以看出,HDFS和MapReduce共同組成了Hadoop分散式系統體系結構的核心。HDFS在叢集上實現分散式檔案系統,MapReduce在叢集上實現了分散式計算和任務處理。HDFS在MapReduce任務處理過程中提供了檔案操作和儲存等支援,MapReduce在HDFS的基礎上實現了任務的分發、跟蹤、執行等工作,並收集結果,二者相互作用,完成了Hadoop分散式叢集的主要任務。

1.2 環境說明

  叢集中包括4個節點:1個Master,3個Salve,節點之間區域網連線,可以相互ping通,具體叢集資訊可以檢視"Hadoop叢集(第2期)"。節點IP地址分佈如下:

機器名稱

IP地址

Master.Hadoop

192.168.1.2

Salve1.Hadoop

192.168.1.3

Salve2.Hadoop

192.168.1.4

Salve3.Hadoop

192.168.1.5

  四個節點上均是CentOS6.0系統,並且有一個相同的使用者hadoop。Master機器主要配置NameNode和JobTracker的角色,負責總管分散式資料和分解任務的執行;3個Salve機器配置DataNode和TaskTracker的角色,負責分散式資料儲存以及任務的執行。其實應該還應該有1個Master機器,用來作為備用

,以防止Master伺服器宕機,還有一個備用馬上啟用。後續經驗積累一定階段後補上一臺備用Master機器。

1.3 網路配置

  Hadoop叢集要按照1.2小節表格所示進行配置,我們在"Hadoop叢集(第1期)"的CentOS6.0安裝過程就按照提前規劃好的主機名進行安裝和配置。如果實驗室後來人在安裝系統時,沒有配置好,不要緊,沒有必要重新安裝,在安裝完系統之後仍然可以根據後來的規劃對機器的主機名進行修改。

  下面的例子我們將以Master機器為例,即主機名為"Master.Hadoop",IP為"192.168.1.2"進行一些主機名配置的相關操作。其他的Slave機器以此為依據進行修改。

  1)檢視當前機器名稱 

  用下面命令進行顯示機器名稱,如果跟規劃的不一致,要按照下面進行修改。

hostname

  上圖中,用"hostname"查"Master"機器的名字為"Master.Hadoop",與我們預先規劃的一致。

  2)修改當前機器名稱 

  假定我們發現我們的機器的主機名不是我們想要的,通過對"/etc/sysconfig/network"檔案修改其中"HOSTNAME"後面的值,改成我們規劃的名稱。

  這個"/etc/sysconfig/network"檔案是定義hostname和是否利用網路的不接觸網路裝置的對系統全體定義的檔案。

  設定形式:設定值=值

  "/etc/sysconfig/network"的設定專案如下:

NETWORKING 是否利用網路

GATEWAY 預設閘道器

IPGATEWAYDEV 預設閘道器的介面名

HOSTNAME 主機名

DOMAIN 域名

  用下面命令進行修改當前機器的主機名(備註:修改系統檔案一般用root使用者)

vim /etc/sysconfig/network

  通過上面的命令我們從"/etc/sysconfig/network"中找到"HOSTNAME"進行修改,檢視內容如下:

3)修改當前機器IP 

假定我們的機器連IP在當時安裝機器時都沒有配置好,那此時我們需要對"ifcfg-eth0"檔案進行配置,該檔案位於"/etc/sysconfig/network-scripts"資料夾下。

  在這個目錄下面,存放的是網路介面(網絡卡)的制御指令碼檔案(控制檔案),ifcfg- eth0是預設的第一個網路介面,如果機器中有多個網路介面,那麼名字就將依此類推ifcfg-eth1,ifcfg-eth2,ifcfg- eth3,……。

  這裡面的檔案是相當重要的,涉及到網路能否正常工作。

  設定形式:設定值=值

  設定專案專案如下:

DEVICE 介面名(裝置,網絡卡)

BOOTPROTO IP的配置方法(static:固定IP, dhcpHCP, none:手動)

HWADDR MAC地址

ONBOOT 系統啟動的時候網路介面是否有效(yes/no)

TYPE 網路型別(通常是Ethemet)

NETMASK 網路掩碼

IPADDR IP地址

IPV6INIT IPV6是否有效(yes/no)

GATEWAY 預設閘道器IP地址

  檢視"/etc/sysconfig/network-scripts/ifcfg-eth0"內容,如果IP不復核,就行修改。

  如果上圖中IP與規劃不相符,用下面命令進行修改:

vim /etc/sysconfig/network-scripts/ifcgf-eth0

  修改完之後可以用"ifconfig"進行檢視。

  4)配置hosts檔案(必須) 

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

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

  例如:機器為"Master.Hadoop:192.168.1.2"對機器為"Salve1.Hadoop:192.168.1.3"用命令"ping"記性連線測試。測試結果如下:

   從上圖中的值,直接對IP地址進行測試,能夠ping通,但是對主機名進行測試,發現沒有ping通,提示"unknown host——未知主機",這時檢視"Master.Hadoop"的"/etc/hosts"檔案內容。

  發現裡面沒有"192.168.1.3 Slave1.Hadoop"內容,故而本機器是無法對機器的主機名為"Slave1.Hadoop" 解析。

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

192.168.1.2 Master.Hadoop

192.168.1.3 Slave1.Hadoop

192.168.1.4 Slave2.Hadoop

192.168.1.5 Slave3.Hadoop

用以下命令進行新增:

vim /etc/hosts

  新增結果如下:

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

  從上圖中我們已經能用主機名進行ping通了,說明我們剛才新增的內容,在區域網內能進行DNS解析了,那麼現在剩下的事兒就是在其餘的Slave機器上進行相同的配置。然後進行測試。(備註:當設定SSH無密碼驗證後,可以"scp"進行復制,然後把原來的"hosts"檔案執行覆蓋即可。)

1.4 所需軟體

1)JDK軟體 

    JDK版本:jdk-6u31-linux-i586.bin

2)Hadoop軟體 

    Hadoop版本:hadoop-1.0.0.tar.gz

1.5 VSFTP上傳

  在"Hadoop叢集(第3期)"講了VSFTP的安裝及配置,如果沒有安裝VSFTP可以按照該文件進行安裝。如果安裝好了,就可以通過FlashFXP.exe軟體把我們下載的JDK6.0和Hadoop1.0軟體上傳到"Master.Hadoop:192.168.1.2"伺服器上。

  剛才我們用一般使用者(hadoop)通過FlashFXP軟體把所需的兩個軟體上傳了跟目下,我們通過命令檢視下一下是否已經上傳了。

    從圖中,我們的所需軟體已經準備好了。

2、SSH無密碼驗證配置

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

2.1 安裝和啟動SSH協議

  在"Hadoop叢集(第1期)"安裝CentOS6.0時,我們選擇了一些基本安裝包,所以我們需要兩個服務:ssh和rsync已經安裝了。可以通過下面命令檢視結果顯示如下:

rpm –qa | grep openssh

rpm –qa | grep rsync

  假設沒有安裝ssh和rsync,可以通過下面命令進行安裝。

yum install ssh 安裝SSH協議

yum install rsync (rsync是一個遠端資料同步工具,可通過LAN/WAN快速同步多臺主機間的檔案)

service sshd restart 啟動服務

  確保所有的伺服器都安裝,上面命令執行完畢,各臺機器之間可以通過密碼驗證相互登。

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

  1)SSH無密碼原理 

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

  2)Master機器上生成密碼對 

   在Master節點上執行以下命令:

ssh-keygen –t rsa –P ''

  這條命是生成其無密碼金鑰對,詢問其儲存路徑時直接回車採用預設路徑。生成的金鑰對:id_rsa和id_rsa.pub,預設儲存在"/home/hadoop/.ssh"目錄下。

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

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

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

  在驗證前,需要做兩件事兒。第一件事兒是修改檔案"authorized_keys"許可權(許可權的設定非常重要,因為不安全的設定安全設定,會讓你不能使用RSA功能),另一件事兒是用root使用者設定"/etc/ssh/sshd_config"的內容。使其無密碼登入有效。

  1)修改檔案"authorized_keys

chmod 600 ~/.ssh/authorized_keys

   備註:如果不進行設定,在驗證時,扔提示你輸入密碼,在這裡花費了將近半天時間來查詢原因。在網上查到了幾篇不錯的文章,把作為"Hadoop叢集_第5期副刊_JDK和SSH無密碼配置"來幫助額外學習之用。

2)設定SSH配置 

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

RSAAuthentication yes # 啟用 RSA 認證

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

AuthorizedKeysFile .ssh/authorized_keys # 公鑰檔案路徑(和上面生成的檔案同)

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

service sshd restart

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

ssh localhost

  從上圖中得知無密碼登入本級已經設定完畢,接下來的事兒是把公鑰複製所有Slave機器上。使用下面的命令格式進行復制公鑰:

scp ~/.ssh/id_rsa.pub 遠端使用者名稱@遠端伺服器IP:~/

  例如:

scp ~/.ssh/id_rsa.pub [email protected]:~/

  上面的命令是複製檔案"id_rsa.pub"到伺服器IP為"192.168.1.3"的使用者為"hadoop"的"/home/hadoop/"下面。

  下面就針對IP為"192.168.1.3"的Slave1.Hadoop的節點進行配置。

  1)把Master.Hadoop上的公鑰複製到Slave1.Hadoop上

  從上圖中我們得知,已經把檔案"id_rsa.pub"傳過去了,因為並沒有建立起無密碼連線,所以在連線時,仍然要提示輸入輸入Slave1.Hadoop伺服器使用者hadoop的密碼。為了確保確實已經把檔案傳過去了,用SecureCRT登入Slave1.Hadoop:192.168.1.3伺服器,檢視"/home/hadoop/"下是否存在這個檔案。

  從上面得知我們已經成功把公鑰複製過去了。

  2)在"/home/hadoop/"下建立".ssh"資料夾 

  這一步並不是必須的,如果在Slave1.Hadoop的"/home/hadoop"已經存在就不需要建立了,因為我們之前並沒有對Slave機器做過無密碼登入配置,所以該檔案是不存在的。用下面命令進行建立。(備註:用hadoop登入系統,如果不涉及系統檔案修改,一般情況下都是用我們之前建立的普通使用者hadoop進行執行命令。)

mkdir ~/.ssh

  然後是修改資料夾".ssh"的使用者許可權,把他的許可權修改為"700",用下面命令執行:

chmod 700 ~/.ssh

備註:如果不進行,即使你按照前面的操作設定了"authorized_keys"許可權,並配置了"/etc/ssh/sshd_config",還重啟了sshd服務,在Master能用"ssh localhost"進行無密碼登入,但是對Slave1.Hadoop進行登入仍然需要輸入密碼,就是因為".ssh"資料夾的許可權設定不對。這個資料夾".ssh"在配置SSH無密碼登入時系統自動生成時,許可權自動為"700",如果是自己手動建立,它的組許可權和其他許可權都有,這樣就會導致RSA無密碼遠端登入失敗。

  對比上面兩張圖,發現資料夾".ssh"許可權已經變了。

  3)追加到授權檔案"authorized_keys

  到目前為止Master.Hadoop的公鑰也有了,資料夾".ssh"也有了,且許可權也修改了。這一步就是把Master.Hadoop的公鑰追加到Slave1.Hadoop的授權檔案"authorized_keys"中去。使用下面命令進行追加並修改"authorized_keys"檔案許可權:

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

chmod 600 ~/.ssh/authorized_keys

  4)用root使用者修改"/etc/ssh/sshd_config"

具體步驟參考前面Master.Hadoop的"設定SSH配置",具體分為兩步:第1是修改配置檔案;第2是重啟SSH服務。

  5)用Master.Hadoop使用SSH無密碼登入Slave1.Hadoop 

  當前面的步驟設定完畢,就可以使用下面命令格式進行SSH無密碼登入了。

ssh 遠端伺服器IP

  從上圖我們主要3個地方,第1個就是SSH無密碼登入命令,第2、3個就是登入前後"@"後面的機器名變了,由"Master"變為了"Slave1",這就說明我們已經成功實現了SSH無密碼登入了。

  最後記得把"/home/hadoop/"目錄下的"id_rsa.pub"檔案刪除掉。

rm –r ~/id_rsa.pub

  到此為止,我們經過前5步已經實現了從"Master.Hadoop"到"Slave1.Hadoop"SSH無密碼登入,下面就是重複上面的步驟把剩餘的兩臺(Slave2.Hadoop和Slave3.Hadoop)Slave伺服器進行配置。這樣,我們就完成了"配置Master無密碼登入所有的Slave伺服器"。

2.3 配置所有Slave無密碼登入Master

  和Master無密碼登入所有Slave原理一樣,就是把Slave的公鑰追加到Master的".ssh"資料夾下的"authorized_keys"中,記得是追加(>>)

  為了說明情況,我們現在就以"Slave1.Hadoop"無密碼登入"Master.Hadoop"為例,進行一遍操作,也算是鞏固一下前面所學知識,剩餘的"Slave2.Hadoop"和"Slave3.Hadoop"就按照這個示例進行就可以了。

  首先建立"Slave1.Hadoop"自己的公鑰和私鑰,並把自己的公鑰追加到"authorized_keys"檔案中。用到的命令如下:

ssh-keygen –t rsa –P ''

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

  接著是用命令"scp"複製"Slave1.Hadoop"的公鑰"id_rsa.pub"到"Master.Hadoop"的"/home/hadoop/"目錄下,並追加到"Master.Hadoop"的"authorized_keys"中。

  1)在"Slave1.Hadoop"伺服器的操作 

  用到的命令如下:

scp ~/.ssh/id_rsa.pub     [email protected]:~/

  2)在"Master.Hadoop"伺服器的操作 

  用到的命令如下:

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

  然後刪除掉剛才複製過來的"id_rsa.pub"檔案。

  最後是測試從"Slave1.Hadoop"到"Master.Hadoop"無密碼登入。

  從上面結果中可以看到已經成功實現了,再試下從"Master.Hadoop"到"Slave1.Hadoop"無密碼登入。

  至此"Master.Hadoop"與"Slave1.Hadoop"之間可以互相無密碼登入了,剩下的就是按照上面的步驟把剩餘的"Slave2.Hadoop"和"Slave3.Hadoop"與"Master.Hadoop"之間建立起無密碼登入。這樣,Master能無密碼驗證登入每個Slave,每個Slave也能無密碼驗證登入到Master。

3、Java環境安裝

  所有的機器上都要安裝JDK,現在就先在Master伺服器安裝,然後其他伺服器按照步驟重複進行即可。安裝JDK以及配置環境變數,需要以"root"的身份進行。

3.1 安裝JDK

  首先用root身份登入"Master.Hadoop"後在"/usr"下建立"java"資料夾,再把用FTP上傳到"/home/hadoop/"下的"jdk-6u31-linux-i586.bin"複製到"/usr/java"資料夾中。

mkdir /usr/java

cp /home/hadoop/ jdk-6u31-linux-i586.bin /usr/java

  接著進入"/usr/java"目錄通過下面命令使其JDK獲得可執行許可權,並安裝JDK。

chmod    +x     jdk-6u31-linux-i586.bin

./jdk-6u31-linux-i586.bin

  按照上面幾步進行操作,最後點選"Enter"鍵開始安裝,安裝完會提示你按"Enter"鍵退出,然後檢視"/usr/java"下面會發現多了一個名為"jdk1.6.0_31"資料夾,說明我們的JDK安裝結束,刪除"jdk-6u31-linux-i586.bin"檔案,進入下一個"配置環境變數"環節。

3.2 配置環境變數

  編輯"/etc/profile"檔案,在後面新增Java的"JAVA_HOME"、"CLASSPATH"以及"PATH"內容。

  1)編輯"/etc/profile"檔案 

vim     /etc/profile

  2)新增Java環境變數 

  在"/etc/profile"檔案的尾部新增以下內容:

# set java environment

export JAVA_HOME=/usr/java/jdk1.6.0_31/

export JRE_HOME=/usr/java/jdk1.6.0_31/jre

export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib

export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

  或者

# set java environment

export JAVA_HOME=/usr/java/jdk1.6.0_31

export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin

   以上兩種意思一樣,那麼我們就選擇第2種來進行設定。

  3)使配置生效 

  儲存並退出,執行下面命令使其配置立即生效。

source /etc/profile

3.3 驗證安裝成功

  配置完畢並生效後,用下面命令判斷是否成功。

java -version

  從上圖中得知,我們以確定JDK已經安裝成功。

3.4 安裝剩餘機器

  這時用普通使用者hadoop通過下面命令格式把"Master.Hadoop"資料夾"/home/hadoop/"的JDK複製到其他Slave的"/home/hadoop/"下面,剩下的事兒就是在其餘的Slave伺服器上按照上圖的步驟安裝JDK。

scp /home/hadoop/jdk-6u31-linux-i586.bin 遠端使用者名稱@遠端伺服器IP:~/

  或者

scp ~/jdk-6u31-linux-i586.bin 遠端使用者名稱@遠端伺服器IP:~/

  備註:"~"代表當前使用者的主目錄,當前使用者為hadoop,所以"~"代表"/home/hadoop"。

  例如:把JDK從"Master.Hadoop"複製到"Slave1.Hadoop"的命令如下。

scp ~/jdk-6u31-linux-i586 [email protected]:~/

  然後檢視"Slave1.Hadoop"的"/home/hadoop"檢視是否已經複製成功了。

  從上圖中得知,我們已經成功複製了,現在我們就用最高許可權使用者root進行安裝了。其他的與這個一樣。

4、Hadoop叢集安裝

  所有的機器上都要安裝hadoop,現在就先在Master伺服器安裝,然後其他伺服器按照步驟重複進行即可。安裝和配置hadoop需要以"root"的身份進行。

4.1 安裝hadoop

  首先用root使用者登入"Master.Hadoop"機器,檢視我們之前用FTP上傳至"/home/Hadoop"上傳的"hadoop-1.0.0.tar.gz"。

  接著把"hadoop-1.0.0.tar.gz"複製到"/usr"目錄下面。

cp /home/hadoop/hadoop-1.0.0.tar.gz /usr

  下一步進入"/usr"目錄下,用下面命令把"hadoop-1.0.0.tar.gz"進行解壓,並將其命名為"hadoop",把該資料夾的讀許可權分配給普通使用者hadoop,然後刪除"hadoop-1.0.0.tar.gz"安裝包。

cd /usr #進入"/usr"目錄

tar –zxvf hadoop-1.0.0.tar.gz #解壓"hadoop-1.0.0.tar.gz"安裝包

mv hadoop-1.0.0 hadoop #將"hadoop-1.0.0"資料夾重新命名"hadoop"

chown –R hadoop:hadoop hadoop #將資料夾"hadoop"讀許可權分配給hadoop使用者

rm –rf hadoop-1.0.0.tar.gz                 #刪除"hadoop-1.0.0.tar.gz"安裝包

  解壓後,並重命名。

  把"/usr/hadoop"讀權限分配給hadoop使用者(非常重要

  刪除"hadoop-1.0.0.tar.gz"安裝包

  最後在"/usr/hadoop"下面建立tmp資料夾,把Hadoop的安裝路徑新增到"/etc/profile"中,修改"/etc/profile"檔案(配置java環境變數的檔案),將以下語句新增到末尾,並使其有效:

# set hadoop path

export HADOOP_HOME=/usr/hadoop

export PATH=$PATH :$HADOOP_HOME/bin

1)在"