使用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相關元件。