HDFS的總結 通俗易懂

2021-09-01 09:30:45 字數 3192 閱讀 1882

hdfs: 上傳的資料經過切塊分布式儲存 並且每個塊都有多個備份 保證效能和可靠性

優點:支援超大檔案

檢測和快速應對硬體故障

流式資料訪問

簡化的一致性模型

高容錯性

可構建在廉價機器上

缺點:低延遲資料訪問

大量的小檔案

多使用者寫入檔案、修改檔案

不支援超強的事務

block

最基本的儲存單位。

128mb(64mb)

3個副本

如果某個塊不足128mb 切出的塊該是多大就是多大 128mb是塊的最大大小

namenode

儲存的是元資料

元資料儲存在namenode的記憶體和磁碟(fsimage、edits、fstime)中

元資料資訊包括:

記憶體中的元資料:

檔名及目錄結構資訊 副本數量 block的編號 block和datanode的對映關係

檔案中的元資料:

檔名及目錄結構資訊 副本數量 block的編號

secondarynamenode

不是namenode的熱備 而是乙個幫助者 幫助namenode合併元資料

觸發元資料合併的條件:

時間間隔達到:3600秒 距離上次合併的時間間隔

edits檔案大小達到:64mb

不是namenode的熱備 但是其實具有一定的備份能力,因為在snn裡儲存著上一次合併的元資料資訊 當nn崩潰,元資料資訊丟失時,

可以從snn中找到上一次合併時的元資料 恢復出部分資料。

但是很有可能丟失部分最新的元資料。只能作為極端工具下無奈的選擇。

datanode

儲存block的節點

定時向nn傳送心跳報告(3秒一次) 保持存活 向nn報告自己持有block資訊 接受nn的命令

如果連續10分鐘nn都沒有收到某個datanode心跳資訊 則nn會認為datanode已經失去連線 

合併元資料流程

當達到合併元資料的條件時,先產生新的edits.new檔案,之後所有的更新寫入此檔案

snn此時來複製nn中的fsimage和edits檔案 複製完成後開始進行合併,合併為fsimage.ckpt

將此檔案傳送回nn,nn刪除舊的fsimage將此檔案更名為新的fsimage 再將edits.new更名為edits完成 元資料合併

這個過程中nn並不需要停止服務,可以持續工作,利用snn減輕了nn的合併資料的工作壓力。

讀流程使用hdfs提供的客戶端開發庫client,向遠端的namenode發起rpc請求;

namenode會視情況返回檔案的部分或者全部block列表,對於每個block,namenode都會返回有該block拷貝的datanode位址;

客戶端開發庫client會選取離客戶端最接近的datanode來讀取block;如果客戶端本身就是datanode,那麼將從本地直接獲取資料.

讀取完當前block的資料後,關閉與當前的datanode連線,並為讀取下乙個block尋找最佳的datanode;

當讀完列表的block後,且檔案讀取還沒有結束,客戶端開發庫會繼續向namenode獲取下一批的block列表。

讀取完乙個block都會進行checksum驗證,如果讀取datanode時出現錯誤,客戶端會通知namenode,然後再從下乙個擁有該block拷貝的datanode繼續讀。

當檔案最後乙個塊也都讀取完成後,datanode會連線namenode告知關閉檔案。

寫流程使用hdfs提供的客戶端開發庫client,向遠端的namenode發起rpc請求;

namenode會檢查要建立的檔案是否已經存在,建立者是否有許可權進行操作,成功則會為檔案建立乙個記錄,否則會讓客戶端丟擲異常;

當客戶端開始寫入檔案的時候,client開發庫會將檔案切分成多個packets,並在內部以資料佇列"data queue"的形式管理這些packets,

並向namenode申請新的blocks。,獲取用來儲存replicas的合適的datanodes列表, 列表的大小根據在namenode中對replication的設定而定

開始以pipeline(管道)的形式將packet寫入所 有的replicas中。開發庫把packet以流的方式寫入第乙個datanode,

該datanode把該packet儲存之後,再將其傳遞給在此 pipeline中的下乙個datanode,直到最後乙個datanode,這種寫資料的方式呈流水線的形式。

最後乙個datanode成功儲存之後會返回乙個ack packet,在pipeline裡傳遞至客戶端,在客戶端的開發庫內部維護著"ack queue",

成功收到datanode返回的ack packet後會從"ack queue"移除相應的packet。

如果傳輸過程中,有某個datanode出現了故障,那麼當前的pipeline會被關閉,出現故障的datanode會從當前的pipeline中移除, 

剩餘的block會繼續在剩下的datanode中繼續以pipeline的形式傳輸,同時namenode會分配乙個新的datanode,保持 replicas設定的數量。

重複如上過程將所有package都上傳完成 之後 向namenode報告成功 關閉檔案

**副本存放策略(機架感知策略):

乙個block有3個副本,這3個副本應該如何儲存?

客戶端將第乙個副本寫入離自己最近的節點 如果客戶端所在的節點就是個datanode 則直接上傳本地 如果不是 則找到最近的datanode節點上傳

要通過管道流來複製block

此時第二個副本選擇 和第乙個副本不同機架的另乙個datanode節點

第三個副本選擇和第二個副本相同機架的datanode節點

啟動流程

namenode啟動,進入安全模式,只能檢視目錄結構無法進行其他操作(讀寫操作)

namenode開始合併元資料,注意這次合併由namenode自己來進行,合併完成後 生成新的fsimage和新的空的edits檔案

再將fsimage中的資料恢復到記憶體中

接著等待 等待datanode的心跳報告 datanode在心跳報告中除了告知namenode當前datanode存活以外,還會在心跳中 帶著其所持有的block資訊

namenode根據datanode心跳中的資訊 在記憶體中構建出 block對應的datanode資訊

當namenode獲取到足夠數量的block資訊後 解除安全模式 開始對外提供服務

**安全模式----注意安全模式最後不要強制退出。

const用法總結(通俗易懂)

const的意思可以概括為 乙個不能被改變的普通變數 使得const在一定程度上提高程式的安全性和可靠性。const的幾種情況 int const size const int size 這兩條語句都是把size宣告為乙個整數,他的值不能被修改。可以在宣告的時候對他進行初始化,int const s...

訊息佇列總結通俗易懂

一 mq是什麼?1 mq全稱為message queue 訊息佇列 mq 一種先進先出的資料結構,是一種應用程式對應用程式的通訊方法。mq是消費 生產者模型的乙個典型的代表,一端往訊息佇列中不斷寫入訊息,而另一端則可以讀取佇列中的訊息。訊息發布者只管把訊息發布到 mq 中而不用管誰來取,訊息使用者只...

numpy bincount 通俗易懂

bincount的用途很簡單,就是統計出乙個列表的各個元素的出現次數。例如輸入是 1,0,2,2,1,2,3,5 那麼輸出就是 1,2,3,1,0,1 這樣的結果可能並不是很直觀,可能依然會有同學會問為什麼會輸出這樣的結果。我們看看 假如我們把輸入的列表中的數字都統計一遍,形成乙個字典 key是列表...