HDFS架構剖析和雙快取機制

2021-10-12 09:26:50 字數 2475 閱讀 6272

hdfs(hadoop distributed file system)的架構演變其實就是hadoop的更新迭代的過程,目前hadoop有hadoop1、hadoop2、hadoop3三個版本,對應的就有hdfs1,hdfs2,hdfs3。

hdfs1是乙個主從架構,主節點只有乙個叫namenode,從節點可以由多個叫datanode。

namenode的職責:

datanode的職責:

為了解決第乙個問題,hdfs2提出了ha高可用搭建方式:

如果使用多namenode的話,有三個問題需要解決:

為了解決第乙個問題,需要搭建乙個journalnode集群,他會從主namenode中獲取元資料,再同步給備namenode。

為了解決第二個問題,需要搭建乙個zookeeper集群,他會促使namenode向zk的鎖中寫資訊,先寫進去的為主namenode。

為了解決第三個問題,zookeeper集群的zkfc程序會實時監聽namenode的存活情況,如果主namenode死亡,那麼備namenode會成為主namenode。

雖然有了乙個journalnode集群,但是元資料受記憶體的限制並沒有完美解決,所有又有了另一種搭建模式:聯邦搭建模式

聯邦模式簡單來說就是把namenode的記憶體拿出來組合成乙個跨越物理限制的記憶體集合。

簡單來說就是namenode拿到元資料存放在所有namenode的記憶體中,而所有的namenode共享所有的元資料和所有的datanode(本質上已經沒有主備之分,所有的namenode都是主節點也都是備節點)。

聯邦模式算是解決了記憶體受限問題,同時也間接解決了namenode宕機問題,而且namenode也可以構建ha高可用,將兩個模式整合起來(聯邦模式適合一千個節點以上的集群)。

hdfs3比較hdfs2做出的公升級是:

hdfs寫元資料的時候,最終元資料會寫到磁碟上的editlog中,但是直接和磁碟進行互動的話會導致效能降低,無法應對高併發場景。所以提出了雙緩衝方案:

使用者向currentbuffer寫入資料到一定地步,觸發閾值後syncbuffer記憶體和currentbuffer進行交換,currentbuffer記憶體清空,syncbuffer開始向磁碟寫入日誌。

public

class

fseditlog

// 釋放鎖, 其他執行緒上鎖,開始迴圈

logsync()

;}private

void

logsync()

// 判斷是否在等待刷寫磁碟 加入已經有執行緒在等待刷寫,其他執行緒就不必在等待

if(iswaitsync)

// 修改iswaitsync 狀態

iswaitsync =

true

;// 判斷是否有人在刷寫磁碟

while

(issyncrunning)

catch

(exception e)

} iswaitsync =

false;}

// 沒有刷寫磁碟的話,直接交換記憶體 (記憶體裡面資料達到閾值,交換記憶體)

editlogbuffer.

setreadytosync()

;// 記憶體交換

if(editlogbuffer.currentbuffer.

size()

>0)

// 修改狀態

issyncruning =

true;}

// 記憶體中的資料寫入磁碟 寫磁碟操作沒有加鎖 分段加鎖

editlogbuffer.

flush()

;synchronized

(this)}

}/**

* 使用了物件導向的思想,把一條日誌看成乙個物件

*/class

editlog

@override

public string tostring()

";}}

/** * 雙緩衝方案

*/class

doublebuffer

// 記憶體1和記憶體2交換

public

void

setreadytosync()

// 獲取當前刷磁碟的記憶體裡的id最大值

public

long

gersyncmaxtxid()

public

void

flush()

syncbuffer.

clear();}}

GetChar快取機制深入剖析

與快取區相關最常見的操作就是字元的輸入與輸出操作getchar,getc,getch,getche,gets系列函式。第乙個例子 與getchar有關 複製 如下 include int main 如上,當輸入乙個字元按下回車後程式沒有等待你二次輸入就結束了,而且無論輸入什麼執行結果均是10,是不是...

HDFS儲存架構剖析以及讀寫流程

hdfs儲存架構主要由三部分組成 namenode,datanode,client 1 開啟分布式檔案 呼叫 分布式檔案 distributedfilesystem.open 方法 2 從 namenode 獲得 datanode 位址 distributedfilesystem 使用 rpc 呼叫...

HDFS 塊快取和聯邦HDFS

塊快取 對於訪問頻繁的塊,顯式地快取在datanode的記憶體中,以堆外塊快取的方式存在 利用快取塊的優勢提高讀操作的效能。聯邦hdfs namenode在記憶體中儲存了每個檔案與每個資料塊的引用關係,超大集群的namenode記憶體會成為瓶頸 hdfs允許擴充套件namenode,不同的namen...