hadoop高可用安裝和原理詳解

本篇主要從hdfs的namenode和resourcemanager的高可用進行安裝和原理的闡述。html

1、HA安裝java

一、基本環境準備node

1.1.一、centos7虛擬機安裝,詳情見VMware安裝Centos7虛擬機linux

1.1.二、關閉防火牆web

systemctl stop firewalld.service
systemctl disable firewalld.service

1.1.三、修改selinuxsql

vim /etc/selinux/config
將SELINUX=enforcing改成SELINUX=disabledshell

[hadoop@lgh2 ~]$ cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 

1.1.四、安裝javaapache

java 安裝
tar -zxvf jdk-8u201-linux-x64.tar.gz -C /usr/local/

vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_201 
export JRE_HOME=/usr/local/jdk1.8.0_201/jre     
export CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
source /etc/profile

1.1.五、添加用戶hadoopbootstrap

groupadd hadoop
useradd -g hadoop -d /home/hadoop
echo 'hadoop' | passwd hadoop --stdin

1.1.六、修改/etc/hostsvim

cat /etc/hosts
192.168.88.131 lgh1
192.168.88.132 lgh2
192.168.88.133 lgh3

如上環境咱們準備三臺機器,如上1.1.6所見:

1.1.七、配置免密登陸

ssh-keygen -t rsa #這個操做須要連續三次按enter鍵,
ssh-copy-id  lgh3
ssh-copy-id  lgh2
ssh-copy-id  lgh1

1.1.八、配置時間同步(這個很重要,在生產環境一定要有,不過本身玩也能夠不用配置)

首先咱們選定192.168.88.131(lgh1)這臺爲時間標準的節點,其餘兩臺機器同這個節點進行同步

設置192.168.88.131這個節點:

yum install -y ntp  #若是沒有安裝就安裝
[root@lgh1 ~]# rpm -qa | grep ntp  #查看安裝結果
ntp-4.2.6p5-29.el7.centos.x86_64   #用來提供時間同步服務
ntpdate-4.2.6p5-29.el7.centos.x86_64 #和某臺服務器進行同步

修改/etc/ntp.conf文件

egrep -v "^$|#" /etc/ntp.conf

[root@lgh1 ~]# egrep -v "^$|#" /etc/ntp.conf 
driftfile /var/lib/ntp/drift
restrict default nomodify notrap nopeer noquery
restrict 192.168.88.0 mask 255.255.255.0 nomodify notrap 
restrict 127.0.0.1 
restrict ::1
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server 127.127.1.0
fudge 127.127.1.0 stratum 10
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
disable monitor

systemctl enable ntpd  #啓動

其餘兩個節點:lhg2和lgh3設置以下:

首先要安裝ntpd:yum install -y ntp #若是沒有安裝則要安裝
新增crontab -e 

*/5 * * * * /usr/sbin/ntpdate -u 192.168.88.131 #表示每五分鐘和131時間同步一次

測試:(能夠經過以下命令修改131的時間,看其餘兩個節點是否能同步成功,親測成功)
date "+%Y-%m-%d %H:%M:%S"
date -s '2018-09-20 10:02:02'

 

二、hadoop高可用安裝

1.2.一、安裝規劃--目錄

 

mkdir -p /opt/hadoop #存放hadoop文件,安裝目錄
chown -R hadoop:hadoop /opt/hadoop
mkdir -p /opt/data/hadoop/hdfs #存放namenode和datanode的數據
mkdir -p /opt/data/hadoop/tmp  #存放臨時文件
chown -R hadoop:hadoop /opt/data/hadoop/hdfs
chown -R hadoop:hadoop /opt/data/hadoop/tmp

 

1.2.二、角色規劃

 

  解壓1.2.三、zookeeper安裝

cd /opt/hadoop
tar -zxvf zookeeper-3.4.8.tar.gz 
ln -s  zookeeper-3.4.8 zookeeper

配置環境變量

vim /etc/profile
export ZOOKEEPER_HOME=/opt/hadoop/zookeeper
export PATH=$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf:$PATH
source /etc/profile

修改配置zoo.cfg

cd /opt/hadoop/zookeeper/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg

