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是列表...