Hadoop大資料元件安裝 史上最詳細教程 手把手教會你安裝
Hadoop安裝--大資料元件安裝--史上最完整教程--手把手教會你安裝
——徹底揭開大資料技術的面紗,讓小白徹底進入大資料技術領域
安裝的Hadoop的生態圈元件有如下幾個(以後會不斷補充完善起來了)。
(1)Hadoop(單機模式獨立,偽分散式偽分散式,全分散式全分散式)
(2)Zookeeper(單機模式,全分散式)
(3)Hadoop的HA模式
(4)Hive
(5)HBase安裝(單機模式,HA模式)
(6)Flume
(7)Sqoop
獲取本教程所有安裝包,百度網盤連結:https://pan.baidu.com/s/1TedUdOETU8bSRMIuIr_9SQ
提取碼:b5qg
注意:我使用的安裝包是目前較新的,適合當下企業需求(時間:2018.11.22)。
使用Hadoop才能更好地理解其特點,在使用之前,首先要了解Hadoop的安裝模式,Hadoop的安裝模式分為單機模式(Standalone)、偽分散式(Pseudo-Distributed)、全分散式(Fully-Distributed)三種模式。在虛擬機器qfedu上安裝Hadoop。
Hadoop的預設模式是單機模式。在不瞭解硬體安裝環境的情況下,Hadoop第一次解壓其原始碼包時,它保守地選擇了最小配置。Hadoop會完全執行在本地。因此它不需要與其他節點進行互動,那麼它也就不使用HDFS,也不載入任何Hadoop的守護程序。單機模式不需要啟動任何服務即可使用,一般只用於除錯。Linux環境下Hadoop單機模式的安裝過程如下。
1.安裝JDK
一般安裝Oracle JDK,這裡安裝1.8版本的JDK。
(1)將JDK安裝包jdk-8u121-linux-x64.rpm放到/root/Downloads/目錄下。
(2)切換到root使用者,解壓JDK安裝包。
[[email protected] ~]$ su root
[[email protected] ~]# rpm -ivh /root/Downloads/jdk-8u121-linux-x64.rpm
(3)遮蔽CentOS7自帶的JDK。
[[email protected] ~]# mv /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64 /usr/lib
2.安裝Hadoop
(1)將安裝包hadoop-2.7.3.tar.gz,放到虛擬機器中的/root/Downloads/目錄下,並解壓到/usr/local/下。
[[email protected] ~]# tar -zxvf /root/Downloads/hadoop-2.7.3.tar.gz -C /usr/local/
(2)開啟檔案/etc/profile,配置hadoop環境變數。
[[email protected] ~]# vi /etc/profile
(3)編輯/etc/profile時,依次按下G鍵,o鍵,將游標移動到檔案末尾,新增如下內容。編輯完成後,先按Esc鍵,後按:wq儲存退出。
# Hadoop environment variables
export JAVA_HOME=/usr/java/jdk1.8.0_121/
export HADOOP_HOME=/usr/local/hadoop-2.7.3/
export PATH=$PATH:JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
(4)使配置檔案生效。
[[email protected] ~]# source /etc/profile
3.測試Hadoop是否安裝成功
(1)檢視Hadoop版本,輸入以下內容。
[[email protected] ~]# hadoop version
輸出如下內容即正確:
Hadoop 2.7.3
(2)檢視hadoop安裝路徑,輸入如下內容。
[[email protected] ~]# which hadoop
輸出如下內容即正確:
/usr/local/hadoop-2.7.3/bin/hadoop
上一小結對Hadoop單機模式的安裝進行了講解,下面對Hadoopd偽分散式的安裝進行講解。這裡會用到對JDK和Hadoop環境變數的配置,配置方式和上一小結相同,不再贅述。下面講述在配置環境變數檔案生效後,對Hadoop配置檔案的配置及其後面的步驟。
1.配置hadoop-env.sh檔案
(1)切換到/usr/local/hadoop-2.7.3/etc/hadoop/目錄下,開啟hadoop-env.sh檔案。
[[email protected] ~]# cd /usr/local/hadoop-2.7.3/etc/hadoop/
[[email protected] hadoop]# vi hadoop-env.sh
(2)在hadoop-env.sh檔案中,將export JAVA_HOME=${JAVA_HOME}修改為以下內容。
export JAVA_HOME=/usr/java/jdk1.8.0_121/
2.配置core-site.xml檔案
(1)開啟core-site.xml檔案
[[email protected] hadoop]# vi core-site.xml
(2)在core-site.xml檔案中輸入以下內容。
<configuration>
<!-- 指定檔案系統的名稱 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
3.配置HDFS的hdfs-site.xml檔案
(1)開啟hdfs-site.xml檔案。
[[email protected] hadoop]# vi hdfs-site.xml
(2)在hdfs-site.xml檔案中輸入以下內容。
<configuration>
<!-- 配置HDFS塊的副本數(預設副本數是3,最大副本數是512) -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
4.配置MapReduce的mapred-site.xml檔案
(1)建立mapred-site.xml檔案。
[[email protected] hadoop]# vi mapred-site.xml
(2)在mapred-site.xml檔案中輸入以下內容。
<configuration>
<!-- 指定MapReduce的執行框架 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
5.配置Yarn的yarn-site.xml檔案
(1)開啟yarn-site.xml檔案。
[[email protected] hadoop]# vi yarn-site.xml
(2)在yarn-site.xml檔案中輸入以下內容。
<configuration>
<!-- 配置NodeManager啟動時載入Shuffle服務 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
6.格式化HDFS檔案系統
[[email protected] hadoop]# hdfs namenode -format
...
18/11/09 19:53:26 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at bogon/192.168.11.11
************************************************************/
7.啟動Hadoop叢集
(1)啟動Hadoop叢集(分別啟動HDFS和Yarn)。
提示:當出現password:時,輸入密碼按下回車鍵。
[[email protected] hadoop]# start-dfs.sh
[[email protected] hadoop]# start-yarn.sh
(2)用jps命令檢視Hadoop叢集的相關程序。
[[email protected] hadoop]# jps
6208 ResourceManager
5674 NameNode
6028 SecondaryNameNode
5823 DataNode
6527 NodeManager
6591 Jps
從上面結果可以看到相關程序全部啟動。
8.檢測
(1)上傳當前資料夾下的mapred-site.xml.template檔案到HDFS的/目錄下。
[[email protected] hadoop]# hdfs dfs -put ./mapred-site.xml.template /
(2)檢視上傳的mapred-site.xml.template檔案。
[[email protected] hadoop]# hdfs dfs -cat /mapred-site.xml.template
(3)檢視本地mapred-site.xml.template檔案。
[[email protected] hadoop]# cat mapred-site.xml.template
如果兩個檔案的內容一致,表明Hadoop的偽分散式叢集搭建成功。
1.1.3 Hadoop的全分散式
重要提示:在Hadoop全分散式搭建前,需要先關閉hadoop叢集,關閉命令如下。
[[email protected] hadoop]# stop-dfs.sh
[[email protected] hadoop]# stop-yarn.sh
Hadoop全分散式搭建規劃,如表3.2所示。
表3.2 Hadoop全分散式搭建規劃
主機名 |
IP地址 |
Hadoop程序 |
qf01 |
192.168.11.11 |
NameNode、DataNode、ResourceManager、NodeManager |
qf02 |
192.168.11.12 |
DataNode、NodeManager |
qf03 |
192.168.11.13 |
DataNode、NodeManager、SecondaryNameNode |
本書的Hadoop全分散式搭建基於Hadoop偽分散式,具體步驟如下。
1.克隆虛擬機器
克隆3臺虛擬機器qf01、qf02、qf03,具體克隆步驟,見第1章 1.5.2 克隆。
寫步驟
2.修改主機名
分別修改虛擬機器qf01、qf02、qf03的主機名(hostname)。
(1)分別開啟虛擬機器qf01、qf02、qf03的/etc/hostname檔案。
[[email protected] ~]# vi /etc/hostname
(2)分別修改主機名,具體做法如下。
①將虛擬機器qf01的hostname檔案中的內容替換為qf01。
②將虛擬機器qf02的hostname檔案中的內容替換為qf02。
③將虛擬機器qf03的hostname檔案中的內容替換為qf03。
3.修改網路設定
(1)分別開啟虛擬機器qf01、qf02、qf03的/etc/sysconfig/network-scripts/ifcfg-ens33檔案。
[[email protected] ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
(2)分別修改網路設定,具體做法如下。
①將虛擬機器qf01的ifcfg-ens33檔案中的IPADDR=192.168.11.1修改為IPADDR=192.168.11.11。
②將虛擬機器qf02的ifcfg-ens33檔案中的IPADDR=192.168.11.1修改為IPADDR=192.168.11.12。
③將虛擬機器qf03的ifcfg-ens33檔案中的IPADDR=192.168.11.1修改為IPADDR=192.168.11.13。
(3)重啟虛擬機器qf01、qf02、qf03。
單擊VMware Workstation中的▼下拉選單,在出現的下拉選單中,單擊“重新啟動客戶機”選項。
4.修改/etc/resolv.conf檔案
resolv.conf是指DNS域名解析配置檔案。
(1)分別開啟虛擬機器qf01、qf02、qf03的/etc/resolv.conf檔案。
[[email protected] ~]# vi /etc/resolv.conf
[[email protected] ~]# vi /etc/resolv.conf
[[email protected] ~]# vi /etc/resolv.conf
(2)分別將檔案中的內容替換為以下內容。
nameserver 192.168.11.2
5.分別關閉虛擬機器qf01、qf02、qf03的防火牆
[[email protected] ~]# systemctl stop firewalld.service
臨時關閉防火牆
6.配置SSH免密登入
此處的SSH免密登入是指虛擬機器qf01通過SSH免密登入虛擬機器qf02、qf03。
(1)分別刪除虛擬機器qf01、qf02、qf03的~/.ssh目錄。注意:在使用rm -rf命令時,要特別小心,避免誤刪檔案。
[[email protected] ~]# rm -rf .ssh
[[email protected] ~]# rm -rf .ssh
[[email protected] ~]# rm -rf .ssh
(2)在虛擬機器qf01上新建SSH公私祕鑰對。
[[email protected] ~]# ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
(3)在虛擬機器qf01上修改/etc/hosts檔案。
①開啟/etc/hosts檔案。
[[email protected] ~]# vi /etc/hosts
②在檔案末尾,換行新增以下內容。
192.168.11.11 qf01
192.168.11.12 qf02
192.168.11.13 qf03
(4)在虛擬機器qf01上配置免密登入虛擬機器qf01、qf02、qf03。
在實際工作中,ssh-copy-id命令的作用:複製本地使用者的公鑰到遠端主機指定使用者的認證庫中,實現本地使用者通過SSH免密登入遠端主機指定使用者。本書進行模擬操作,實現虛擬機器qf01(本地root使用者)通過SSH免密登入虛擬機器qf01、qf02、qf03(3臺遠端主機的root使用者)。
[[email protected] ~]# ssh-copy-id [email protected]
[[email protected] ~]# ssh-copy-id [email protected]
[[email protected] ~]# ssh-copy-id [email protected]
提示:出現(yes/no)?,輸入yes,按下回車鍵。
(5)將虛擬機器qf01的hosts檔案分發到虛擬機器qf02、qf03。
為了便於在虛擬機器qf01向虛擬機器qf02、qf03分發目錄或檔案,此處編寫一個Shell指令碼xsync.sh。
①在虛擬機器qf01上的/usr/local/bin目錄下新建xsync.sh檔案。在/usr/local/bin目錄下的Shell指令碼檔案可以在任意位置被呼叫,使用起來比較方便。
[[email protected] ~]# cd /usr/local/bin
[[email protected] bin]# vi xsync.sh
②在檔案中輸入以下內容。
#!/bin/bash
if [ $# -lt 1 ] ; then echo no params ; exit ; fi
user=`whoami`
# 取出目錄(或檔案)名稱
filename=`basename $1`
dir=`dirname $1`
# 切換到目錄(或檔案)所在的路徑下
cd $dir
# 獲取當前路徑的絕對路徑
fullpath=`pwd -P`
for (( i=2; i<=3 ; i++ )) ; do
tput setaf 5
echo ============ qf0$i [email protected] ============
tput setaf 9
rsync -lr $filename [email protected]$i:$fullpath
done
其中,rsync命令的作用是:實現本地使用者和遠端主機指定使用者的檔案同步和本地不同路徑下檔案的同步。
③為xsync.sh檔案的所有者新增執行許可權。
[[email protected] bin]# chmod u+x xsync.sh
④使用xsync.sh將虛擬機器qf01的/etc/hosts檔案分發到虛擬機器qf02、qf03。
[[email protected] ~]# xsync.sh /etc/hosts
(6)驗證SSH免密登入是否配置成功。
[[email protected] bin]# ssh qf02
出現如下內容,表明虛擬機器qf01通過SSH成功登入虛擬機器qf02。
[[email protected] ~]#
輸入exit,按下回車鍵,退回到虛擬機器qf01。
7.修改相關配置檔案
[[email protected] ~]# cd /usr/local/hadoop-2.7.3/etc/hadoop/
(2)配置core-site.xml檔案。
①開啟core-site.xml檔案。
[[email protected] hadoop]# vi core-site.xml
②將core-site.xml檔案中的內容替換為以下內容。
<configuration>
<!-- 指定檔案系統的名稱-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://qf01:9000</value>
</property>
<!-- 配置Hadoop執行產生的臨時資料儲存目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/tmp/hadoop-qf01</value>
</property>
<!-- 配置操作HDFS的快取大小 -->
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
</configuration>
(3)配置hdfs-site.xml檔案。
①開啟hdfs-site.xml檔案。
[[email protected] hadoop]# vi hdfs-site.xml
②將hdfs-site.xml檔案中的內容替換為以下內容。
<configuration>
<!-- 配置HDFS塊的副本數(全分佈模式預設副本數是3,最大副本數是512) -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 設定HDFS塊的大小 -->
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
<!-- 配置HDFS元資料的儲存目錄 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoopdata/dfs/name</value>
</property>
<!-- 配置HDFS真正的資料內容(資料塊)的儲存目錄 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoopdata/dfs/data</value>
</property>
<!-- 配置HDFS的NameNode的HTTP地址 -->
<property>
<name>dfs.namenode.http-address</name>
<value>qf01:50070</value>
</property>
<!-- 配置HDFS的Secondary Namenode的HTTP地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>qf03:50090</value>
</property>
<!-- 開啟通過Web操作HDFS -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<!-- 關閉HDFS檔案的許可權檢查 -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
</configuration>
(4)配置mapred-site.xml檔案。
①開啟mapred-site.xml檔案。
[[email protected] hadoop]# vi mapred-site.xml
②將mapred-site.xml檔案中的內容替換為以下內容。
<configuration>
<!-- 指定MapReduce的執行框架 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
(5)配置yarn-site.xml。
①開啟yarn-site.xml檔案。
[[email protected] hadoop]# vi yarn-site.xml
②將yarn-site.xml檔案中的內容替換為以下內容。
<configuration>
<!-- 指定啟動Yarn的ResourceManager服務的主機 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>qf01</value>
</property>
<!-- 配置NodeManager啟動時載入Shuffle服務 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定ResourceManager的內部通訊地址 -->
<property>
<name>yarn.resourcemanager.address</name>
<value>qf01:8032</value>
</property>
<!-- 指定ResourceManager的Scheduler的內部通訊地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>qf01:8030</value>
</property>
<!-- 指定ResourceManager的Resource-Tracker的內部通訊地址 -->
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>qf01:8031</value>
</property>
<!-- 指定ResourceManager的Admin的內部通訊地址 -->
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>qf01:8033</value>
</property>
<!-- 指定ResourceManager的WebUI的內部通訊地址 -->
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>qf01:8088</value>
</property>
</configuration>
(6)設定從節點(slave),即修改slaves檔案。
①開啟slaves檔案。
[[email protected] hadoop]# vi slaves
②此處填寫所有需要配置成從節點的主機名。具體做法:將slaves檔案中的內容替換為以下內容。注意:每個主機名佔一行。
qf01
qf02
qf03
8.分發配置檔案
[[email protected] hadoop]# xsync.sh /usr/local/hadoop-2.7.3/etc/hadoop
9.初始化HDFS
初始化HDFS,只能進行一次,如果初始化HDFS不成功,需要重新搭建。由於Hadoop叢集搭建涉及細節較多,建議在初始化HDFS之前,先對每個虛擬機器拍攝快照。拍攝快照後,在虛擬機器qf01的終端,輸入以下命令,初始化HDFS。
[[email protected] hadoop]# hdfs namenode -format
倒數第9行,出現INFO common.Storage: common.Storage: Storage directory /home/hadoopdata/dfs/name has been successfully formatted,表明初始化HDFS已成功。
重啟
10.啟動和檢視Hadoop程序
(1)啟動Hadoop程序。
[[email protected] hadoop]# start-dfs.sh
[[email protected] hadoop]# start-yarn.sh
(2)檢視Hadoop程序。
①在虛擬機器qf01中檢視Hadoop程序。
[[email protected] hadoop]# jps
17089 ResourceManager
17427 Jps
16917 SecondaryNameNode
16699 DataNode
17196 NodeManager
16590 NameNode
以17089 ResourceManager為例,17089是指程序ID。
②在虛擬機器qf02中檢視Hadoop程序。
[[email protected] hadoop]# jps
3140 Jps
2968 NodeManager
2877 DataNode
③在虛擬機器qf03中檢視Hadoop程序。
[[email protected] hadoop]# jps
16512 NodeManager
16682 Jps
16412 DataNode
如果看到規劃的Hadoop程序均已啟動,表明Hadoop全分散式搭建成功。
注意:由於只在root使用者下搭建了Hadoop全分散式,再次啟動虛擬機器時,需要切換到root使用者下,進行相關操作。
(3)編寫指令碼檢視Hadoop程序。
目前在3臺虛擬機器上檢視Hadoop程序,操作相對簡單。在實際工作中,可能會檢視幾十臺伺服器上的Hadoop程序,操作起來就比較煩瑣。以當前的Hadoop全分散式叢集為例,可以編寫Shell指令碼xcmd.sh來簡化操作。
xcmd.sh的具體用途:在虛擬機器qf01上檢視虛擬機器qf01、qf02、qf03上執行相同命令操作的結果。編寫xcmd.sh指令碼和檢視Hadoop程序的步驟如下。
①在虛擬機器qf01上的/usr/local/bin目錄下新建xcmd.sh檔案,輸入以下內容。
#!/bin/bash
if [ $# -lt 1 ] ; then echo no params ; exit ; fi
for (( i=1 ; i<=3 ; i++ )) ; do
tput setaf 5
echo ============ qf0$i [email protected] ============
tput setaf 9
ssh qf0$i "[email protected]"
done
②為xcmd.sh檔案的所有者新增執行許可權。
[[email protected] hadoop]# chmod u+x xcmd.sh
③在虛擬機器qf01上,使用xcmd.sh指令碼檢視Hadoop的所有程序,具體如下。
[[email protected] bin]# xcmd.sh jps
============ qf01 jps ============
25604 ResourceManager
25718 NodeManager
25147 NameNode
26221 Jps
25295 DataNode
============ qf02 jps ============
10731 Jps
10252 DataNode
10414 NodeManager
============ qf03 jps ============
21699 DataNode
21813 SecondaryNameNode
21948 NodeManager
22270 Jps
2.1 Zookeeper的安裝和常用命令
本書使用的是3.4.10版本的Zookeeper,或者從官網下載,網址為http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.10。用Java編寫的Zookeeper執行在JVM上,需要提前安裝JDK並配置好Java環境(在第3章 3.2 節已完成)。本書主要講述Zookeeper的兩種安裝模式:單機模式和全分散式。
2.1.1 Zookeeper單機模式
Zookeeper單機模式,安裝步驟如下。
(1)將Zookeeper安裝包zookeeper-3.4.10放到虛擬機器qf01的/root/Downloads/目錄下,切換到root使用者,新建目錄/mysoft,解壓Zookeeper安裝包到/mysoft目錄下。
[[email protected] ~]# mkdir /mysoft
[[email protected] ~]# tar -zxvf /root/Downloads/zookeeper-3.4.10.tar.gz -C /mysoft/
(2)切換到/mysoft目錄下,將zookeeper-3.4.10重新命名為zookeeper。
[[email protected] ~]# cd /mysoft/
[[email protected] mysoft]# mv zookeeper-3.4.10 zookeeper
(3)開啟/etc/profile檔案,配置Zookeeper環境變數。
[[email protected] mysoft]# vi /etc/profile
在檔案末尾新增如下三行內容。
# Zookeeper environment variables
export ZOOKEEPER_HOME=/mysoft/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
(4)使環境變數生效。
[[email protected] mysoft]# source /etc/profile
(5)將檔案/mysoft/zookeeper/conf/zoo_sample.cfg重新命名為zoo.cfg(Zookeeper的配置檔案)。
[[email protected] mysoft]# cd /mysoft/zookeeper/conf/
[[email protected] conf]# mv zoo_sample.cfg zoo.cfg
(6)啟動Zookeeper的伺服器。
[[email protected] conf]# zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /mysoft/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
(7)檢測Zookeeper伺服器是否啟動成功有兩種方法。
①檢視Zookeeper伺服器的啟動狀態。
[[email protected] conf]# zkServer.sh status
出現如下內容表明Zookeeper伺服器啟動成功。
ZooKeeper JMX enabled by default
Using config: /mysoft/zookeeper/bin/../conf/zoo.cfg
Mode: standalone
②用jps命令檢視Zookeeper伺服器的QuorumPeerMain程序是否啟動。
[root[email protected] conf]# jps
11716 Jps
10412 QuorumPeerMain
出現QuorumPeerMain程序表明Zookeeper伺服器啟動成功。QuorumPeerMain是zookeeper叢集的啟動入口。
(8)關閉Zookeeper伺服器。
[[email protected] conf]# zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /mysoft/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
2.1.2 Zookeeper全分散式
1.安裝步驟
Zookeeper全分散式,又稱Zookeeper叢集模式,安裝步驟如下。
(1)修改Zookeeper的配置檔案zoo.cfg。
[[email protected] conf]# vi /mysoft/zookeeper/conf/zoo.cfg
①將dataDir=/tmp/zookeeper修改為如下內容。
dataDir=/mysoft/zookeeper/zkdata
②在檔案末尾新增如下3行。
server.1=qf01:2888:3888
server.2=qf02:2888:3888
server.3=qf03:2888:3888
其中,1、2、3被稱為myid,要求是在1~255之間的整數。qf01、qf02、qf03是指其對應的主機地址。
2888是leader埠,負責和follower進行通訊。3888是follower埠,負責與其他節點推選leader。
(2)新建目錄/mysoft/zookeeper/zkdata,在該目錄下新建檔案myid。
[[email protected] conf]# mkdir /mysoft/zookeeper/zkdata
[[email protected] conf]# vi /mysoft/zookeeper/zkdata/myid
在myid檔案中填寫如下內容。
1
(3)將/soft/zookeeper/分發到虛擬機器qf02、qf03。
[[email protected] conf]# xsync.sh /mysoft/zookeeper/
(4)修改虛擬機器qf02的/mysoft/zookeeper/zkdata/myid檔案。
[[email protected] ~]# vi /mysoft/zookeeper/zkdata/myid
將myid檔案中的內容替換為如下內容。
2
(5)修改虛擬機器qf03的/mysoft/zookeeper/zkdata/myid檔案。
[[email protected] ~]# vi /mysoft/zookeeper/zkdata/myid
將myid檔案中的內容替換為如下內容。
3
(6)將虛擬機器qf01的系統環境變數分發到虛擬機器qf02、qf03。
[[email protected] conf]# xsync.sh /etc/profile
(7)分別使虛擬機器qf02、qf03的環境變數生效。
[[email protected] ~]# source /etc/profile
[[email protected] ~]# source /etc/profile
(8)分別啟動虛擬機器qf01、qf02、qf03的Zookeeper伺服器。
[[email protected] conf]# zkServer.sh start
[[email protected] ~]# zkServer.sh start
[[email protected] ~]# zkServer.sh start
(9)分別檢視各虛擬機器的Zookeeper伺服器啟動狀態。
①檢視虛擬機器qf01的Zookeeper伺服器啟動狀態。
[[email protected] conf]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /mysoft/zookeeper/bin/../conf/zoo.cfg
Mode: follower
②檢視虛擬機器qf02的Zookeeper伺服器啟動狀態。
[[email protected] ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /mysoft/zookeeper/bin/../conf/zoo.cfg
Mode: leader
③檢視虛擬機器qf02的Zookeeper伺服器啟動狀態。
[[email protected] ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /mysoft/zookeeper/bin/../conf/zoo.cfg
Mode: follower
檢視啟動狀態返回的結果中,出現Mode: follower或Mode: leader,表明Zookeeper伺服器啟動成功。
注意:本次啟動Zookeeper伺服器,leader出現在虛擬機器qf02上。由於Leader的選舉是隨機的,因此下次啟動Zookeeper伺服器時,Leader可能會出現在其他虛擬機器上。
2. 啟動和關閉Zookeeper叢集
啟動和關閉Zookeeper叢集需要在每臺虛擬機器上啟動和關閉Zookeeper伺服器。在實際工作中,使用的伺服器可能會比較多,在每個伺服器上都進行相同的操作,效率不高。為了方便地啟動和關閉Zookeeper叢集,可以編寫啟動指令碼xzk.sh,具體步驟如下。
(1)在虛擬機器qf01的/usr/local/bin/目錄下,新建xzk.sh指令碼檔案,xzk.sh檔案內容如下。
#!/bin/bash
cmd=$1
if [ $# -gt 1 ] ; then echo param must be 1 ; exit ; fi
for (( i=1 ; i<=3 ; i++ )) ; do
tput setaf 5
echo ============ qf0$i [email protected] ============
tput setaf 9
ssh qf0$i "source /etc/profile ; zkServer.sh $cmd"
done
(2)為xzk.sh指令碼擁有者新增執行許可權。
[[email protected] bin]# chmod u+x xzk.sh
(3)通過xzk.sh指令碼的start和stop命令,在虛擬機器qf01上同時啟動和關閉虛擬機器qf01、qf02、qf03的Zookeeper伺服器。
[[email protected] bin]# xzk.sh start
[[email protected] bin]# xzk.sh stop
至此,Zookeeper全分散式安裝完成。
3.1 Hadoop的HA模式
3.1.1 HA模式簡介
Hadoop的HA模式是指在Hadoop全分散式基礎上,利用Zookeeper等協調工具配置的高可用的Hadoop叢集模式。
Hadoop的HA模式搭建規劃,如表4.3所示。本書Hadoop的HA模式是通過Zookeeper來實現的,因此需要在Hadoop的配置檔案裡對Zookeeper進行相關設定。
表4.3 Hadoop的HA模式搭建規劃
主機名 |
IP地址 |
相關程序 |
qf01 |
192.168.10.11 |
NameNode、DataNode、DFSZKFailoverController、QuorumPeerMain、JournalNode、ResourceManager、NodeManager |
qf02 |
192.168.10.12 |
NameNode、DataNode、DFSZKFailoverController、QuorumPeerMain、JournalNode、NodeManager |
qf03 |
192.168.10.13 |
DataNode、NodeManager、QuorumPeerMain、JournalNode |
Hadoop的HA模式包括兩部分:HDFS的HA模式、Yarn的HA模式。
3.1.2 HDFS的HA模式
在HDFS的HA模式下,有兩個NameNode,一個NameNode處於活躍(Active)狀態,另一個NameNode處於備用(Standby)狀態。活躍的NameNode負責Hadoop叢集中的所有客戶端操作,而備用的NameNode只是充當從屬伺服器,維持足夠的狀態以在必要時進行快速故障轉移。
Hadoop的HA模式出現的原因是Hadoop叢集存在“單點故障”問題。“單點故障”問題是指對於只有一個NameNode的Hadoop叢集,如果NameNode出現故障,會導致Hadoop叢集無法正常工作。HA模式下的Hadoop叢集解決了單點故障問題,基本原理是:當一臺NameNode出現故障時,HA模式下的Hadoop叢集通過Zookeeper等協調工具快速啟動備用的NameNode,確保Hadoop叢集的高可用性。
1. HDFS的HA模式搭建
由於HDFS的HA模式搭建步驟較多,建議在搭建之前先對虛擬機器qf01、qf02、qf03拍攝快照。如果搭建過程中系統報錯,可以快速恢復到搭建以前的狀態。
本書HDFS的HA模式搭建是在之前的Hadoop叢集和Zookeeper叢集基礎上進行的,具體步驟如下。
(1)確保Hadoop叢集和Zookeeper叢集處於關閉狀態。
(2)修改虛擬機器qf01的/usr/local/hadoop-2.7.3/etc/hadoop/core-site.xml檔案。
[[email protected] ~]# vi /usr/local/hadoop-2.7.3/etc/hadoop/core-site.xml
將core-site.xml檔案中的內容替換為如下內容。
<configuration>
<!-- 指定檔案系統的名稱-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://qianfeng</value>
</property>
<!-- 配置Hadoop執行產生的臨時資料儲存目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/tmp/hadoop-qf01</value>
</property>
<!-- 指定自動故障轉移的叢集 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>qf01:2181,qf02:2181,qf03:2181</value>
</property>
<!-- 配置操作HDFS的快取大小 -->
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
</configuration>
(3)修改虛擬機器qf01的/usr/local/hadoop-2.7.3/etc/hadoop/hdfs-site.xml檔案。
[[email protected] ~]# vi /usr/local/hadoop-2.7.3/etc/hadoop/hdfs-site.xml
將hdfs-site.xml檔案中的內容替換為如下內容。
<configuration>
<!-- 配置HDFS塊的副本數(全分佈模式預設副本數是3,最大副本數是512) -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 設定HDFS塊的大小 -->
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
<!-- 配置HDFS元資料的儲存目錄 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoopdata/dfs/name</value>
</property>
<!-- 配置HDFS真正的資料內容(資料塊)的儲存目錄 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoopdata/dfs/data</value>
</property>
<!-- 開啟通過Web操作HDFS -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<!-- 關閉HDFS檔案的許可權檢查 -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<!-- 配置虛擬服務名-->
<property>
<name>dfs.nameservices</name>
<value>qianfeng</value>
</property>
<!-- 為虛擬服務指定兩個NameNode(目前每個虛擬服務最多可以配置兩個NameNode) -->
<property>
<name>dfs.ha.namenodes.qianfeng</name>
<value>nn1,nn2</value>
</p