Ubuntu_10.04下Hadoop-0.20.2集群配置手冊(cè)
一、軟硬件環(huán)境的準(zhǔn)備
下面的文章來(lái)自hadoopor.com,我先交待一下我自己的環(huán)境: 兩臺(tái)機(jī)器,每臺(tái)機(jī)器上面兩個(gè)虛機(jī)(vmware 均以橋接方式,也就是說(shuō)4個(gè)虛機(jī)都有各自獨(dú)立的內(nèi)網(wǎng)IP)都是ubuntu10.04,宿主機(jī)都是windowsxp,用SecureCRT(嚴(yán)重推薦,好使)連接各個(gè)副機(jī)。最后按下文配置,成功運(yùn)行~另:機(jī)器之間的文件用SCP命令吧,好使~~~
////////////////////////////////////////////////////////////////////////////////
集群包含三個(gè)節(jié)點(diǎn):1個(gè)namenode,3個(gè)datanode,節(jié)點(diǎn)之間局域網(wǎng)連接,可以相互ping通。操作系統(tǒng)ubuntu 10.04節(jié)點(diǎn)IP地址分布如下:
hadoop-namenode:
hadoop-datanode1:
hadoop-datanode2:
hadoop-datanode3:
修改/etc/hosts文件如下:
192.168.7.132 hadoop-namenode
192.168.8.2 hadoop-datanode1
192.168.7.123 hadoop-datanode2
192.168.7.179 hadoop-datanode3
把namenode上面的hosts文件覆蓋所有datanode上面的hosts,是他們內(nèi)容一致。
安裝JDK環(huán)境:
下載JDK安裝包jdk-6u20-linux-i586.bin,進(jìn)行安裝,然后把安裝目錄移到/usr/lib/ jdk1.6.0_20,
然后ln –s /usr/lib/jdk1.6.0_20/bin/java /usr/bin/java
在/etc/profile下面設(shè)置JDK_HOME變量
export JDK_HOME=/usr/lib/jdk1.6.0_20
JDK環(huán)境的操作需要在所有的namenode和datanode上面進(jìn)行操作。
SSH無(wú)密碼驗(yàn)證配置
Hadoop需要使用SSH協(xié)議,namenode將使用SSH協(xié)議啟動(dòng)namenode和datanode進(jìn)程,(datanode向namenode傳遞心跳信息可能也是使用SSH協(xié)議,這是我認(rèn)為的,還沒(méi)有做深入了解)。許多教程上介紹Hadoop集群配置時(shí)只說(shuō)明了namenode上SSH無(wú)密碼登錄所有datanode,我在配置時(shí)發(fā)現(xiàn)必須使datanode上也能SSH無(wú)密碼登錄到namenode,Hadoop集群才能正常啟動(dòng)(也許這不是必須的,只是我的一個(gè)失誤,但是這樣能夠正常啟動(dòng)Hadoop集群)。
*配置Namenode無(wú)密碼登錄所有Datanode
(0)原理
Namenode作為客戶端,要實(shí)現(xiàn)無(wú)密碼公鑰認(rèn)證,連接到服務(wù)端datanode上時(shí),需要在namenode上生成一個(gè)密鑰對(duì),包括一個(gè)公鑰和一個(gè)私鑰,而后將公鑰復(fù)制到datanode上。當(dāng)namenode通過(guò)ssh連接datanode時(shí),datanode就會(huì)生成一個(gè)隨機(jī)數(shù)并用namenode的公鑰對(duì)隨機(jī)數(shù)進(jìn)行加密,并發(fā)送給namenode。namenode收到加密數(shù)之后再用私鑰進(jìn)行解密,并將解密數(shù)回傳給datanode,datanode確認(rèn)解密數(shù)無(wú)誤之后就允許namenode進(jìn)行連接了。這就是一個(gè)公鑰認(rèn)證過(guò)程,其間不需要用戶手工輸入密碼。重要過(guò)程是將客戶端namenode公鑰復(fù)制到datanode上。
(1)所有機(jī)器上生成密碼對(duì)
所有節(jié)點(diǎn)上執(zhí)行以下命令:
root@hadoop-namenode# ssh-keygen
然后一路回車(chē)就可以了。
這將在/root/.ssh/目錄下生成一個(gè)私鑰id_rsa和一個(gè)公鑰id_rsa.pub。
把namenode節(jié)點(diǎn)上面的id_rsa.pub 復(fù)制到所有datanode節(jié)點(diǎn)/root/.ssh/位置。
(注意:原文沒(méi)有細(xì)說(shuō),這是指把id_rsa.pub先拷貝成authorized_keys,再將authorized_keys復(fù)制到其它datanode上的)
root@hadoop-namenode# cp id_rsa.pub authorized_keys
namenode的公鑰
root@hadoop-namenode# chmod 644 authorized_keys
使用SSH協(xié)議將namenode的公鑰信息authorized_keys復(fù)制到所有DataNode的.ssh目錄下(.ssh下最初沒(méi)有authorized_keys,如果有,則需要復(fù)制追加,后面會(huì)講到如何追加)。
root@hadoop-namenode# scp authorized_keys data節(jié)點(diǎn)ip地址:/root/.ssh
這樣配置過(guò)后,namenode可以無(wú)密碼登錄所有datanode,可以通過(guò)命令
“ssh 節(jié)點(diǎn)ip地址”來(lái)驗(yàn)證。有些手冊(cè)上介紹的配置方法與此不一致,但是這種方法是成功的。很多手冊(cè)到此步SSH配置就完成了,但是我實(shí)驗(yàn)時(shí)發(fā)現(xiàn)不能正常啟動(dòng)hadoop,所以我還繼續(xù)做了配置。
*配置每個(gè)Datanode無(wú)密碼登錄Namenode
(0)原理
Namenode連接datanode時(shí)namenode是客戶端,需要將namenode上的公鑰復(fù)制到datanode上,那么,如果datanode主動(dòng)連接namenode,datanode是客戶端,此時(shí)需要將datanode上的公鑰信息追加到namenode中的authorized_keys之中。(此時(shí),由于namenode中已經(jīng)存在authorized_keys文件,所以這里是追加)。
如果進(jìn)一步需要datanode之間實(shí)現(xiàn)公鑰無(wú)密碼驗(yàn)證,則同樣需要相互之間追加公鑰信息
(1)將各個(gè)datanode上的id_rsa.pub追加到namenode的authorized_keys
在所有datanode上依次執(zhí)行如下命令:
root@hadoop-datanode1# scp id_rsa.pub namenode ip地址:/root/.ssh/datanode ip地址.id_rsa.pub
這將datanode上之前產(chǎn)生的公鑰id_rsa.pub復(fù)制到namenode上的.ssh目錄中,并重命名為datanode ip地址.id_rsa.pub,這是為了區(qū)分從各個(gè)datanode上傳過(guò)來(lái)的公鑰。
復(fù)制完畢,在namenode上執(zhí)行以下命令,將每個(gè)datanode的公鑰信息追加:
root@hadoop-namenode# cat datanode ip地址.id_rsa.pub >> authorized_keys
這樣,namenode和datanode之間便可以相互ssh上并不需要密碼......
注意:整個(gè)過(guò)程中只涉及到創(chuàng)建密鑰,復(fù)制公鑰,添加公鑰內(nèi)容,沒(méi)有更改配置文件,實(shí)際上配置文件/etc/ssh/sshd_config中開(kāi)啟了公鑰驗(yàn)證
{
RSAAuthentication yes
PubkeyAuthentication yes
}
(2)SSH配置完畢
至此,namenode能無(wú)密碼驗(yàn)證登陸每個(gè)datanode。每個(gè)datanode也能無(wú)密碼驗(yàn)證SSH登陸到namenode。
二、hadoop配置
1.安裝
下載hadoop發(fā)行版,地址:http://apache.freelamp.com/hadoop/core/stable/
安裝Hadoop集群通常要將安裝軟件解壓到集群內(nèi)的所有機(jī)器上。并且安裝路徑要一致,如果我們用HADOOP_HOME指代安裝的根路徑,通常,集群里的所有機(jī)器的HADOOP_HOME路徑相同。
通常,集群里的一臺(tái)機(jī)器被指定為NameNode,另一臺(tái)不同的機(jī)器被指定為JobTracker。這些機(jī)器是masters。余下的機(jī)器即作為DataNode也作為T(mén)askTracker。這些機(jī)器是slaves。
下載安裝包后,直接解壓安裝即可:
$tar –zxvf hadoop-0.20.2.tar.gz
$cd hadoop-0.20.2
注:如果集群內(nèi)機(jī)器的環(huán)境完全一樣,可以在一臺(tái)機(jī)器上把Hadoop0.20.2集群配置好,然后把配置好的軟件即hadoop-0.20.2整個(gè)文件夾拷貝到其他機(jī)器的相同位置即可。
2.配置
編輯conf/hadoop-env.sh文件,至少需要將JAVA_HOME設(shè)置為Java安裝根路徑。
配置core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/tmp</value>
(注意,請(qǐng)先在hadoop目錄下建立tmp文件夾)
<description>A base for other temporary directories.</description>
</property>
<!-- file system properties -->
<property>
<name>fs.default.name</name>
<value>hdfs://hadoop-namenode:9000</value>
</property>
</configuration>
dfs.name.dir是NameNode持久存儲(chǔ)名字空間及事務(wù)日志的本地文件系統(tǒng)路徑。當(dāng)這個(gè)值是一個(gè)逗號(hào)分割的目錄列表時(shí),nametable數(shù)據(jù)將會(huì)被復(fù)制到所有目錄中做冗余備份。
dfs.data.dir是DataNode存放塊數(shù)據(jù)的本地文件系統(tǒng)路徑,逗號(hào)分割的列表。當(dāng)這個(gè)值是逗號(hào)分割的目錄列表時(shí),數(shù)據(jù)將被存儲(chǔ)在所有目錄下,通常分布在不同設(shè)備上。
dfs.replication是數(shù)據(jù)需要備份的數(shù)量,默認(rèn)是3,如果此數(shù)大于集群的機(jī)器數(shù)會(huì)出錯(cuò)。
注意:此處的name1、name2、data1、data2目錄不能預(yù)先創(chuàng)建,hadoop格式化時(shí)會(huì)自動(dòng)創(chuàng)建,如果預(yù)先創(chuàng)建反而會(huì)有問(wèn)題。
(c)配置hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
(replication 是數(shù)據(jù)副本數(shù)量,默認(rèn)為3,datanode 少于3臺(tái)就會(huì)報(bào)錯(cuò))
</property>
</configuration>
(d)配置mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value> hadoop-namenode:9001</value>
</property>
</configuration>
配置conf/masters和conf/slaves來(lái)設(shè)置主從結(jié)點(diǎn),注意最好使用主機(jī)名,并且保證機(jī)器之間通過(guò)主機(jī)名可以互相訪問(wèn),每個(gè)主機(jī)名一行。
(e)配置masters文件,加入namenode的ip地址
hadoop-namenode
(f)配置slaves文件, 加入所有datanode的ip地址
hadoop-datanode1
hadoop-datanode2
hadoop-datanode3
將namenode上配置好的hadoop所在文件夾hadoop復(fù)制到所有datanode的 /opt目錄下(實(shí)際上masters,slavers文件時(shí)不必要的,復(fù)制了也沒(méi)問(wèn)題)。
三、Hadoop集群?jiǎn)?dòng)
IP地址分布:
NameNode:210.77.9.204
DataNode1: 210.77.9.199
DataNode2: 210.77.9.216
Namenode執(zhí)行:
格式化hadoop,
root@hadoop-namenode:/opt/hadoop/hadoop-0.20.2/bin# ./hadoop namenode –format
啟動(dòng)hadoop,
root@hadoop-namenode:/opt/hadoop/hadoop-0.20.2/bin#./start-all.sh
可以通過(guò)以下啟動(dòng)日志看出,首先啟動(dòng)namenode,然后啟動(dòng)datanode1,datanode2,datanode3,
啟動(dòng)hadoop成功后,在namenode中的tmp文件夾中生成了dfs文件夾,在datanode中的tmp文件夾中均生成了dfs文件夾和mapred文件夾。
在namenode上查看集群狀態(tài)
root@hadoop-namenode:/opt/hadoop/hadoop-0.20.2/bin# ./hadoop dfsadmin -report
Configured Capacity: 22339694592 (20.81 GB)
Present Capacity: 10691964928 (9.96 GB)
DFS Remaining: 10691891200 (9.96 GB)
DFS Used: 73728 (72 KB)
DFS Used%: 0%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
-------------------------------------------------
Datanodes available: 3 (3 total, 0 dead)
Name: 192.168.7.179:50010
Decommission Status : Normal
Configured Capacity: 7446564864 (6.94 GB)
DFS Used: 24576 (24 KB)
Non DFS Used: 3950833664 (3.68 GB)
DFS Remaining: 3495706624(3.26 GB)
DFS Used%: 0%
DFS Remaining%: 46.94%
Last contact: Thu Jul 15 14:03:33 CST 2010
Name: 192.168.8.2:50010
Decommission Status : Normal
Configured Capacity: 7446564864 (6.94 GB)
DFS Used: 24576 (24 KB)
Non DFS Used: 3746869248 (3.49 GB)
DFS Remaining: 3699671040(3.45 GB)
DFS Used%: 0%
DFS Remaining%: 49.68%
Last contact: Thu Jul 15 14:03:33 CST 2010
Name: 192.168.7.123:50010
Decommission Status : Normal
Configured Capacity: 7446564864 (6.94 GB)
DFS Used: 24576 (24 KB)
Non DFS Used: 3950026752 (3.68 GB)
DFS Remaining: 3496513536(3.26 GB)
DFS Used%: 0%
DFS Remaining%: 46.95%
Last contact: Thu Jul 15 14:03:33 CST 2010
web 方式查看:http:// namenode ip地址:50070 例如:http://192.168.7.132:50070
ERROR:
[root@localhost ~]# hadoop fs -ls #會(huì)出現(xiàn)如下情況
09/04/27 01:23:28 INFO ipc.Client: Retrying connect to server: /192.168.13.129:9000. Already tried 0 time(s). 這里為什么連接不上呢?
09/04/27 01:23:29 INFO ipc.Client: Retrying connect to server: /192.168.13.129:9000. Already tried 1 time(s).
09/04/27 01:23:30 INFO ipc.Client: Retrying connect to server: /192.168.13.129:9000. Already tried 2 time(s).
09/04/27 01:23:31 INFO ipc.Client: Retrying connect to server: /192.168.13.129:9000. Already tried 3 time(s).
09/04/27 01:23:32 INFO ipc.Client: Retrying connect to server: /192.168.13.129:9000. Already tried 4 time(s).
09/04/27 01:23:33 INFO ipc.Client: Retrying connect to server: /192.168.13.129:9000. Already tried 5 time(s).
09/04/27 01:23:34 INFO ipc.Client: Retrying connect to server: /192.168.13.129:9000. Already tried 6 time(s).
09/04/27 01:23:35 INFO ipc.Client: Retrying connect to server: /192.168.13.129:9000. Already tried 7 time(s).
09/04/27 01:23:36 INFO ipc.Client: Retrying connect to server: /192.168.13.129:9000. Already tried 8 time(s).
09/04/27 01:23:37 INFO ipc.Client: Retrying connect to server: /192.168.13.129:9000. Already tried 9 time(s).
查看log 日志vim logs/hadoop-root-namenode-cwb.com.log
ERROR org.apache.hadoop.hdfs.server.namenode.FSNamesystem: FSNamesystem initialization failed.
org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /tmp/hadoop-root/dfs/name is in an inconsistent state: storage directory does not exist or is not accessible.
問(wèn)題解決方法hadoop namenode -format
不過(guò)這個(gè)要注意,如果hdfs里面有數(shù)據(jù),那么這么做之后,數(shù)據(jù)會(huì)丟失。