知識目錄
- 一、寫在前面💕
- 二、Zookeeper安裝?
- 三、Hadoop配置?
- 四、Hadoop HA自動模式?
- 五、HA腳本分享?
- 七、結語💕
一、寫在前面💕
大家好!這篇文章是我在搭建Hdfs的HA(高可用)時寫下的詳細筆記與感想,希望能幫助到大家!本篇文章收錄于 初心 的 大數據 專欄。
🏠 個人主頁:初心%個人主頁
🧑 個人簡介:大家好,我是初心,和大家共同努力
💕 座右銘:理想主義的花,終究會盛開在浪漫主義的土壤里!🍺🍺🍺
💕歡迎大家:這里是CSDN,我記錄知識的地方,喜歡的話請三連,有問題請私信😘
二、Zookeeper安裝?
- 1.將Zookeeper壓縮包上傳到 Hadoop102的/opt/software 目錄下
這里我們還是使用Xshell+Xftp進行文件上傳,將Zookeeper上傳。
- 2.解壓到 /opt/module/HA 目錄下
tar -xzvf /opt/software/apache-zookeeper-3.5.7-bin.tar.gz -C /opt/module/HA/
- 3.將Zookeeper重命名
mv /opt/module/HA/apache-zookeeper-3.5.7-bin/ zookeeper
- 4.重命名Zookeeper的zoo_sample.cfg為zoo.cfg文件
mv zoo_sample.cfg zoo.cfg
- 5.修改zoo.cfg文件
vim /opt/module/HA/zookeeper/conf/zoo.cfg
按下G,按下o,直接插入到最后一行,插入以下內容,其中hadoop102,hadoop103,hadoop104分別是三個節點的主機名。
server.1=hadoop102:2888:3888
server.2=hadoop103:2888:3888
server.3=hadoop104:2888:3888
- 6.新建myid文件
進入到zookeeper目錄下:
cd /opt/module/HA/zookeeper/
新建zkData目錄:
mkdir zkData
進入到zkData目錄,并新建myid文件:
cd zkData
vim myid
只需分別在Hadoop102,Hadoop103,Hadoop104的myid文件添加數字 1,2,3 即可,保存退出:
- 7.配置環境變量
vim /etc/profile.d/my_env.sh
插入以下內容:
# ZOOKEEPER_HOME
export ZOOKEEPER_HOME=/opt/module/HA/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
- 8.刷新環境變量
source /etc/profile.d/my_env.sh
- 9.分發
這里需要分發的有Zookeeper,my_env.sh文件,以及都要刷新環境變量。前面兩個命令在hadoop102執行即可,第三個命令在hadoop103,hadoop104上都要執行一次。
xsync /opt/module/HA/zookeeper/
xsync /etc/profile.d/my_env.sh
source /etc/profile.d/my_env.sh
三、Hadoop配置?
- 1.保留原來的Hadoop集群
為什么要保留原來的集群?
在搭建Hadoop高可用之前,我們的集群是有Hdfs,Yarn,JobHistory,這些我們日后還需要繼續學習使用,因此我選擇保留下來,換句話說,**即使我們高可用(HA)搭建失敗了,我們還能回到開始的狀態。**保留方式就是我們搭建的時候不要直接使用Hadoop目錄,而是復制一份。
- 2.復制Hadoop目錄
cp -r /opt/module/hadoop-3.1.3/ /opt/module/HA/
- 3.刪除data和logs目錄
cd /opt/module/HA/hadoop-3.1.3/
rm -rf data
rm -rf logs
- 4.新建Zookeeper相關目錄
cd /opt/module/HA/
mkdir logs
mkdir tmp
- 5.修改兩個配置文件
這里的兩個配置文件是 core-site.xml
文件和 hdfs-site.xml
文件,這是Hadoop目錄中僅需要修改的兩個文件.這里以注釋形式給出需要修改的地方,不用修改這兩個文件,直接覆蓋即可.
hdfs-site.xml:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--Licensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License. See accompanying LICENSE file.
--><!-- Put site-specific property overrides in this file. --><configuration><!-- 集群名稱,此值在接下來的配置中將多次出現務必注意同步修改 -->
<property><name>dfs.nameservices</name><value>mycluster</value>
</property>
<!-- 所有的namenode列表,此處也只是邏輯名稱,非namenode所在的主機名稱 -->
<property><name>dfs.ha.namenodes.mycluster</name><value>nn1,nn2</value>
</property><!-- namenode之間用于RPC通信的地址,value填寫namenode所在的主機地址 -->
<!-- 默認端口8020,注意mycluster1與nn1要和上文的配置一致 -->
<property><name>dfs.namenode.rpc-address.mycluster.nn1</name><value>hadoop102:8020</value>
</property>
<property><name>dfs.namenode.rpc-address.mycluster.nn2</name><value>hadoop103:8020</value>
</property><!-- namenode的web訪問地址,默認端口9870 -->
<property><name>dfs.namenode.http-address.mycluster.nn1</name><value>hadoop102:9870</value>
</property>
<property><name>dfs.namenode.http-address.mycluster.nn2</name><value>hadoop103:9870</value>
</property><!-- journalnode主機地址,最少三臺,默認端口8485 -->
<!-- 格式為 qjournal://jn1:port;jn2:port;jn3:port/${nameservices} -->
<!-- a shared edits dir must not be specified if HA is not enabled -->
<!-- 偽分布式時,取消該配置 -->
<property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster</value>
</property><!-- 故障時自動切換的實現類,照抄即可 -->
<property><name>dfs.client.failover.proxy.provider.mycluster</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property><!-- 故障時相互操作方式(namenode要切換active和standby),這里我們選ssh方式 -->
<property><name>dfs.ha.fencing.methods</name><value>sshfence</value>
</property>
<!-- 修改為自己用戶的ssh key存放地址 -->
<property><name>dfs.ha.fencing.ssh.private-key-files</name><value>/home/sky/.ssh/id_rsa</value>
</property><!-- namenode日志文件輸出路徑,即journalnode讀取變更的位置 -->
<property><name>dfs.journalnode.edits.dir</name><value>/opt/module/HA/logs/</value>
</property><!-- 啟用自動故障轉移 -->
<property><name>dfs.ha.automatic-failover.enabled</name><value>true</value>
</property><property><name>dfs.webhdfs.enabled</name><value>true</value>
</property><!-- 解決 DataXceiver error processing WRITE_BLOCK operation src -->
<property><name>dfs.datanode.max.transfer.threads</name><value>8192</value><description> Specifies the maximum number of threads to use for transferring datain and out of the DN. </description>
</property>
</configuration>
core-site.xml:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--Licensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License. See accompanying LICENSE file.
--><!-- Put site-specific property overrides in this file. --><configuration><!-- HDFS主入口,mycluster僅是作為集群的邏輯名稱,可隨意更改但務必與hdfs-site.xml中dfs.nameservices值保持一致 -->
<property><name>fs.defaultFS</name><value>hdfs://mycluster</value>
</property><!-- 默認的hadoop.tmp.dir指向的是/tmp目錄,將導致namenode與datanode數據全都保存在易失目錄中,此處進行修改 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/HA/tmp/</value><!-- <value>/opt/bigdata/hadoopha</value> -->
</property><!-- 用戶角色配置,不配置此項會導致web頁面報錯(不能操作數據) -->
<property><name>hadoop.http.staticuser.user</name><value>sky</value>
</property><!-- zookeeper集群地址,這里只配置了單臺,如是集群以逗號進行分隔 -->
<property><name>ha.zookeeper.quorum</name><value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
</property><!-- 權限配置 hadoop.proxyuser.{填寫自己的用戶名}.hosts-->
<property><name>hadoop.proxyuser.sky.hosts</name><value>*</value>
</property>
<property><name>hadoop.proxyuser.sky.groups</name><value>*</value>
</property><!-- 解決journalnode連接不上,導致namenode啟動問題 -->
<!-- 也有可能是網絡的問題,參考該文章:https://blog.csdn.net/tototuzuoquan/article/details/89644127 -->
<!-- 在dev環境中出現連不上journalnode問題,添加該配置,以增加重試次數和間隔 -->
<property><name>ipc.client.connect.max.retries</name><value>100</value><description>Indicates the number of retries a client will make to establish a server connection.</description>
</property><property><name>ipc.client.connect.retry.interval</name><value>10000</value><description>Indicates the number of milliseconds a client will wait for before retrying to establish a server connection.</description>
</property>
</configuration>
- 6.修改環境變量
vim /etc/profile.d/my_env.sh
將HADOOP_HOME改為新的Hadoop目錄所在路徑:
# HADOOP_HOME
export HADOOP_HOME=/opt/module/HA/hadoop-3.1.3
- 7.分發Hadoop目錄和my_env.sh文件
xsync /opt/module/HA/hadoop-3.1.3/
xsync /etc/profile.d/my_env.sh
- 8.刷新環境變量
分別在三個節點上刷新環境變量:
source /etc/profile.d/my_env.sh
四、Hadoop HA自動模式?
- 1.修改hadoop/etc/hadoop/hadoop-env.sh文件
vim /opt/module/HA/hadoop-3.1.3/etc/hadoop/hadoop-env.sh
在末尾插入以下內容,sky是用戶名,因為我至始至終都沒使用root賬號.
export HDFS_ZKFC_USER=sky
export HDFS_JOURNALNODE_USER=sky
- 2.分發
xsync /opt/module/HA/hadoop-3.1.3/
- 2.啟動與初始化集群
啟動Zookeeper:
zkServer.sh start
刷新環境變量:
source /etc/profile.d/my_env.sh
啟動Hdfs:
myhadoop start
myhadoop是我另外一個Hadoop集群啟停腳本,具體的腳本內容和使用請參考:Hadoop集群啟停腳本
- 3.查看namenode的活躍狀態
zkServer.sh status
五、HA腳本分享?
腳本名字是myHA.sh,功能是實現一鍵啟動和停止Zookeeper和Hdfs,查看zookeeper狀態.
#! /bin/bash
if [ $# -lt 1 ]
thenecho "No Args Input..."exit;
ficase $1 in
"start"){echo "----------啟動zookeeper----------"for i in hadoop102 hadoop103 hadoop104doecho ---------- zookeeper $i 啟動 ------------ssh $i "/opt/module/HA/zookeeper/bin/zkServer.sh start"doneecho "---------- 啟動hdfs------------"ssh hadoop102 "/opt/module/HA/hadoop-3.1.3/sbin/start-dfs.sh"echo "---------- hadoop HA啟動成功------------"
};;
"stop"){echo "----------關閉hdfs----------"ssh hadoop102 "/opt/module/HA/hadoop-3.1.3/sbin/stop-dfs.sh"echo "----------關閉zookeeper----------"for i in hadoop102 hadoop103 hadoop104doecho ---------- zookeeper $i 停止 ------------ssh $i "/opt/module/HA/zookeeper/bin/zkServer.sh stop"doneecho "---------- hadoop HA停止成功------------"
};;
"status"){for i in hadoop102 hadoop103 hadoop104doecho ---------- zookeeper $i 狀態 ------------ ssh $i "/opt/module/HA/zookeeper/bin/zkServer.sh status"done
};;
*)echo "Input Args Error"
;;
esac
七、結語💕
😎 本文主要講解了如何搭建Hdfs的高可用(HA),后期還會出加上Yarn的高可用教程,大家可以期待一下哦!😊
? 這就是今天要分享給大家的全部內容了,我們下期再見!😊
🍻 世間所有的相遇,都是久別重逢~
😍
🏠 我在CSDN等你哦!😍