hadoop HA部署
說明:
1.在hadoop2.0中通常由兩個NameNode組成,一個處於active狀態,另一個處於standby狀態。Active NameNode對外提供服務,而Standby NameNode則不對外提供服務,僅同步active namenode的狀態,
以便能夠在它失敗時快速進行切換。hadoop2.0官方提供了兩種HDFS HA的解決方案,一種是NFS,另一種是QJM。這里我們使用簡單的QJM。在該方案中,主備NameNode之間通過一組JournalNode同步元數據
信息,一條數據只要成功寫入多數JournalNode即認為寫入成功。通常配置奇數個JournalNode這里還配置了一個zookeeper集群,用於ZKFC(DFSZKFailoverController)故障轉移,當Active NameNode掛掉了,會自動切換
Standby NameNode為standby狀態
2.hadoop-2.2.0中依然存在一個問題,就是ResourceManager只有一個,存在單點故障,hadoop2.5.1開啟RM高用后可以解決這個問題,有兩個ResourceManager,一個是Active,一個是Standby,狀態由zookeeper進行協調
集群規划:
主機名 IP地址 安裝的軟件 運行的進程
node1 192.168.40.143 jdk,hadoop NameNode,DFSZKFailoverController
node2 192.168.40.144 jdk,hadoop,zookeeper NameNode,DFSZKFailoverController,DataNode,NodeManager,QuorumPeerMain,JournalNode
node3 192.168.40.145 jdk,hadoop,zookeeper DataNode,NodeManager,ResourceManager,QuorumPeerMain,JournalNode
node4 192.168.40.140 jdk,hadoop,zookeeper DataNode,NodeManager,ResourceManager,QuorumPeerMain,JournalNode
1.准備環境,四台虛擬機,64位CentOS6.5系統,hadoop版本2.5.1
192.168.40.143
192.168.40.144
192.168.40.145
192.168.40.140
2.配置hosts
在/etc/hosts下配置端口映射
192.168.40.143 node1
192.168.40.144 node2
192.168.40.145 node3
192.168.40.140 node4
3.安裝jdk1.7.0_79
4.建立hadoop運行賬號hello(四台機器一樣)
5.使用hadoop用戶操作:ssh遠程免密碼登陸
6.在node2,node3,node4上安裝zookeeper(詳細安裝步驟略,見前面文章)
7.安裝配置hadoop集群(在node1上操作)
7.1下載並解壓hadoop安裝包
tar -zxvf hadoop-2.5.1-x64.tar.gz
7.2修改配置文件(hadoop2.0所有的配置文件都在$HADOOP_HOME/etc/hadoop目錄下)
#將hadoop添加到環境變量中
vim /etc/profile
export HADOOP_HOME=/home/hello/app/hadoop-2.5.1
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
7.2.1修改core-site.xml
<configuration>
<!-- 指定hdfs的nameservice為ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1/</value>
</property>
<!-- 指定hadoop臨時目錄,tmp這個目錄需要提前建立好 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hello/app/hadoop-2.5.1/tmp</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>node2:2181,node3:2181,node4:2181</value>
</property>
</configuration>
7.2.2修改hdfs-site.xml
<configuration>
<!--指定hdfs的nameservice為ns1,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!-- ns1下面有兩個NameNode,分別是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>node1:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>node1:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>node2:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>node2:50070</value>
</property>
<!-- 指定NameNode的元數據在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node2:8485;node3:8485;node4:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盤存放數據的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hello/app/hadoop-2.5.1/journaldata</value>
</property>
<!-- 開啟NameNode失敗自動切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失敗自動切換實現方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔離機制時需要ssh免登陸 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hello/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔離機制超時時間 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
7.2.3修改mapred-site.xml
<configuration>
<!-- 指定mr框架為yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
7.2.4修改yarn-site.xml
<configuration>
<!-- 開啟RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分別指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>node3</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node4</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node2:2181,node3:2181,node4:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
7.2.5修改slaves
node2
node3
node4
7.2.6修改hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_79
7.2.7修改yarn-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_79
7.3將配置好的hadoop拷貝到其他節點
scp -r ./hadoop-2.5.1 hello@node2:/home/hello/app/
scp -r ./hadoop-2.5.1 hello@node3:/home/hello/app/
scp -r ./hadoop-2.5.1 hello@node4:/home/hello/app/
###注意:嚴格按照下面的步驟
8.啟動集群
8.1啟動zookeeper集群(分別在node2、node3、node4上啟動zk)
cd /home/hello/app/zookeeper-3.4.7
./bin/zkServer.sh start
#查看狀態:一個leader,兩個follower
./bin/zkServer.sh status
8.2啟動journalnode(分別在在node2、node3、node4上執行)
cd /weekend/hadoop-2.5.1
./sbin/hadoop-daemon.sh start journalnode
#運行/usr/java/jdk1.7.0_79/bin/jps命令檢驗,node2、node3、node4上多了JournalNode進程
8.3格式化HDFS
#在node1上執行命令:
./bin/hdfs namenode -format
#格式化后會在根據core-site.xml中的hadoop.tmp.dir配置生成個文件,這里我配置的是/home/hello/app/hadoop-2.5.1/tmp,
#然后將/home/hello/app/hadoop-2.5.1/tmp拷貝到node2的/home/hello/app/hadoop-2.5.1/下。
scp -r ./tmp/ hello@node2:/home/hello/app/hadoop-2.5.1/
##也可以這樣,建議hdfs namenode -bootstrapStandby
8.4格式化ZKFC(在node1上執行即可)
./bin/hdfs zkfc -formatZK
8.5啟動HDFS(在node1上執行)
./sbin/start-dfs.sh
8.6啟動YARN(分別在node3,node4上執行)
./sbin/start-yarn.sh
測試集群工作狀態的一些指令:
./bin/hdfs dfsadmin -report 查看hdfs的各節點狀態信息
./bin/hdfs haadmin -getServiceState nn1 查看namenode高可用
./bin/yarn rmadmin –getServiceState rm1 查看ResourceManager高可用
./sbin/hadoop-daemon.sh start namenode 單獨啟動一個namenode進程
./hadoop-daemon.sh start zkfc 單獨啟動一個zkfc進程
附:成功部署完成后的截圖