為什么使用Hadoop Ha 集群:
hadoop集群分為namenode、resourcemanager和datenode,namenode為主節(jié)點,datenode為數(shù)據(jù)節(jié)點,namenode、resourcemanager一般是單點,如果namenode、resourcemanager出現(xiàn)故障則hadoop集群不能正常使用,只能等namenode、resourcemanager修復后才能正常工作。本章搭建namenode、resourcemanager的高可用。
簡單介紹工作原理:

hadoop2.0的HA 機制有兩個namenode,一個是active namenode,狀態(tài)是active;另外一個是standby namenode,狀態(tài)是standby。兩者的狀態(tài)是可以切換的,但不能同時兩個都是active狀態(tài),最多只有1個是active狀態(tài)。只有active namenode提供對外的服務,standby namenode是不對外服務的。active namenode和standby namenode之間通過NFS或者JN(journalnode,QJM方式)來同步數(shù)據(jù)。
active namenode會把最近的操作記錄寫到本地的一個edits文件中(edits file),并傳輸?shù)絅FS或者JN中。standby namenode定期的檢查,從NFS或者JN把最近的edit文件讀過來,然后把edits文件和fsimage文件合并成一個新的fsimage,合并完成之后會通知active namenode獲取這個新fsimage。active namenode獲得這個新的fsimage文件之后,替換原來舊的fsimage文件。
這樣,保持了active namenode和standby namenode的數(shù)據(jù)的實時同步,standby namenode可以隨時切換成active namenode(譬如active namenode掛了)。而且還有一個原來hadoop1.0的secondarynamenode,checkpointnode,buckcupnode的功能:合并edits文件和fsimage文件,使fsimage文件一直保持更新。所以啟動了hadoop2.0的HA機制之后,secondarynamenode,checkpointnode,buckcupnode這些都不需要了。
詳細介紹參考:http://blog.51cto.com/sstudent/1381607
話不多說,開始環(huán)境介紹:
系統(tǒng)版本:CentOS Linux release 7.3.1611 (Core)
內核版本:Linux master 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
cpu:4核
內存8g
jdk:
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)
zookeepeer版本:zookeeper-3.4.9
| ip | node | 組件 |
|---|---|---|
| 172.16.100.93 master | DFSZKFailoverController、NameNode、 ResourceManager | jdk |
| 172.16.100.94 node1 | DataNode、JournalNode、NodeManager | jdk、zookeeper |
| 172.16.100.95 node2 | DataNode、JournalNode、NodeManager | jdk、zookeeper |
| 172.16.101.50 node3 | DFSZKFailoverController、JournalNode、NameNode | jdk、zookeeper |
將以下放到各個機器的/etc/hosts文件中
172.16.100.93 master
172.16.100.94 node1
172.16.100.95 node2
172.16.101.50 node3
node1、node2、node3 操作
本次是將zookeeper安裝在root用戶,做上免密登錄
zookeeper 安裝:
#cd /usr/local/src
#wget http://archive.apache.org/dist/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
#tar zxvf zookeeper-3.4.9.tar.gz
#mv zookeeper-3.4.9 ../zookeeper
#cd ../zookeeper/conf
#cp zoo_sample.cfg zoo.cfg
#vim zoo.cfg (添加以下配置文件)
dataDir=/usr/local/zookeeper/data/
clientPort=2181
server.1=172.16.100.94:2888:3888
server.2=172.16.100.95:2888:3888
server.3=172.16.101.50:2888:3888
#cd /usr/local/zookeeper/data
#echo "1" > myid (第一臺為1、第二臺為2、第三臺為3)
配置完后啟動zookeeper(三臺都啟動)
#cd //usr/local/zookeeper/bin
#./zkServer.sh start
#./zkServer.sh status (若一個為leader,兩個follower為正常)
hadoop安裝
創(chuàng)建hadoop 用戶,使用hadoop用戶創(chuàng)建master到node節(jié)點登錄免密,node3到各個節(jié)點免密
#useradd -d /usr/hadoop hadoop
#passwd hadoop
配置免秘鑰登錄:
#su hadoop
$ssh-keygen -t rsa (一直回車)
$cd /usr/hadoop/.ssh/
$vim authorized_keys
$chmod 600 authorized_keys (將其他機器該路徑的id_rsa.pub 文件復制到該文件即可,測試)
安裝hadoop,可以先在一臺上安裝然后同步到另外三臺機器上面,也可以都先把包下載到各個主機上面解壓到相同目錄然后在第一臺上面修改需要修改的文件,然后將文件同步到其他的機器上面,本次使用的第二個,四臺做以下操作
$cd /usr/local/src
$wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-3.0.3/hadoop-3.0.3.tar.gz
$tar zxvf hadoop-3.0.3.tar.gz
$mv hadoop-3.0.3/ /usr/hadoop/
在master上操作:
第一步在hadoop-env.sh和mapred-env.sh還有yarn-env.sh中寫上你的jdk路徑,然后將這三個文件同步到其他主機上面去
修改hadoop的環(huán)境變量
$vim ~/.bashrc (將以下添加到該文件,每臺都需要設置)
export HADOOP_HOME=/usr/hadoop
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
修改配置文件:
$cd /usr/hadoop/etc/hadoop
$vim core-site.xml
<configuration>
<!-- 指定hdfs的nameservice為ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1/</value>
</property>
<!-- 指定hadoop臨時目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/hadoop/namenode</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>node1:2181,node2:2181,node3:2181</value>
</property>
</configuration>
修改hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///usr/hadoop/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///usr/hadoop/datanode</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址,nn1所在地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>master:8020</value>
</property>
<!-- nn1的http通信地址,外部訪問地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>master:50070</value>
</property>
<!-- nn2的RPC通信地址,nn2所在地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>node3:8020</value>
</property>
<!-- nn2的http通信地址,外部訪問地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>node3:50070</value>
</property>
<!--namenode1 RPC端口 -->
<!-- 指定NameNode的元數(shù)據(jù)在JournalNode日志上的存放位置(一般和zookeeper部署在一起) -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1:8485;node2:8485;node3:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盤存放數(shù)據(jù)的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/hadoop/journal</value>
</property>
<!--客戶端通過代理訪問namenode,訪問文件系統(tǒng),HDFS 客戶端與Active 節(jié)點通信的Java 類,使用其確定Active 節(jié)點是否活躍 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--這是配置自動切換的方法,有多種使用方法,具體可以看官網(wǎng),在文末會給地址,這里是遠程登錄殺死的方法 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 這個是使用sshfence隔離機制時才需要配置ssh免登陸 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/usr/hadoop/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔離機制超時時間,這個屬性同上,如果你是用腳本的方法切換,這個應該是可以不配置的 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<!-- 這個是開啟自動故障轉移,如果你沒有自動故障轉移,這個可以先不配 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
修改mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
修改yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
然后在該路徑創(chuàng)建workers文件,信息如下:
node1
node2
node3
配置文件修改完畢,將以上做的修改同步到其他3臺主機上面
啟動過程:
1、啟動zookeeper集群
在node1,node2, node3節(jié)點執(zhí)行如下命令:
./bin/zkServer.sh start
2、格式化zk集群
master上執(zhí)行:
/bin/hdfs zkfc -formatZK
3、啟動journalnode集群
node1, node2, node2上執(zhí)行:
./sbin/hadoop-daemon.sh start journalnode
4、格式化namenode
master上執(zhí)行:
./bin/hdfs namenode -format
5、啟動datanode
node1, node2, node3上執(zhí)行:
./sbin/hadoop-daemon.sh start datanode
6、啟動namenode
master:
./sbin/hadoop-daemon.sh start namenode
node3(namenode2):
./bin/hdfs namenode -bootstrapStandby
./sbin/hadoop-daemon.sh start namenode
此時namenode1(master)和namenode2(node3)同時處于standby狀態(tài)。
$hdfs haadmin -getServiceState nn1 (查看master的name狀態(tài))
$hdfs haadmin -getServiceState nn2(查看master2(node3)的name狀態(tài))
7、啟動zkfc服務
在namenode1(master)和namenode2(node2)上同時執(zhí)行如下命令:
./sbin/hadoop-daemon.sh start zkfc
8、功能驗證,完畢
擴展:
也可手動切換狀態(tài)
$ bin/hdfs haadmin -transitionToActive nn1 ##切換成active
$ bin/hdfs haadmin -transitionToStandby nn1 ##切換成standby
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
以上為nanmenode 節(jié)點搭建高可用,下面為ResourceManager,高可用配置
規(guī)劃:把master上面的ResourceManager做主,node3上面做備份節(jié)點
修改配置文件yarn-site.xml :
<?xml version="1.0"?>
<configuration>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster1</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>master</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node3</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node1:2181,node2:2181,node3:2181</value>
</property>
</configuration>
然后同步各個節(jié)點。
$scp yarn-site.xml node1:/usr/hadoop/etc/hadoop/
$scp yarn-site.xml node2:/usr/hadoop/etc/hadoop/
$scp yarn-site.xml node3:/usr/hadoop/etc/hadoop/
啟動節(jié)點,在master、node3上面啟動
$cd /usr/hadoop/sbin
$./yarn-daemon.sh start resourcemanager
查看狀態(tài):
$yarn rmadmin -getServiceState rm1 (查看1的yarn的狀態(tài))
$yarn rmadmin -getServiceState rm2 (查看2的yarn的狀態(tài))
測試: jps 查看master上面resourcemanager的pid,然后殺掉,
查看node3上面的resourcemanager的節(jié)點狀態(tài)