tickTime=2000 #服務器與客戶端之間交互的基本時間單元(ms)
initLimit=10 # 此配置表示容許follower鏈接並同步到leader的初始化時間,它以tickTime的倍數來表示。當超過設置倍數的tickTime時間,則鏈接失敗
syncLimit=5 # Leader服務器與follower服務器之間信息同步容許的最大時間間隔,若是超過次間隔,默認follower服務器與leader服務器之間斷開連接
dataDir=/opt/hadoop/zookeeper/data #保存zookeeper數據路徑
dataLogDir=/opt/hadoop/zookeeper/dataLog #保存zookeeper日誌路徑,當此配置不存在時默認路徑與dataDir一致
clientPort=2181 #客戶端訪問zookeeper時通過服務器端時的端口號
server.1=lgh1:2888:3888 #表示了不一樣的zookeeper服務器的自身標識,做爲集羣的一部分,每一臺服務器應該知道其餘服務器的信息
server.2=lgh2:2888:3888
server.3=lgh3:2888:3888
maxClientCnxns=60 #限制鏈接到zookeeper服務器客戶端的數量

修改myid文件

cd /opt/hadoop/zookeeper
mkdir data dataLog

cd /opt/hadoop/zookeeper/data
touch myid && echo 1 > myid

分發並修改myid文件

scp -r /opt/hadoop/zookeeper hadoop@lgh2:/opt/hadoop/
scp -r /opt/hadoop/zookeeper hadoop@lgh3:/opt/hadoop/
vim /opt/hadoop/zookeeper/data/myid #lgh2 修改成2
vim /opt/hadoop/zookeeper/data/myid #lgh3 修改成3

啓動並查看狀態

zkServer.sh start
zkServer.sh status

一臺爲leader狀態,其餘兩個爲follower狀態

 

 

 

 1.2.四、解壓hadoop

cd /opt/hadoop
tar -zxvf hadoop-2.7.7.tar.gz 
ln -s hadoop-2.7.7 hadoop

1.2.五、配置環境變量

export HADOOP_HOME="/opt/hadoop/hadoop-2.7.7"
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

1.2.六、修改hadoop-env.sh、mapred-env.sh、yarn-env.sh

export JAVA_HOME=/usr/local/jdk1.8.0_201

1.2.七、修改hdfs-site.xml文件

<configuration>
  <property>
    <!-- 爲namenode集羣定義一個services name -->
    <name>dfs.nameservices</name>
    <value>mycluster</value>
  </property>
  <property>
    <!-- nameservice 包含哪些namenode,爲各個namenode起名 -->
    <name>dfs.ha.namenodes.mycluster</name>
    <value>nn1,nn2</value>
  </property>
  <property>
    <!--  名爲nn1的namenode 的rpc地址和端口號,rpc用來和datanode通信 -->
    <name>dfs.namenode.rpc-address.mycluster.nn1</name>
    <value>lgh1:8020</value>
  </property>
  <property>
    <!-- 名爲nn2的namenode 的rpc地址和端口號,rpc用來和datanode通信  -->
    <name>dfs.namenode.rpc-address.mycluster.nn2</name>
    <value>lgh2:8020</value>
  </property>
  <property>
    <!--名爲nn1的namenode 的http地址和端口號,web客戶端 -->
    <name>dfs.namenode.http-address.mycluster.nn1</name>
    <value>lgh1:50070</value>
  </property>
  <property>
    <!--名爲nn2的namenode 的http地址和端口號,web客戶端 -->
    <name>dfs.namenode.http-address.mycluster.nn2</name>
    <value>lgh2:50070</value>
  </property>
  <property>
    <!--  namenode間用於共享編輯日誌的journal節點列表 -->
    <!-- 指定NameNode的edits元數據的共享存儲位置。也就是JournalNode列表
                                            該url的配置格式:qjournal://host1:port1;host2:port2;host3:port3/journalId
        journalId推薦使用nameservice,默認端口號是:8485 -->
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://lgh1:8485;lgh2:8485;lgh3:8485/mycluster</value>
  </property>
  <property>
    <!--  journalnode 上用於存放edits日誌的目錄 -->
    <name>dfs.journalnode.edits.dir</name>
    <value>/opt/hadoop/hadoop/tmp/data/dfs/jn</value>
  </property>
  <property>
    <!--  客戶端鏈接可用狀態的NameNode所用的代理類 -->
    <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
           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>
   <!-- journalnode集羣之間通訊的超時時間 -->
  <property>
    <name>dfs.qjournal.start-segment.timeout.ms</name>
    <value>60000</value>
  </property>
  <!-- 指定副本數 -->
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
  <!--namenode路徑-->
  <property>
        <name>dfs.namenode.name.dir</name>
        <value>/opt/data/hadoop/hdfs/nn</value>
    </property>
  <!--datanode路徑-->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/opt/data/hadoop/hdfs/dn</value>
    </property>
    <!-- 開啓NameNode失敗自動切換 -->
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>
    <!-- 啓用webhdfs -->
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>

    <!-- 配置sshfence隔離機制超時時間 -->
    <property>
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>30000</value>
    </property>

    <property>
        <name>ha.failover-controller.cli-check.rpc-timeout.ms</name>
        <value>60000</value>
    </property>
