一、準備5臺機器:
1臺NameNode,處於active狀態。
1臺NameNode,處於standBy狀態,如果主NameNode掛了,自動切換到standBy機器,屬於Hdoop的HA。可以由很多臺處於standBy狀態的NameNode,一般一臺就夠了。同一時刻,只能有一臺處於active狀態的NameNode 。
另外3臺是DataNode。
二、修改主機名稱,用於hadoop機器間的通訊。
1)、修改DNS解析,vi /etc/hosts
192.168.62.156 hadoopNameNode
192.168.62.155 standByNameNode
192.168.62.152 152dataNode
192.168.62.153 153dataNode
192.168.62.154 154dataNode
2)、同時對127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4中的localhost.localdomain 也分別改名字爲hadoopNameNode standByNameNode 152dataNode 153dataNode 154dataNode
此命令後,機器之間可以通過ping 153dataNode的方式,直接ping 192.168.62.153
3)、分別修改主機名稱:vi /etc/sysconfig/network
修改HOSTNAME=hadoopNameNode
修改HOSTNAME=standByNameNode
修改HOSTNAME=152dataNode
修改HOSTNAME=153dataNode
修改HOSTNAME=154dataNode
三、安裝了JDK,,另需要安裝ssh。執行 ssh命令如果顯示說明SSH已經安裝成功。
usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
[-D [bind_address:]port] [-e escape_char] [-F configfile]
[-I pkcs11] [-i identity_file]
[-L [bind_address:]port:host:hostport]
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
[-R [bind_address:]port:host:hostport] [-S ctl_path]
[-W host:port] [-w local_tun[:remote_tun]]
[user@]hostname [command]
四、配置SSH 免密碼登陸(每一臺服務器上都要執行)
1)、在每一臺服務器上執行:
ssh-keygen -t rsa 之後一路回 車(產生祕鑰,會自動產生一個.ssh文件
位於:./root/.ssh下。
2)、cd /root/.ssh
執行: cp id_rsa.pub authorized_keys
此時執行ssh localhost或ssh IP,無需輸入密碼就能登錄。
上面實際上是生成了公鑰和私鑰,每臺服務器要將自己的公鑰發給其他所有機器。
3)、將每臺服務器的id_rsa.pub文件(公鑰)發送給其他機器(一般先輸入yes,再輸入密碼纔會發送過去)
1)、在hadoopNameNode服務器上執行:
scp /root/.ssh/id_rsa.pub standByNameNode:/root/.ssh/hadoopNameNode.pub
scp /root/.ssh/id_rsa.pub 152dataNode:/root/.ssh/hadoopNameNode.pub
scp /root/.ssh/id_rsa.pub 153dataNode:/root/.ssh/hadoopNameNode.pub
scp /root/.ssh/id_rsa.pub 154dataNode:/root/.ssh/hadoopNameNode.pub
2)、在standByNameNode服務器上執行:
scp /root/.ssh/id_rsa.pub hadoopNameNode:/root/.ssh/standByNameNode.pub
scp /root/.ssh/id_rsa.pub 152dataNode:/root/.ssh/standByNameNode.pub
scp /root/.ssh/id_rsa.pub 153dataNode:/root/.ssh/standByNameNode.pub
scp /root/.ssh/id_rsa.pub 154dataNode:/root/.ssh/standByNameNode.pub
3)、在152dataNode服務器上執行:
scp /root/.ssh/id_rsa.pub hadoopNameNode:/root/.ssh/152dataNode.pub
scp /root/.ssh/id_rsa.pub standByNameNode:/root/.ssh/152dataNode.pub
scp /root/.ssh/id_rsa.pub 153dataNode:/root/.ssh/152dataNode.pub
scp /root/.ssh/id_rsa.pub 154dataNode:/root/.ssh/152dataNode.pub
4)、在153dataNode服務器上執行:
scp /root/.ssh/id_rsa.pub hadoopNameNode:/root/.ssh/153dataNode.pub
scp /root/.ssh/id_rsa.pub standByNameNode:/root/.ssh/153dataNode.pub
scp /root/.ssh/id_rsa.pub 152dataNode:/root/.ssh/153dataNode.pub
scp /root/.ssh/id_rsa.pub 154dataNode:/root/.ssh/153dataNode.pub
5)、在154dataNode服務器上執行:
scp /root/.ssh/id_rsa.pub hadoopNameNode:/root/.ssh/154dataNode.pub
scp /root/.ssh/id_rsa.pub standByNameNode:/root/.ssh/154dataNode.pub
scp /root/.ssh/id_rsa.pub 152dataNode:/root/.ssh/154dataNode.pub
scp /root/.ssh/id_rsa.pub 153dataNode:/root/.ssh/154dataNode.pub
4.在每臺機器上執行公鑰都追加到授權文件裏
1)、在hadoopNameNode服務器上執行:
cat /root/.ssh/standByNameNode.pub >> /root/.ssh/authorized_keys
cat /root/.ssh/152dataNode.pub >> /root/.ssh/authorized_keys
cat /root/.ssh/153dataNode.pub >> /root/.ssh/authorized_keys
cat /root/.ssh/154dataNode.pub >> /root/.ssh/authorized_keys
2)、在standByNameNode服務器上執行:
cat /root/.ssh/hadoopNameNode.pub >> /root/.ssh/authorized_keys
cat /root/.ssh/152dataNode.pub >> /root/.ssh/authorized_keys
cat /root/.ssh/153dataNode.pub >> /root/.ssh/authorized_keys
cat /root/.ssh/154dataNode.pub >> /root/.ssh/authorized_keys
3)、在152dataNode服務器上執行:
cat /root/.ssh/standByNameNode.pub >> /root/.ssh/authorized_keys
cat /root/.ssh/hadoopNameNode.pub >> /root/.ssh/authorized_keys
cat /root/.ssh/153dataNode.pub >> /root/.ssh/authorized_keys
cat /root/.ssh/154dataNode.pub >> /root/.ssh/authorized_keys
4)、在153dataNode服務器上執行:
cat /root/.ssh/hadoopNameNode.pub >> /root/.ssh/authorized_keys
cat /root/.ssh/standByNameNode.pub >> /root/.ssh/authorized_keys
cat /root/.ssh/152dataNode.pub >> /root/.ssh/authorized_keys
cat /root/.ssh/154dataNode.pub >> /root/.ssh/authorized_keys
5)、在154dataNode服務器上執行:
cat /root/.ssh/hadoopNameNode.pub >> /root/.ssh/authorized_keys
cat /root/.ssh/standByNameNode.pub >> /root/.ssh/authorized_keys
cat /root/.ssh/152dataNode.pub >> /root/.ssh/authorized_keys
cat /root/.ssh/153dataNode.pub >> /root/.ssh/authorized_keys
5)、驗證ssh是否免密碼成功 152dataNode hostname
152dataNode
6)、搭建Zookeeper集羣,參考我的其他文章
目前在這3臺機器上搭建了zookeeper集羣
192.168.62.153:2181,192.168.62.154:2181,192.168.62.155:2181
7)、在每一臺機器上建立如下目錄:
1)在操作系統下建立級聯文件夾
mkdir -p /tmp/hadoop/name
mkdir -p /tmp/hadoop/data
mkdir -p /tmp/hadoop/journal
mkdir -p /tmp/hadoop/tmp
2)、賦予權限
chmod 777 /tmp/hadoop/name
chmod 777 /tmp/hadoop/data
chmod 777 /tmp/hadoop/journal
chmod 777 /tmp/hadoop/tmp
chmod 777 haddop安裝目錄下/bin
chmod 777 haddop安裝目錄下/sbin
8)、haddop的配置(文件的配置在haddop安裝目錄下的/etc/haddop目錄下,只需要再其中一臺hadoop機器上配置,其他的拷貝就可以了,共涉及修改7個配置文件)
cd /soft/hadoop/etc/hadoop
1)、修改%hadoop%所在目錄下/etc/目錄下的hadoop-env.sh(vi /soft/hadoop/etc/hadoop/hadoop-env.sh)
export JAVA_HOME=/usr/java/jdk1.7.0_67
export HADOOP_OPTS=-Djava.net.preferIPv4Stack=true
2)、修改vi yarn-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_67
3)、配置slaves,vi slaves,將數據節點dataNode保存到改文件。
152dataNode
153dataNode
154dataNode
4)、配置vi core-site.xml
|
mycluster是自己取的一個名字,後面的一些配置文件中需要使用到這個名字。
5)、配置vi hdfs-site.xml
|
dfs.namenode.shared.edits.dir配置了2臺NameNode,並配置了一臺DataNode進去,否則啓動會告警不建議偶數臺配置。
n1,n2也是自己取的名字。
6)、配置vi mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
7)、vi yarn-site.xml
|
yarn.resourcemanager.zk.state-store.address配的是zookeeper集羣的地址。
10)、在一臺機器上完成配置後,只要把整個安裝包拷貝到其他機器上就可以了。
scp -r /soft/hadoop root@standByNameNode:/soft/hadoop/ 拷貝到備份節點,root用戶的/soft/hadoop目錄下
scp -r /soft/hadoop root@152dataNode:/soft/hadoop/
scp -r /soft/hadoop root@153dataNode:/soft/hadoop/
scp -r /soft/hadoop root@154dataNode:/soft/hadoop/
11)、將Hadoop的命令執行加入的環境變量中vi /etc/profile
export HADOOP_HOME=/soft/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
執行source /etc/profile
14)、在所有服務器上停止防火牆(Hadoop的通訊有各種)
service iptables stop
----------------------首次部署啓動服務---------------------------------
15)、首先啓動zookeeper集羣。
16)、在hadoopNameNode服務器上執行:hdfs zkfc -formatZK
目的是註冊到zookeeper,實現故障轉移。
17)、在每個服務器上都執行,因爲HA的haddop的format依賴於journalnode進程:
hadoop-daemon.sh start journalnode
18)、主nameNode節點下執行,這裏是mycluster是在上面的配置文件中配置的。
hadoop namenode -format mycluster
19)、在主namenode節點啓動./sbin/hadoop-daemon.shstart namenode進程
hadoop-daemon.sh start namenode
20)、在備nameNode節點執行第一行命令,這個是把備namenode節點的目錄格式化並把元數據從主namenode節點copy過來,並且這個命令不會把journalnode目錄再格式化了!
然後用第二個命令啓動備namenode進程!
hdfs namenode -bootstrapStandby
hadoop-daemon.sh start namenode
21)、在兩個namenode節點都執行以下命令(先執行的節點就成爲了active狀態的nameNode,另一個爲standBy)
hadoop-daemon.sh start zkfc
22)、在所有datanode節點都執行以下命令啓動datanode
hadoop-daemon.sh start datanode
如果啓動的時候報錯:java.io.IOException: Incompatible clusterIDs in,此時只需要清空datanode機器上/tmp/hadoop/下的所有目錄,然後重建,並chmod 777 * 就可以了。
如果還是不行,首先清空所有dataNode機器上/tmp/hadoop/下的所有目錄,然後重建,並chmod 777 *,然後重複從第15步開始執行。
23)、通過訪問主備NameNode節點,可以查看Hadoop服務器的運行狀況。
http://hadoopNameNode(IP):50070/dfshealth.jsp
http://standByNameNode(IP):50070/dfshealth.jsp
----------------------日常啓動停止服務(非首次)---------------------------------
24)、在主nameNode服務器上啓動停止hadoop服務,可把standBynameNode及dataNode服務器上的所有進程全部啓動。
啓動命令:start-dfs.sh 可通過JPS命令查看運行的java進程。
在主nameNode下的進程爲:DFSZKFailoverController、NameNode、JournalNode
standByNameNode下的進程爲:DFSZKFailoverController、NameNode、JournalNode
各DataNode下的進程爲DataNode、JournalNode
停止命令:stop-dfs.sh
25)、有時執行命令hadoop fs -ls /目錄,會報錯:
15/04/07 00:24:39 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
ls: Operation category READ is not supported in state standby
此時需要重複執行(19-21步)
------------------測試Hadoop的nameNode的HA功能---------------------------------
在主nameNode機器上執行命令 jps
15644 NameNode
3221 QuorumPeerMain
16034 Jps
15477 JournalNode
15806 DFSZKFailoverController
然後執行kill -9 15644。
此時可從備nameNode的網頁端http://standByNameNode(IP):50070/dfshealth.jsp看到已經被轉換成active狀態的nameNode節點。
如果在原先的主nameNode上重啓hadoop-daemon.sh start namenode,可以看到其狀態爲備節點。
反覆操作,可以看到nameNode主備自動切換。
25)、其他命令:
關閉dataNode節點:hadoop-daemon.sh stop datanode
參考文章: http://www.21ops.com/front-tech/10744.html
擴展閱讀:在本文中使用了一個主nameNode一個備nameNode,通常來說面對數以百萬計的文件是可行,(一百萬個文件的元數據信息佔用主nameNode大概300M的內存,一千萬佔用3G,一個億佔用30G),因此隨着文件的增長,需要通過HDFS Federation實現HDFS的多NameNode.
HDFS Federation是指HDFS集羣可同時存在多個NameNode,這些NameNode分別管理一部分數據,且共享所有DataNode的存儲資源。這種設計可解決單NameNode存在的以下幾個問題:
(1)HDFS集羣擴展性。多個NameNode分管一部分目錄,使得一個集羣可以擴展到更多節點,不再像1.0中那樣由於內存的限制制約文件存儲數目。
(2)性能更高效。多個NameNode管理不同的數據,且同時對外提供服務,將爲用戶提供更高的讀寫吞吐率。
(3)良好的隔離性。用戶可根據需要將不同業務數據交由不同NameNode管理,這樣不同業務之間影響很小。
需要注意的,HDFS Federation並不能解決單點故障問題,也就是說,每個NameNode都存在在單點故障問題,你需要爲每個namenode部署一個backup namenode以應對NameNode掛掉對業務產生的影響。