目錄
- 1 Hadoop
- 1.1 介紹Hadoop
- 1.2 Hadoop特性優點
- 1.3 hadoop集群中hadoop都需要啟動哪些行程,他們的作用分別是什么?
- 1.4 Hadoop主要的組態檔
- 1.5 Hadoop集群重要命令
- 1.6 HDFS的垃圾桶機制
- 1.7 HDFS寫資料流程
- 1.8 Hadoop讀資料流程
- 1.9 SecondaryNameNode的作用
- 1.10 HDFS的擴容 縮容(面試)
- 1.動態擴容
- 1.1. 基礎準備
- 1.2. 添加datanode
- 1.3.datanode負載均衡服務
- 1.4.添加nodemanager
- 2.動態縮容
- 2.1.添加退役節點
- 2.2.重繪集群
- 1.11 HDFS安全模式
- 1.12 機架感知
1 Hadoop

1.1 介紹Hadoop
- 廣義上來說,Hadoop通常是指一個更廣泛的概念——Hadoop生態圈,
- 狹義上說,Hadoop指Apache這款開源框架,它的核心組件有:
- HDFS(分布式檔案系統):解決海量資料存盤
- YARN(作業調度和集群資源管理的框架):解決資源任務調度
- MAPREDUCE(分布式運算編程框架):解決海量資料計算
1.2 Hadoop特性優點
- 擴容能力(Scalable):Hadoop是在可用的計算機集群間分配資料并完成計算任務的,這些集群可用方便的擴展到數以千計的節點中,
- 成本低(Economical):Hadoop通過普通廉價的機器組成服務器集群來分發以及處理資料,以至于成本很低,
- 高效率(Efficient):通過并發資料,Hadoop可以在節點之間動態并行的移動資料,使得速度非常快,
- 可靠性(Rellable):能自動維護資料的多份復制,并且在任務失敗后能自動地重新部署(redeploy)計算任務,所以Hadoop的按位存盤和處理資料的能力值得人們信賴,
1.3 hadoop集群中hadoop都需要啟動哪些行程,他們的作用分別是什么?
- namenode =>HDFS的守護行程,負責維護整個檔案系統,存盤著整個檔案系統的元資料資訊,image+edit log
- datanode =>是具體檔案系統的作業節點,當我們需要某個資料,namenode告訴我們去哪里找,就直接和那個DataNode對應的服務器的后臺行程進行通信,由DataNode進行資料的檢索,然后進行具體的讀/寫操作
- secondarynamenode =>一個守護行程,相當于一個namenode的元資料的備份機制,定期的更新,和namenode進行通信,將namenode上的image和edits進行合并,可以作為namenode的備份使用
- resourcemanager =>是yarn平臺的守護行程,負責所有資源的分配與調度,client的請求由此負責,監控nodemanager
- nodemanager => 是單個節點的資源管理,執行來自resourcemanager的具體任務和命令
- DFSZKFailoverController高可用時它負責監控NN的狀態,并及時的把狀態資訊寫入ZK,它通過一個獨立執行緒周期性的呼叫NN上的一個特定介面來獲取NN的健康狀態,FC也有選擇誰作為Active NN的權利,因為最多只有兩個節點,目前選擇策略還比較簡單(先到先得,輪換),
- 7)JournalNode 高可用情況下存放namenode的editlog檔案
1.4 Hadoop主要的組態檔
-
hadoop-env.sh
- 檔案中設定的是Hadoop運行時需要的環境變數,JAVA_HOME是必須設定的,即使我們當前的系統中設定了JAVA_HOME,它也是不認識的,因為Hadoop即使是在本機上執行,它也是把當前的執行環境當成遠程服務器,
-
core-site.xml
-
設定Hadoop的檔案系統地址
<property> <name>fs.defaultFS</name> <value>hdfs://node-1:9000</value> </property>
-
-
hdfs-site.xml
-
指定HDFS副本的數量
-
secondary namenode 所在主機的ip和埠
<property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>node-2:50090</value> </property> -
-
mapred-site.xml
-
指定mr運行時框架,這里指定在yarn上,默認是local
<property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
-
-
yarn-site.xml
-
指定YARN的主角色(ResourceManager)的地址
<property> <name>yarn.resourcemanager.hostname</name> <value>node-1</value> </property>
-
1.5 Hadoop集群重要命令
-
初始化
- hadoop namenode –format
-
啟動dfs
- start-dfs.sh
-
啟動yarn
- start-yarn.sh
-
啟動任務歷史服務器
- mr-jobhistory-daemon.sh start historyserver
-
一鍵啟動
- start-all.sh
-
啟動成功后:
- NameNode http://nn_host:port/ 默認50070.
- ResourceManagerhttp://rm_host:port/ 默認 8088
- NameNode http://nn_host:port/ 默認50070.


