一直想裝hadoop集羣,但老是沒有時間,最近抽了三天時間下定決定裝了一下,在個人wmware上虛擬了一臺Ubuntu14.04,而後再複製了兩臺虛擬機,準備開始!!!!html
基本參考 http://www.cnblogs.com/xia520pi/archive/2012/05/16/2503949.htmljava
一. 瞭解hadoop:node
對於Hadoop的集羣來說,能夠分紅兩大類角色:Master和Salve。Hadoop分佈式文件系統(HDFS,Hadoop Distributed Filesystem)和MapReduce(Google MapReduce的開源實現)爲核心的Hadoop爲用戶提供了系統底層細節透明的分佈式基礎架構。apache
Hadoop集羣角色:master,slavevim
Hadoop基礎框架:HDFS,MapReduce瀏覽器
一個HDFS集羣是由一個NameNode和若干個DataNode組成的,MapReduce框架是由一個單獨運行在主節點上的JobTracker和運行在每一個集羣從節點的TaskTracker共同組成的。安全
master:JobTracker,NameNode服務器
slave:TaskTracker,DataNode網絡
JobTracker:監控它們的執行狀況,而且從新執行以前的失敗任務架構
TaskTracker:負責由主節點指派的任務
NameNode:做爲主服務器,管理文件系統的命名空間和客戶端對文件系統的訪問操做
DataNode:管理存儲的數據
二. 安裝Hadoop集羣(徹底分佈式)
我有三臺虛擬機:
192.168.62.128 master.hadoop
192.168.62.129 slave1.hadoop
192.168.62.130 slave2.hadoop
1.修改主機名(IP)
$ sudo vim /etc/hostname
2.配置hosts文件(必須)
$sudo vim /etc/hosts
"/etc/hosts"這個文件是用來配置主機將用的DNS服務器信息,是記載LAN內接續的各主機的對應[HostName和IP]用的。當用戶在進行網絡鏈接時,首先查找該文件,尋找對應主機名(或域名)對應的IP地址。在進行Hadoop集羣配置中,須要在"/etc/hosts"文件中添加集羣中全部機器的IP與主機名,這樣Master與全部的Slave機器之間不只能夠經過IP進行通訊,並且還能夠經過主機名進行通訊。因此在全部的機器上的"/etc/hosts"文件末尾中都要添加以下內容:
192.168.62.128 master.hadoop
192.168.62.129 slave1.hadoop
192.168.62.130 slave2.hadoop
3.用ping測試一下是否連通
$ping slave1.hadoop
4.如今剩下的事兒就是在其他的Slave機器上進行相同的配置。而後進行測試。
1)JDK軟件
下載地址:http://www.oracle.com/technetwork/java/javase/index.html
2)Hadoop軟件
下載地址:http://hadoop.apache.org/common/releases.html
全部的機器上都要安裝JDK,如今就先在Master服務器安裝,而後其餘服務器按照步驟重複進行便可。安裝JDK以及配置環境變量,須要以"root"的身份進行。
1.在/usr下創建一個文件夾java,而後將解壓後的jdk文件夾複製過來
2.將jdk文件夾的權限改成root
$sudo chown -R root:root jdk1.8.0_45
3.編輯"/etc/profile"文件,在後面添加Java的"JAVA_HOME"、"CLASSPATH"以及"PATH"內容
$sudo vim /etc/profile
在"/etc/profile"文件的尾部添加如下內容:
# set java environment export JAVA_HOME=/usr/java/jdk1.8.0_45 export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
4.保存並退出,執行下面命令使其配置當即生效
$source profile
5.配置完畢並生效後,用下面命令判斷是否成功
$java -version
6.其它機器一樣安裝,用root權限
全部的機器上都要安裝hadoop,如今就先在Master服務器安裝,而後其餘服務器按照步驟重複進行便可。安裝和配置hadoop須要以"root"的身份進行。
1.把解壓後的Hadoop1.2.1複製到/usr文件下,改名爲hadoop
#cp -r /home/xx/hadoop1.2.1 /usr #mv hadoop1.2.1 hadoop
2.把"/usr/hadoop"讀權限分配給hadoop用戶(很是重要)
#chown -R xx:xx hadoop
3.最後在"/usr/hadoop"下面建立tmp文件夾,把Hadoop的安裝路徑添加到"/etc/profile"中,修改"/etc/profile"文件(配置java環境變量的文件),將如下語句添加到末尾,並使其有效:
# set hadoop path export HADOOP_HOME=/usr/hadoop export PATH=$PATH:$HADOOP_HOME/bin
相關命名:
#mkdir /usr/hadoop/tem #vim /etc/profile #source profile
source使profile配置當即生效!
4.配置hadoop(/usr/hadoop/conf)
配置 hadoop-env.sh,core-site.xml、hdfs-site.xml、mapred-site.xml,masters,slaves這六個文件。具體參見文章開頭連接文章。
Hadoop配置文件在conf目錄下,以前的版本的配置文件主要是Hadoop-default.xml和Hadoop-site.xml。因爲Hadoop發展迅速,代碼量急劇增長,代碼開發分爲了core,hdfs和map/reduce三部分,配置文件也被分紅了三個core-site.xml、hdfs-site.xml、mapred-site.xml。core-site.xml和hdfs-site.xml是站在HDFS角度上配置文件;core-site.xml和mapred-site.xml是站在MapReduce角度上配置文件。
配置master的slaves文件,裏面須要完整的slave信息,例如:slave用戶名@slave-IP
如今在Master機器上的Hadoop配置就結束了,剩下的就是配置Slave機器上的Hadoop。
5.用scp將master上的hadoop文件傳給slave機器上,給相應機器上的用戶加上讀權限
#chown -R hadoop:hadoop(用戶名:用戶組) hadoop(文件夾)
6.接着在"Slave1 .Hadoop"上修改"/etc/profile"文件(配置 java 環境變量的文件),將如下語句添加到末尾,並使其有效(source /etc/profile):
# set hadoop environment export HADOOP_HOME=/usr/hadoop export PATH=$PATH:$HADOOP_HOME/bin
7.剩下的事兒就是照葫蘆畫瓢把剩餘的幾臺Slave機器部署好
SSH無密碼原理
原理:Master(NameNode | JobTracker)做爲客戶端,要實現無密碼公鑰認證,鏈接到服務器Salve(DataNode | Tasktracker)上時,須要在Master上生成一個密鑰對,包括一個公鑰和一個私鑰,然後將公鑰複製到全部的Slave上。當Master經過SSH鏈接Salve時,Salve就會生成一個隨機數並用Master的公鑰對隨機數進行加密,併發送給Master。Master收到加密數以後再用私鑰解密,並將解密數回傳給Slave,Slave確認解密數無誤以後就容許Master進行鏈接了。這就是一個公鑰認證過程,其間不須要用戶手工輸入密碼。重要過程是將客戶端Master公鑰複製到Slave上。
1.安裝ssh
$sudo apt-get install ssh
2.Master機器上生成密碼對
$ssh-keygen -t rsa
這條命是生成其無密碼密鑰對,詢問其保存路徑時直接回車採用默認路徑。生成的密鑰對:id_rsa和id_rsa.pub,默認存儲在"/home/xx/.ssh"目錄下。
3.接着在Master節點上作以下配置,把id_rsa.pub追加到受權的key裏面去
$cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
4.在驗證前,須要作兩件事兒。第一件事兒是修改文件"authorized_keys"權限(權限的設置很是重要,由於不安全的設置安全設置,會讓你不能使用RSA功能),另外一件事兒是用root用戶設置"/etc/ssh/sshd_config"的內容。使其無密碼登陸有效。
$ chmod 600 ~/.ssh/authorized_keys $ sudo vim /etc/ssh/sshd_config
修改SSH配置文件"/etc/ssh/sshd_config"的下列內容
RSAAuthentication yes # 啓用 RSA 認證
PubkeyAuthentication yes # 啓用公鑰私鑰配對認證方式
AuthorizedKeysFile .ssh/authorized_keys # 公鑰文件路徑(和上面生成的文件同)
設置完以後記得重啓SSH服務,才能使剛纔設置有效
$ service ssh restart
退出root登陸,使用hadoop普通用戶驗證是否成功
$ ssh localhost
接下來的事兒是把公鑰複製全部的Slave機器上
5.使用下面的命令格式進行復制公鑰:
$ sudo scp ~/.ssh/id_rsa.pub 遠程用戶名@遠程服務器IP:~/
6.在"/home/hadoop/"下建立".ssh"文件夾,而後是修改文件夾".ssh"的用戶權限,把他的權限修改成"700",用下面命令執行:
$ mkdir ~/.ssh $ chmod 700 ~/.ssh
備註:若是不進行,即便你按照前面的操做設置了"authorized_keys"權限,並配置了"/etc/ssh/sshd_config",還重啓了ssh服務,在Master能用"ssh localhost"進行無密碼登陸,可是對Slave1.Hadoop進行登陸仍然須要輸入密碼,就是由於".ssh"文件夾的權限設置不對。這個文件夾".ssh"在配置SSH無密碼登陸時系統自動生成時,權限自動爲"700",若是是本身手動建立,它的組權限和其餘權限都有,這樣就會致使RSA無密碼遠程登陸失敗。
7.到目前爲止slave1.hadoop的公鑰也有了,文件夾".ssh"也有了,且權限也修改了。這一步就是把master.hadoop的公鑰追加到slave1.hadoop的受權文件"authorized_keys"中去。使用下面命令進行追加並修改"authorized_keys"文件權限:
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys $ chmod 600 ~/.ssh/authorized_keys
8.修改slave1"/etc/ssh/sshd_config"
具體分爲兩步:第1是修改配置文件;第2是重啓SSH服務,具體步驟參考前面Master.Hadoop的"設置SSH配置"
9.用Master.Hadoop使用SSH無密碼登陸Slave1.Hadoop
$ ssh slave1.hadoop
10.最後記得把slave1"/home/hadoop/"目錄下的"id_rsa.pub"文件刪除掉
到此爲止,咱們通過前5步已經實現了從"Master.Hadoop"到"Slave1.Hadoop"SSH無密碼登陸,下面就是重複上面的步驟把剩餘的兩臺(Slave2.Hadoop和Slave3.Hadoop)Slave服務器進行配置。這樣,咱們就完成了"配置Master無密碼登陸全部的Slave服務器"。
11.和Master無密碼登陸全部Slave原理同樣,就是把Slave的公鑰追加到Master的".ssh"文件夾下的"authorized_keys"中,記得是追加(>>)。
12.首先建立"slave1.hadoop"本身的公鑰和私鑰,並把本身的公鑰追加到"authorized_keys"文件中。用到的命令以下:
$ ssh-keygen –t rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
13.接着是用命令"scp"複製"slave1.hadoop"的公鑰"id_rsa.pub"到"master.hadoop"的"/home/xx/"目錄下,並追加到"master.hadoop"的"authorized_keys"中
在"Slave1.Hadoop"服務器的操做
$ sudo scp ~/.ssh/id_rsa.pub xx@192.168.62.128:~/
在"Master.Hadoop"服務器的操做
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
而後刪除掉剛纔複製到master上的"id_rsa.pub"文件
14.最後是測試從"slave1.hadoop"到"master.hadoop"無密碼登陸
$ ssh master.hadoop
至此"Master.Hadoop"與"Slave1.Hadoop"之間能夠互相無密碼登陸了,剩下的就是按照上面的步驟把剩餘的"Slave2.Hadoop"與"Master.Hadoop"之間創建起無密碼登陸。這樣,Master能無密碼驗證登陸每一個Slave,每一個Slave也能無密碼驗證登陸到Master。
1.格式化HDFS文件系統
在"Master.Hadoop"上使用普通用戶hadoop進行操做。(備註:只需一次,下次啓動再也不須要格式化,只需 start-all.sh)
$ hadoop namenode -format
2.啓動hadoop以前,關閉集羣中每臺機器的防火牆
$ sudo ufw disable
3.進入/usr/hadoop/bin目錄能夠看到各個腳本 開啓是start-all.sh 關閉是stop-all.sh
$ start-all.sh
能夠經過如下啓動日誌看出,首先啓動namenode 接着啓動datanode1,datanode2,…,而後啓動secondarynamenode。再啓動jobtracker,而後啓動tasktracker1,tasktracker2,…。啓動 hadoop成功後,在 Master 中的 tmp 文件夾中生成了 dfs 文件夾,在Slave 中的 tmp 文件夾中均生成了 dfs 文件夾和 mapred 文件夾。
4.驗證hadoop
1)驗證方法一:用"jps"命令
在Master上用 java自帶的小工具jps查看進程。
依次能夠看到JobTracker,NameNode,JPS,SecondaryNameNode進程號。
在Slave1上用jps查看進程。
依次能夠看到TaskTracker,DataNode,JPS進程號。
2)驗證方式二:用"hadoop dfsadmin -report"
最終起來的界面:在瀏覽器中輸入master的ip地址:端口號
1)訪問"http:192.168.62.128:50030"
2)訪問"http:192.168.62.128:50070"