hadoop 3.2.x 高可用集羣搭建

配置 hadoop 高可用集羣的緣由:若是集羣只有一個 NameNode,若NameNode 節點出現故障,那麼整個集羣都沒法使用,也就是存在單點故障的隱患,hadoop 高可用集羣可以實現 standby NameNode 自動切換爲 active。
HA 的架構,節點個數通常爲奇數個,有兩個 NameNode,一臺爲 active 狀態,一臺爲 standby 狀態,active NameNode 對外提供服務,standby Namenode 實時同步了 active NameNode 的元數據,當 active NameNode 節點出現故障,standby NameNode 節點可當即切換爲active狀態並對外提供服務,ResourceManager 同理。因此,在實際生產中通常採用 HA 架構來提升集羣的可靠性。
我這裏用三臺機器來搭建 Hadoop 高可用集羣,hadoop 版本3.2.0
集羣能夠本身規劃,節點最好爲奇數,最少爲3個節點
hadoop 3.2.x 高可用集羣搭建
用Hadoop用戶須要相關設置,也能夠直接用root用戶(我這裏用的是root)
集羣環境下配置SSH免密碼登陸
注意:配置SSH免密碼登陸,使用hadoop身份登陸虛擬機服務器,進行相關的操做。html

分別在每臺機器上安裝
設置好hosts
192.168.217.128 hadoop301
192.168.217.129 hadoop302
192.168.217.130 hadoop303java

生成SSH免密碼登陸公鑰和私鑰
在每臺虛擬機服務器上執行以下命令,在每臺服務器上分別生成SSH免密碼登陸的公鑰和私鑰。
ssh-keygen -t rsa
cat .ssh/id_rsa.pub >> .ssh/authorized_keys
(2)設置目錄和文件權限
在每臺虛擬機服務器上執行以下命令,設置相應目錄和文件的權限。
chmod 700 .ssh
chmod 644 .ssh/authorized_keys
chmod 600 .ssh/id_rsa
(3)將公鑰拷貝到每臺服務器
在每臺虛擬機服務器上執行以下命令,將生成的公鑰拷貝到每臺虛擬機服務器上。
scp -r .ssh/id_rsa.pub hadoop302
scp -r .ssh/id_rsa.pub hadoop303
執行完上面的命令以後,每臺服務器之間均可以經過「ssh 服務器主機名」進行免密碼登陸了。
注意:執行每條命令的時候,都會提示相似以下信息。
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'binghe101,192.168.175.101' (RSA) to the list of known hosts.
hadoop@binghe101's password:
在「是否確認繼續鏈接」的地方輸入「yes」,提示輸入密碼的地方輸入相應服務器的登陸密碼便可,後續使用「ssh 主機名」登陸相應服務器就不用再輸入密碼了。node

jdk
hadoop 3.2.x 高可用集羣搭建web

在 hadoop301 上安裝
tar -zxf zookeeper-3.6.1.tar.gz -C /opt/
配置zoo.cfg
cd zookeeper-3.6.1/conf
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg
zoo.cfg 內容以下
#The number of milliseconds of each tick 心跳基本時間單位,毫秒級,ZK基本上全部的時間都是這個時間的整數倍。
tickTime=2000
#The number of ticks that the initial
#synchronization phase can take
#tickTime的個數,表示在leader選舉結束後,followers與leader同步須要的時間,若是followers比較多或者說leader的數據灰常多時,同步時間相應可能會增長,那麼這個值也須要相應增長。固然,這個值也是follower和observer在開始同步leader的數據時的最大等待時間(setSoTimeout)
initLimit=10
#The number of ticks that can pass between
#sending a request and getting an acknowledgement
#tickTime的個數,這時間容易和上面的時間混淆,它也表示follower和observer與leader交互時的最大等待時間,只不過是在與leader同步完畢以後,進入正常請求轉發或ping等消息交互時的超時時間
syncLimit=5
#the directory where the snapshot is stored.
#do not use /tmp for storage, /tmp here is just
#example sakes.
#內存數據庫快照存放地址,若是沒有指定事務日誌存放地址(dataLogDir),默認也是存放在這個路徑下,建議兩個地址分開存放到不一樣的設備上
dataDir=/data/zookeeper
#the port at which the clients will connect
clientPort=2181
#the maximum number of client connections.
#increase this if you need to handle more clients
#maxClientCnxns=60shell

#Be sure to read the maintenance section of the
#administrator guide before turning on autopurge.數據庫

#http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenanceapache

#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=hadoop301:2888:3888
server.2=hadoop302:2888:3888
server.3=hadoop303:2888:3888vim

同步到 hadoop302 hadoop303
scp -r /opt/zookeeper-3.6.1 root@hadoop302:/opt
scp -r /opt/zookeeper-3.6.1 root@hadoop302:/optbash

