1. 程式人生 > >使用3臺虛擬機器搭建Hadoop HA叢集(1)

使用3臺虛擬機器搭建Hadoop HA叢集(1)

系列部落格目錄連結:Hadoop權威指南學習筆記:總章

基礎環境搭建:使用3臺虛擬機器搭建Hadoop HA叢集(1)
HA環境搭建:使用3臺虛擬機器搭建Hadoop HA叢集(2)

工欲善其事,必先利其器,要學好大資料,就必須首先學會自己動手搭建Hadoop叢集。本文章僅介紹搭建方法,因為資源有限,有些部署策略可能不適合實際應用。

本節包含如下內容

  • 叢集架構設計
  • 配置DNS環境
  • 搭建DNS伺服器
  • 配置叢集間免密
  • 配置Java環境
  • 配置時間同步服務

一. 計劃

由於手頭只有一臺筆記本,因此選擇在一臺筆記本上搭建三臺虛擬機器來模擬叢集。

1. 節點資源分配

IP Hostname 系統環境 username 記憶體 儲存 CPU核數
192.168.46.128 cloud1 ubuntu 16.04 hadoop 1GB 50GB 1
192.168.46.129 cloud2 ubuntu 16.04 hadoop 1GB 50GB 1
192.168.46.130 cloud3 ubuntu 16.04 hadoop 1GB 50GB 1

2. 叢集架構

IP zkfc zookeeper Namenode DataNode journalNode ResourceManager NodeManager DNS伺服器 DNS域名 NTP
192.168.46.128 × × × a.cloud.ha
192.168.46.129 × b.cloud.ha ×
192.168.46.130 × × × c.cloud.ha ×

注意:

  • 按照Hadoop高可用原理,NameNode和RM都建議配為一主一備。
  • 本叢集基於域名解析,如果不想配置域名服務,也可直接使用IP地址對映。後者缺點是後期更換機器時比較麻煩,需要修改所有節點hosts檔案,而域名解析僅需修改域名伺服器配置即可
  • 一般情況下DataNode與NodeManager部署在一起,儘量使“計算”靠近“資料”。
  • 在HA叢集中,Standby NameNode同時也完成了namespace的checkpoint工作,所以不需要在執行Secondary NameNode, CheckpointNode, or BackupNode。實際上如果你執行這些服務的話會出錯。
  • zkfc負責主從切換,journalNode負責儲存元資料。
  • NTP指時間同步伺服器的位置。

二. 搭建基礎環境

搭建基礎環境包含配置DNS環境、搭建DNS服務、配置免密、配置JAVA環境四部分。除搭建DNS服務操作僅需要在cloud1節點上操作外,其餘三部分皆需要在所有節點操作。

1. 配置DNS環境

操作節點:cloud1、cloud2、cloud3

該部分包含配置節點靜態IP、DNS IP。請將eth0替換為您所在主機的網絡卡名。注意,不要在該檔案中的閘道器、靜態IP、DNS相關配置項後增加註釋,否則會導致網絡卡啟動失敗或DNS域名解析出現問題。

vim /etc/network/interfaces

修改檔案如下,請將address 後的地址改為指定節點對應的IP

	auto eth0
	iface eth0 inet static		
	        address 192.168.46.128
	        netmask 255.255.255.0
	        gateway 192.168.46.2		
	        # dns-* options are implemented by the resolvconf package, if instatlled
	        # dns-nameservers 192.168.46.128	
	        # dns-search pcat

編輯完成後,重啟網絡卡並關閉防火牆:

sudo /etc/init.d/networking restart
sudo ufw disable

如果重啟後發現網絡卡IP沒有改變,請注意使用Ubuntu桌面刪除系統原有配置。刪除方法如圖:
在這裡插入圖片描述
刪除後重啟服務即可。

附:vmvare虛擬機器檢視閘道器、IP地址範圍方法如圖:
在這裡插入圖片描述
檢視子網範圍:
在這裡插入圖片描述
檢視閘道器:
在這裡插入圖片描述

2. 搭建DNS服務

操作節點:cloud1

a. 下載DNS服務軟體:bind9。如果遇到依賴問題,可選擇更換阿里源

sudo apt update
sudo apt install bind9 bind9utils bind9-doc

b. 配置local檔案
編輯named.conf.local檔案

sudo vim /etc/bind/named.conf.local

寫入如下:

zone "cloud.ha" {
        type master;
        file "/var/cache/bind/db.cloud.ha.zone";
};

其中zone後的“cloud.ha”為域名,type表示注DNS伺服器。file指向區域配置檔案位置(檔名及路徑自定義)。

c. 配置conf檔案
編輯named.conf.options檔案。在options內,directory表示區域檔案存放位置,一般為local檔案的上一級目錄;forwarders表示繼承的dns,當你的dns未找到域名後,會使用該選項所指向的DNS地址。以下程式碼中dns為阿里雲DNS。