</configuration>

1.2.八、修改core-site.xml

<configuration>
  <property>
    <!--  hdfs 地址,ha中是鏈接到nameservice -->
    <name>fs.defaultFS</name>
    <value>hdfs://mycluster</value>
  </property>
  <property>
    <!--  -->
    <name>hadoop.tmp.dir</name>
    <value>/opt/data/hadoop/tmp</value>
  </property>
  <!-- 指定zookeeper地址 -->
<property>
    <name>ha.zookeeper.quorum</name>
    <value>lgh1:2181,lgh2:2181,lgh3:2181</value>
</property>

<!-- hadoop連接zookeeper的超時時長設置 -->
     <property>
         <name>ha.zookeeper.session-timeout.ms</name>
         <value>30000</value>
         <description>ms</description>
     </property>

    <property>
        <name>fs.trash.interval</name>
        <value>1440</value>
    </property>
    <property>
       <name>hadoop.proxyuser.hdfs.groups</name>
       <value>*</value>
    </property>
    <property>
       <name>hadoop.proxyuser.hdfs.hosts</name>
       <value>*</value>
    </property>
    <property>
       <name>hadoop.proxyuser.hive.groups</name>
       <value>*</value>
    </property>
    <property>
       <name>hadoop.proxyuser.hive.hosts</name>
       <value>*</value>
    </property>
</configuration>

1.2.九、修改yarn-site.xml 

<configuration>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
  </property>
  <property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>106800</value>
  </property>
  <property>
    <!--  啓用resourcemanager的ha功能 -->
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
  </property>
  <property>
    <!--  爲resourcemanage ha 集羣起個id -->
    <name>yarn.resourcemanager.cluster-id</name>
    <value>yarn-cluster</value>
  </property>
  <property>
    <!--  指定resourcemanger ha 有哪些節點名 -->
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm1,rm2</value>
  </property>
  <property>
    <!--  指定第一個節點的所在機器 -->
    <name>yarn.resourcemanager.hostname.rm1</name>
    <value>lgh2</value>
  </property>
  <property>
    <!--  指定第二個節點所在機器 -->
    <name>yarn.resourcemanager.hostname.rm2</name>
    <value>lgh3</value>
  </property>
  <property>
    <!--  指定resourcemanger ha 所用的zookeeper 節點 -->
    <name>yarn.resourcemanager.zk-address</name>
    <value>lgh1:2181,lgh2:2181,lgh3:2181</value>
  </property>
  <property>
    <!--  -->
    <name>yarn.resourcemanager.recovery.enabled</name>
    <value>true</value>
  </property>
  <!-- 制定resourcemanager的狀態信息存儲在zookeeper集羣上 -->
    <property>
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
    </property>
  <property>
      <name>yarn.log.server.url</name>
      <value>http://lgh2:19888/jobhistory/logs/</value>
  </property>
</configuration>

1.2.十、修改 slaves 

lgh1
lgh2
lgh3

1.2.十一、分發到其餘兩個節點

scp /opt/hadoop/hadoop-2.7.7 hadoop@lgh2:/opt/hadoop/
scp /opt/hadoop/hadoop-2.7.7 hadoop@lgh3:/opt/hadoop/

1.2.十二、格式化nomenode和zookeeper

[hadoop@lgh1 ~]$ hdfs namenode -format
[hadoop@lgh2 ~]$ hdfs namenode -bootstrapStandby
[hadoop@lgh1 ~]$ hdfs zkfc -formatZK #格式化zookeeper

1.2.1三、啓動

stop-dfs.sh  #關閉全部journalnode
start-dfs.sh #啓動namenode,datanode,journalnode等組件
start-yarn.sh #啓動yarn

