1. 程式人生 > >centos7搭建hadoop2.10高可用(HA)

centos7搭建hadoop2.10高可用(HA)

本篇介紹在centos7中搭建hadoop2.10高可用叢集,首先準備6臺機器:2臺nn(namenode);4臺dn(datanode);3臺jns(journalnodes)

IP hostname 程序
192.168.30.141 s141 nn1(namenode),zkfc(DFSZKFailoverController),zk(QuorumPeerMain)
192.168.30.142 s142 dn(datanode), jn(journalnode),zk(QuorumPeerMain)
192.168.30.143 s143 dn(datanode), jn(journalnode),zk(QuorumPeerMain)
192.168.30.144 s144 dn(datanode), jn(journalnode)
192.168.30.145 s145 dn(datanode)
192.168.30.146 s146 nn2(namenode),zkfc(DFSZKFailoverController)

 

 

 

 

 

各個機器 jps程序:

 

 

由於本人使用的是vmware虛擬機器,所以在配置好一臺機器後,使用克隆,克隆出剩餘機器,並修改hostname和IP,這樣每臺機器配置就都統一了每臺機器配置 新增hdfs使用者及使用者組,配置jdk環境,安裝hadoop,本次搭建高可用叢集在hdfs使用者下,可以參照:centos7搭建hadoop2.10偽分佈模式

下面是安裝高可用叢集的一些步驟和細節:

1.設定每臺機器的hostname 和 hosts

修改hosts檔案,hosts設定有後可以使用hostname訪問機器,這樣比較方便,修改如下:

127.0.0.1 locahost
192.168.30.141 s141
192.168.30.142 s142
192.168.30.143 s143
192.168.30.144 s144
192.168.30.145 s145
192.168.30.146 s146

2.設定ssh無密登入,由於s141和s146都為namenode,所以要將這兩臺機器無密登入到所有機器,最好hdfs使用者和root使用者都設定無密登入

我們將s141設定為nn1,s146設定為nn2,就需要s141、s146能夠通過ssh無密登入到其他機器,這樣就需要在s141和s146機器hdfs使用者下生成金鑰對,並將s141和s146公鑰傳送到其他機器放到~/.ssh/authorized_keys檔案中,更確切的說要將公鑰新增的所有機器上(包括自己)

在s141和s146機器上生成金鑰對:

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

將id_rsa.pub檔案內容追加到s141-s146機器的/home/hdfs/.ssh/authorized_keys中,現在其他機器暫時沒有authorized_keys檔案,我們就將id_rsa.pub更名為authorized_keys即可,如果其他機器已存在authorized_keys檔案可以將id_rsa.pub內容追加到該檔案後,遠端複製可以使用scp命令:

s141機器公鑰複製到其他機器

scp id_rsa.pub hdfs@s141:/home/hdfs/.ssh/id_rsa_141.pub
scp id_rsa.pub hdfs@s142:/home/hdfs/.ssh/id_rsa_141.pub
scp id_rsa.pub hdfs@s143:/home/hdfs/.ssh/id_rsa_141.pub
scp id_rsa.pub hdfs@s144:/home/hdfs/.ssh/id_rsa_141.pub
scp id_rsa.pub hdfs@s145:/home/hdfs/.ssh/id_rsa_141.pub
scp id_rsa.pub hdfs@s146:/home/hdfs/.ssh/id_rsa_141.pub

s146機器公鑰複製到其他機器

scp id_rsa.pub hdfs@s141:/home/hdfs/.ssh/id_rsa_146.pub
scp id_rsa.pub hdfs@s142:/home/hdfs/.ssh/id_rsa_146.pub
scp id_rsa.pub hdfs@s143:/home/hdfs/.ssh/id_rsa_146.pub
scp id_rsa.pub hdfs@s144:/home/hdfs/.ssh/id_rsa_146.pub
scp id_rsa.pub hdfs@s145:/home/hdfs/.ssh/id_rsa_146.pub
scp id_rsa.pub hdfs@s146:/home/hdfs/.ssh/id_rsa_146.pub

在每臺機器上可以使用cat將祕鑰追加到authorized_keys檔案

cat id_rsa_141.pub >> authorized_keys
cat id_rsa_146.pub >> authorized_keys

此時authorized_keys檔案許可權需要改為644(注意,經常會因為這個許可權問題導致ssh無密登入失敗)

chmod 644 authorized_keys