sudo vim /etc/bind/named.conf.options

請參照修改為如下內容

options {
      // change -edit-
        directory "/var/cache/bind";
	
	// change++
        forwarders {
                223.5.5.5;
                223.6.6.6;
        };
        // change ++
        allow-query-cache { any; };
   
   	// change -edit-
        dnssec-enable no;
        dnssec-validation no;
        
        auth-nxdomain no;    # conform to RFC1035
        listen-on-v6 { any; };
};

d. 建立區域檔案
區域檔案存放位置與我們local中指定的檔案對應,本例為/var/cache/bind/db.cloud.ha.zone。

sudo vim /var/cache/bind/db.cloud.ha.zone

填入如下內容:

$TTL 1D
@         IN       SOA       ns.cloud.ha.     1594287557.qq.com.  (200 1H 15M 1W 1D )
@         IN       NS        ns.cloud.ha.
ns.cloud.ha. IN A 192.168.46.128
a       IN      A       192.168.46.128
b       IN      A       192.168.46.129
c       IN      A       192.168.46.130

簡單介紹以下配置檔案中的相關引數含義:

  • SOA表示起始授權機構。在指令@ IN SOA ns.cloud.ha. 1594287557.qq.com.中,指定了負責解析cloud.ha域(由local檔案定義,@表示引用)的授權主機名是ns.cloud.ha.,授權主機名稱將在區域檔案中解析為IP地址,1594287557.qq.com.表示負責該區域的管理員的E-mail地址,檔案中不允許使用@符號,因此使用.表示@。
  • @ IN NS ns.cloud.ha.是一條NS(Name Server)資源記錄,定義了域cloud.ha由DNS伺服器ns.cloud.ha.負責解析,NS資源記錄定義的伺服器稱為區域權威名稱伺服器。權威名稱伺服器負責維護和管理所管轄區域中的資料,被其他伺服器或客戶端當作權威的來源,並且能肯定應答區域內所含名稱的查詢。這裡的配置要求和SOA記錄配置一致。
  • A定義了域名到IP地址的對映。在上面的例子中,使用了兩種方式來定義A資源記錄,一種是使用相對名稱,即在名稱的末尾沒有加".",另外一種是使用完全規範域名FQDN(Fully Qualified Domain Name),即名稱的最後以".“結束。對於相對名稱a, b等,Bind會自動在相對名稱的後面加上字尾”.cloud.ha."。

e. 檢查配置檔案及區域檔案合法性

named-checkconf;named-checkzone cloud.ha /var/cache/bind/db.cloud.ha.zone

結果如圖表示校驗完成:
在這裡插入圖片描述

