@[TOC]
HDFS架構:
NameNode(NN):
- 管理文件系統的namespace/元數據
- 一個HDFS集羣只有一個Active的NN
說白了就是管理文件的目錄
它保存了兩個核心的數據結構: Fslmage和EditLog
- FsImage負責維護文件系統樹和樹中所有文件和文件夾的元數據。
———維護文件結構和文件元信息的鏡像 - EditLog操作日誌文件中記錄了所有針對文件的創建,刪除,重命名操作。
———記錄對文件的操作PS:
1.NN的元數據爲了讀寫速度塊是寫在內存裏的,FsImage只是它的一個鏡像保存文件
2.當每輸入一個增刪改操作,EditLog都會單獨生成一個文件,最後EL會生成多個文件
3.2NN不是NN的備份(但可以做備份),它的主要工作是幫助NN合併edits log,減少NN啓動時間。
4.拓撲距離:根據節點網絡構成的樹形結構計算最短路徑
5.機架感知:根據拓撲距離得到的節點擺放位置
SecondaryNameNode(2NN):
- 合併NameNode的editlogs和fsimage文件
- 輔助NN將內存中元數據信息持久化
DataNode(DN):
- 數據存儲節點,保存和檢索Block
- 一個集羣可以有多個數據節點
ResourceManager(RM):
它是負責管理機器中的內存、cpu的那個操作系統的調度系統
- ResourceManager負責整個集羣的資源管理和分配,是一個全局的資源管理系統。
- NodeManager以心跳的方式向ResourceManager彙報資源使用情況(目前主要是CPU和內存的使用情況)。RM只接受NM的資源回報信息,對於具體的資源處理則交給NM自己處理。
- YARN Scheduler根據application的請求爲其分配資源,不負責application job的監控、追蹤、運行狀態反饋、啓動等工作。
NodeManager(NM):
- NodeManager是每個節點上的資源和任務管理器,它是管理這臺機器的代理,負責該節點程序的運行,以及該節點資源的管理和監控。YARN集羣每個節點都運行一個NodeManager。
- NodeManager定時向ResourceManager彙報本節點資源(CPU、內存)的使用情況和Container的運行狀態。當ResourceManager宕機時NodeManager自動連接RM備用節點。
- NodeManager接收並處理來自ApplicationMaster的Container啓動、停止等各種請求。
HDFS具體工作原理:
一:NN——2NN(元數據節點工作原理)
第一步: 當客戶端對元數據進行增刪改請求時,由於hadoop安全性要求比較高,它會先將操作寫入到editlog文件裏,先持久化
第二步: 然後將具體增刪改操作,將FSimage和edit寫入內存裏進行具體的操作,先寫文件,即使宕機了也可以恢復數據,不然先內存數據就會消失,此時2NN發現時間到了,或者edit數據滿了或者剛開機時,就會請求執行輔助操作,NN收到後將edit瞬間複製一份,這個時候客戶端傳過來的數據繼續寫到edit裏。
第三步:我們把複製的edit和fsimage拷貝到2NN裏,操作寫在2NN的內存裏合併,合併後將文件返回給NN做爲新的Fsimage。所以一旦NN宕機2NN比NN差一個edit部分,無法完全恢復原先狀態,只能說輔助恢復。
但是輔助Namenode總是落後於主Namenode,所以在Namenode宕機時,數據丟失是不可避免的。在這種情況下,一般的,要結合遠程掛載的網絡文件系統(NFS)中的Namenode的元數據文件來使用,把NFS中的Namenode元數據文件,拷貝到輔助Namenode,並把輔助Namenode作爲主Namenode來運行。
爲了讀寫速度,datanode的位置信息是存在namenode的內存裏的,不存硬盤,又因爲會擔心宕機,所以要備份一個fsimage,不斷傳數據,不斷備份又會產生一致性問題,節點斷電,數據丟失,所以採用editlog,延遲更新的方式,定期更新。但是定期更新這個操作由NN來做壓力會太大,效率會變低,所以引入2NN來輔助。通常,SecondaryNamenode 運行在一個單獨的物理機上,因爲合併操作需要佔用大量的CPU時間以及和Namenode相當的內存
namenode的fsimage並不永久保存塊的位置信息,因爲這些信息在系統啓動時由數據節點重建
NN—DN(數據存取原理)
二:HDFS讀文件流程:
第一步: 首先調用FileSystem.open()方法,獲取到DistributedFileSystem實例。
第二步: DistributedFileSystem 向Namenode發起RPC(遠程過程調用)請求獲得文件的開始部分或全部block列表,對於每個返回的塊,都包含塊所在的DataNode地址。
> 這些DataNode會按照Hadoop定義的集羣拓撲結構得出客戶端的距離,然後再進行排序。如果客戶端本身就是一個DataNode,那麼他將從本地讀取文件。
第三步: DistributedFileSystem會向客戶端client返回一個支持文件定位的輸入流對象FSDataInputStream,用於客戶端讀取數據。
第四步: FSDataInputStream包含一個DFSInputStream對象,這個對象用來管理DataNode和NameNode之間的I/O
第五步: 客戶端調用read()方法,DFSInputStream就會找出離客戶端最近的datanode並連接datanode
第六步: DFSInputStream對象中包含文件開始部分的數據塊所在的DataNode地址,首先它會連接包含文件第一個塊最近DataNode。隨後,在數據流中重複調用read()函數,直到這個塊全部讀完爲止。如果第一個block塊的數據讀完,就會關閉指向第一個block塊的datanode連接,接着讀取下一個block塊。
第七步: 如果第一批block們都讀完了,DFSInputStream就會去namenode拿下一批blocks的location,然後繼續讀,如果所有的block塊都讀完,這時就會關閉掉所有的流。read 方法是並行的讀取 block 信息,不是一塊一塊的讀取。
NameNode 只是返回Client請求包含塊的DataNode地址,並不是返回請求塊的數據。
第八步: 最終讀取來所有的 block 會合併成一個完整的最終文件。
三:HDFS寫文件流程:
第一步: 客戶端通過調用 DistributedFileSystem 的create方法,創建一個新的文件。
第二步: DistributedFileSystem 通過 RPC(遠程過程調用)調用 NameNode,去創建一個沒有blocks關聯的新文件。
第三步: 創建前,NameNode 會做各種校驗,比如文件是否存在,客戶端有無權限去創建等。如果校驗通過,NameNode 就會記錄下新文件,否則就會拋出IO異常。
第四步: NameNode 返回請求成功 的信息後,客戶端將文件邏輯分塊成數個部分,通過FSDataOutputStream對象,將DataNode寫入數據,數據首先被寫入FSDataOutputStream對象內部的buffer中,FSDOutputStream 會把數據切成一個個小packet(64k) FSDOutputStream 負責處理namenode和datanode之間的通信。客戶端開始寫數據FSDOutputStream,,然後排成隊列 data queue。 使用管道與 切割成packet的理由 :並行存儲,增加效率。
第五步: 輸出流 會去處理接受 data queue,它先詢問 NameNode 這個新的 block 最適合存儲的在哪幾個DataNode裏,比如重複數是3,通過計算拓撲距離,進行機架感知,完成3個datanode節點最合適存儲位置尋找。把它們排成一個 pipeline。DataStreamer 把 packet 按隊列輸出到管道的第一個 DataNode 中,第一個 DataNode的內存buffer接收到packet將其持久化的同時又把 packet 輸出到第二個 DataNode 中,以此類推。
第六步: DFSOutputStream 還有 一個隊列叫 ack queue ,也是由 packet 組成,等待DataNode的收到響應,當pipeline中的所有DataNode都表示已經收到的時候,這時akc queue纔會把對應的packet包移除掉。這組datanode組成的pipeline反方向上,發送ack成功信號,最終由pipeline中第一個datanode節點將pipelineack發送給client,並close關閉掉流,client將成功信息傳給namenode,namenode將其對應元數據信息保存下來。
第七步: 繼續讀接下來的剩下來的塊,namenode 再會分配三個節點的位置,以此類推,直至寫完。
HDFS具體應用:
HDFS CLI (命令行)
基本格式:
- hdfs dfs +….
- hadoop fs (已過時)
命令:
-ls:
hdfs dfs -ls /mydemo
-cat:
hdfs dfs -ls /mydemo/niceday.txt
-put:
hdfs dfs -put /opt/soft/niceday.txt /mydemo
mkdir:
hdfs dfs -mkdir /mydemo
-text:
hdfs dfs -ls /mydemo/niceday.txt
-get:
hdfs dfs -get /mydemo/niceday.txt /opt
rm /rm-R:
hdfs dfs -rm /mydemo/niceday.txt
HDFS優缺點:
HDFS優點:
- 支持處理超大文件
- 可運行廉價機器上
- 高容錯性
- 流式文件寫入
HDFS缺點:——不合適實時
- 不適合低延時數據訪問場景。
- 不適合小文件存取場景——佔用NN大量內存,尋找時間超過讀取時間。
- 不適合併發寫入,文件隨機修改場景。
HDFS小細節:
HDFS副本機制:
-
block數據塊128M的原因:
-
HDFS平均尋址時間大概爲10ms
-
大量測試發現尋址時間爲傳輸時間的1%,爲最佳狀態
-
目前磁盤傳輸100MB/s,計算出最佳大小:100MB/s * 1 = 100MB
再經過cpu讀取固定是2的整數次冪,所以我們將塊設定爲128MB
-
-
block數據塊過大: 磁盤讀寫時間過長,易被誤判成失效節點
- block數據塊過小:
- 文件過於碎片化,namenode浪費大量內存
- 元數據信息過多,增加尋址時間。
-
副本數默認爲3
-
存放機制:
一個在本地機架節點
一個在同一個機架不同節點
一個在不同機架的節點
HDFS的文件夾的作用:
-
log
:錯誤在logs上找 -
share
:jar包和幫助文檔所在地 -
tmp/dfs/data
: 裏存有datanode的版本號,uuid來確認時本機的datanode -
tmp/dfs/name
: 裏存有namenode的版本號,他們的集羣id是一樣的,還存着fsimage和edit -
tmp/dfs/name
: 裏存有secondnamenode的版本號,,還存着fsimage和edit
HDFS高可用:(High Availability)
- 2.x版本
- 解決:HDFS Federation方式,共享DN資源
- Active Namenode
- 對外提供服務
- Standby namenode
- active故障時切換爲active