| 選項名稱 | 使用格式 | 含義 |
|---|---|---|
| -ls | -ls <路徑> | 查看指定路徑的當前目錄結構 |
| -lsr | -lsr <路徑> | 遞回查看指定路徑的目錄結構 |
| -du | -du <路徑> | 統計目錄下個檔案大小 |
| -dus | -dus <路徑> | 匯總統計目錄下檔案(夾)大小 |
| -count | -count [-q] <路徑> | 統計檔案(夾)數量 |
| -mv | -mv <源路徑> <目的路徑> | 移動 |
| -cp | -cp <源路徑> <目的路徑> | 復制 |
| -rm | -rm [-skipTrash] <路徑> | 洗掉檔案/空白檔案夾 |
| -rmr | -rmr [-skipTrash] <路徑> | 遞回洗掉 |
| -put | -put <多個linux上的檔案> <hdfs路徑> | 上傳檔案 |
| -copyFromLocal | -copyFromLocal <多個linux上的檔案> <hdfs路徑> | 從本地復制 |
| -moveFromLocal | -moveFromLocal <多個linux上的檔案> <hdfs路徑> | 從本地移動 |
| -getmerge | -getmerge <源路徑> <linux路徑> | 合并到本地 |
| -cat | -cat <hdfs路徑> | 查看檔案內容 |
| -text | -text <hdfs路徑> | 查看檔案內容 |
| -copyToLocal | -copyToLocal [-ignoreCrc] [-crc] [hdfs源路徑] [linux目的路徑] | 從本地復制 |
| -moveToLocal | -moveToLocal [-crc] <hdfs源路徑> <linux目的路徑> | 從本地移動 |
| -mkdir | -mkdir <hdfs路徑> | 創建空白檔案夾 |
| -setrep | -setrep [-R] [-w] <副本數> <路徑> | 修改副本數量 |
| -touchz | -touchz <檔案路徑> | 創建空白檔案 |
| -stat | -stat [format] <路徑> | 顯示檔案統計資訊 |
| -tail | -tail [-f] <檔案> | 查看檔案尾部資訊 |
| -chmod | -chmod [-R] <權限模式> [路徑] | 修改權限 |
| -chown | -chown [-R] [屬主][:[屬組]] 路徑 | 修改屬主 |
| -chgrp | -chgrp [-R] 屬組名稱 路徑 | 修改屬組 |
| -help | -help [命令選項] | 幫助 |
1.6 HDFS的垃圾桶機制
-
修改core-site.xml
<property> <name>fs.trash.interval</name> <value>1440</value> </property> -
這個時間以分鐘為單位,例如1440=24h=1天,HDFS的垃圾回收的默認配置屬性為 0,也就是說,如果你不小心誤洗掉了某樣東西,那么這個操作是不可恢復的,
1.7 HDFS寫資料流程

詳細步驟:
- 1)客戶端通過Distributed FileSystem模塊向namenode請求上傳檔案,namenode檢查目標檔案是否已存在,父目錄是否存在,
- 2)namenode回傳是否可以上傳,
- 3)客戶端請求第一個 block上傳到哪幾個datanode服務器上,
- 4)namenode回傳3個datanode節點,分別為dn1 dn2 dn3,
- 5)客戶端通過FSDataOutputStream模塊請求dn1上傳資料,dn1收到請求會繼續呼叫dn2,然后dn2呼叫dn3,將這個通信管道建立完成,
- 6)dn1 dn2 dn3逐級應答客戶端,
- 7)客戶端開始往dn1上傳第一個block(先從磁盤讀取資料放到一個本地記憶體快取),以packet為單位(大小為64k),dn1收到一個packet就會傳給dn2,dn2傳給dn3;dn1每傳一個packet會放入一個應答佇列等待應答,
- 8)當一個block傳輸完成之后,客戶端再次請求namenode上傳第二個block的服務器,
1.8 Hadoop讀資料流程

詳細步驟:
- 1)客戶端通過Distributed FileSystem向namenode請求下載檔案,namenode通過查詢元資料,找到檔案塊所在的datanode地址,
- 2)挑選一臺datanode(就近原則,然后隨機)服務器,請求讀取資料,
- 3)datanode開始傳輸資料給客戶端(從磁盤里面讀取資料輸入流,以packet為單位來做校驗,大小為64k),
- 4)客戶端以packet為單位接收,先在本地快取,然后寫入目標檔案,作者:李小李的路
1.9 SecondaryNameNode的作用
NameNode職責是管理元資料資訊,DataNode的職責是負責資料具體存盤,那么SecondaryNameNode的作用是什么?
答:它的職責是合并NameNode的edit logs到fsimage檔案中,
每達到觸發條件 [達到一個小時,或者事物數達到100萬],會由secondary namenode將namenode上積累的所有edits和一個最新的fsimage下載到本地,并加載到記憶體進行merge(這個程序稱為checkpoint),如下圖所示:

