前文說到如何搭建集群中第一個節點,這篇將說到如何向集群添加節點。這篇是基於前文的,沒有看過前文的可以參考此鏈接:http://www.cnblogs.com/mikelij/archive/2012/03/06/2380937.html
2 向集群添加節點
前文已經建立了一個節點的hadoop集群。現在要做的添加節點。安裝JDK, 創建hadoop用戶等見前文。這里就不重復了。
2.1 檢查主機名,修改/etc/hostname, /etc/hosts
新節點需要在這個集群里叫一個名字,給此節點命名,比如slavenode1, slavenode2, etc.集群里新加入的服務器都需要在/etc/hostname中改名,將規定的服務器名放在/etc/hostname文件中。然后將已有服務器上的/etc/hosts拷貝過來。再加上此新節點的主機名。然后再復制到群里每一個服務器中。即所有集群中服務器的/etc/hosts文件要一樣。
2.2 配置SSH Key以便hadoop用戶無密碼登錄集群
與前文不同的是,此處只需要將之前的節點產生的ssh key等拷貝過來就可以了。用hadoop用戶登錄,
sudo apt-get install ssh
安裝完ssh就可以從已有的服務器上拷貝ssh key了。
mkdir /home/hadoop/.ssh
scp hadoop@namenode:/home/hadoop/.ssh/* /home/hadoop/.ssh/
這就拷貝過來了。之所以要從已有服務器上拷貝ssh key,是因為如果兩個服務器的ssh key不一致,則第一次連服務器時,還是需要密碼的。這里的需求是hadoop用戶連任何一個集群中的服務器都不需要密碼,因此需要拷貝已有服務器上的ssh key.
下面需要從此節點用ssh命令連 到已有的所有節點上去。已有的節點只有一個時,假設本節點的主機名是slavenode1, 就ssh namenode, ssh localhost, ssh slavenode1。如果已經有namenode, slavenode1, slavenode2... 到slavenode6, 那么就嘗試ssh namenode, ssh slavenode1, ssh slavenode2, ..., ssh slavenode6, ssh localhost. 保證這些連接都是不需要密碼就可連接的就可以了。另外在換到其他機器上,都ssh 此節點的主機名,如ssh slavenode1s。這樣的方法,就可以保證每台機器間都可以用ssh無密碼就可以連接。用的用戶都是hadoop。
2.3 安裝hadoop包
可參考前文的1.5, 這里就不重復了。
2.4 namenode上的hadoop配置
集群里要加入新的節點,可以在namenode服務器上的mapred-site.xml中加入dfs.hosts和mapred.hosts兩個元素。即象這樣:
<property>
<name>dfs.hosts</name>
<value>/usr/local/hadoop/hadoop-0.20.203.0/conf/slaves</value>
</property>
<property>
<name>mapred.hosts</name>
<value>/usr/local/hadoop/hadoop-0.20.203.0/conf/slaves</value>
</property>
然后再在/usr/local/hadoop/hadoop-0.20.203.0/conf/slaves文件中寫上集群中所有的節點的主機名。一個主機名占一行。如:
namenode
slavenode1
slavenode2
...
如果dfs.hosts和mapred.hosts已經加好了,就只需要到slaves中加入一行。
2.5 新加入節點的hadoop配置
集群中所有節點的hadoop配置要全部保持一致。即那些core-site.xml, hdfs-site.xml, mapred-site.xml, masters, slaves可以從已有節點處拷貝過來。包括/etc/environment也可以從已有節點那里拷貝過來。用scp命令,上面已經用過了,再用scp拷貝這些文件過來。
2.6 新加入節點啟動
start-dfs.sh
start-mapred.sh
2.7 通知namenode和jobtracker有新節點加入
在第一台服務器(namenode兼jobtracker)運行的情況下,到第一台服務器那里,
hadoop dfsadmin -refreshNodes
這是通知hdfs有新節點加入
hadoop mradmin -refreshNodes
這是通知jobtracker有新節點加入
2.8 驗證集群是否正常工作
還是老辦法,用一些常用命令將一些服務器上的本地文件方到服務器上,如:
hadoop fs -put testfolder uploadfolder
再拷貝,刪除等做一做。
另外驗證jobtracker和所有的tasktracker是否正常工作,還是用wordcount示例來運行:
hadoop jar hadoop-examples-0.20.203.0.jar wordcount input output
得到大概這樣的結果就對了, 即map增長到100%, reduce也增長到100%。
訪問http://namenode:50070/ 可以看到集群里所有的datanode
還有http://namenode:50030/ 可以看到集群里所有的tasktracker
2.7 啟動集群
namenode上運行:
start-all.sh
slavenode上運行:
start-dfs.sh
start-mapred.sh
2.8 停止集群
slavenode上運行:
stop-mapred.sh
stop-dfs.sh
namenode上運行:
stop-all.sh
2.9 遇到的問題
Too many fetch-failures問題
這次還是遇到了這個問題,和單機時一樣的錯誤信息Too many fetch-failures,略有不同的是reduce不是卡在0%,而是卡在17%那里就不動了。
這次又是到處檢查,最后發現是第一台服務器的/etc/hosts文件里少寫了一個服務器名字。將這個服務器名字補上以后,這個wordcount示例就可以正常運行了。
所以集群中所有服務器的/etc/hosts, core-site.xml, hdfs-site.xml, mapred-site.xml, masters, slaves,還有ssh key所在.ssh目錄等文件和目錄都需完全一樣。
以上說的是往集群里添加節點,這里說的是添加第二個節點,此過程適用於以后所有新節點的添加。第三個一直到第n個都是按同樣的方法來添加。只要重復以上過程就可以了。
本文就說到這里。后文再說一些hadoop集群管理的內容。
