Hadoop-2.8.5的HA集群搭建
一、Hadoop HA 機制的學習
1.1、Hadoop 2.X 的架構圖
2.x版本中,HDFS架構解決了單點故障問題,即引入雙NameNode架構,同時借助共享存儲系統來進行元數據的同步,共享存儲系統類型一般有幾類,如:Shared NAS+NFS、BookKeeper、BackupNode 和 Quorum Journal Manager(QJM),上圖中用的是QJM作為共享存儲組件,通過搭建奇數結點的JournalNode實現主備NameNode元數據操作信息同步。
1.2、QJM原理
QJM全稱是Quorum Journal Manager, 由JournalNode(JN)組成,一般是奇數點結點組成。每個JournalNode對外有一個簡易的RPC接口,以供NameNode讀寫EditLog到JN本地磁盤。當寫EditLog時,NameNode會同時向所有JournalNode並行寫文件,只要有N/2+1結點寫成功則認為此次寫操作成功,遵循Paxos協議。其內部實現框架如下:
1.3、主備切換機制
要完成HA,除了元數據同步外,還得有一個完備的主備切換機制,Hadoop的主備選舉依賴於ZooKeeper。下面是主備切換的狀態圖:
上面介紹了下關於HadoopHA機制,歸納起來主要是兩塊:元數據同步和主備選舉。元數據同步依賴於QJM共享存儲,主備選舉依賴於ZKFC和Zookeeper。整個過程還是比較復雜的,如果能理解Paxos協議,那也能更好的理解這個。
詳細請參考:https://www.cnblogs.com/qcloud1001/p/7693476.html
二、hadoop2.8.5 的HA 集群搭建準備
2.1、集群搭建準備
這裏使用的是: CentOS7.0 VMware Workstation 14 SecureCRT連接工具
Hadoop-2.8.5 jdk-1.8.0_191 zookeeper-3.4.6
apache全系列資源官網下載:http://mirror.bit.edu.cn/apache/
2.2、虛擬機設置
打開VMware Workstation 14 通過ALT+E+N打開虛擬網絡編輯器
以下1、2、3 需要記錄,需要在虛擬機中配置
通過cmd也能找到網卡設置
cmd > ipconfig
2.3、虛擬機設置
虛擬機安裝可以參考: https://www.cnblogs.com/sxdcgaq8080/p/7466529.html
網絡適配器:NAT
內存:512MB~1024MB即可
安裝可以選擇:最小安裝
安裝一臺虛擬機即可,其他幾臺可以使用克隆方法:(其他幾臺虛擬機也可以在單機配置完畢後進行復制)
2.4、各虛擬機設置
2.4.1 靜態ip的設置
2.4.2 主機名的設置
2.4.3 hosts設置
2.4.3 ssh密鑰的設置
下面進行設置:可以參考我這裏的配置
修改靜態ip
這裏的ifcfg-ens33需要根據個人虛擬機的網絡名
cd /etc/sysconfig/network-scripts ls vi ifcfg-ens33
這裏修改:ONBOOT=yes,BOOTPROTO=static
添加:IPADDR=192.168.182.135 #參考前面的網卡設置
NETMASK=255.255.255.0 #參考前面的網卡設置
GATEWAY=192.168.182.2 #參考前面的網卡設置
DNS1=8.8.8.8
service network restart
進行網絡重啟後連接測試(個人/外網):ping 主機ip/www.baidu.com
其他三臺虛擬機設置如上,只有ip需要修改
主機名修改:
hostname node1 su vi /etc/sysconfig/network vi /etc/hostname
reboot
network中添加:NETWORKING=yes
HOSTNAME=node1
hostname中添加:node1
之後重啟:reboot
其他三臺虛擬機設置如上,分別修改主機名為node2,node3,node4
hosts的設置:
vi /etc/hosts
node1的修改如下:
其他三臺虛擬機設置如上,沒有變化
ssh密鑰的設置:
以下命令用於生成ssh鍵值對,復制公鑰形成 id_rsa.pub 到authorized_keys 文件中,並提供擁有者具有authorized_keys文件的讀寫權限。
ssh-keygen -t rsa cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 0600 ~/.ssh/authorized_keys
其他三臺虛擬機執行以上命令後,需要對node1進行設置,以後能通過node1免密訪問其他主機。
通過SecureCRT分別連接4臺虛擬機,需要將node1的公鑰發送到其他主機進行記錄
scp ~/.ssh/id_rsa.pub root@node2:~/.ssh/id_rsa_n1.pub scp ~/.ssh/id_rsa.pub root@node3:~/.ssh/id_rsa_n1.pub scp ~/.ssh/id_rsa.pub root@node4:~/.ssh/id_rsa_n1.pub
發送完畢後,將id_rsa_n1.pub中的內容追加到authorized_keys中
cat ~/.ssh/id_rsa_n1.pub >> ~/.ssh/authorized_keys
三臺虛擬機完成上面操作可在node1主機中進行驗證
ssh node2 ssh node3
正確的設置下登陸是不需要密碼的,用exit退出登錄
2.5、jdk1.8.0的設置安裝及hadoop2.8.5的安裝
2.5.1 jdk1.8的安裝
首先卸載原centOS系統中附帶的jdk
通過以下兩個命令查找系統中的jdk
rpm -qa | grep jdk rpm -qa | grep gcj
可能的結果是:(也有可能有其他的)
libgcj-4.1.2-42.el5
java-1.4.2-gcj-compat-1.4.2.0-40jpp.115
之後通過 yum -y remove <file>命令卸載
yum -y remove java-1.4.2-gcj-compat-1.4.2.0-40jpp.115
最後輸入java -version驗證虛擬機中是否還有jdk
接下來是安裝的過程
1、通過SecureCRT將linux版本的jdk,hadoop,zookeeper(為了後面的搭建)發送到虛擬機上
通過SFTP進行發送
發送後的tar.gz文件在~文件夾內
使用 tar -zxvf <file> 進行解壓 之後使用 mv ~/<file> /usr/local/java/ 移動到/usr/local目錄下
這裏我的目錄是在/usr/local下
2、各種環境的配置
linux的環境配置在/etc/profile中
vi /etc/profile
在文件的最後添加如下的配置(後面的也一並配置了)
這裏註意各個軟件的目錄位置
export HADOOP_HOME=/usr/local/hadoop2.8.5 export JAVA_HOME=/usr/local/java/jdk1.8.0 export ZOOKEEPER_HOME=/usr/local/zookeeper export HADOOP_MAPRED_HOME=$HADOOP_HOME export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME export YARN_HOME=$HADOOP_HOME export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export HADOOP_INSTALL=$HADOOP_HOME export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin:$PATH
後面使用 source /etc/profile 刷新文件即可
下面進行驗證:
到這裏驗證通過就說明安裝成功了。
三、HA集群搭建的設置
以上是各node上的分布:
NN:namenode DN:datanode ZK : zookeeper(QuorumPeerMain)
ZKFC : DFSZKFailoverController JN : JournalNode RM:ResourceManager
DM:DataNode、NodeManager
以下配置參考hadoop HA 官網配置:http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html
各hadoop文件配置:
cd $HADOOP_HOME ls cd etc/hadoop
該目錄下進行hadoop的配置(均在configuration標簽中配置):
core-site.xml
<property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>node1:2181,node2:2181,node3:2181</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/hadoopHA</value> </property>View Code
hdfs-site.xml
<property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>node1:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>node2:8020</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>node1:50070</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>node2:50070</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://node2:8485;node3:8485;node4:8485/mycluster</value> </property> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/opt/journal/data</value> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property>View Code
cp mapred-site.xml.template mapred-site.xml
通過這個創建mapred-site.xml配置
mapred-site.xml
<property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>View Code
yarn-site.xml
<property> <name>yarn.resourcemanager.hostname</name> <value>node1</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property>View Code
編輯slaves文件,添加以下內容
node2
node3
node4
View Code
所有配置完成之後,要全部同步到其他幾臺虛擬機
scp ./* root@node2:/usr/local/hadoop2.8.5/etc/hadoop/
scp ./* root@node3:/usr/local/hadoop2.8.5/etc/hadoop/
scp ./* root@node4:/usr/local/hadoop2.8.5/etc/hadoop/
對於zookeeper進行配置
cd $ZOOKEEPER_HOME/conf
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
修改:dataDir=/opt/zookeeper #這裏指定zookeeper的data數據目錄(沒有,需要手動創建)
在最後添加:
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
現在保存並去創建zookeeper的data數據目錄,在該目錄下
vi myid
在該文件中不同zookeeper虛擬機中配置不同(不能有錯),跟zoo.cfg後面配置的server有關,myid文件中只有1個數字即可。
node1:1
node2:2
node3:3
四、集群服務的啟動驗證
1、(node1,node2,node3)虛擬機上的zookeeper啟動
cd $ZOOKEEPER_HOME/bin
./zkServer.sh start
啟動完成後可通過 ./zkServer.sh status 進行查看
2、在node1上進行驗證
2.1、格式化操作
cd $HADOOP_HOME/bin
zkfc格式化:hdfs zkfc -format
hdfs格式化:hdfs namenode -format
2.2、HA的啟動
cd $HADOOP_HOME/sbin
./start-dfs.sh(啟動HDFS)
./start-yarn.sh(啟動YARN)
2.3、HA的驗證
各node主機的hadoop端口驗證
zookeeper各節點驗證
2.4 、外部網站驗證
Hadoop-2.8.5的HA集群搭建