HDFS元資料管理機制
### 1.元資料管理概述 > HDFS分類-型別分包括以下幾部分
- 檔案、目錄自身的屬性資訊,例如檔名,目錄名,修改資訊等
- 檔案記錄的資訊的儲存相關的資訊,例如儲存塊資訊,分塊情況,副本個數等
- 記錄 HDFS 的 Datanode 的資訊,用於 DataNode 的管理。
> 按形式分 - 記憶體元資料 記憶體 - 元資料檔案兩種 磁碟
> HDFS 磁碟上元資料檔案分為兩類,用於持久化儲存:
- fsimage 映象檔案:是元資料的一個持久化的檢查點,包含 Hadoop 檔案系統中的所有
目錄和檔案元資料資訊,但不包含檔案塊位置的資訊。
- Edits 編輯日誌:存放的是 Hadoop 檔案系統的所有更改操作(檔案建立,刪除或修改)
的日誌,檔案系統客戶端執行的更改操作首先會被記錄到 edits 檔案中。
> ps:所謂的持久化,就是將資料儲存到硬碟中,使得在應用程式或機器重啟後可以繼續訪問之前儲存的資料
```
當客戶端對 HDFS 中的檔案進行新增或者修改操作,操作記錄首先被記入 edits 日誌檔案中,當客戶端操作成功後,相應的元資料會更新到記憶體元資料中。因為 fsimage 檔案一般都很大(GB 級別的很常見),如果所有的更新操作都往 fsimage檔案中新增,這樣會導致系統執行的十分緩慢。
```
HDFS 這種設計實現著手於:一是記憶體中資料更新、查詢快,極大縮短了操作響應時間; 二是記憶體中元資料丟失風險頗高(斷電等),因此輔佐元資料映象檔案(fsimage)+編輯日 志文件(edits)的備份機制進行確保元資料的安全。
### 2.元資料目錄 在 Hadoop 的 HDFS 首次部署好配置檔案之後,並不能馬上啟動使用,而是先要對檔案系 統進行格式化。需要在 NameNode(NN)節點上進行如下的操作:
```
$HADOOP_HOME/bin/hdfs namenode –format
```
檔案系統:此時的檔案系統在物理上還不存在
格式化:格式化並不是指傳統意義上的本地磁碟格式化,而是一些清除與準備工作。
> 格式化在current目錄下會生成:
``` current/ |--VERSION |--edits_* |--fsimage_0000000000000547077 |--fsimage_0000000000000547077.md5 `--seen_txid ```
目錄在哪是在 hdfs-site.xml的dfs.namenode.name.dir指定 可以是多個
> seen_txid:
$dfs.namenode.name.dir/current/seen_txid 非常重要,是存放 transactionId 的文 件,format 之後是 0,它代表的是 namenode 裡面的 edits_*檔案的尾數,namenode 重啟的 時候,會按照 seen_txid的數字,循序從頭跑 edits_0000001~到 seen_txid 的數字。所以 當你的 hdfs 發生異常重啟的時候,一定要比對 seen_txid 內的數字是不是你 edits 最後的 尾數。做完之後會在$dfs.namenode.name.dir/current建立檔案結構:這個目錄也正是 namenode 元資料相關的檔案目錄:
```
cat VERSION
namespaceID=1752067181
clusterID=cluster84
cTime=0
storageType=NAME_NODE
blockpoolID=BP-824456762-192.168.20.39-1508928616349
layoutVersion=-60
```
- namespaceID/clusterID/blockpoolID:HDFS 叢集的唯一識別符號.防止 DataNodes 意外註冊到另一個叢集中的 namenode 上
- storageType:說明這個檔案儲存的是什麼程序的資料結構資訊(如果是 DataNode,storageType=DATA_NODE);
- cTime:NameNode 儲存系統建立時間,首次格式化檔案系統這個屬性是 0,當檔案系統升級之後,該值會更新到升級之後的時間戳;
- layoutVersion :表示 HDFS 永久性資料結構的版本資訊,是一個負整數。
### 3.SecondaryNameNode: > 這個出現的原因: HDFS 叢集執行一段事件後
- edit logs 檔案會變的很大,怎麼去管理這個檔案是一個挑戰。
- NameNode 重啟會花費很長時間,因為有很多改動要合併到 fsimage 檔案上。
- 如果 NameNode 掛掉了,那就丟失了一些改動。因為此時的 fsimage 檔案非常舊。
```
作用:減小sedit logs文的件的大小和得到一個最新的fsimage
檔案,減少在namenode上的壓力。相當於windows的恢復功能(可以說是快照)
職責:它的職責是合併 NameNode的editlogs到fsimage檔案中。
```
### 4.checkpoint
> 簡介:
每達到觸發條件,會由secondary namenode 將 namenode 上積累的所有 edits 和一個 最新的 fsimage 下載到本地,並載入到記憶體進行 merge(這個過程稱為 checkpoint)
> Checkpoint 觸發條件
- dfs.namenode.checkpoint.period:兩次連續的 checkpoint 之間的時間間隔。預設 1 小時
- dfs.namenode.checkpoint.txns:最大的沒有執行 checkpoint 事務的數量,滿足將強制執行緊急 checkpoint,即使尚未達到檢查點週期。預設設定為 100 萬