Ubuntu_10.04下Hadoop-0.20.2集羣配置手冊java
1、軟硬件環境的準備node
下面的文章來自hadoopor.com,我先交待一下我本身的環境: 兩臺機器,每臺機器上面兩個虛機(vmware 均以橋接方式,也就是說4個虛機都有各自獨立的內網IP)都是ubuntu10.04,宿主機都是windowsxp,用SecureCRT(嚴重推薦,好使)鏈接各個副機。最後按下文配置,成功運行~另:機器之間的文件用SCP命令吧,好使~~~linux
////////////////////////////////////////////////////////////////////////////////web
集羣包含三個節點:1個namenode,3個datanode,節點之間局域網鏈接,能夠相互ping通。操做系統ubuntu 10.04節點IP地址分佈以下:apache
hadoop-namenode:ubuntu
hadoop-datanode1:vim
hadoop-datanode2:windows
hadoop-datanode3:併發
修改/etc/hosts文件以下:ssh
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,是他們內容一致。
安裝JDK環境:
下載JDK安裝包jdk-6u20-linux-i586.bin,進行安裝,而後把安裝目錄移到/usr/lib/ jdk1.6.0_20,
而後ln –s /usr/lib/jdk1.6.0_20/bin/java /usr/bin/java
在/etc/profile下面設置JDK_HOME變量
export JDK_HOME=/usr/lib/jdk1.6.0_20
JDK環境的操做須要在全部的namenode和datanode上面進行操做。
SSH無密碼驗證配置
Hadoop須要使用SSH協議,namenode將使用SSH協議啓動namenode和datanode進程,(datanode向namenode傳遞心跳信息可能也是使用SSH協議,這是我認爲的,尚未作深刻了解)。許多教程上介紹Hadoop集羣配置時只說明瞭namenode上SSH無密碼登陸全部datanode,我在配置時發現必須使datanode上也能SSH無密碼登陸到namenode,Hadoop集羣才能正常啓動(也許這不是必須的,只是個人一個失誤,可是這樣可以正常啓動Hadoop集羣)。
*配置Namenode無密碼登陸全部Datanode
(0)原理
Namenode做爲客戶端,要實現無密碼公鑰認證,鏈接到服務端datanode上時,須要在namenode上生成一個密鑰對,包括一個公鑰和一個私鑰,然後將公鑰複製到datanode上。當namenode經過ssh鏈接datanode時,datanode就會生成一個隨機數並用namenode的公鑰對隨機數進行加密,併發送給namenode。namenode收到加密數以後再用私鑰進行解密,並將解密數回傳給datanode,datanode確認解密數無誤以後就容許namenode進行鏈接了。這就是一個公鑰認證過程,其間不須要用戶手工輸入密碼。重要過程是將客戶端namenode公鑰複製到datanode上。
(1)全部機器上生成密碼對
全部節點上執行如下命令:
root@hadoop-namenode# ssh-keygen
而後一路回車就能夠了。
這將在/root/.ssh/目錄下生成一個私鑰id_rsa和一個公鑰id_rsa.pub。
把namenode節點上面的id_rsa.pub 複製到全部datanode節點/root/.ssh/位置。
(注意:原文沒有細說,這是指把id_rsa.pub先拷貝成authorized_keys,再將authorized_keys複製到其它datanode上的)
root@hadoop-namenode# cp id_rsa.pub authorized_keys
namenode的公鑰
root@hadoop-namenode# chmod 644 authorized_keys
使用SSH協議將namenode的公鑰信息authorized_keys複製到全部DataNode的.ssh目錄下(.ssh下最初沒有authorized_keys,若是有,則須要複製追加,後面會講到如何追加)。
root@hadoop-namenode# scp authorized_keys data節點ip地址:/root/.ssh
這樣配置事後,namenode能夠無密碼登陸全部datanode,能夠經過命令
「ssh 節點ip地址」來驗證。有些手冊上介紹的配置方法與此不一致,可是這種方法是成功的。不少手冊到此步SSH配置就完成了,可是我實驗時發現不能正常啓動hadoop,因此我還繼續作了配置。
*配置每一個Datanode無密碼登陸Namenode
(0)原理
Namenode鏈接datanode時namenode是客戶端,須要將namenode上的公鑰複製到datanode上,那麼,若是datanode主動鏈接namenode,datanode是客戶端,此時須要將datanode上的公鑰信息追加到namenode中的authorized_keys之中。(此時,因爲namenode中已經存在authorized_keys文件,因此這裏是追加)。
若是進一步須要datanode之間實現公鑰無密碼驗證,則一樣須要相互之間追加公鑰信息
(1)將各個datanode上的id_rsa.pub追加到namenode的authorized_keys
在全部datanode上依次執行以下命令:
root@hadoop-datanode1# scp id_rsa.pub namenode ip地址:/root/.ssh/datanode ip地址.id_rsa.pub
這將datanode上以前產生的公鑰id_rsa.pub複製到namenode上的.ssh目錄中,並重命名爲datanode ip地址.id_rsa.pub,這是爲了區分從各個datanode上傳過來的公鑰。
複製完畢,在namenode上執行如下命令,將每一個datanode的公鑰信息追加:
root@hadoop-namenode# cat datanode ip地址.id_rsa.pub >> authorized_keys
這樣,namenode和datanode之間即可以相互ssh上並不須要密碼......
注意:整個過程當中只涉及到建立密鑰,複製公鑰,添加公鑰內容,沒有更改配置文件,實際上配置文件/etc/ssh/sshd_config中開啓了公鑰驗證
{
RSAAuthentication yes
PubkeyAuthentication yes
}
(2)SSH配置完畢
至此,namenode能無密碼驗證登錄每一個datanode。每一個datanode也能無密碼驗證SSH登錄到namenode。
2、hadoop配置
1.安裝
下載hadoop發行版,地址:http://apache.freelamp.com/hadoop/core/stable/
安裝Hadoop集羣一般要將安裝軟件解壓到集羣內的全部機器上。而且安裝路徑要一致,若是咱們用HADOOP_HOME指代安裝的根路徑,一般,集羣裏的全部機器的HADOOP_HOME路徑相同。
一般,集羣裏的一臺機器被指定爲NameNode,另外一臺不一樣的機器被指定爲JobTracker。這些機器是masters。餘下的機器即做爲DataNode也做爲TaskTracker。這些機器是slaves。
下載安裝包後,直接解壓安裝便可:
$tar –zxvf hadoop-0.20.2.tar.gz
$cd hadoop-0.20.2
注:若是集羣內機器的環境徹底同樣,能夠在一臺機器上把Hadoop0.20.2集羣配置好,而後把配置好的軟件即hadoop-0.20.2整個文件夾拷貝到其餘機器的相同位置便可。
2.配置
編輯conf/hadoop-env.sh文件,至少須要將JAVA_HOME設置爲Java安裝根路徑。
配置core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/tmp</value>
(注意,請先在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持久存儲名字空間及事務日誌的本地文件系統路徑。當這個值是一個逗號分割的目錄列表時,nametable數據將會被複制到全部目錄中作冗餘備份。
dfs.data.dir是DataNode存放塊數據的本地文件系統路徑,逗號分割的列表。當這個值是逗號分割的目錄列表時,數據將被存儲在全部目錄下,一般分佈在不一樣設備上。
dfs.replication是數據須要備份的數量,默認是3,若是此數大於集羣的機器數會出錯。
注意:此處的name一、name二、data一、data2目錄不能預先建立,hadoop格式化時會自動建立,若是預先建立反而會有問題。
(c)配置hdfs-site.xml
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/opt/hadoop/hadoopfs/name1,/opt/hadoop/hadoopfs/name2</value> #hadoop的name目錄路徑
<description> </description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/opt/hadoop/hadoopfs/data1,/opt/hadoop/hadoopfs/data2</value>
<description> </description>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
dfs.name.dir是NameNode持久存儲名字空間及事務日誌的本地文件系統路徑。 當這個值是一個逗號分割的目錄列表時,nametable數據將會被複制到全部目錄中作冗餘備份。
dfs.data.dir是DataNode存放塊數據的本地文件系統路徑,逗號分割的列表。 當這個值是逗號分割的目錄列表時,數據將被存儲在全部目錄下,一般分佈在不一樣設備上。
dfs.replication是數據須要備份的數量,默認是3,若是此數大於集羣的機器數會出錯。
(d)配置mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value> hadoop-namenode[j1]:9001</value>
</property>
</configuration>
配置conf/masters和conf/slaves來設置主從結點,注意最好使用主機名,而且保證機器之間經過主機名能夠互相訪問,每一個主機名一行。
(e)配置masters文件,加入namenode的ip地址
hadoop-namenode
(f)配置slaves文件, 加入全部datanode的ip地址
hadoop-datanode1
hadoop-datanode2
hadoop-datanode3
將namenode上配置好的hadoop所在文件夾hadoop複製到全部datanode的 /opt目錄下(實際上masters,slavers文件時沒必要要的,複製了也沒問題)。
3、Hadoop集羣啓動
IP地址分佈:
NameNode:210.77.9.204
DataNode1: 210.77.9.199
DataNode2: 210.77.9.216
Namenode執行:
格式化hadoop,
root@hadoop-namenode:/opt/hadoop/hadoop-0.20.2/bin# ./hadoop namenode –format
啓動hadoop,
root@hadoop-namenode:/opt/hadoop/hadoop-0.20.2/bin#./start-all.sh
能夠經過如下啓動日誌看出,首先啓動namenode,而後啓動datanode1,datanode2,datanode3,
啓動hadoop成功後,在namenode中的tmp文件夾中生成了dfs文件夾,在datanode中的tmp文件夾中均生成了dfs文件夾和mapred文件夾。
在namenode上查看集羣狀態
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 #會出現以下狀況
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.
問題解決方法hadoop namenode -format
不過這個要注意,若是hdfs裏面有數據,那麼這麼作以後,數據會丟失。
必須是主控端ip名字