3.配置hadoop配置檔案(${hadoop_home}/etc/hadoop/)

配置細節:

注意: s141和s146具有完全一致的配置,尤其是ssh.

1) 配置nameservice

[hdfs-site.xml]
<property>
    <name>dfs.nameservices</name>
    <value>mycluster</value>
</property>


2) dfs.ha.namenodes.[nameservice ID]

[hdfs-site.xml]
<!-- myucluster下的名稱節點兩個id -->
<property>
  <name>dfs.ha.namenodes.mycluster</name>
  <value>nn1,nn2</value>
</property>

3) dfs.namenode.rpc-address.[nameservice ID].[name node ID] 

[hdfs-site.xml]
配置每個nn的rpc地址。
<property>
    <name>dfs.namenode.rpc-address.mycluster.nn1</name>
    <value>s141:8020</value>
</property>
<property>
    <name>dfs.namenode.rpc-address.mycluster.nn2</name>
    <value>s146:8020</value>
</property>

4) dfs.namenode.http-address.[nameservice ID].[name node ID]
配置webui埠

[hdfs-site.xml]
<property>
    <name>dfs.namenode.http-address.mycluster.nn1</name>
    <value>s141:50070</value>
</property>
<property>
    <name>dfs.namenode.http-address.mycluster.nn2</name>
    <value>s146:50070</value>
</property>

5) dfs.namenode.shared.edits.dir
名稱節點共享編輯目錄.選擇三臺journalnode節點,這裡選擇s142、s143、s144三臺機器

[hdfs-site.xml]
<property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://s142:8485;s143:8485;s144:8485/mycluster</value>
</property>

6) dfs.client.failover.proxy.provider.[nameservice ID]
配置一個HA失敗轉移的java類(改配置是固定的),client使用它判斷哪個節點是啟用態。

[hdfs-site.xml]
<property>
    <name>dfs.client.failover.proxy.provider.mycluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

7) dfs.ha.fencing.methods
指令碼列表或者java類,在容災保護啟用態的nn.

[hdfs-site.xml]
<property>
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
</property>

<property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/home/hdfs/.ssh/id_rsa</value>
</property>

8) fs.defaultFS 
配置hdfs檔案系統名稱服務。這裡的mycluster為上面配置的dfs.nameservices  

[core-site.xml]
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://mycluster</value>
</property>

9) dfs.journalnode.edits.dir
配置JN存放edit的本地路徑。

[hdfs-site.xml]
<property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/home/hdfs/hadoop/journal</value>
</property>

 

完整配置檔案:

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>/home/hdfs/hadoop</value>
    </property>
</configuration>

hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <property>
      <name>dfs.replication</name>
      <value>3</value>
    </property>
    <property>
      <name>dfs.hosts</name>
      <value>/opt/soft/hadoop/etc/dfs.include.txt</value>
    </property>
    <property>
      <name>dfs.hosts.exclude</name>
      <value>/opt/soft/hadoop/etc/dfs.hosts.exclude.txt</value>
    </property>
    <property>
      <name>dfs.nameservices</name>
      <value>mycluster</value>
    </property>
    <property>
      <name>dfs.ha.namenodes.mycluster</name>
      <value>nn1,nn2</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn1</name>
      <value>s141:8020</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn2</name>
      <value>s146:8020</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.mycluster.nn1</name>
      <value>s141:50070</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.mycluster.nn2</name>
      <value>s146:50070</value>
    </property>
    <property>
      <name>dfs.namenode.shared.edits.dir</name>
      <value>qjournal://s142:8485;s143:8485;s144:8485/mycluster</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>

    <property>
      <name>dfs.ha.fencing.ssh.private-key-files</name>
      <value>/home/hdfs/.ssh/id_rsa</value>
    </property>
    <property>
      <name>dfs.journalnode.edits.dir</name>
      <value>/home/hdfs/hadoop/journal</value>
    </property>
</configuration>

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>
</configuration>

yarn-site.xml

<?xml version="1.0"?>

<configuration>

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

4. 部署細節

 1)在jn節點分別啟動jn程序(s142,s143,s144)

hadoop-daemon.sh start journalnode

 2)啟動jn之後,在兩個NN之間進行disk元資料同步

  a)如果是全新叢集,先format檔案系統,只需要在一個nn上執行。
  [s141|s146]

