1 完全分佈式模式介紹
完全分佈式,指的是在真實環境下,使用多臺機器,共同配合,來構建一個完整的分佈式文件系統。
在真實環境中,hdfs中的相關守護進程也會分佈在不同的機器中,比如:
-1. namenode守護進程儘可能的單獨部署在一臺硬件性能相對來說比較好的機器中。
-2. 其他的每臺機器上都會部署一個datanode守護進程,一般的硬件環境即可。
-3. secondarynamenode守護進程最好不要和namenode在同一臺機器上。
2 平臺軟件說明
- 操作系統: win10/win7
- 虛擬軟件: VMware14
- 虛擬機:
主機名 IP
master 192.168.10.200
slave1 192.168.10.201
slave2 192.168.10.202
- 軟件包存儲路徑: /opt/software/
- 軟件安裝路徑: /opt/apps/
- Jdk: jdk-8u221-linux-x64.tar.gz
- Hadoop: hadoop-2.7.6.tar.gz
- 用戶: root
切記,切記,切記:實際生產環境中,我們不會使用root用戶來搭建和管理hdfs,而是使用普通用戶。這裏爲了方便學習,我們才使用的root用戶。
3 守護進程佈局
我們搭建hdfs的完全分佈式,順便搭建一下yarn。hdfs和yarn的相關守護進程的佈局如下:
master: namenode,datanode,ResourceManager,nodemanager
slave1: datanode,nodemanager,secondarynamenode
slave2: datanode,nodemanager
4 完全分佈式環境需求和搭建(重點)
4.1 環境需求說明:
-1. 三臺機器的防火牆必須是關閉的.
-2. 確保三臺機器的網絡配置暢通(NAT模式,靜態IP,主機名的配置)
-3. 確保/etc/hosts文件配置了ip和hostname的映射關係
-4. 確保配置了三臺機器的免密登陸認證(克隆會更加方便)
-5. 確保所有機器時間同步
-6. jdk和hadoop的環境變量配置
4.2 關閉防火牆
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
#最好也把selinux關閉掉,這是linux系統的一個安全機制,進入文件中將SELINUX設置爲disabled
[root@master ~]# vi /etc/selinux/config
.........
SELINUX=disabled
.........
情況說明: 如果安裝好三臺機器,三臺機器的防火牆都需要單獨關閉和設置開機不啓動。如果準備使用克隆方式,只關閉master機器即可。下面的配置也是如此。
4.3 靜態IP和主機名配置
--1. 配置靜態IP(確保NAT模式)
[root@master ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
............
BOOTPROTO=static #將dhcp改爲static
............
ONBOOT=yes #將no改爲yes
IPADDR=192.168.10.200 #添加IPADDR屬性和ip地址
PREFIX=24 #添加NETMASK=255.255.255.0或者PREFIX=24
GATEWAY=192.168.10.2 #添加網關GATEWAY
DNS1=192.168.10.2 #添加DNS1和備份DNS
DNS2=8.8.8.8
DNS3=114.114.114.114
--2. 重啓網絡服務
[root@master ~]# systemctl restart network
或者
[root@master ~]# service network restart
--3. 修改主機名(如果修改過,請略過這一步)
[root@localhost ~]# hostnamectl set-hostname master
或者
[root@localhost ~]# vi /etc/hostname
master
注意:配置完ip和主機名後,最好reboot一下
4.4 配置/etc/hosts文件
[root@master ~]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.81.200 master <=添加本機的靜態IP和本機的主機名之間的映射關係
4.5 免密登陸認證
-1. 使用rsa加密技術,生成公鑰和私鑰。一路回車即可
[root@master ~]# cd ~
[root@master ~]# ssh-keygen -t rsa
-2. 進入~/.ssh目錄下,將id_rsa.pub複製一份文件,文件名爲authorized_keys。保證此文件的權限是600
[root@master ~]# cd ~/.ssh
[root@master .ssh]# cp id_rsa.pub authorized_keys
或者使用ssh-copy-id命令
[root@master .ssh]# ssh-copy-id -i id_ras.pub root@master
-3. 進行驗證
[hadoop@master .ssh]# ssh localhost
[hadoop@master .ssh]# ssh master
[hadoop@master .ssh]# ssh 0.0.0.0
#輸入yes後,不提示輸入密碼就對了
注意:三臺機器提前安裝好的情況下,需要同步公鑰文件。如果使用克隆技術。那麼使用同一套密鑰對就方便多了。
4.6 時間同步
可以參考Linux文檔中的時間同步或者搭建局域網時間服務器。
4.7 安裝Jdk和Hadoop,配置相關環境變量
-1. 上傳和解壓兩個軟件包
[root@master ~]# cd /opt/software/
[root@master software]# tar -zxvf jdk-8u221-linux-x64.tar.gz -C /opt/apps/
[root@master software]# tar -zxvf hadoop-2.7.6.tar.gz -C /opt/apps/
-2. 進入apps裏,給兩個軟件更名
[root@master software]# cd /opt/apps/
[root@master apps]# mv jdk1.8.0_221/ jdk
[root@master apps]# mv hadoop-2.7.6/ hadoop
-3. 配置環境變量
[hadoop@master apps]# vi /etc/profile
.....省略...........
#java environment
export JAVA_HOME=/opt/apps/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
#hadoop environment
export HADOOP_HOME=/opt/apps/hadoop
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
5 Hadoop的配置文件
5.1 提取四個默認配置文件
第一步:將hadoop安裝包解壓到pc端的一個目錄下,然後在hadoop-2.7.6目錄下創建一個default目錄,用於存儲默認配置文件。 第二步:進入hadoop的share目錄中的doc子目錄,搜索default.xml。將以下四個默認的xml文件copy到default目錄中,方便以後查看
5.2 $HADOOP_HOME/etc/hadoop/目錄下的用戶自定義配置文件
- core-site.xml
- hdfs-site.xml
- mapred-site.xml 複製mapred-site.xml.template而來
- yarn-site.xml
5.3 屬性的優先級
代碼中的屬性>xxx-site.xml>xxx-default.xml
6 完全分佈式文件配置(重點)
配置前說明:我們先在master機器節點上配置hadoop的相關屬性。
6.1 配置core-site.xml文件
[root@master ~]# cd $HADOOP_HOME/etc/hadoop/
[root@master hadoop]# vi core-site.xml
<configuration>
<!-- hdfs的地址名稱:schame,ip,port-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:8020</value>
</property>
<!-- hdfs的基礎路徑,被其他屬性所依賴的一個基礎路徑 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/apps/hadoop/tmp</value>
</property>
</configuration>
參考:core-default.xml
6.2 再配置hdfs-site.xml文件
[root@master hadoop]# vi core-site.xml
<configuration>
<!-- namenode守護進程管理的元數據文件fsimage存儲的位置-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/name</value>
</property>
<!-- 確定DFS數據節點應該將其塊存儲在本地文件系統的何處-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/data</value>
</property>
<!-- 塊的副本數-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 塊的大小-->
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
<!-- secondarynamenode守護進程的http地址:主機名和端口號。參考守護進程佈局-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>slave1:50090</value>
</property>
</configuration>
參考:hdfs-default.xml
6.3 然後配置mapred-site.xml文件
如果只是搭建hdfs,只需要配置core-site.xml和hdfs-site.xml文件就可以了,但是我們過兩天要學習的MapReduce是需要YARN資源管理器的,因此,在這裏,我們提前配置一下相關文件。
[root@master hadoop]# cp mapred-site.xml.template mapred-site.xml
[root@master hadoop]# vi mapred-site.xml
<configuration>
<!-- 指定mapreduce使用yarn資源管理器-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 配置作業歷史服務器的地址-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<!-- 配置作業歷史服務器的http地址-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
</configuration>
參考:mapred-default.xml
6.4 配置yarn-site.xml文件
[root@master hadoop]# vi yarn-site.xml
<configuration>
<!-- 指定yarn的shuffle技術-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定resourcemanager的主機名-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
</configuration>
參考:yarn-default.xml
6.5 配置hadoop-env.sh腳本文件
[root@master hadoop]# vi hadoop-env.sh
.........
# The java implementation to use.
export JAVA_HOME=/opt/apps/jdk
.........
6.6 配置slaves文件,此文件用於指定datanode守護進程所在的機器節點主機名
[root@master hadoop]# vi slaves
master
slave1
slave2
6.7 配置yarn-env.sh文件,此文件可以不配置,不過,最好還是修改一下yarn的jdk環境比較好
[root@master hadoop]# vi yarn-env.sh
........省略........
# some Java parameters
export JAVA_HOME=/opt/apps/jdk
........省略........
7 另外兩臺機器配置說明
當把master機器上的hadoop的相關文件配置完畢後,我們有以下兩種方式來選擇配置另外幾臺機器的hadoop.
方法1:“scp”進行同步
提示:本方法適用於多臺虛擬機已經提前搭建出來的場景。
--1. 同步hadoop到slave節點上
[root@master ~]# cd /opt/apps
[root@master apps]# scp -r ./hadoop slave1:/opt/apps/
[root@master apps]# scp -r ./hadoop slave2:/opt/apps/
--2. 同步/etc/profile到slave節點上
[root@master apps]# scp /etc/profile slave1:/etc/
[root@master apps]# scp /etc/profile slave2:/etc/
--3. 如果slave節點上的jdk也沒有安裝,別忘記同步jdk。
--4. 檢查是否同步了/etc/hosts文件
方法2:克隆master虛擬機
提示:本方法適用於還沒有安裝slave虛擬機的場景。通過克隆master節點的方式,來克隆一個slave1和slave2機器節點,這種方式就不用重複安裝環境和配置文件了,效率非常高,節省了大部分時間(免密認證的祕鑰對都是相同的一套)。
--1. 打開一個新克隆出來的虛擬機,修改主機名
[root@master ~]# hostnamectl set-hostname slave1
--2. 修改ip地址
[root@master ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
.........省略.........
IPADDR=192.168.10.201 <==修改爲slave1對應的ip地址
.........省略........
--3. 重啓網絡服務
[root@master ~]# systemctl restart network
--4. 其他新克隆的虛擬機重複以上1~3步
--5. 免密登陸的驗證
從master機器上,連接其他的每一個節點,驗證免密是否好使,同時去掉第一次的詢問步驟
--6. 建議:每臺機器在重啓網絡服務後,最好reboot一下。
8 格式化NameNode
1)在master機器上運行命令
[root@master ~]# hdfs namenode -format
注意,注意,注意: 如果你是從僞分佈式過來的,最好先把僞分佈式的相關守護進程關閉:stop-all.sh
2)格式化的相關信息解讀
--1. 生成一個集羣唯一標識符:clusterid
--2. 生成一個塊池唯一標識符:BlockPoolId
--3. 生成namenode進程管理內容(fsimage)的存儲路徑:
默認配置文件屬性hadoop.tmp.dir指定的路徑下生成dfs/name目錄
--4. 生成鏡像文件fsimage,記錄分佈式文件系統根路徑的元數據
--5. 其他信息都可以查看一下,比如塊的副本數,集羣的fsOwner等。
參考圖片:
3)目錄裏的內容查看
9 啓動集羣
9.1 啓動腳本和關閉腳本介紹
1. 啓動腳本
-- start-dfs.sh :用於啓動hdfs集羣的腳本
-- start-yarn.sh :用於啓動yarn守護進程
-- start-all.sh :用於啓動hdfs和yarn
2. 關閉腳本
-- stop-dfs.sh :用於關閉hdfs集羣的腳本
-- stop-yarn.sh :用於關閉yarn守護進程
-- stop-all.sh :用於關閉hdfs和yarn
3. 單個守護進程腳本
-- hadoop-daemons.sh :用於單獨啓動或關閉hdfs的某一個守護進程的腳本
-- hadoop-daemon.sh :用於單獨啓動或關閉hdfs的某一個守護進程的腳本
reg:
hadoop-daemon.sh [start|stop] [namenode|datanode|secondarynamenode]
-- yarn-daemons.sh :用於單獨啓動或關閉hdfs的某一個守護進程的腳本
-- yarn-daemon.sh :用於單獨啓動或關閉hdfs的某一個守護進程的腳本
reg:
yarn-daemon.sh [start|stop] [resourcemanager|nodemanager]
9.2 啓動hdfs
1)使用start-dfs.sh,啓動 hdfs。參考圖片
2)啓動過程解析:
- 啓動集羣中的各個機器節點上的分佈式文件系統的守護進程
一個namenode和resourcemanager以及secondarynamenode
多個datanode和nodemanager
- 在namenode守護進程管理內容的目錄下生成edit日誌文件
- 在每個datanode所在節點下生成${hadoop.tmp.dir}/dfs/data目錄,參考下圖:
注意,注意,注意
如果哪臺機器的相關守護進程沒有開啓,那麼,就查看哪臺機器上的守護進程對應的日誌log文件,注意,啓動腳本運行時提醒的日誌後綴是*.out,而我們查看的是*.log文件。此文件的位置:${HADOOP_HOME}/logs/裏
3)jps查看進程
--1. 在master上運行jps指令,會有如下進程
namenode
datanode
--2. 在slave1上運行jps指令,會有如下進程
secondarynamenode
datanode
--3. 在slave2上運行jps指令,會有如下進程
datanode
9.3 啓動yarn
1)使用start-yarn.sh腳本,參考圖片
2)jps查看
--1. 在master上運行jps指令,會多出有如下進程
resoucemanager
nodemanager
--2. 在slave1上運行jps指令,會多出有如下進程
nodemanager
--3. 在slave2上運行jps指令,會多出有如下進程
nodemanager
9.4 webui查看
1. http://192.168.10.200:50070
2. http://192.168.10.200:8088
10 程序案例演示:wordcount
1) 準備要統計的兩個文件,存儲到~/data/下
--1. 創建data目錄
[root@master hadoop]# mkdir ~/data
--2. 將以下兩個文件上傳到data目錄下
- poetry1.txt
- poetry2.txt
2) 在hdfs上創建存儲目錄
[root@master hadoop]# hdfs dfs -mkdir /input
3) 將本地文件系統上的上傳到hdfs上,並在web上查看一下
[root@master hadoop]$ hdfs dfs -put ~/data/poetry* /input/
4) 運行自帶的單詞統計程序wordcount
[root@master hadoop]# cd $HADOOP_HOME
[root@master hadoop]# hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar wordcount /input /out
效果如下:
5) 查看webui
6) 查看part-r-00000文件
[root@master hadoop]# hdfs dfs -cat /out/part-r-00000
11 集羣守護進程不能開啓的情況
1. 格式化集羣時,報錯原因
- 當前用戶使用不當
- /etc/hosts裏的映射關係填寫錯誤
- 免密登錄認證異常
- jdk環境變量配置錯誤
- 防火牆沒有關閉
2. namenode進程沒有啓動的原因:
- 當前用戶使用不當
- 重新格式化時,忘記刪除${hadoop.tmp.dir}/目錄下的內容
- 網絡震盪,造成edit日誌文件的事務ID序號不連續
3. datanode出現問題的原因
- /etc/hosts裏的映射關係填寫錯誤
- master免密登錄此節點異常
- 重新格式化時,忘記刪除${hadoop.tmp.dir}/目錄下的內容,造成datanode的唯一標識符不在新集羣中。
4. 上述問題暴力解決辦法:重新格式化
如果想重新格式化,那麼需要先刪除每臺機器上的${hadoop.tmp.dir}指定路徑下的所有內容,然後再格式化:最好也把logs目錄下的內容也清空,因爲日誌內容已經是前一個廢棄集羣的日誌信息了,留着也無用。