[hadoop@lgh2 ~]$ /opt/hadoop/hadoop/sbin/yarn-daemon.sh start resourcemanager #這裏必定要注意是yarn-daemon.sh,啓動resourcemanager
[hadoop@lgh3 ~]$ /opt/hadoop/hadoop/sbin/yarn-daemon.sh start resourcemanager

1.2.1四、查看進程

jps (圖片不協調。。。)

 

 

 

1.2.1五、 訪問頁面(namenode)

192.168.88.131:50070

192.168.88.132:50070

 

 

 

 

 

1.2.1六、測試namenode故障轉移

在節點192.168.88.132上執行:

[hadoop@lgh2 ~]$ /opt/hadoop/hadoop/sbin/hadoop-daemon.sh stop namenode

 

 

 

 

 

 

 而後咱們恢復192.168.88.132的namenode

[hadoop@lgh2 ~]$ /opt/hadoop/hadoop/sbin/hadoop-daemon.sh start namenode

 

 

 該節點變成了standby節點。說明故障轉移成功

1.2.1七、查看yarn頁面訪問

 

 

resourcemanager的故障測試:

[hadoop@lgh3 ~]$ /opt/hadoop/hadoop/sbin/yarn-daemon.sh stop resourcemanager  #停掉lgh3節點上的resourcemanager

這裏不截圖了,很成功

到這裏hadoop的高可用就安裝完畢了(不過筆者這個中踩了很多坑,遇到一些奇葩問題,可是沒有記錄,總之,刪除掉生成的東西,多格式化幾回試試)

刪除的目錄有:

