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...