hadoop集羣搭建

 首先確定hdfs分佈式文件系統目前很多大公司都在用,例如百度、騰訊、淘寶等。相信網上也有很多關於這方面的文檔,我寫這篇文章只是爲了自己更加深刻的學習和理解,或者幫助一些不會搭建的童鞋們!有問題請加羣234086986討論!以前我搭建的是hadoop-0.20.2、hbase-0.90.4、hbase自帶的zookeeper,但是經過與開發測試後,用了hadoop-1.0.3、hbase-0.92.1和獨立部署的zookeeper-3.3.5版本替代上述版本。下面開始配置分佈式集羣。
前期準備工作,大致分爲以下幾步:
1)安裝jdk並檢查是否正常。
2)每臺幾點上實現無密碼認證及檢查是否正常。
3)安裝hadoop並配置,檢查是否正常。
本次環境一共用了四臺服務器,操作系統均使用RedHat4.8版本、JAVA使用的是版本是jdk1.6.0_14,當然你可以找適合自己的版本,但是務必是1.6以上。
主機名          IP地址            用途
hadoop1       192.168.3.65        namenode、jobtracker
hadoop2       192.168.3.66        datanode、tasktracker
hadoop3       192.168.3.67        datanode、tasktracker
hadoop4       192.168.3.64        secondarynamenode、tasktracker、datanode
對於hadoop來說,在hdfs看來節點分爲namenode、datanode。namenode只有一個,datanode可以是很多;在mapreduce看來節點分爲jobtracker、tasktracker,jobtracker只有一個,tasktracker有多個。我這裏是將namenode和jobtracker部署在同一節點上,datanode和tasktracker部署在其它節點上,另外hadoop4上面還部署了secondarynamenode。當然你可以全部部署在一臺機器上,但是這樣根本無法測試hdfs分佈式文件系統的性能。所以根據個人的情況而定。
以本實驗爲例,四臺機器的hosts文件分別如下,(注意把127.0.0.1那一行直接刪除掉,避免一些客觀因素的影響),寫完後四臺機器分別使用PING每個節點的主機名測試一下連通性即可!下面紅色字體則是輸入命令。
一定不要用IP地址代理host,我就是被這個問題浪費了三天時間
[root@hadoop1 ~] # more /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
192.168.3.65    hadoop1
192.168.3.66    hadoop2
192.168.3.67    hadoop3
192.168.3.64    hadoop4
1、下面開始安裝jdk,上傳到/root目錄下,我只在一臺機器上示範安裝,其餘的節點也請自行完成安裝。
[root@hadoop1 ~] # chmod a+x jdk-6u14-linux-x64.bin
[root@hadoop1 ~] # ./jdk-6u14-linux-x64.bin(一路空格,提示輸入yes和no的時候輸入yes即可)
將安裝目錄移動到/usr/java目錄下(java目錄自行創建)
[root@hadoop1 ~] # mkdir /usr/java
[root@hadoop1 ~] # mv jdk1.6.0_14 /usr/java
配置java的環境變量
[root@hadoop1 ~] # vi .bash_profile
添加如下內容:
export JAVA_HOME=/usr/java/jdk1.6.0_14
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
讓添加的環境變量生效執行如下命令:
[root@hadoop1 ~] # source .bash_profile
驗證安裝是否成功?如果出來以下信息則說明安裝沒有任何問題。
[root@hadoop1 ~]#  java -version
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)
同樣在hadoop2、hadoop3、hadoop4上面安裝jdk。
2、由於hadoop要求所有機器上hadoop的部署目錄結構要求相同,並且都有一個相同的用戶名的賬戶。參考各種文檔上說的是三臺機器都建立一個hadoop用戶,使用這個賬戶來實現無密碼認證。但是我用了這個hadoop這個賬戶做好信任關係之後還是需要密碼登錄,後來才知道是authorized_keys這個文件的權限的關係。這裏我就用root用戶做。個人建議下載hadoop穩定版本,因爲後面還需要配置hbase的,如果選擇的版本不匹配,那麼出現的問題將會讓你找不到頭緒。這裏提醒大家多看官方文檔。下載地址:http://labs.renren.com/apache-mirror/hadoop/core/
下載文件後上傳到/root目錄下並將其解壓:(所有的操作均在hadoop1上操作,除去在數據節點上操作的我會特殊說明,爲了實驗方便就放root用戶下,如果是真實環境建議放別的目錄下面)
[root@hadoop1 ~] # tar -zxvf  hadoop-1.0.3.tar.gz
將解壓完後的目錄備份一份並且重命名爲hadoop即可!(方便以後有問題好恢復)
[root@hadoop1 ~] # cp -r hadoop-1.0.3 hadoop
這樣一來,所有的配置文件都在/root/hadoop/conf/目錄中,所有執行程序都在/root/hadoop/bin目錄中。
在Hadoop啓動以後,Namenode是通過SSH(Secure Shell)來啓動和停止各個節點上的各種守護進程的,這就需要在節點之間執行指令的時候是不需要輸入密碼的方式,故我們需要配置SSH使用無密碼公鑰認證的方式。
首先要保證每臺機器上都裝了SSH服務器,且都正常啓動。實際中我們用的都是OpenSSH,這是SSH協議的一個免費開源實現。
以本文中的4臺機器爲例,現在hadoop1是主節點,它需要主動發起SSH連接到hadoop2,對於SSH服務來說,hadoop1就是SSH客戶端,而hadoop2, hadoop3,hadoop4則是SSH服務端,因此在hadoop2,hadoop3,hadoop4上需要確定sshd服務已經啓動。簡單的說,在hadoop1上需要生成一個密鑰對,即一個私鑰,一個公鑰。將公鑰拷貝到hadoop2上,這樣,比如當hadoop1向hadoop2發起ssh連接的時候,hadoop2上就會生成一個隨機數並用hadoop1的公鑰對這個隨機數進行加密,併發送給hadoop1,hadoop1收到這個加密的數以後用私鑰進行解密,並將解密後的數發送回hadoop2,hadoop2確認解密的數無誤後就允許hadoop1進行連接了。這就完成了一次公鑰認證過程。
對於本文中的4臺機器,首先在hadoop1上生成密鑰對:
[root@hadoop1 ~]# ssh-keygen -t rsa(直接一路回車鍵即可)
這個命令將爲hadoop1上的用戶root生成其密鑰對。生成的密鑰對id_rsa,id_rsa.pub,在/root/.ssh目錄下。
然後將id_rsa.pub文件傳到其它兩臺數據節點的/root/.ssh目錄下。先在其它兩臺數據節點上建立隱藏目錄.ssh
[root@hadoop2 ~]# mkdir /root/.ssh(在hadoop2上操作)
[root@hadoop3 ~]# mkdir /root/.ssh(在hadoop3上操作)
[root@hadoop4 ~]# mkdir /root/.ssh(在hadoop4上操作)
[root@hadoop1 ~]# scp /root/.ssh/id_rsa.pub 192.168.3.66:/root/.ssh
[root@hadoop1 ~]# scp /root/.ssh/id_rsa.pub 192.168.3.67:/root/.ssh
[root@hadoop1 ~]# scp /root/.ssh/id_rsa.pub 192.168.3.64:/root/.ssh
驗證這3臺數據節點上分別查看是否拷貝過去了?並且重新命名爲authized_keys文件
[root@hadoop2 ~]# mv /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys(在hadoop2上操作)
[root@hadoop3 ~]# mv /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys(在hadoop3上操作)
[root@hadoop4 ~]# mv /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys(在hadoop4上操作)
現在可以驗證從hadoop1登錄hadoop2、hadoop3、hadoop4上是否還需要輸入密碼了?如果不需要那麼說明則可以了。(如下圖)
[root@hadoop1 ~]# ssh hadoop2
Last login: Mon Jun 25 09:38:22 2012 from zengzhunzhun.ninetowns.cn
[root@hadoop1 ~]# ssh hadoop3
Last login: Mon Jun 25 13:52:12 2012 from zengzhunzhun.ninetowns.cn
[root@hadoop1 ~]# ssh hadoop4
Last login: Mon Jun 25 10:41:01 2012 from 172.16.7.65
拷貝hadoop1上的root用戶的公鑰id_rsa.pub重命名爲authorized_keys文件
[root@hadoop1 ~]# cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
驗證本機登錄是否需要密碼?
[root@hadoop1 ~]# ssh hadoop1
Last login: Tue Jun 26 13:38:28 2012 from zengzhunzhun.ninetowns.cn
上述條件我們只測試了hadoop1登錄hadoop2、hadoop3、hadoop4和它自己不需要密碼,但是hadoop2登錄hadoop3、hadoop1、hadoop4還是需要密碼的,我們的目的就是讓其中任意兩臺機器都能登錄另外不需要輸入密碼。
把hadoop1上的私鑰id_rsa分別上傳到hadoop2、hadoop3、hadoop4機器的/root/.ssh/下,不需要重命名。
[root@hadoop1:~]# scp /root/.ssh/id_rsa 192.168.3.66:/root/.ssh
[root@hadoop1:~]# scp /root/.ssh/id_rsa 192.168.3.67:/root/.ssh
[root@hadoop1:~]# scp /root/.ssh/id_rsa 192.168.3.64:/root/.ssh
驗證文件是否傳過去,如果過去就可以測試了。隨便找一臺機器登錄其它兩臺,如果可以,那麼我們接着往下一步(這裏不做任何闡述)
3、在/root/hadoop/conf目錄下的hadoop-env.sh中設置Hadoop需要的環境變量,其中JAVA_HOME是必須設定的變量。如下圖所示:
export JAVA_HOME=/usr/java/jdk1.6.0_14
修改slaves文件
如前所述,在hadoop1(NameNode)的hadoop/conf目錄下,打開slaves文件,該文件用來指定所有的DataNode,一行指定一個主機名。即本文中的hadoop2、hadoop3、hadoop4。因此slaves文件看起來應該是這樣的:
hadoop2
hadoop3
hadoop4
修改masters文件
打開masters文件,該文件用來指定備份節點Secondarynamenode,生產上環境部署不會將namenode和Secondarynamenode同時部署在一臺服務器上,內容如下:
hadoop4
修改core-site.xml文件
core-site.xml是hadoop核心的配置文件,這裏配置的是hdfs的地址和端口
core-site.xml的添加如下內容:
<configuration>
    <property>
          <name>fs.default.name</name>
          <value>hdfs://hadoop1:9000</value>
    </property>
