天天看點

基于zookeeper搭建Hadoop的HA高可用叢集

目錄

       一.準備工作

(一).先配置一台機器作為模闆,後面用于克隆

(二).配置其他兩台機器基礎配置

(三).ssh免密操作

二.配置叢集

(一).zookeeper叢集配置(配置成功後需要拍快照)

(二).配置hadoop叢集(配置完畢後拍快照)

一.準備工作

(這裡用的這幾個版本

apache-zookeeper-3.7.0-bin.tar.gz

hadoop-2.7.2.tar.gz

jdk-8u144-linux-x64.tar.gz

(一).先配置一台機器作為模闆,後面用于克隆

1.1建立一台虛拟機(安裝的全新系統,最簡版)

1.2關閉防火牆

systemctl stop firewalld #關閉防火牆

systemctl disable firewalld # 禁用防火牆開機啟動

1.3 在/opt檔案夾建立檔案夾software和module檔案夾用于放壓縮檔案和解壓後檔案

cd /opt/

mkdir software  

mkdir module

1.4修改主機名

hostnamectl   set-hostname hadoop1

1.5修改ip位址  (可以先用 ip addr 檢視虛拟機ip位址,再根據網段改ip)

1.5.1進入網卡配置檔案

vi  /etc/sysconfig/network-script/ifcfg-ens33

TYPE="Ethernet"

PROXY_METHOD="none"

BROWSER_ONLY="no"

BOOTPROTO="dhcp"

DEFROUTE="yes"

IPV4_FAILURE_FATAL="no"

IPV6INIT="yes"

IPV6_AUTOCONF="yes"

IPV6_DEFROUTE="yes"

IPV6_FAILURE_FATAL="no"

IPV6_ADDR_GEN_MODE="stable-privacy"

NAME="ens33"

UUID="e4314a3b-a0e2-4f59-87d0-827460cac8f3"

DEVICE="ens33"

ONBOOT="yes"

1.5.2删除一些配置

IPV4_FAILURE_FATAL="no"

IPV6INIT="yes"

IPV6_AUTOCONF="yes"

IPV6_DEFROUTE="yes"

IPV6_FAILURE_FATAL="no"

IPV6_ADDR_GEN_MODE="stable-privacy"

UUID="e4314a3b-a0e2-4f59-87d0-827460cac8f3"

 1.5.3修改

将BOOTPROTO="dhcp"改為BOOTPROTO="static"

在最後添加ip位址、網關、dns伺服器

IPADDR=192.168.xx.xx

GATEWAY=192.168.xx.2

DNS1=192.168.xx.2

 1.5.4儲存後,重新開機網卡服務

systemctl restart network

1.6 修改hosts檔案,增加主機名與IP映射

vi /etc/hosts

在hosts檔案添加:

192.168.xx.xx  hadoop1

192.168.xx.xx  hadoop2

192.168.xx.xx  hadoop3

(修改windows的hosts映射

C:\Windows\System32\drivers\etc\hosts

[修改後訪可以直接用主機名代替:

如http://192.168.xx.xx:50070可以寫成http://hadoop1:50070]

)

1.7安裝lrzsz.x86_64 (在xshell上可以直接拖拽檔案上傳到Linux)

yum -y install lrzsz.x86_64

1.8 上傳JDK到 software檔案夾

1.8.1解壓jdk

tar -zxvf 壓縮包名 -C /opt/module

1.8.2配置環境變量JAVA_HOME

vi /etc/profile

#JAVA_HOME

  export JAVA_HOME=/opt/module/jdk....

  export PATH=$PATH:$JAVA_HOME/bin

1.8.3修改完畢儲存後重新整理環境變量

source /etc/profile

java -version #檢視版本,能檢視表示成功

1.9關機,并拍攝快照,克隆兩台(hadoop 2,hadoop3)

(二).配置其他兩台機器基礎配置

2.1修改hadoop2,hadoop3的ip位址

 vi /etc/sysconfig/net......./ifcfg-ens33

修改後

 TYPE="Ethernet"

   BOOTPROTO='static'

   IPADDR="192.168.xx.xx"

   GATEWAY="192.168.xx.2"

   DNS1="192.168.xx.2"

   NAME="ens33"

   DEVICES="ens33"

   ONBOOT="yes"

2.2修改兩台機器主機名為hadoop2,hadoop3

hostnamectl set-hostname hadoop2 

 hostnamectl set-hostname hadoop3

hostname #檢視主機名

(三).ssh免密操作

3.1 配置免密登入(很重要)

3.1.1在hadoop1上生成RSA秘鑰

ssh-keygen  -t  rsa    #回車就行

3.1.2在hadoop1上做自己與自己的免密

ssh-copy-id  [email protected]   # yes就行

3.1.3将這套配置分發給其他機器

sendfile.sh  .ssh    #yes 輸入密碼

這樣所有機器ssh都不需要密碼了.

在hadoop2 上 ssh hadoop3 (輸入密碼,下次連就不需要在輸密碼)

exit #登出

3.2在hadoop1家目錄下,使用rsync寫一個發送檔案腳本

vi  sendfile.sh

#!/bin/bash
    #1 擷取輸入參數個數,如果沒有參數,直接退出
    pcount=$#
    if((pcount==0)); then
    echo no args;
    exit;
    fi
     
    #2 擷取檔案名稱
    p1=$1
    fname=`basename $p1`
    echo fname=$fname
     
    #3 擷取上級目錄到絕對路徑
    pdir=`cd -P $(dirname $p1); pwd`
    echo pdir=$pdir
     
    #4 擷取目前使用者名稱
    user=`whoami`
     
    #5 循環
    for((host=2; host<4; host++)); do
            echo ------------------- hadoop   hadoop$host --------------
            rsync -av $pdir/$fname [email protected]$host:$pdir
done
           

chmod +x sendfile.sh  #添加可執行權限

cp sendfile.sh /bin/   #同步到bin目錄下,可全局執行

二.配置叢集

(一).zookeeper叢集配置(配置成功後需要拍快照)

1.1 将zookeeper壓縮檔案上傳到/opt/software,并解壓到/opt/modlue

tar -zxvf zookeeper.tar -C /opt/module

1.2 重命名檔案夾為zookeeper(在module檔案夾這裡操作)

mv  xxxx zookeeper

1.3  配置環境變量ZOOKEEPER_HOME

vi /etc/profile

#ZOOKEEPER_HOME

export ZOOKEEPER_HOME=/opt/module/zookeeper

export PATH=$PATH:$ZOOKEEPER_HOME/bin

source /etc/profile #重新整理環境變量

1.4複制配置檔案并更改配置資訊

1.4.1 在zookeeper檔案夾下

cd conf/  #進入該檔案夾下

cp zoo_sample.cfg  zoo.cfg

1.4.2 更改配置資訊

vi zoo.cfg

dataDir=/opt/module/zookeeper/data  #zkdata資料儲存的路徑

在該檔案末尾添加

server.0=hadoop1:2888:3888

server.1=hadoop2:2888:3888

server.2=hadoop3:2888:3888

1.4.3 在data檔案夾下建立一個myid,并寫入伺服器對應id号(沒有data檔案夾就建一個在zookeeper檔案夾下,mkdir data )

cd data

vi myid

0  #hadoop1就是0 hadoop2是1 hadoop3是2

1.5同步zookeeper給其他伺服器,并修改myid内容

 如果是在module檔案夾下:sendfile.sh zookeeper

家目錄下:sendfile.sh /opt/module/zookeeper

1.6 啟動zookeeper叢集

執行zookeeper/bin 下的zkServer(每台機器都要開)

./zkServer.sh start   #打開

./zkServer.sh stop   #關閉

1.7檢視每台機器的狀态

zkServer.sh status

在啟動hadoop之前,必須要先把zookeeper啟動

(二).配置hadoop叢集(配置完畢後拍快照)

叢集規劃

基于zookeeper搭建Hadoop的HA高可用叢集

 1.上傳hadoop到software檔案夾下

2.解壓到module檔案夾

tar -zxvf 壓縮包名r -C /opt/module

3.配置環境變量HADOOP_HOME

vi  etc/profile

#HADOOP_HOME

export HADOOP_HOME=/opt/module/hadoop-2.7.2

export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

source /etc/profile #重新整理環境變量

4.修改配置 (hadoop-2.7.2/etc/hadoop/)

4.1 hadoop.env.sh、 yarn.env.sh、mapred.env.sh 配置JAVA_HOME

export  JAVA_HOME=/opt/module/jdk-xx

4.2.core-site.xml

<configuration>
	<property>
        <!-- 指定 namenode 的 hdfs 協定檔案系統的通信位址 -->
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop1:8020</value>
    </property>
    <property>
        <!-- 指定 hadoop 叢集存儲臨時檔案的目錄 -->
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-2.7.2/datas</value>
    </property>
    <property>
        <!-- ZooKeeper 叢集的位址 -->
        <name>ha.zookeeper.quorum</name>
        <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
    </property>
    <property>
        <!-- ZKFC 連接配接到 ZooKeeper 逾時時長 -->
        <name>ha.zookeeper.session-timeout.ms</name>
        <value>60</value>
    </property>
<!-- 防止出現journalnode服務ConnectException -->
	 <property>
        <name>ipc.client.connect.max.retries</name>
        <value>100</value>
    </property>
    <property>
        <name>ipc.client.connect.retry.interval</name>
        <value>60</value>
    </property>
</configuration>
           

4.3 hdfs-site.xml

<configuration>
	<property>
        <!-- 指定 HDFS 副本的數量 -->
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <property>
        <!-- namenode 節點資料(即中繼資料)的存放位置,可以指定多個目錄實作容錯,多個目錄用逗号分隔 -->
        <name>dfs.namenode.name.dir</name>
        <value>/opt/module/hadoop-2.7.2/namenode/data</value>
    </property>
    <property>
        <!-- datanode 節點資料(即資料塊)的存放位置 -->
        <name>dfs.datanode.data.dir</name>
        <value>/opt/module/hadoop-2.7.2/datanode/data</value>
    </property>
    <property>
        <!-- 叢集服務的邏輯名稱 -->
        <name>dfs.nameservices</name>
        <value>mycluster</value>
    </property>
    <property>
        <!-- NameNode ID 清單-->
        <name>dfs.ha.namenodes.mycluster</name>
        <value>nn1,nn2</value>
    </property>
    <property>
        <!-- nn1 的 RPC 通信位址 -->
        <name>dfs.namenode.rpc-address.mycluster.nn1</name>
        <value>hadoop1:8020</value>
    </property>
    <property>
        <!-- nn2 的 RPC 通信位址 -->
        <name>dfs.namenode.rpc-address.mycluster.nn2</name>
        <value>hadoop2:8020</value>
    </property>
    <property>
        <!-- nn1 的 http 通信位址 -->
        <name>dfs.namenode.http-address.mycluster.nn1</name>
        <value>hadoop1:50070</value>
    </property>
    <property>
        <!-- nn2 的 http 通信位址 -->
        <name>dfs.namenode.http-address.mycluster.nn2</name>
        <value>hadoop2:50070</value>
    </property>
    <property>
        <!-- NameNode 中繼資料在 JournalNode 上的共享存儲目錄 -->
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/mycluster</value>
    </property>
    <property>
        <!-- Journal Edit Files 的存儲目錄 -->
        <name>dfs.journalnode.edits.dir</name>
        <value>/opt/module/hadoop-2.7.2/journalnode/data</value>
    </property>
    <property>
        <!-- 配置隔離機制,確定在任何給定時間隻有一個 NameNode 處于活動狀态 -->
        <name>dfs.ha.fencing.methods</name>
        <value>sshfence</value>
    </property>
    <property>
        <!-- 使用 sshfence 機制時需要 ssh 免密登入 -->
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/root/.ssh/id_rsa</value>
    </property>
    <property>
        <!-- SSH 逾時時間 -->
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>30000</value>
    </property>
    <property>
        <!-- 通路代理類,用于确定目前處于 Active 狀态的 NameNode -->
        <name>dfs.client.failover.proxy.provider.mycluster</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <property>
        <!-- 開啟故障自動轉移 -->
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>
</configuration>
           

4.4 yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->
	<property>
        <!--配置 NodeManager 上運作的附屬服務。需要配置成 mapreduce_shuffle 後才可以在 Yarn 上運作 MapReduce 程式。-->
        <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>86400</value>
    </property>
    <property>
        <!-- 啟用 RM HA -->
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
    <property>
        <!-- RM 叢集辨別 -->
        <name>yarn.resourcemanager.cluster-id</name>
        <value>my-yarn-cluster</value>
    </property>
    <property>
        <!-- RM 的邏輯 ID 清單 -->
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>
    <property>
        <!-- RM1 的服務位址 -->
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>hadoop2</value>
    </property>
    <property>
        <!-- RM2 的服務位址 -->
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hadoop3</value>
    </property>
    <property>
        <!-- RM1 Web 應用程式的位址 -->
        <name>yarn.resourcemanager.webapp.address.rm1</name>
        <value>hadoop2:8088</value>
    </property>
    <property>
        <!-- RM2 Web 應用程式的位址 -->
        <name>yarn.resourcemanager.webapp.address.rm2</name>
        <value>hadoop3:8088</value>
    </property>
    <property>
        <!-- ZooKeeper 叢集的位址 -->
        <name>yarn.resourcemanager.zk-address</name>
        <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
    </property>
    <property>
        <!-- 啟用自動恢複 -->
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
    </property>
    <property>
        <!-- 用于進行持久化存儲的類 -->
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
    </property>
</configuration>
           

4.5 需要将mapred.site.xml.template改名,mapred-site.xml

cp mapred.site.xml.template  mapred.site.xml
<configuration>
    <property>
        <!--指定 mapreduce 作業運作在 yarn 上-->
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>
           

4.6 slaves

配置所有從屬節點的主機名或ip位址

hadoop1

hadoop2

hadoop3

4.7 将hadoop分發給其他機器(sendfile.sh前面編寫的分發腳本)

sendfile.sh /opt/module/hadoop-2.72/

或者

scp -r /opt/module/hadoop-2.72/  hadoop2:/opt/module

scp -r /opt/module/hadoop-2.72/  hadoop3:/opt/module

4.8 啟動叢集

4.8.1 啟動zookeeper叢集,分别在三台伺服器上啟動

zkServer.sh start

4.8.2 啟動JournalNode

分别到hadoop-2.7.2/sbin下,啟動JournalNode程序

hadoop-daemon.sh start journalnode

4.8.3 初始化NAMENode,在hadoop1上執行NameNode初始化

hdfs namenode -format

執行成功後,将存Namenode的中繼資料目錄複制到未格式化的hadoop2上Namenode上[hdfs-site.xml 中dfs.namenode.name.dir屬性指定的目錄]

 scp -r /opt/module/hadoop-2.7.2/namenode/data

 hadoop2:/opt/module/hadoop-2.7.2/namenode/data

4.8.4 初始化HA狀态,在任意一個有Namenode上執行指令來初始化zookeeper中的HA狀态

hdfs zkfc -formatZK

4.8.5 啟動HDFS,在hadoop1上hadoop-2.7.2/sbin目錄下,此時 hadoop1 和 hadoop2 上的 NameNode 服務,和三台伺服器上的 DataNode 服務都會被啟動:

start-dfs.sh

4.8.6 啟動yarn,在hadoop2上 hadoop-2.7.2/sbin目錄下,此時 hadoop2 上的 ResourceManager 服務,和三台伺服器上的 NodeManager 服務都會被啟動:

start-yarn.sh

但是,這個時候 hadoop3 上的 ResourceManager 服務通常是沒有啟動的,需要手動啟動:

yarn-daemon.sh start resourcemanager

4.8.7 檢視程序jps

基于zookeeper搭建Hadoop的HA高可用叢集

5 檢視web 端 ,hdfs和yarn端口号分别是:50070,8088

Hadoop1 上的Namenode

通路位址:http://192.168.xx.xx:50070

基于zookeeper搭建Hadoop的HA高可用叢集

 Hadoop2 上的Namenode

基于zookeeper搭建Hadoop的HA高可用叢集

Hadoop2 上的resourcemanager

 通路位址:http://192.168.xx.xx:8088

基于zookeeper搭建Hadoop的HA高可用叢集

Hadoop3 上的resourcemanager

基于zookeeper搭建Hadoop的HA高可用叢集

 6.hadoop叢集再次啟動(不涉及初始化操作了)

首先開zookeeper叢集,在打開hadoop叢集

zkServer.sh start   #hadoop1,hadoop2,hadoop3

start-dfs.sh       #hadoop1

start-yarn.sh   #hadoop2

yarn-daemon.sh start resourcemanager  #hadoop3

執行完畢用jps看一眼,DFSZKFailoverController

是否啟動成功,若沒成功需要手動再起

hadoop-daemon.sh start zkfc   #隻有hadoop1和hadoop2才有