rm -rf /opt/data/hadoop/hdfs/*

rm -rf /opt/data/hadoop/tmp/*

rm -rf /opt/hadoop/hadoop/logs/*

 

 

2、基本原理

一、namenode高可用

 

     咱們知道namenode是整個hdfs的核心,若是namenode掛了,那麼整個hdfs文件系統也不能提供服務,因此hadoop對hdfs提供了高可用的方案,即Hadoop HA,hdfs的高可用提供了兩種方案,一種是基於QJM(Quorum Journal Manager)的,一種是基於NFS的,咱們用的通常都是基於QJM的,因此這裏也是講基於QJM的高可用,高可用用來解決NameNode單點故障的問題。解決的方法是在HDFS集羣中設置多個NameNode節點。那麼提供多個namenode一定存在新的問題:

一、如何保證NameNode內存中元數據數據一致,並保證編輯日誌文件的安全性。
二、多個NameNode如何協做
三、客戶端如何能正確地訪問到可用的那個NameNode。
四、怎麼保證任意時刻只能有一個NameNode處於對外服務狀態

針對如上問題,hadoop提供了以下解決方案:

       對於保證NameNode元數據的一致性和編輯日誌的安全性,採用Zookeeper來存儲編輯日誌文件。

       兩個NameNode一個是Active狀態的,一個是Standby狀態的,一個時間點只能有一個Active狀態的 。

       NameNode提供服務,兩個NameNode上存儲的元數據是實時同步的,當Active的NameNode出現問題時,經過Zookeeper實時切換到Standby的NameNode上,並將Standby改成Active狀態。

      客戶端經過鏈接一個Zookeeper的代理來肯定當時哪一個NameNode處於服務狀態。

咱們看一下hdfs高可用的架構圖:以下圖所示:

 

 

          HDFS HA架構中有兩臺NameNode節點,一臺是處於活動狀態(Active)爲客戶端提供服務,另一臺處於熱備份狀態(Standby)。

         DataNode會將心跳信息和Block彙報信息同時發給兩臺NameNode,DataNode只接受Active NameNode發來的文件讀寫操做指令。爲了使備用節點保持其狀態與Active節點同步,兩個節點都與一組稱爲「JournalNodes」(JN)的單獨守護進程通訊。當Active節點執行任何名稱空間修改時,它會將修改記錄持久地記錄到大多數這些JN中。待機節點可以從JN讀取編輯,而且不斷觀察它們對編輯日誌的更改。當備用節點看到編輯時,它會將它們應用到本身的命名空間。若是發生故障轉移,Standby將確保在將自身升級爲Active狀態以前已從JournalNodes讀取全部編輯內容。這可確保在發生故障轉移以前徹底同步命名空間狀態。注意:必須至少有3個JournalNode守護進程,由於編輯日誌修改必須寫入大多數JN。這將容許系統容忍單個機器的故障。您也能夠運行3個以上的JournalNodes,但爲了實際增長系統能夠容忍的失敗次數,您應該運行奇數個JN(即3,5,7等)。請注意:當使用N JournalNodes運行時,系統最多能夠容忍(N-1)/ 2個故障並繼續正常運行。

     Zookeeper來保證在Active NameNode失效時及時將Standby NameNode修改成Active狀態。

   故障檢測 - 集羣中的每一個NameNode計算機都在ZooKeeper中維護一個持久會話。若是計算機崩潰,ZooKeeper會話將過時,通知其餘NameNode應該觸發故障轉移。Active NameNode選舉 - ZooKeeper提供了一種簡單的機制,能夠將節點專門選爲活動節點。若是當前活動的NameNode崩潰,則另外一個節點可能在ZooKeeper中採用特殊的獨佔鎖,指示它應該成爲下一個活動的。

    ZKFailoverController(ZKFC)是一個新組件,它是一個ZooKeeper客戶端,它還監視和管理NameNode的狀態。運行NameNode的每臺機器也運行ZKFC,ZKFC負責:

一、運行情況監視 : ZKFC按期使用運行情況檢查命令對其本地NameNode進行ping操做。只要NameNode及時響應健康狀態,ZKFC就認爲該節點是健康的。若是節點已崩潰,凍結或以其餘方式進入不健康狀態,則運行情況監視器會將其標記爲運行情況不佳。

二、ZooKeeper會話管理 :當本地NameNode運行正常時,ZKFC在ZooKeeper中保持會話打開。若是本地NameNode處於活動狀態,它還擁有一個特殊的「鎖定」znode。此鎖使用ZooKeeper對「短暫」節點的支持; 若是會話過時,將自動刪除鎖定節點

三、基於ZooKeeper的選舉 :若是本地NameNode是健康的,而且ZKFC發現沒有其餘節點當前持有鎖znode,它將本身嘗試獲取鎖。若是成功,那麼它「贏得了選舉」,並負責運行故障轉移以使其本地NameNode處於活動狀態。故障轉移過程相似於上述手動故障轉移:首先,必要時對先前的活動進行隔離,而後本地NameNode轉換爲活動狀態。

    元數據文件有兩個文件:fsimage和edits,備份元數據就是備份這兩個文件。JournalNode用來實時從Active NameNode上拷貝edits文件,JournalNode有三臺也是爲了實現高可用。

    Standby NameNode不對外提供元數據的訪問,它從Active NameNode上拷貝fsimage文件,從JournalNode上拷貝edits文件,而後負責合併fsimage和edits文件,至關於SecondaryNameNode的做用。最終目的是保證Standby NameNode上的元數據信息和Active NameNode上的元數據信息一致,以實現熱備份。

 

二、resourcemanager高可用

首先咱們來看一下官方提供的架構圖:如圖所示:

 

 

    ResourceManager HA經過主動/備用架構實現 - 在任什麼時候間點,其中一個RM處於活動狀態,而且一個或多個RM處於待機模式,等待活動RM出現故障或者宕機時機。轉換爲活動的觸發器來自管理員(經過CLI)或啓用自動故障轉移時的集成故障轉移控制器。

   RM能夠選擇嵌入基於Zookeeper的ActiveStandbyElector來決定哪一個RM應該是Active。當Active關閉或無響應時,另外一個RM自動被選爲Active,而後接管。請注意,不須要像HDFS那樣運行單獨的ZKFC守護程序,由於嵌入在RM中的ActiveStandbyElector充當故障檢測器和領導者選擇器而不是單獨的ZKFC守護程序。

    當存在多個RM時,客戶端和節點使用的配置(yarn-site.xml)應該列出全部RM。客戶端,應用程序管理器ApplicationMaster(AM)和節點管理器NodeManager(NM)嘗試以循環方式鏈接到RM,直到它們到達活動RM。若是活動中止,他們將恢復循環輪詢,直到他們鏈接到新的RM

 

更多相關文章:hadoop生態系列

參考:

https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html

https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html

http://www.javashuo.com/article/p-tweovbou-eg.html

http://www.javashuo.com/article/p-xugvrxde-me.html

相關文章
相關標籤/搜索