啓動zookeeper
在全部機器行上執行,順序 hadoop301 hadoop302 hadoop303
/opt/zookepper-3.6.1/bin/zkServer.sh start
/opt/zookepper-3.6.1/bin/zkServer.sh status服務器

查看zookeeper集羣狀態
hadoop 3.2.x 高可用集羣搭建

在 hadoop301 上安裝
將 hadoop-3.2.0tar.gz 上傳到/opt 目錄下, 並解壓
tar -zxvf hadoop-3.2.0.tar.gz -C /opt/
配置Hadoop系統環境變量
一樣,Hadoop的系統環境變量也須要在「/etc/profile」文件中進行相應的配置,經過以下命令打開「/etc/profile」文件並進行相關設置。
編輯/etc/profile, 在末尾添加
export HADOOP_HOME=/opt/hadoop-3.2.0
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
建立Hadoop的數據存儲相關目錄(自定義根據你本身的硬盤空間大小在相關路徑下建立)
mkdir -p /data/hadoop/tmp
mkdir -p /data/hadoop/journalnode/data
mkdir -p /data/hadoop/hdfs/namenode
mkdir -p /data/hadoop/hdfs/datanode

如下是Hadoop相關配置,可是根據本身的實際路徑及配置而修改。
編輯 /opt/hadoop-3.2.0/etc/hadoop/core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/tmp/hadoop/tmpdir</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop301:2181,hadoop302:2181,hadoop303:2181</value>
</property>
</configuration>

編輯/opt/hadoop-3.2.0/etc/hadoop/hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
<!-- hdfs HA configuration-->
<!-- all default configuration can be found at https://hadoop.apache.org/docs/stable|<can be a version liek r3.2.1></can>/hadoop-project-dist/hadoop-hdfs//hdfs-default.xml -->

<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- dfs.nameservices 這裏須要與core-site.xml 中fs.defaultFS 的名稱一致-->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 定義集羣中 namenode 列表,這裏定義了三個namenode,分別是nn1,nn2,nn3-->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2,nn3</value>
</property>
<!-- namenode nn1的具體定義,這裏要和 dfs.ha.namenodes.mycluster 定義的列表對應 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop301:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop302:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn3</name>
<value>hadoop303:8020</value>
</property>
<!-- namenode nn1的具體定義,這裏要和 dfs.ha.namenodes.mycluster 定義的列表對應 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop301:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop302:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn3</name>
<value>hadoop303:9870</value>
</property>
<!-- 指定NameNode的元數據在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop301:8485;hadoop302:8485;hadoop303:8485/mycluster</value>
</property>
<!-- 指定JournalNode在本地磁盤存放數據的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/tmp/hadoop/journalnode/data</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>
<!-- 使用sshfence隔離機制時須要ssh免登錄 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔離機制超時時間 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<property>
<name>dfs.journalnode.http-address</name>
<value>0.0.0.0:8480</value>
</property>
<property>
<name>dfs.journalnode.rpc-address</name>
<value>0.0.0.0:8485</value>
</property>
<!-- hdfs HA configuration end-->

<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/tmp/hadoop/hdfs/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/tmp/hadoop/hdfs/datanode</value>
</property>
<!--開啓webhdfs接口訪問-->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<!-- 關閉權限驗證,hive能夠直連 -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
</configuration>

編輯 /opt/hadoop-3.2.0/etc/hadoop/yarn-site.xml
<?xml version="1.0"?>
<configuration>

<!-- yarn ha configuration-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 定義集羣名稱 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster1</value>
</property>
<!-- 定義本機在在高可用集羣中的id 要與 yarn.resourcemanager.ha.rm-ids 定義的值對應,若是不做爲resource manager 則刪除這項配置。-->
<property>
<name>yarn.resourcemanager.ha.id</name>
<value>rm1</value>
</property>
<!-- 定義高可用集羣中的 id 列表 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 定義高可用RM集羣具體是哪些機器 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop301</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop302</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop301:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop302:8088</value>
</property>
<property>
<name>hadoop.zk.address</name>
<value>hadoop301:2181,hadoop302:2181,hadoop303:2181</value>
</property>

<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>

編輯 /opt/hadoop-3.2.0/etc/hadoop/mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>
/opt/hadoop-3.2.1/share/hadoop/common/,
/opt/hadoop-3.2.1/share/hadoop/common/lib/
,
/opt/hadoop-3.2.1/share/hadoop/hdfs/,
/opt/hadoop-3.2.1/share/hadoop/hdfs/lib/
,
/opt/hadoop-3.2.1/share/hadoop/mapreduce/,
/opt/hadoop-3.2.1/share/hadoop/mapreduce/lib/
,
/opt/hadoop-3.2.1/share/hadoop/yarn/,
/opt/hadoop-3.2.1/share/hadoop/yarn/lib/

</value>
</property>

</configuration>