然後開啟/etc/network/interfaces中的如下注釋(刪除前面的#)

# dns-nameservers 192.168.46.128	
# dns-search pcat

開啟註釋後重啟節點

sudo reboot

重啟完成後,檢視DNS伺服器配置如圖:

cat /etc/resolv.conf

在這裡插入圖片描述

重啟bind9服務並設為開機自啟服務

sudo systemctl restart bind9;sudo systemctl enable bind9

然後執行下面命令,結果如圖即表示DNS服務搭建成功

nslookup c.cloud.ha
ping a.cloud.ha

在這裡插入圖片描述

至此,DNS搭建完成。關於區DNS相關的更詳細的資料見:

3. 搭建免密

操作節點:cloud1,cloud2,cloud3

以下以cloud1為例,其餘兩臺參考此節點進行操作。進行此步驟之前,需保證節點已經安裝openssh服務,如果未安裝,執行sudo apt install ssh
a. 建立空密碼的祕鑰
執行以下命令後一路回車即可

ssh-keygen -t rsa

b. 去掉初始詢問

vim /etc/ssh/ssh_config

找到StrictHostKeyChecking更改為no

# StrictHostKeyChecking ask
StrictHostKeyChecking no

c. 新增至cloud1、cloud2、cloud3節點

ssh-copy-id a.cloud.ha;ssh-copy-id b.cloud.ha;ssh-copy-id c.cloud.ha

其他節點同此操作。完成後即完成免密操作。測試時ssh到任何主機不需要輸入密碼即表示叢集間免密成功。

4. 配置Jdk

操作節點:cloud1、cloud2、cloud3

本次以cloud1為例,其他節點參考操作。
a. 將解壓後的java資料夾移動到/user/java/下,如圖
在這裡插入圖片描述
b. 建立連結檔案

sudo ln -s jdk jdk jdk1.8.0_111

c. 配置java環境

sudo vim /etc/profile

檔案末尾加入如下內容

export JAVA_HOME=/usr/java/jdk
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

載入環境變數

source /etc/profile

如下圖即表示正確配置。

java -version
which java

在這裡插入圖片描述

三. 搭建NTP伺服器(時間同步)

叢集之間的時間同步是一個非常常見的問題,當然也十分重要,因此我們需要在cloud1上搭建一個NTP時間伺服器,其餘兩個節點以此為一句進行同步。

1. 更改節點時區

操作節點:cloud1、cloud2、cloud3

由於我們的機器位於東八區,因此我們需要將機器所在時區改為上海時間Asia/Shanghai。(針對Ubuntu)

cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

2. 搭建時鐘伺服器

操作節點:cloud1

此時鐘伺服器用於給叢集其他節點提供時間同步服務。下面介紹安裝過程。
a. 安裝ntp

sudo apt install ntp

b. 編輯配置檔案/etc/ntp.conf。以下提出配置檔案的全部內容,修改的部分在註釋中說明。

# /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help

driftfile /var/lib/ntp/ntp.drift

# Enable this if you want statistics to be logged.
#statsdir /var/log/ntpstats/

statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable

# Specify one or more NTP servers.

# Use servers from the NTP Pool Project. Approved by Ubuntu Technical Board
# on 2011-02-08 (LP: #104525). See http://www.pool.ntp.org/join.html for
# more information.
# 註釋掉該部分
# pool 0.ubuntu.pool.ntp.org iburst
# pool 1.ubuntu.pool.ntp.org iburst
# pool 2.ubuntu.pool.ntp.org iburst
# pool 3.ubuntu.pool.ntp.org iburst

# 註釋掉該部分
# Use Ubuntu's ntp server as a fallback.
# pool ntp.ubuntu.com

# Access control configuration; see /usr/share/doc/ntp-doc/html/accopt.html for
# details.  The web page <http://support.ntp.org/bin/view/Support/AccessRestrictions>
# might also be helpful.
#
# Note that "restrict" applies to both servers and clients, so a configuration
# that might be intended to block requests from certain clients could also end
# up blocking replies from your own upstream servers.
# 增加了該部分
restrict 127.0.0.1

# 增加了該部分
server 127.127.1.0
fudge  127.127.1.0 stratum 10

# 增加了該部分,使用了阿里雲NTP服務
server ntp.aliyun.com iburst minpoll 4 maxpoll 10

restrict ntp.aliyun.com nomodify notrap nopeer noquery
# By default, exchange time with everybody, but don't allow configuration.
restrict -4 default kod notrap nomodify nopeer noquery limited
restrict -6 default kod notrap nomodify nopeer noquery limited
# 添加了客戶端節點
restrict b.cloud.ha
restrict c.cloud.ha

# Local users may interrogate the ntp server more closely.
restrict 127.0.0.1
restrict ::1

# Needed for adding pool entries
restrict source notrap nomodify noquery

# Clients from this (example!) subnet have unlimited access, but only if
# cryptographically authenticated.
#restrict 192.168.123.0 mask 255.255.255.0 notrust


# If you want to provide time to your local subnet, change the next line.
# (Again, the address is an example only.)
#broadcast 192.168.123.255

# If you want to listen to time broadcasts on your local subnet, de-comment the
# next lines.  Please do this only if you trust everybody on the network!
#disable auth
#broadcastclient

#Changes recquired to use pps synchonisation as explained in documentation:
#http://www.ntp.org/ntpfaq/NTP-s-config-adv.htm#AEN3918
#server 127.127.8.1 mode 135 prefer    # Meinberg GPS167 with PPS
#fudge 127.127.8.1 time1 0.0042        # relative to PPS for my hardware

#server 127.127.22.1                   # ATOM(PPS)
#fudge 127.127.22.1 flag3 1            # enable PPS API

詳細引數解析見:https://www.cnblogs.com/276815076/p/6397994.html

c. 重啟ntp服務

sudo systemctl restart ntp

d. 驗證服務ntpq -p。如圖表示正確
在這裡插入圖片描述

3. 設定客戶端時間同步

操作節點:cloud2、cloud3
a. 安裝ntp

sudo apt install ntp

b. 編輯/etc/ntp.conf,註釋掉伺服器配置中註釋掉的部分,然後再檔案中新增時間伺服器地址。此處為a.cloud.ha

server a.cloud.ha

c. 同步時間

sudo ntpdate -d a.cloud.ha

如下圖表示成功:
在這裡插入圖片描述
d. 設定定時任務。基於crontab定時任務。

crontab -e
# 新增如下內容
# 設定為每天9點定時同步
0 9 * * * /usr/sbin/ntpdate -d a.cloud.ha

至此,時間同步搭建完成。

四. 本節小結

本節主要進行了基礎環境的部署,下一小節將部署hadoop相關元件。