自行整理, 學(xué)習(xí)用途, 侵知刪歉
1.HDFS
- 新加入的文件被分成block, 64M默認(rèn);
- 默認(rèn)每一個block復(fù)制3份,分布在多臺node上
- HDFS can be deployed with or without high availability
2. HDFS without high availability, 3 deamons, [Mode A]:
- NameNode(Master)
- Secondary NameNode(Master)
- DataNode (slave)
NameNode
- NameNode 包含所有metadata
hdfs中文件位置信息
所屬關(guān)系(ownership)和權(quán)限(permission)
獨(dú)立block的名字
block的位置信息
Metadata
- 存儲在硬盤上, 當(dāng)Namenode守護(hù)進(jìn)程啟動時讀取
- 文件名: fsimage (block的位置信息沒有存在里面)
edits
- 硬盤上,對metadata的更改被寫進(jìn)一份log文件,叫做
edits
SlaveNode
- 實際的文件內(nèi)容以block的形式存儲在slva node上
- block文件名:
blk_xxxxxxx
- 每個slaveNode運(yùn)行一個NataNode daemon, 控制對block的訪問, 與NameNode通信
the Secondary NameNode(SN)
- SN并不是NameNode的失效備援
- SN將
metadata
的變化內(nèi)容寫到edit log
里 - SN周期性的將
系統(tǒng)的metadata快照
與edit log
合并成一份新的metadata快照
, 并將新的metadata快照
傳送回NameNode - SN的運(yùn)行環(huán)境經(jīng)需要和NameNode一樣的RAM
文件系統(tǒng)的metadata快照 和 Edit
- fsimage包含了一個系統(tǒng)metadata的快照, 并不會在每次寫入操作時更新
- 當(dāng)hdfs客戶端進(jìn)行一個寫操作, 它首先記錄在Primary Namenode的
edits
- 對所有
edits
進(jìn)行更新(Namenode重啟時)將會耗時很長, 所以這個事由the secondary namenode做
Checkingpointing the file system Metadata
- SN周期性的檢查NameNode里的in-memory file去獲取
fsimage
和新產(chǎn)生edits
- SN把
fsimage
放到內(nèi)存, 然后應(yīng)用edits
中的更新內(nèi)容, 然后構(gòu)造新的fsimage
文件,并將其送回primary NameNode - primary NameNode收到后, 更新
fsimage
和 新產(chǎn)生的edits
- 默認(rèn)情況下checkpoint = min{ 每小時或者每1,000,000傳輸進(jìn)行一次 }
在這種模式下, 一個NameNode就是一個single point of failure, SN不是 ; 如果故障, HDFS會在故障的NameNode更換后恢復(fù)正常; risk比較低,恢復(fù)也比較簡單
3.HDFS with high Availability [Mode B]:
為了排除Single Point of Failure
2個NameNode:
standby
NameNode和Active
NameNode, standby
在Active
掛掉后代替它.
active
NameNode把metadata寫到JournalNodes[Quorum機(jī)制]
standby
NameNode讀取JournalNode[Quorum機(jī)制]
來和Active NameNode保持同步
-
一個HDFS目錄可以快照(snapshot),例如:
-
HDFS Cache
- it is possible to cache HDFS files in off-heap memory on DataNodes
- cache is in off-heap memory for DataNode user
HDFS HA 部署步驟
1.配置Hadoop的 configuration
2.安裝和啟動JournalNodes
3.如果沒有安裝, 則配置并啟動一個ZooKeeper ensemble
4.如果從一個con-HA的配置轉(zhuǎn)成HA, 初始化shared edits directory
5.安裝, 引導(dǎo), 啟動Standby NameNode
6.安裝, 規(guī)定(format),啟動ZooKeeper failover controllers
7.重啟DataNodes, Yarn, MapReduce守護(hù)進(jìn)程
- Journal Node配置
在每一個要運(yùn)行JournalNode的host上
1.安裝
-?sudo yum install hadoop-hdfs-journalnode
2.在Journal Node 創(chuàng)建shared edits directory
-路徑 dfs.journalnode.edits.dir
3.啟動JournalNode
-sudo service hadoop-hdfs-journalnode start
4.HDFS寫文件(client寫到DataNode)
-
client
連接到NameNode
-
NameNode
設(shè)置好metadata
的入口(entry), 并將block的名字和DataNode
的列表發(fā)送給client
-
client
連接到第一個DataNode
然后開始發(fā)送數(shù)據(jù); 第一個發(fā)送完了給第二DataNode
發(fā)送, 然后去第三個 - 流水線的請求數(shù)據(jù)包返回發(fā)送給
client
- block寫入完成,
client
給NameNode
報告完成
-
如果這個流水線的DataNode失敗了:
- 這個流水線就關(guān)閉了
- 一個新的流水線啟動, 開啟2個好的節(jié)點(diǎn), 數(shù)據(jù)就繼續(xù)寫到這2個好的節(jié)點(diǎn)
-
NameNode
會知曉這個block是有備份的, 然后這個數(shù)據(jù)會在另一個DataNode
重新備份
-
當(dāng)數(shù)據(jù)的block寫完后, client會計算每一個block的checkSum
- checkSum和data一起發(fā)送到
DataNode
- checkSum和每一個數(shù)據(jù)
block
一起寫入 - 保證了數(shù)據(jù)的一致性
- checkSum和data一起發(fā)送到
Rack-aware
Hadoop了解rack awareness
的概念:
- 知曉node在哪里, 如何和另一個node關(guān)聯(lián)
- 幫助ResourceManager給靠近
data
的node
分配處理資源 - 幫助
NameNode
找到最近的block給client
去讀取 - HDFS將data blocks復(fù)制在不同的節(jié)點(diǎn), 不同的機(jī)架, 更好的安全性
第一份拷貝: 在client的同一個節(jié)點(diǎn)
第二份拷貝: 靠近的另一個機(jī)架上的一個節(jié)點(diǎn)
第三份拷貝: 同一機(jī)架上的不同節(jié)點(diǎn)上
5. HDFS讀文件(client讀DataNode)
-
client
連接NameNode
-
NameNode
返回文件的第一部分block的名字和路徑(距離最近的先返回) -
client
連接到第一個DataNode
開始讀取block - 如果連接失敗,
client
會連接到list里的下一個節(jié)點(diǎn)去讀block
數(shù)據(jù)污染
- 當(dāng)
client
讀取一個block時, 它會校對checkSum, 實時的checkSum會和block創(chuàng)建時的checkSum對比 - 如果不同,
client
會讀取下一個DataNode
中的數(shù)據(jù), 然后告知NameNode
這里出現(xiàn)一個數(shù)據(jù)污染版本,NameNode
會在別處重新備份這個block -
DataNode
默認(rèn)每3周會檢查block的checkSums
數(shù)據(jù)可靠性和恢復(fù)
-
DataNode
每3秒發(fā)送心跳給NameNode
- 一段時間沒有收到心跳就可以認(rèn)為
DataNode
掛了 -
NameNode
會知道哪些block受影響, 然后讓其他的節(jié)點(diǎn)復(fù)制這些block到一個新的節(jié)點(diǎn)
*掛了的節(jié)點(diǎn)恢復(fù)后,NameNode
會告知新備份的DataNode
刪除多余的備份
數(shù)據(jù)從不會經(jīng)過NameNode, 不管是讀寫還是拷貝過程
`