</configuration>
修改hdfs-site.xml文件
將默認的/root/hadoop/src/hdfs/hdfs-default.xml文件拷貝一份到/root/hadoop/conf目錄下並且重命名爲hdfs-site.xml,執行如下命令拷貝:
[root@hadoop1:~]# cp /root/hadoop/src/hdfs/hdfs-default.xml  /root/hadoop/conf/hdfs-site.xml
修改dfs.name.dir的目錄,因爲默認是在/tmp目錄下,linux系統重啓時可能會造成臨時目錄的文件丟失。
 
改爲
 
修改dfs.data.dir的目錄,原理同上:
 
改爲
 
還有一處需要注意的是dfs.replication的值,hadoop默認設置爲3(文件塊備份份數),正好我也有3個數據節點,所有不用修改。
修改mapred-site.xml文件
mapred-site.xml是mapreduce的配置文件,配置的是jobtracker的地址和端口
<configuration>
      <property>
            <name>mapred.job.tracker</name>
            <value>hadoop1:9001</value>
      </property>
</configuration>
文件基本修改完成了。下面開始部署hadoop了。
現在需要將hadoop部署到其他的機器上,保證目錄結構一致。
[root@hadoop1 ~]# scp -r /root/hadoop hadoop2:/root
[root@hadoop1 ~]# scp -r /root/hadoop hadoop3:/root
[root@hadoop1 ~]# scp -r /root/hadoop hadoop4:/root
至此,可以說,Hadoop已經在各個機器上部署完畢了,下面就讓我們開始啓動Hadoop吧。
啓動之前,我們先要格式化namenode,先進入~/hadoop/目錄,執行下面的命令:
[root@hadoop1 hadoop]# bin/hadoop namenode -format
不出意外,應該會提示格式化成功。如果不成功,就去hadoop/logs/目錄下去查看日誌文件。如果之前你格式化過了,再想格式化一次,必須刪除/tmp和/data目錄下的文件纔可以。
下面就該正式啓動hadoop啦,在bin/下面有很多啓動腳本,可以根據自己的需要來啓動。
* start-all.sh 啓動所有的Hadoop守護。包括namenode, datanode, jobtracker, tasktrack
* stop-all.sh 停止所有的Hadoop
* start-mapred.sh 啓動Map/Reduce守護。包括Jobtracker和Tasktrack
* stop-mapred.sh 停止Map/Reduce守護
* start-dfs.sh 啓動Hadoop DFS守護.Namenode和Datanode
* stop-dfs.sh 停止DFS守護
在這裏,簡單啓動所有守護:
[root@hadoop1 hadoop]# bin/start-all.sh
啓動的時候hadoop1上會有2個java進程,用jps命令查看進程,分別是NameNode,JobTracker。
hadoop2和hadoop3上面應該是datanode、tasktracker進程。而hadoop4上面是datanode、tasktracker、secondarynamenode三個進程。
查看集羣的狀態
[root@hadoop1 ~]# hadoop/bin/hadoop dfsadmin -report
Warning: $HADOOP_HOME is deprecated.
Configured Capacity: 3242369060864 (2.95 TB)
Present Capacity: 2914902978560 (2.65 TB)
DFS Remaining: 2890176589824 (2.63 TB)
DFS Used: 24726388736 (23.03 GB)
DFS Used%: 0.85%
Under replicated blocks: 4
Blocks with corrupt replicas: 0
Missing blocks: 0
-------------------------------------------------
Datanodes available: 3 (3 total, 0 dead)
Name: 192.168.3.64:50010
Decommission Status : Normal
Configured Capacity: 1960094191616 (1.78 TB)
DFS Used: 8242106368 (7.68 GB)
Non DFS Used: 156155813888 (145.43 GB)
DFS Remaining: 1795696271360(1.63 TB)
DFS Used%: 0.42%
DFS Remaining%: 91.61%
Last contact: Tue Jun 26 15:21:44 CST 2012
 