1.10 HDFS的擴容 縮容(面試)
1.動態擴容
隨著公司業務的增長,資料量越來越大,原有的datanode節點的容量已經不能滿足存盤資料的需求,需要在原有集群基礎上動態添加新的資料節點,也就是俗稱的**動態擴容**,
有時候舊的服務器需要進行退役更換,暫停服務,可能就需要在當下的集群中停止某些機器上hadoop的服務,俗稱**動態縮容**,
1.1. 基礎準備
在基礎準備部分,主要是設定hadoop運行的系統環境
修改新機器系統hostname(通過/etc/sysconfig/network進行修改)

修改hosts檔案,將集群所有節點hosts配置進去(集群所有節點保持hosts檔案統一)

設定NameNode到DataNode的免密碼登錄(ssh-copy-id命令實作)
修改主節點slaves檔案,添加新增節點的ip資訊(集群重啟時配合一鍵啟動腳本使用)

在新的機器上上傳解壓一個新的hadoop安裝包,從主節點機器上將hadoop的所有組態檔,scp到新的節點上,
1.2. 添加datanode
- 在namenode所在的機器的
/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop目錄下創建dfs.hosts檔案
cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop
vim dfs.hosts
添加如下主機名稱(包含新服役的節點)
node-1
node-2
node-3
node-4
- 在namenode機器的hdfs-site.xml組態檔中增加dfs.hosts屬性
cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop
vim hdfs-site.xml
<property>
<name>dfs.hosts</name>
<value>/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/dfs.hosts</value>
</property>
dfs.hosts屬性的意義:命名一個檔案,其中包含允許連接到namenode的主機串列,必須指定檔案的完整路徑名,如果該值為空,則允許所有主機,相當于一個白名單,也可以不配置,
在新的機器上單獨啟動datanode: hadoop-daemon.sh start datanode

