目錄
一、集羣規劃
說明:
集羣共5個節點,主機名分別是node01、node02、node03、node04、node05
初始啓動集羣
node01上運行active namenode即主namenode;node02上運行standby namenode即從namenode
node04上運行主resourcemanager;node05上運行從resourcemanager
-
每個節點運行的進程如下表
機器名 |
運行進程 |
---|---|
node01 | NameNode/zkfc/Zookeeper/Journalnode/DataNode/NodeManager |
node02 | NameNode/zkfc/Zookeeper/Journalnode/DataNode/NodeManager |
node03 | Zookeeper/Journalnode/DataNode/NodeManager/JobHistoryServer |
node04 | ResourceManager |
node05 | ResourceManager |
二、五節點Hadoop HA搭建
1. 虛擬機環境準備
-
準備5臺虛擬機
-
在做五節點hadoop HA集羣搭建之前,要求先完成每臺虛擬機的基本環境準備
-
每個節點都要做好“在node01上開始解壓hadoop的tar.gz包之前的環境配置”
-
主要包括如下步驟(三節點Hadoop集羣搭建時已講解過,不再贅述)
-
windows|mac安裝VMWare虛擬化軟件
-
VMWare下安裝CenoOS7
-
虛擬機關閉防火牆
-
禁用selinux
-
配置虛擬網卡
-
配置虛擬機網絡
-
安裝JDK
-
配置時間同步
-
修改主機名
-
修改ip地址
-
修改/etc/hosts
-
各節點免密鑰登陸
-
重啓虛擬機
-
-
2. 安裝ZooKeeper集羣
Hadoop高可用集羣需要使用ZooKeeper集羣做分佈式協調;所以先安裝ZooKeeper集羣
-
在node01、node02、node03上安裝ZooKeeper集羣(不再贅述)
3. 五節點Hadoop HA搭建
注意:
①3.1到3.8在node01上操作
②此文檔使用普通用戶操作,如hadoop
③hadoop安裝到用戶主目錄下,如/kkb/install
請根據自己的實際情況修改
3.1 解壓hadoop壓縮包
-
hadoop壓縮包hadoop-2.6.0-cdh5.14.2_after_compile.tar.gz上傳到node01的/kkb/soft路徑中
-
解壓hadoop壓縮包到/kkb/install
#解壓hadoop壓縮包到/kkb/install
[hadoop@node01 ~]$ cd
[hadoop@node01 ~]$ cd /kkb/soft/
[hadoop@node01 soft]$ tar -xzvf hadoop-2.6.0-cdh5.14.2_after_compile.tar.gz -C /kkb/install/
3.2 修改hadoop-env.sh
-
進入hadoop配置文件路徑$HADOOP_HOME/etc/hadoop
[hadoop@node01 soft]$ cd /kkb/install/hadoop-2.6.0-cdh5.14.2/
[hadoop@node01 hadoop-2.6.0-cdh5.14.2]$ cd etc/hadoop/
-
修改hadoop-env.sh,修改JAVA_HOME值爲jdk解壓路徑;保存退出
export JAVA_HOME=/kkb/install/jdk1.8.0_141
注意:JAVA_HOME值修改爲自己jdk的實際目錄
3.3 修改core-site.xml
注意:
情況一:值/kkb/install/hadoop-2.6.0-cdh5.14.2/tmp根據實際情況修改
情況二:值node01:2181,node02:2181,node03:2181根據實際情況修改,修改成安裝了zookeeper的虛擬機的主機名
<configuration>
<!-- 指定hdfs的nameservice id爲ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<!-- 指定hadoop臨時文件存儲的基目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/kkb/install/hadoop-2.6.0-cdh5.14.2/tmp</value>
</property>
<!-- 指定zookeeper地址,ZKFailoverController使用 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>node01:2181,node02:2181,node03:2181</value>
</property>
</configuration>
3.4 修改hdfs-site.xml
注意:
情況一:屬性值qjournal://node01:8485;node02:8485;node03:8485/ns1中的主機名,修改成實際安裝zookeeper的虛擬機的主機名
情況二:屬性值/kkb/install/hadoop-2.6.0-cdh5.14.2/journal中”/kkb/install/hadoop-2.6.0-cdh5.14.2”替換成實際hadoop文件夾的路徑
情況三:屬性值/home/hadoop/.ssh/id_rsa中/home/hadoop根據實際情況替換
<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>node01:8020</value>
</property>
<!-- nn1的http通信地址,web訪問地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>node01:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>node02:8020</value>
</property>
<!-- nn2的http通信地址,web訪問地址 -->
<property>
<name>dfs.namenode.http-address.ns1.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/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盤存放數據的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/kkb/install/hadoop-2.6.0-cdh5.14.2/journal</value>
</property>
<!-- 開啓NameNode失敗自動切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 此類決定哪個namenode是active,切換active和standby -->
<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/hadoop/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔離機制超時時間 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
3.5 修改mapred-site.xml
-
重命名文件
[hadoop@node01 hadoop]$ mv mapred-site.xml.template mapred-site.xml
-
修改mapred-site.xml
<configuration>
<!-- 指定運行mr job的運行時框架爲yarn -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- MapReduce JobHistory Server IPC host:port -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>node03:10020</value>
</property>
<!-- MapReduce JobHistory Server Web UI host:port -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node03:19888</value>
</property>
</configuration>
3.6 修改yarn-site.xml
注意:
情況一:屬性yarn.resourcemanager.hostname.rm1的值node04根據實際情況替換
情況二:屬性yarn.resourcemanager.hostname.rm2的值node05根據實際情況替換
情況三:屬性值node01:2181,node02:2181,node03:2181根據實際情況替換;替換成實際安裝zookeeper的虛擬機的主機名
<configuration>
<!-- 是否啓用日誌聚合.應用程序完成後,日誌彙總收集每個容器的日誌,這些日誌移動到文件系統,例如HDFS. -->
<!-- 用戶可以通過配置"yarn.nodemanager.remote-app-log-dir"、"yarn.nodemanager.remote-app-log-dir-suffix"來確定日誌移動到的位置 -->
<!-- 用戶可以通過應用程序時間服務器訪問日誌 -->
<!-- 啓用日誌聚合功能,應用程序完成後,收集各個節點的日誌到一起便於查看 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 開啓RM高可靠 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id爲yrc,意爲yarn cluster -->
<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>node04</value>
</property>
<!-- 指定第二個RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node05</value>
</property>
<!-- 配置第一臺機器的resourceManager通信地址 -->
<!--客戶端通過該地址向RM提交對應用程序操作-->
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>node04:8032</value>
</property>
<!--向RM調度資源地址-->
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>node04:8030</value>
</property>
<!--NodeManager通過該地址交換信息-->
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
<value>node04:8031</value>
</property>
<!--管理員通過該地址向RM發送管理命令-->
<property>
<name>yarn.resourcemanager.admin.address.rm1</name>
<value>node04:8033</value>
</property>
<!--RM HTTP訪問地址,查看集羣信息-->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>node04:8088</value>
</property>
<!-- 配置第二臺機器的resourceManager通信地址 -->
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>node05:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>node05:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
<value>node05:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address.rm2</name>
<value>node05:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>node05:8088</value>
</property>
<!--開啓resourcemanager自動恢復功能-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--在node4上配置rm1,在node5上配置rm2,注意:一般都喜歡把配置好的文件遠程複製到其它機器上,但這個在YARN的另一個機器上一定要修改,其他機器上不配置此項-->
<!--
<property>
<name>yarn.resourcemanager.ha.id</name>
<value>rm1</value>
<description>If we want to launch more than one RM in single node, we need this configuration</description>
</property>
-->
<!--用於持久存儲的類。嘗試開啓-->
<property>
<name>yarn.resourcemanager.store.class</name>
<!-- 基於zookeeper的實現 -->
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!-- 單個任務可申請最少內存,默認1024MB -->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>512</value>
</property>
<!--多長時間聚合刪除一次日誌 此處-->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>2592000</value><!--30 day-->
</property>
<!--時間在幾秒鐘內保留用戶日誌。只適用於如果日誌聚合是禁用的-->
<property>
<name>yarn.nodemanager.log.retain-seconds</name>
<value>604800</value><!--7 day-->
</property>
<!-- 指定zk集羣地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node01:2181,node02:2181,node03:2181</value>
</property>
<!-- 逗號隔開的服務列表,列表名稱應該只包含a-zA-Z0-9_,不能以數字開始-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
3.7 修改slaves
node01、node02、node03上運行了datanode、nodemanager,所以修改slaves內容替換爲:
node01
node02
node03
3.8 遠程拷貝hadoop文件夾
拷貝到node02~node05
[hadoop@node01 hadoop]$ scp -r /kkb/install/hadoop-2.6.0-cdh5.14.2/ node02:/kkb/install/
[hadoop@node01 hadoop]$ scp -r /kkb/install/hadoop-2.6.0-cdh5.14.2/ node03:/kkb/install/
[hadoop@node01 hadoop]$ scp -r /kkb/install/hadoop-2.6.0-cdh5.14.2/ node04:/kkb/install/
[hadoop@node01 hadoop]$ scp -r /kkb/install/hadoop-2.6.0-cdh5.14.2/ node05:/kkb/install/
3.9 修改兩個RM的yarn-site.xml
在node04上,找到屬性yarn.resourcemanager.ha.id
去除註釋①、②
[hadoop@node04 ~]$ cd /kkb/install/hadoop-2.6.0-cdh5.14.2/etc/hadoop
[hadoop@node04 hadoop]$ vim yarn-site.xml
在node05上
-
找到屬性
yarn.resourcemanager.ha.id
去除註釋①、② -
③修改成rm2
[hadoop@node05 ~]$ cd /kkb/install/hadoop-2.6.0-cdh5.14.2/etc/hadoop/
[hadoop@node05 hadoop]$ vim yarn-site.xml
修改後,結果如下
3.10 配置環境變量
-
node01到node05五個節點都配置環境變量
#將hadoop添加到環境變量中
vim /etc/profile
添加內容如下(注意:若HADOOP_HOME已經存在,則修改):
export HADOOP_HOME=/kkb/install/hadoop-2.6.0-cdh5.14.2/
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
編譯文件,使新增環境變量生效
source /etc/profile
4. 啓動與初始化hadoop集羣
注意:嚴格按照下面的步驟 先檢查各臺hadoop環境變量是否設置好
4.1 啓動zookeeper集羣
注意:根據zookeeper實際安裝情況,啓動zookeeper
分別在node01、node02、node03上啓動zookeeper
zkServer.sh start
#查看狀態:一個爲leader,另外兩個爲follower
zkServer.sh status
4.2 啓動HDFS
4.2.1 格式化ZK
在node01上執行即可
集羣有兩個namenode,分別在node01、node02上
每個namenode對應一個zkfc進程;
在主namenode node01上格式化zkfc
hdfs zkfc -formatZK
4.2.2 啓動journalnode 啓動journalnode
-
在node01上執行
-
會啓動node01、node02、node03上的journalnode
-
因爲使用的是hadoop-daemons.sh
-
hadoop-daemons.sh start journalnode
-
運行jps命令檢驗,node01、node02、node03上多了JournalNode進程
4.2.3 格式化HDFS
- 在node01上執行
-
根據集羣規劃node01、node02上運行namenode;所以只在主namenode節點即node01上執行命令:
-
此命令慎用;只在集羣搭建(初始化)時使用一次;
-
一旦再次使用,會將HDFS上之前的數據格式化刪除掉
-
hdfs namenode -format
-
下圖表示格式化成功
4.2.4 初始化元數據、啓動主NN
-
node01上執行(主namenode)
hdfs namenode -initializeSharedEdits -force
#啓動HDFS
start-dfs.sh
4.2.5 同步元數據信息、啓動從NN
-
node02上執行(從namenode)
-
同步元數據信息,並且設置node02上namenode爲standBy狀態
hdfs namenode -bootstrapStandby
hadoop-daemon.sh start namenode
4.2.5 JPS查看進程
-
node01上
- node02上
- node03上
4.3 啓動YARN
4.6.1 主resourcemanager
- 把namenode和resourcemanager部署在不同節點,是因爲性能問題,因爲他們都要佔用大量資源
- 坑:在node04上啓動yarn之前,先依次從node04 ssh遠程連接到node01、node02、node03、node04、node05;因爲初次ssh時,需要交互,輸入yes,回車
start-yarn.sh
4.6.2 從resourcemanager
- 在從resourcemanager即node05上啓動rm
yarn-daemon.sh start resourcemanager
4.6.3 查看resourceManager狀態
-
node04上,它的resourcemanager的Id是rm1
yarn rmadmin -getServiceState rm1
-
node05上,它的resourcemanager的Id是rm2
yarn rmadmin -getServiceState rm2
4.4 啓動JobHistory
-
node03上執行
mr-jobhistory-daemon.sh start historyserver
5. 驗證集羣是否可用
5.1 驗證HDFS HA
5.1.1 訪問WEB UI
node01、node02一主一備
5.1.2 模擬主備切換
-
在主namenode節點,運行
hadoop-daemon.sh stop namenode
-
訪問之前爲"備namenode"的WEB UI;發現狀態更新爲active
-
或者使用命令查看狀態
hdfs haadmin -getServiceState nn2
-
啓動剛纔手動停掉的namenode
hadoop-daemon.sh start namenode
-
訪問它的WEB UI,發現狀態更新爲standby
-
或者使用命令查看狀態
hdfs haadmin -getServiceState nn1
5.2 驗證Yarn HA
node04、node05主備切換
5.2.1 訪問WEB UI
-
node04瀏覽器訪問
http://node04:8088/cluster/cluster
- node05瀏覽器訪問
http://node05:8088/cluster/cluster
5.2.2 模擬主備切換
-
在主resourcemanager節點,運行
yarn-daemon.sh stop resourcemanager
-
訪問之前爲"備resourcemanager"的WEB UI;發現狀態更新爲active
-
或者命令查看狀態
yarn rmadmin -getServiceState rm2
- 啓動剛纔手動停掉的resourcemanager
yarn-daemon.sh start resourcemanager
- 訪問它的WEB UI,發現狀態更新爲standby
- 或者命令查看狀態
yarn rmadmin -getServiceState rm1
5.2.3 運行MR示例
-
運行一下hadoop示例中的WordCount程序:
hadoop fs -put /kkb/install/hadoop-2.6.0-cdh5.14.2/LICENSE.txt /
hadoop jar /kkb/install/hadoop-2.6.0-cdh5.14.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.14.2.jar wordcount /LICENSE.txt /w0727
6. 集羣常用命令
6.1 關閉Hadoop HA集羣
正確指令執行順序如下
-
主namenode上運行
stop-dfs.sh
-
主resoucemanager上運行
stop-yarn.sh
-
從resoucemanager上運行
yarn-daemon.sh stop resourcemanager
-
關閉zookeeper集羣;每個zk服務器運行
zkServer.sh stop
6.2 常用命令
-
單獨啓動namenode
hadoop-daemon.sh start namenode
- 單獨啓動datanode
hadoop-daemon.sh start datanode
- 單獨啓動journalnode
hadoop-daemon.sh start journalnode
- 啓動zookeeper
./zkServer.sh start
- 啓動hdfs
start-dfs.sh
- 啓動yarn
start-yarn.sh
- 單獨啓動resorucemanager
yarn-daemon.sh start resouremanger
- 查看namenode狀態(namenode1)
hdfs haadmin -getServiceState nn1
- 查看resourcemanager狀態(resourcemanager2)
yarn rmadmin -getServiceState rm2