---恢復內容開始---
一、集群規划
主機名 | ip | NameNode | DataNode | Yarn | ZooKeeper | JournalNode |
node01 | 192.168.1.201 | 是 | 是 | 否 | 是 | 是 |
node02 | 192.168.1.202 | 是 | 是 | 否 | 是 | 是 |
node03 | 192.168.1.203 | 否 | 是 | 否 | 是 | 是 |
注:所有操作都是在root用戶下操作,如需其他用戶,請自行創建。注意文件權限問題。
二、環境搭建
1、安裝JDK
1.1 下載jdk
這里使用的是jdk-8u144-linux-x64.tar.gz,下載地址:鏈接:https://pan.baidu.com/s/1TCsxtcSqfA4SSrLaWJa79Q 密碼:sot0
將下載的jdk 上傳到node01服務器的/opt目錄下
[root@node01 usr]# cd /opt/ [root@node01 opt]# ll total 727676 -rw-r--r--. 1 root root 149756462 Oct 23 12:24 apache-hive-2.1.1-bin.tar.gz -rw-r--r--. 1 root root 266688029 Oct 23 12:24 hadoop-2.7.4.tar.gz -rw-r--r--. 1 root root 104659474 Oct 23 12:24 hbase-1.2.6-bin.tar.gz -rw-r--r--. 1 root root 185515842 Oct 23 12:26 jdk-8u144-linux-x64.tar.gz -rw-r--r--. 1 root root 3465760 Oct 23 12:24 mysql-connector-java-5.1.44.tar.gz -rw-r--r-- 1 root root 35042811 Oct 23 13:37 zookeeper-3.4.10.tar.gz
然后切換到/usr 目錄下
[root@node01 ~]# cd /usr/
新建app目錄,用以安裝所需軟件
[root@node01 usr]# mkdir -p /usr/app
進入app目錄
[root@node01 opt]# cd /usr/app/
解壓jdk到當前路徑下
[root@node01 app]# tar zxvf /opt/jdk-8u144-linux-x64.tar.gz
建立jdk軟連接
[root@node01 app]# ln -s jdk1.8.0_144/ java
配置環境變量
[root@node01 app]# vi /etc/profile
在打開的文件末尾添加如下代碼后保存
export JAVA_HOME=/usr/app/java export CLASS_PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib export PATH=$PATH:$JAVA_HOME/bin
使配置生效
[root@node01 app]# source /etc/profile
查看Java版本,顯示如下則jdk安裝完成
[root@node01 app]# java -version java version "1.8.0_144" Java(TM) SE Runtime Environment (build 1.8.0_144-b01) Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
根據以上流程,分別在node02、node03 節點上完成jdk 安裝。
2、安裝zookeeper
下載zookeeper
這里使用的是zookeeper-3.4.10.tar.gz,下載地址:鏈接:鏈接:https://pan.baidu.com/s/1hhLu-F4YAl0FtIb67_GzQw 密碼:ntxo
將下載的zookeeper上傳到node01服務器的/opt目錄下
[root@node01 usr]# cd /opt/
[root@node01 opt]# ll
total 727676
-rw-r--r--. 1 root root 149756462 Oct 23 12:24 apache-hive-2.1.1-bin.tar.gz -rw-r--r--. 1 root root 266688029 Oct 23 12:24 hadoop-2.7.4.tar.gz -rw-r--r--. 1 root root 104659474 Oct 23 12:24 hbase-1.2.6-bin.tar.gz -rw-r--r--. 1 root root 185515842 Oct 23 12:26 jdk-8u144-linux-x64.tar.gz -rw-r--r--. 1 root root 3465760 Oct 23 12:24 mysql-connector-java-5.1.44.tar.gz -rw-r--r-- 1 root root 35042811 Oct 23 13:37 zookeeper-3.4.10.tar.gz
然后切換到/usr/app 目錄下
[root@node01 ~]# cd /usr/app/
解壓zookeeper到當前路徑下
[root@node01 app]# tar zxvf /opt/zookeeper-3.4.10.tar.gz
建立zookeeper軟連接
[root@node01 app]# ln -s zookeeper-3.4.10/ zookeeper
配置環境變量
[root@node01 app]# vi /etc/profile
在打開的文件末尾添加如下代碼后保存
export JAVA_HOME=/usr/app/java export CLASS_PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib export ZOOKEEPER_HOME=/usr/app/zookeeper
export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin
使配置生效
[root@node01 app]# source /etc/profile
切換到conf目錄,修改zookeepe配置文件
[root@node01 app]# cd /usr/app/zookeeper/conf/
[root@node01 conf]# cp zoo_sample.cfg zoo.cfg
[root@node01 conf]# vi zoo.cfg
按照如下內容修改zoo.cfg 然后保存
# The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/usr/app/zookeeper/data dataLogDir=/usr/app/zookeeper/datalog # the port at which the clients will connect clientPort=21810 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1 server.1=node01:28880:38880 server.2=node02:28880:38880 server.3=node03:28880:38880
在zookeeper目錄下創建data和datalog兩個目錄
[root@node01 conf]# mkdir -p /usr/app/zookeeper/data
[root@node01 conf]# mkdir -p /usr/app/zookeeper/datalog
在data目錄下創建myid文件並添加內容為1
[root@node01 conf]# cd /usr/app/zookeeper/data
[root@node01 data]# echo 1 > myid
根據以上步驟在node02、node03節點安裝好zookeeper
注:node02節點上的myid內容為2,node03節點上的myid內容為3。
三個節點的zookeeper配置完成后可以測試安裝是否成功
在三個節點上分別執行如下命令啟動zookeeper
[root@node01 data]# zkServer.sh start ZooKeeper JMX enabled by default Using config: /usr/app/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED
分別查看三個節點的狀態,可以看到一個leader和兩個follower,說明zookeeper安裝成功。
[root@node01 data]# zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/app/zookeeper/bin/../conf/zoo.cfg Mode: follower
[root@node02 data]# zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/app/zookeeper/bin/../conf/zoo.cfg Mode: leader
[root@node03 hadoop]# zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/app/zookeeper/bin/../conf/zoo.cfg Mode: follower
分別停止三個節點上的zookeeper
[root@node01 data]# zkServer.sh stop
3、安裝hadoop
下載hadoop
這里使用的是 hadoop-2.7.4.tar.gz 下載地址:鏈接:https://pan.baidu.com/s/1PSlTdRjcjH8z8eirdeDCrA 密碼:sz3c
將下載的hadoop上傳到node01服務器的/opt目錄下
[root@node01 usr]# cd /opt/ [root@node01 opt]# ll total 727676 -rw-r--r--. 1 root root 149756462 Oct 23 12:24 apache-hive-2.1.1-bin.tar.gz -rw-r--r--. 1 root root 266688029 Oct 23 12:24 hadoop-2.7.4.tar.gz -rw-r--r--. 1 root root 104659474 Oct 23 12:24 hbase-1.2.6-bin.tar.gz -rw-r--r--. 1 root root 185515842 Oct 23 12:26 jdk-8u144-linux-x64.tar.gz -rw-r--r--. 1 root root 3465760 Oct 23 12:24 mysql-connector-java-5.1.44.tar.gz -rw-r--r-- 1 root root 35042811 Oct 23 13:37 zookeeper-3.4.10.tar.gz
然后切換到/usr/app 目錄下
[root@node01 ~]# cd /usr/app/
解壓hadoop到當前路徑下
[root@node01 app]# tar zxvf /opt/hadoop-2.7.4.tar.gz
建立hadoop軟連接
[root@node01 app]# ln -s hadoop-2.7.4/ hadoop
配置環境變量
[root@node01 app]# vi /etc/profile
在打開的文件末尾添加如下代碼后保存
export JAVA_HOME=/usr/app/java
export CLASS_PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export ZOOKEEPER_HOME=/usr/app/zookeeper
export HADOOP_HOME=/usr/app/hadoop
export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
使配置生效
[root@node01 app]# source /etc/profile
切換到hadoop目錄,分別創建journal、hdfs/data、hdfs/name 路徑
[root@node01 app]# cd /usr/app/hadoop [root@node01 hadoop]# mkdir journal
[root@node01 hadoop]# mkdir -p hdfs/name
[root@node01 hadoop]# mkdir -p hdfs/data
切換到配置文件目錄
[root@node01 hadoop]# cd /usr/app/hadoop/etc/hadoop/
將如下代碼寫入 core-site.xml
[root@node01 hadoop]# vi core-site.xml
<configuration>
<!-- 指定hdfs的nameservice為ns -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<!--指定hadoop數據臨時存放目錄-->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/app/hadoop/tmp</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<!--指定zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>node01:21810,node02:21810,node03:21810</value>
</property>
</configuration>
將如下代碼寫入到 hdfs-site.xml
[root@node01 hadoop]# vi 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>node01:9000</value> </property> <!-- nn1的http通信地址 --> <property> <name>dfs.namenode.http-address.ns.nn1</name> <value>node01:50070</value> </property> <!-- nn2的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.ns.nn2</name> <value>node02:9000</value> </property> <!-- nn2的http通信地址 --> <property> <name>dfs.namenode.http-address.ns.nn2</name> <value>node02:50070</value> </property> <!-- 指定NameNode的元數據在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://node01:8485;node02:8485;node03:8485/ns</value> </property> <!-- 指定JournalNode在本地磁盤存放數據的位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/usr/app/hadoop/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> <property> <name>dfs.namenode.name.dir</name> <value>file:///usr/app/hadoop/hdfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:///usr/app/hadoop/hdfs/data</value> </property> <property> <name>dfs.replication</name> <value>2</value> </property> <!-- 在NN和DN上開啟WebHDFS (REST API)功能,不是必須 --> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> </configuration>
將如下代碼寫入到 mapred-site.xml
[root@node01 hadoop]# cp mapred-site.xml.template mapred-site.xml
[root@node01 hadoop]# vi mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
將如下代碼寫入到 yarn-site.xml
[root@node01 hadoop]# vi yarn-site.xml
<configuration>
<!-- 指定nodemanager啟動時加載server的方式為shuffle server -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定resourcemanager地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node03</value>
</property>
</configuration>
修改 hadoop-env.sh
找到文件的export JAVA_HOME=${JAVA_HOME} 一行,將其修改為 export JAVA_HOME=/usr/app/java
修改 slaves 文件
node01
node02
node03
按照如上步驟將node02、node03節點的hadoop配置完成
至此,Hadoop HA 集群環境搭建完成,以下開始測試集群
4、集群啟動
分別在node01、node02、node03 三個節點執行以下命令啟動zookeeper
[root@node01 hadoop]# zkServer.sh start
驗證zookeeper集群狀態
[root@node01 data]# zkServer.sh status
ZooKeeper JMX enabled by default Using config: /usr/app/zookeeper/bin/../conf/zoo.cfg Mode: follower
[root@node02 data]# zkServer.sh status
ZooKeeper JMX enabled by default Using config: /usr/app/zookeeper/bin/../conf/zoo.cfg Mode: leader
[root@node03 hadoop]# zkServer.sh status
ZooKeeper JMX enabled by default Using config: /usr/app/zookeeper/bin/../conf/zoo.cfg Mode: follower啟動
在node01上啟動journalnode集群
[root@node01 hadoop]# hadoop-daemons.sh start journalnode
執行jps命令,可以查看到JournalNode的java進程pid
在node01上格式化zkfc
[root@node01 hadoop]# hdfs zkfc -formatZK
在node01上格式化hdfs
[root@node01 hadoop]# hadoop namenode -format
在node01上啟動namenode
[root@node01 hadoop]# hadoop-daemon.sh start namenode
在node02上啟動數據同步和standby的namenode
[root@node01 hadoop]# hdfs namenode -bootstrapStandby
[root@node01 hadoop]# hadoop-daemon.sh start namenode
在node01 上啟動datanode
[root@node01 hadoop]# hadoop-daemons.sh start datanode
在node03上啟動yarn
[root@node03 hadoop]# start-yarn.sh
在node01上啟動zkfc
[root@node01 hadoop]# hadoop-daemons.sh start zkfc
全部啟動后分別在node01、node02、node03上執行jps 可以看到下面這些進程
[root@node01 hadoop]# jps 7073 QuorumPeerMain 2406 DFSZKFailoverController 2150 DataNode 2248 NodeManager 2536 NameNode 1849 JournalNode 7882 Jps
[root@node02 data]# jps 1654 QuorumPeerMain 3430 Jps 1895 DataNode 1993 NodeManager 1707 JournalNode 1806 NameNode 2126 DFSZKFailoverController
[root@node03 hadoop]# jps 1604 QuorumPeerMain 2518 Jps 1961 NodeManager 1756 DataNode 1869 ResourceManager 1679 JournalNode
4、測試HA高可用性
http://192.168.1.202:50070/dfshealth.html#tab-overview
http://192.168.1.201:50070/dfshealth.html#tab-overview
在node02(active)節點關閉namenode
[root@node02 hadoop]# hadoop-daemon.sh stop namenode
在node02(active)節點開啟namenode
[root@node02 hadoop]# hadoop-daemon.sh start namenode
---恢復內容結束---