重繪頁面就可以看到新的節點加入進來了
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-6iY02taD-1634389355322)(assert/1582387823813.png)]](https://img.uj5u.com/2021/10/18/275142181355065.png)
1.3.datanode負載均衡服務
新加入的節點,沒有資料塊的存盤,使得集群整體來看負載還不均衡,因此最后還需要對hdfs負載設定均衡,因為默認的資料傳輸帶寬比較低,可以設定為64M,即hdfs dfsadmin -setBalancerBandwidth 67108864即可
默認balancer的threshold為10%,即各個節點與集群總的存盤使用率相差不超過10%,我們可將其設定為5%,然后啟動Balancer,
sbin/start-balancer.sh -threshold 5,等待集群自均衡完成即可,
1.4.添加nodemanager
在新的機器上單獨啟動nodemanager:
yarn-daemon.sh start nodemanager

在ResourceManager,通過yarn node -list查看集群情況

2.動態縮容
2.1.添加退役節點
在namenode所在服務器的hadoop配置目錄etc/hadoop下創建dfs.hosts.exclude檔案,并添加需要退役的主機名稱,
注意:該檔案當中一定要寫真正的主機名或者ip地址都行,不能寫node-4
node04.hadoop.com
在namenode機器的hdfs-site.xml組態檔中增加dfs.hosts.exclude屬性
cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop
vim hdfs-site.xml
<property>
<name>dfs.hosts.exclude</name>
<value>/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/dfs.hosts.exclude</value>
</property>
dfs.hosts.exclude屬性的意義:命名一個檔案,其中包含不允許連接到namenode的主機串列,必須指定檔案的完整路徑名,如果值為空,則不排除任何主機,
2.2.重繪集群
在namenode所在的機器執行以下命令,重繪namenode,重繪resourceManager,
hdfs dfsadmin -refreshNodes
yarn rmadmin –refreshNodes

等待退役節點狀態為decommissioned(所有塊已經復制完成),停止該節點及節點資源管理器,注意:如果副本數是3,服役的節點小于等于3,是不能退役成功的,需要修改副本數后才能退役,
node-4執行以下命令,停止該節點行程
cd /export/servers/hadoop-2.6.0-cdh5.14.0
sbin/hadoop-daemon.sh stop datanode
sbin/yarn-daemon.sh stop nodemanager
namenode所在節點執行以下命令重繪namenode和resourceManager
hdfs dfsadmin –refreshNodes
yarn rmadmin –refreshNodes
namenode所在節點執行以下命令進行均衡負載
cd /export/servers/hadoop-2.6.0-cdh5.14.0/
sbin/start-balancer.sh
1.11 HDFS安全模式
安全模式是HDFS所處的一種特殊狀態,在這種狀態下,檔案系統只接受讀資料請求,而不接受洗掉 修改等變更請求,是一種保護機制,用于保證集群中的資料塊的安全性,
在NameNode主節點啟動時,HDFS首先進入安全模式,集群會開始檢查資料塊的完整性,DataNode在啟動的時候會向namenode匯報可用的block資訊,當整個系統達到安全標準時,HDFS自動離開安全模式,
-
手動進入安全模式
hdfs dfsadmin -safemode enter -
手動離開安全模式
hdfs dfsadmin -safemode leave
1.12 機架感知
hadoop自身是沒有機架感知能力的,必須通過人為的設定來達到這個目的,一種是通過配置一個腳本來進行映射;另一種是通過實作DNSToSwitchMapping介面的resolve()方法來完成網路位置的映射,
- 1 寫一個腳本,然后放到hadoop的core-site.xml組態檔中,用namenode和jobtracker進行呼叫,
#!/usr/bin/python
#-*-coding:UTF-8 -*-
import sys
rack = {"hadoop-node-31":"rack1",
"hadoop-node-32":"rack1",
"hadoop-node-33":"rack1",
"hadoop-node-34":"rack1",
"hadoop-node-49":"rack2",
"hadoop-node-50":"rack2",
"hadoop-node-51":"rack2",
"hadoop-node-52":"rack2",
"hadoop-node-53":"rack2",
"hadoop-node-54":"rack2",
"192.168.1.31":"rack1",
"192.168.1.32":"rack1",
"192.168.1.33":"rack1",
"192.168.1.34":"rack1",
"192.168.1.49":"rack2",
"192.168.1.50":"rack2",
"192.168.1.51":"rack2",
"192.168.1.52":"rack2",
"192.168.1.53":"rack2",
"192.168.1.54":"rack2",
}
if __name__=="__main__":
print "/" + rack.get(sys.argv[1],"rack0")
-
2 將腳本賦予可執行權限chmod +x RackAware.py,并放到bin/目錄下,
-
3 然后打開conf/core-site.html
<property> <name>topology.script.file.name</name> <value>/opt/modules/hadoop/hadoop-1.0.3/bin/RackAware.py</value> <!--機架感知腳本路徑--> </property> <property> <name>topology.script.number.args</name> <value>20</value> <!--機架服務器數量,由于我寫了20個,所以這里寫20--> </property> -
4 重啟Hadoop集群
-
namenode日志
2012-06-08 14:42:19,174 INFO org.apache.hadoop.hdfs.StateChange: BLOCK* NameSystem.registerDatanode: node registration from 192.168.1.49:50010 storage DS-1155827498-192.168.1.49-50010-1338289368956 2012-06-08 14:42:19,204 INFO org.apache.hadoop.net.NetworkTopology: Adding a new node: /rack2/192.168.1.49:50010 2012-06-08 14:42:19,205 INFO org.apache.hadoop.hdfs.StateChange: BLOCK* NameSystem.registerDatanode: node registration from 192.168.1.53:50010 storage DS-1773813988-192.168.1.53-50010-1338289405131 2012-06-08 14:42:19,226 INFO org.apache.hadoop.net.NetworkTopology: Adding a new node: /rack2/192.168.1.53:50010 2012-06-08 14:42:19,226 INFO org.apache.hadoop.hdfs.StateChange: BLOCK* NameSystem.registerDatanode: node registration from 192.168.1.34:50010 storage DS-2024494948-127.0.0.1-50010-1338289438983 2012-06-08 14:42:19,242 INFO org.apache.hadoop.net.NetworkTopology: Adding a new node: /rack1/192.168.1.34:50010 2012-06-08 14:42:19,242 INFO org.apache.hadoop.hdfs.StateChange: BLOCK* NameSystem.registerDatanode: node registration from 192.168.1.54:50010 storage DS-767528606-192.168.1.54-50010-1338289412267 2012-06-08 14:42:49,492 INFO org.apache.hadoop.hdfs.StateChange: STATE* Network topology has 2 racks and 10 datanodes 2012-06-08 14:42:49,492 INFO org.apache.hadoop.hdfs.StateChange: STATE* UnderReplicatedBlocks has 0 blocks 2012-06-08 14:42:49,642 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem: ReplicateQueue QueueProcessingStatistics: First cycle completed 0 blocks in 0 msec 2012-06-08 14:42:49,642 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem: ReplicateQueue QueueProcessingStatistics: Queue flush completed 0 blocks in 0 msec processing time, 0 msec clock time, 1 cycles
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/321152.html
標籤:其他
