topology
1 Hadoop2.0 HA 叢集搭建步驟
1.1 架構圖
1.2 叢集節點分配
- hadoop1
Zookeeper
NameNode(active)
Resourcemanager (active)
- hadoop2
Zookeeper
NameNode (standby)
- hadoop3
Zookeeper
ResourceManager(standby)
- hadoop4
DataNode
NodeManager
JournalNode
- hadoop5
DataNode
NodeManager
JournalNode
- hadoop6
DataNode
NodeManager
JournalNode
1.3 安裝步驟
1.3.1 固化IP
修改配置檔案
cd /etc/sysconfig/network-scripts #進入網路配置目錄
dir ifcfg* #找到網路卡配置檔案
ifcfg-eno16777736 ifcfg-lo
vi ifcfg-eno16777736
配置檔案內容
TYPE=Ethernet
BOOTPROTO=static #改成static,針對NAT
NAME=eno16777736
UUID=4cc9c89b-cf9e-4847-b9ea-ac713baf4cc8
DEVICE=eno16777736
ONBOOT=yes #開機啟動此網路卡
IPADDR=192.168.163.129 #固定IP地址
NETMASK=255.255.255.0 #子網掩碼
GATEWAY=192.168.163.2 #閘道器和NAT自動配置的相同,不同則無法登入
DNS1=192.168.163.2 #和閘道器相同
重啟網路
service network restart
ping www.baidu.com
1.3.2 永久關閉每臺機器的防火牆
systemctl stop firewalld.service #關閉防火牆服務
systemctl disable firewalld.service #禁止防火牆開啟啟動
firewall-cmd --state #檢查防火牆狀態
1.3.3 為每臺機器配置主機名
hadoop1,hadoop2 ……
以及hosts檔案
配置主機名
執行:vim /etc/hostname 修改為hadoop1~6
然後執行 hostname 主機名
達到不重啟生效目的
配置hosts檔案
執行:vim /etc/hosts
示例:
127.0.0.1 localhost ::1 localhost 192.168.65.121 hadoop1 192.168.65.122 hadoop2 192.168.65.123 hadoop3 192.168.65.124 hadoop4 192.168.65.125 hadoop5 192.168.65.126 hadoop6
1.3.4 通過遠端命令將配置好的hosts檔案scp到其他5臺節點上
執行:scp /etc/hosts hadoop2:/etc
1.3.5 為每臺機器配置ssh免祕鑰登入
執行:ssh-keygen
ssh-copy-id root@hadoop1 (分別傳送到6臺節點上)
vim /root/.ssh/known_hosts 檢查是否配置成功
1.3.6 為每臺機器安裝jdk和配置JAVA_HOME
vim /etc/profile
在尾行新增
JAVA_HOME=/home/app/jdk1.8.0_65 JAVA_BIN=/home/app/jdk1.8.0_65/bin HADOOP_HOME=/home/app/hadoop-2.7.1 PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME JAVA_BIN HADOOP_HOME PATH CLASSPATH
1.3.7 前三臺機器安裝和配置zookeeper
解壓安裝包 tar -xvf zookeeper-3.4.8.tar.gz
進入conf目錄 cd zookeeper-3.4.8/conf/
複製zoo_sample.cfg 為zoo.cfg: cp zoo_sample.cfg zoo.cfg
編輯zoo.cfg:vim zoo.cfg
Zookeeper根目錄中建立tmp資料夾,tmp資料夾中建立myid檔案,編輯文字:1(2,3)
拷貝整個zookeeper目錄到hadoop2,hadoop3並修改myid檔案分別為1,2
scp -r zookeeper-3.4.8 hadoop2:/home/app
1.3.8 安裝和配置01節點的hadoop
解壓安裝包
cd etc/hadoop
配置 hadoop-env.sh
配置jdk安裝所在目錄
配置hadoop配置檔案所在目錄
1.3.9 配置core-site.xml
<configuration> <!--用來指定hdfs的老大,ns為固定屬性名,表示兩個namenode--> <property> <name>fs.defaultFS</name> <value>hdfs://ns</value> </property> <!--用來指定hadoop執行時產生檔案的存放目錄--> <property> <name>hadoop.tmp.dir</name> <value>/home/app/hadoop-2.7.1/tmp</value> </property> <!--執行zookeeper地址--> <property> <name>ha.zookeeper.quorum</name> <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value> </property> </configuration>
1.3.10 配置01節點的hdfs-site.xml
<configuration> <!--執行hdfs的nameservice為ns,和core-site.xml保持一致--> <property> <name>dfs.nameservices</name> <value>ns</value> </property> <!--ns下有兩個namenode,分別是nn1,nn2--> <property> <name>dfs.ha.namenodes.ns</name> <value>nn1,nn2</value> </property> <!--nn1 的 RPC 通訊地址--> <property> <name>dfs.namenode.rpc-address.ns.nn1</name> <value>hadoop1:9000</value> </property> <!--nn1的http通訊地址--> <property> <name>dfs.namenode.http-address.ns.nn1</name> <value>hadoop1:50070</value> </property> <!--nn2的RPC通訊地址--> <property> <name>dfs.namenode.rpc-address.ns.nn2</name> <value>hadoop2:9000</value> </property> <!--nn2 的 http 通訊地址--> <property> <name>dfs.namenode.http-address.ns.nn2</name> <value>hadoop2:50070</value> </property> <!--指定namenode的後設資料在JournalNode上的存放位置,這樣,namenode2可以 從 jn 叢集裡獲取最新的namenode的資訊,達到熱備的效果--> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop4:8485;hadoop5:8485;hadoop6:8485/ns</value> </property> <!--指定 JournalNode 存放資料的位置--> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/app/hadoop-2.7.1/journal</value> </property> <!--開啟namenode故障時自動切換--> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!--配置切換的實現方式--> <property> <name>dfs.client.failover.proxy.provider.ns</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!--配置隔離機制--> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <!--配置隔離機制的ssh登入祕鑰所在的位置--> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <!--配置namenode資料存放的位置,可以不配置,如果不配置,預設用的是core-site.xml裡配置的hadoop.tmp.dir的路徑--> <property> <name>dfs.namenode.name.dir</name> <value>file:///home/app/hadoop-2.7.1/tmp/namenode</value> </property> <!--配置datanode資料存放的位置,可以不配置,如果不配置,預設用的是core-site.xml 裡配置的 hadoop.tmp.dir 的路徑--> <property> <name>dfs.datanode.data.dir</name> <value>file:///home/app/hadoop-2.7.1/tmp/datanode</value> </property> <!--配置 block 副本數量--> <property> <name>dfs.replication</name> <value>3</value> </property> <!--設定hdfs的操作許可權,false表示任何使用者都可以在hdfs上操作檔案--> <property> <name>dfs.permissions</name> <value>false</value> </property> </configuration>
1.3.11 配置 mapred-site.xml
<configuration>
<property>
<!--指定mapreduce執行在yarn上-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
1.3.12 配置yarn-site.xml
<configuration> <!--開啟YARN HA --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!--指定兩個resourcemanager的名稱--> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!--配置rm1,rm2的主機--> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>hadoop1</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>hadoop3</value> </property> <!--開啟yarn恢復機制--> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <!--執行rm恢復機制實現類--> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> <!--配置zookeeper的地址--> <property> <name>yarn.resourcemanager.zk-address</name> <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value> <description>For multiple zk services, separate them with comma</description> </property> <!--指定YARN HA的名稱--> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yarn-ha</value> </property> <!--指定 yarn 的老大 resoucemanager 的地址--> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop1</value> </property> <!--NodeManager獲取資料的方式--> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
1.3.13 配置slaves檔案
hadoop4
hadoop5
hadoop6
1.3.14 根據配置檔案,建立相關的資料夾,用來存放對應資料
在hadoop-2.7.1目錄下建立:
①journal目錄
②建立tmp目錄
③在tmp目錄下,分別建立namenode目錄和datanode目錄
1.3.15 配置 hadoop 的環境變數(可不配)
JAVA_HOME=/home/app/jdk1.8.0_65 JAVA_BIN=/home/app/jdk1.8.0_65/bin HADOOP_HOME=/home/app/hadoop-2.7.1 PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME JAVA_BIN HADOOP_HOME PATH CLASSPATH
1.3.16 通過scp 命令,將hadoop安裝目錄遠端copy到其他5臺機器上
比如向hadoop02節點傳輸:
scp -r hadoop-2.7.1 hadoop2:/home/app
1.3.17 啟動zookeeper叢集
在Zookeeper安裝目錄的bin目錄下執行:sh zkServer.sh start
1.3.18 格式化zookeeper
在zk的leader節點上執行:
hdfs zkfc -formatZK,這個指令的作用是在zookeeper叢集上生成ha節點 (ns節點)
注:18--24步可以用一步來替代:進入hadoop安裝目錄的sbin目錄,執行: sh start-dfs.sh 。 但建議還是按部就班來執行,比較可靠。
1.3.19 啟動journalnode叢集
在4、5、6節點上執行:
切換到hadoop安裝目錄的sbin目錄下,執行:
sh hadoop-daemons.sh start journalnode
然後執行jps命令檢視程式。
1.3.20 格式化1節點的namenode
在1節點上執行:
hadoop namenode -format
1.3.21 啟動1節點的namenode
在 1 節點上執行:
sh hadoop-daemon.sh start namenode
1.3.22 把2節點的namenode節點變為standby namenode節點
在2節點上執行:
hdfs namenode -bootstrapStandby
1.3.23 啟動 2 節點的 namenode 節點
在2節點上執行:
sh hadoop-daemon.sh start namenode
1.3.24 在4,5,6節點上啟動datanode節點
在 4,5,6 節點上執行: sh hadoop-daemon.sh start datanode
1.3.25 啟動zkfc(啟動FalioverControllerActive)
在1,2節點上執行:
sh hadoop-daemon.sh start zkfc
1.3.26 在1節點上啟動主Resourcemanager
在1節點上執行:start-yarn.sh
啟動成功後,4,5,6節點上應該有nodemanager 的程式
1.3.27 在 3 節點上啟動副 Resoucemanager
在3節點上執行:sh yarn-daemon.sh start resourcemanager
1.4 測試
輸入地址: http://192.168.65.111:50070 ,檢視 namenode 的資訊,是active狀態
輸入地址:http://192.168.65.22:50070檢視namenode的資訊,是standby狀態
然後停掉01節點的namenode,此時發現standby的namenode變為active。