編輯 /opt/hadoop-3.2.0/etc/hadoop/hadoop-env.sh
#The java implementation to use. By default, this environment
#variable is REQUIRED on ALL platforms except OS X!
#export JAVA_HOME=
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0

#Some parts of the shell code may do special things dependent upon
#the operating system. We have to set this here. See the next
#section as to why....
export HADOOP_OS_TYPE=${HADOOP_OS_TYPE:-$(uname -s)}
export HADOOP_PID_DIR=/opt/hadoop-3.2.1/pid
export HADOOP_LOG_DIR=/var/log/hadoop

編輯 /opt/hadoop-3.2.0/etc/hadoop/yarn-env.sh
#Specify the max heapsize for the ResourceManager. If no units are
#given, it will be assumed to be in MB.
#This value will be overridden by an Xmx setting specified in either
#HADOOP_OPTS and/or YARN_RESOURCEMANAGER_OPTS.
#Default is the same as HADOOP_HEAPSIZE_MAX
#export YARN_RESOURCEMANAGER_HEAPSIZE=
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0

編輯 /opt/hadoop-3.2.0/sbin/start-dfs.sh, /opt/hadoop-3.2.1/sbin/stop-dfs.sh,在腳本開始添加
HDFS_NAMENODE_USER=root
HDFS_DATANODE_USER=root
HDFS_JOURNALNODE_USER=root
HDFS_ZKFC_USER=root
編輯 /opt/hadoop-3.2.0/sbin/start-yarn.sh, /opt/hadoop-3.2.1/sbin/stop-yarn.sh,在腳本開始添加
YARN_RESOURCEMANAGER_USER=root
YARN_NODEMANAGER_USER=root

修改/opt/hadoop-3.2.0/etc/hadoo/workers 爲以下內容
hadoop301
hadoop302
hadoop303

拷貝 hadoop-3.2.1 到 hadoop302 hadoop303
scp -r /opt/hadoop-3.2.0 root@hadoop302:/opt
scp -r /opt/hadoop-3.2.0 root@hadoop302:/opt

在hadoop302 上執行
修改vi /opt/hadoop-3.2.0/etc/hadoop/yarn-site.xml的yarn.resourcemanager.ha.id,改成以下內容
<property>
<name>yarn.resourcemanager.ha.id</name>
<value>rm2</value>
</property>

在hadoop303上執行
vi /opt/hadoop-3.2.0/etc/hadoop/yarn-site.xml刪除以下property
<property>
<name>yarn.resourcemanager.ha.id</name>
<value>rm1</value>
</property>

啓動journalnode
在全部機器行上執行,順序 hadoop301 hadoop302 hadoop303
#注意,若是使用zsh 須要切換回bash
#chsh -s /usr/bin/bash
/opt/hadoop-3.2.1/sbin/hadoop-daemon.sh start journalnode
#或者經過 /opt/hadoop-3.2.1/bin/hdfs --daemon start journalnode

格式化 Namenode
在hadoop301上執行
#注意,若是使用zsh 須要切換回bash
#chsh -s /usr/bin/bash
/opt/hadoop-3.2.0/bin/hadoop namenode -format
#同步格式化以後的元數據到其餘namenode,否則可能起不來
scp -r /data/hadoop/hdfs/namenode/current root@hadoop302:/data/hadoop/hdfs/namenode
scp -r /data/hadoop/hdfs/namenode/current root@hadoop303:/data/hadoop/hdfs/namenode
#格式化ZK
hdfs zkfc -formatZK

啓動 hadoop
在hadoop301 上執行
#必須在bash 環境下執行,zsh 兼容模式也不行
start-dfs.sh
start-yarn.sh
hdfs haadmin -getAllServiceState

#正常啓動後所看到的進程 jps 查看
2193 QuorumPeerMain
5252 JournalNode
4886 NameNode
5016 DataNode
5487 DFSZKFailoverController

頁面訪問
hadoop 3.2.x 高可用集羣搭建
hadoop 3.2.x 高可用集羣搭建

Hadooop Classpath
不少其餘的計算引擎都會使用hadoop的hdfs和yarn,他們使用的方式都是經過Hadoop class path。經過以下命令,能夠看到hadoop的class path 又哪些

/opt/hadoop-3.2.0/bin/hadoop classpath

spark without hadoop 的安裝包就會要求配置已經安裝的hadoop 的classpath,能夠再spark-env.sh中添加以下配置
###in conf/spark-env.sh ###

#If 'hadoop' binary is on your PATH
export SPARK_DIST_CLASSPATH=$(hadoop classpath)

#With explicit path to 'hadoop' binary
export SPARK_DIST_CLASSPATH=$(/path/to/hadoop/bin/hadoop classpath)

#Passing a Hadoop configuration directoryexport SPARK_DIST_CLASSPATH=$(hadoop --config /path/to/configs classpath)

相關文章
相關標籤/搜索