Name: 192.168.3.67:50010
Decommission Status : Normal
Configured Capacity: 713072295936 (664.1 GB)
DFS Used: 8242180096 (7.68 GB)
Non DFS Used: 53200564224 (49.55 GB)
DFS Remaining: 651629551616(606.88 GB)
DFS Used%: 1.16%
DFS Remaining%: 91.38%
Last contact: Tue Jun 26 15:21:44 CST 2012
 
Name: 192.168.3.66:50010
Decommission Status : Normal
Configured Capacity: 569202573312 (530.11 GB)
DFS Used: 8242102272 (7.68 GB)
Non DFS Used: 118109704192 (110 GB)
DFS Remaining: 442850766848(412.44 GB)
DFS Used%: 1.45%
DFS Remaining%: 77.8%
Last contact: Tue Jun 26 15:21:44 CST 2012
還可以查看http://192.168.3.65:50030或者http://192.168.3.65:50070通過網頁查看集羣的狀態。這裏就不說了!
同樣,如果要停止hadoop,則執行如下命令:
[root@hadoop1 hadoop]# bin/stop-all.sh
還有一些hdfs文件系統使用的方法我就不多介紹了。網上很多文檔,大家去google吧!
 
轉載自:http://blog.chinaunix.net/uid-23916356-id-3254578.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章