1. datanode介紹
1.1 datanode
datanode是負責當前節點上的數據的管理,具體目錄內容是在初始階段自動創建的,保存的文件夾位置由配置選項{dfs.data.dir}決定
1.2 datanode的作用
datanode以數據塊的形式存儲HDFS文件
datanode響應HDFS 客戶端讀寫請求
datanode周期性向NameNode匯報心跳信息,數據塊信息,緩存數據塊信息
1.3 datanode的多目錄配置
datanode也可以配置多個目錄,每個目錄存儲的數據不一樣,數據不是副本
(見:https://www.cnblogs.com/cjq10029/p/12368074.html)
<property> #hdfs-site.xml
<name>dfs.datanode.data.dir</name>
<value>/sdb1/data,/opt/software/hadoop277/tmp/data</value>
</property>
1.4 datanode的邏輯結構
我們可以將基於Federation的架構的HDFS分為三層:數據層,邏輯層和服務層
1.4.1 數據層
將DataNode 中負責數據塊存儲和管理數據塊操作的部分抽象成數據層,它主要包括2部分:
1.4.1.1 DataStorage(數據塊存儲)
數據塊存儲主要是管理DataNode磁盤存儲空間以及磁盤存儲空間的生命周期。說的直白一點就是DataStorage這個類主要負責管理數據存儲文件信息,比如current,detach,finalized等等文件。
BlockPoolSliceStorage可以用來管理DataNode每一個單獨的塊池,DataStorage會持有這個BlockPoolSliceStorage對象引用,並通過這個引用來管理DataNode的塊池。
1.4.1.2 FSDataset(文件系統數據集)
FSDataset抽象了DataNode對數據塊管理的操作,比如創建數據塊,維護數據塊文件等。我們知道每一個DataNode都可以配置多個不同類型的存儲目錄來保存數據,所以HDFS定義了FSVolumeImpl來管理DataNode上單個存儲目錄上 保存的數據塊,同時定義了FSVo
lumeList來維護DataNode上所有FSVolumeImpl對象的引用。FSDataSet會通過FSVolumeList提供的管理功能來管理DataNode上存儲的目錄保存的數據塊
1.4.2 邏輯層
DataNode基於數據層會執行很多HDFS 邏輯處理,比如向NameNode匯報數據塊狀態,發送心跳,掃描損壞的數據塊等,我們將HDFS執行這些邏輯的部分抽象成邏輯層。邏輯層主要包括三個模塊:
1.4.2.1 BlockPoolManager
BlockPoolManager是管理所有BlockPool的接口類,在HDFS Federation機制下,我們在集群可以創建多個NameSpace,每一個NameSpace都對應着一個BlockPool,一個BlockPoolManager會持有一個BPOfferService對象,用於管理DataNode單個BlockPool, 我們知道,如果引入HA機制, NameNode就會有ActiveNM 和 StandbyNM。所以每一個BPOfferService又會持有2個BPServiceActor對象,每一個BPServiceActor對應於命名空間里的一個Name Node,該對象負責向NameNode發送心跳報告,數據塊匯報,緩存匯報等
1.4.2.2 DataBlockScanner
一個周期性掃描每一個數據塊並檢查數據塊校驗是否正常的一個線程
1.4.2.3 DirectoryScanner
周期性掃描磁盤數據塊,對比內存中元數據與實際磁盤存儲數據塊的差異,並根據差異更新內存元數據,使得與磁盤保存一致
1.4.3 服務層
主要用於客戶端或者其他節點和DataNode通信,以及訪問DataNode狀態等功能,主要包括三個模塊:
1.4.3.1 HttpServer: 對外提供http服務
1.4.3.2 ipcServer:RPC服務端,響應來自客戶端,NameNode和其他DataNode的rpc請求
1.4.3.3 DataXceiverServer:輸出傳輸服務端,響應來自客戶端以及其他Data Node的流式接口請求
1.5 datanode工作機制
datanode啟動時,每個datanode對本地磁盤進行掃描,將本datanode上保存的block信息匯報給namenode
namenode在接收到的block信息以及該block所在的datanode信息等保存在內存中。
DataNode啟動后向NameNode注冊,通過后周期性(1小時)的向NameNode上報所有的塊信息
通過向NameNode發送心跳保持與其聯系(3秒一次),心跳返回結果帶有NN的命令,返回的命令為:如塊的復制,刪除某個數據塊…..
如果10分鍾沒有收到DataNode的心跳,則認為其已經lost,並copy其上的block到其它DataNode
DN在其文件創建后三周進行驗證其checkSum的值是否和文件創建時的checkSum值一致
DataNode之間還會相互通信,執行數據塊復制任務。同時,在客戶端執行寫操作的時候,DataNode之間需要相互配合,以保證寫操作的一致性
邏輯結構原文鏈接:https://blog.csdn.net/zhanglh046/article/details/78599095