hadoop namenode -format

  b)如果將非HA叢集轉換成HA叢集,複製原NN的metadata到另一個NN上.

    1.步驟一
    在s141機器上,將hadoop資料複製到s146對應的目錄下

scp -r /home/hdfs/hadoop/dfs hdfs@s146:/home/hdfs/hadoop/

    2.步驟二
    在新的nn(未格式化的nn,我這裡是s146)上執行以下命令,實現待命狀態引導。注意:需要s141namenode為啟動狀態(可以執行:hadoop-daemon.sh start namenode )。

hdfs namenode -bootstrapStandby

    如果沒有啟動s141名稱節點,就會失敗,如圖:

     啟動s141名稱節點後,在s141上執行命令

hadoop-daemon.sh start namenode

    然後在執行待命引導命令,注意:提示是否格式化,選擇N,如圖:

    3. 步驟三

    在其中一個NN上執行以下命令,完成edit日誌到jn節點的傳輸。

hdfs namenode -initializeSharedEdits

    如果執行過程中報:java.nio.channels.OverlappingFileLockException  錯誤:

       說明namenode在啟動中,需要停掉namenode節點(hadoop-daemon.sh stop namenode)

      執行完後檢視s142,s143,s144是否有edit資料,這裡檢視生產了mycluster目錄,裡面有編輯日誌資料,如下:

       4.步驟四

      啟動所有節點.

      在s141上啟動名稱節點和所有資料節點:

hadoop-daemon.sh start namenode
hadoop-daemons.sh start datanode

      在s146上啟動名稱節點

hadoop-daemon.sh start namenode

 此時在瀏覽器中訪問  http://192.168.30.141:50070/ 和 http://192.168.30.146:50070/ 你會發現兩個namenode都為standby

  

 

 這時需要手動使用命令將其中一個切換為啟用態,這裡將s141(nn1)設定為active

hdfs haadmin -transitionToActive nn1

此時s141就為active

 hdfs haadmin常用命令:

至此手動容災高可用配置完成,但是這種方式不智慧,不能夠自動感知容災,所以下面介紹自動容災配置

5.自動容災配置

需要引入zookeeper quarum 和 zk 容災控制器(ZKFC)兩個元件

  搭建zookeeper叢集,選擇s141,s142,s143三臺機器,下載 zookeeper:http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.6

  1) 解壓zookeeper:

tar -xzvf apache-zookeeper-3.5.6-bin.tar.gz -C /opt/soft/zookeeper-3.5.6

  2) 配置環境變數,在/etc/profile中新增zk環境變數,並重新編譯/etc/profile檔案

source /etc/profile

  3) 配置zk配置檔案,三臺機器配置檔案統一

# 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=/home/hdfs/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=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=s141:2888:3888
server.2=s142:2888:3888
server.3=s143:2888:3888

  4)分別

    在s141的/home/hdfs/zookeeper(在zoo.cfg配置檔案中配置的dataDir路徑)目錄下建立myid檔案,值為1(對應zoo.cfg配置檔案中的server.1)

    在s142的/home/hdfs/zookeeper(在zoo.cfg配置檔案中配置的dataDir路徑)目錄下建立myid檔案,值為2(對應zoo.cfg配置檔案中的server.2)

    在s143的/home/hdfs/zookeeper(在zoo.cfg配置檔案中配置的dataDir路徑)目錄下建立myid檔案,值為3(對應zoo.cfg配置檔案中的server.3)

  5) 分別在每臺機器上啟動zk

zkServer.sh start

  啟動成功會出現zk程序:

 

 配置hdfs相關配置:

  1)停止hdfs所有程序

stop-all.sh

  2) 配置hdfs-site.xml,啟用自動容災.

[hdfs-site.xml]
<property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
</property>

  3) 配置core-site.xml,指定zk的連線地址.

<property>
    <name>ha.zookeeper.quorum</name>
    <value>s141:2181,s142:2181,s143:2181</value>
</property>

  4) 分發以上兩個檔案到所有節點。

  5) 在其中的一臺NN(s141),在ZK中初始化HA狀態

hdfs zkfc -formatZK

  出現如下結果說明成功:

 

   也可去zk中檢視:

 

   6) 啟動hdfs叢集

start-dfs.sh

檢視各個機器程序:

 

 啟動成功,再看一下webui

  s146為啟用態

 

   s141為待命態

 

 至此hadoop 自動容災HA搭建