【hadoop】13.HDFS-DataNode工做機制

簡介

經過本教程您能夠學習到:node

  1. DataNode的工做機制;
  2. 超時配置;
  3. 數據完整性驗證流程;
  4. DataNode的目錄結構;

一、DataNode的工做機制

前面咱們學習了namenode的工做機制,接下來咱們看看工做節點datanode的工做機制,以下圖所示:安全

(1)一個數據塊在datanode上以文件形式存儲在磁盤上,包括兩個文件,一個是數據自己,一個是元數據包括數據塊的長度,塊數據的校驗和,以及時間戳。網絡

(2)DataNode啓動後向namenode註冊,經過後,週期性(1小時)的向namenode上報全部的塊信息。ide

(3)心跳是每3秒一次,心跳返回結果帶有namenode給該datanode的命令如複製塊數據到另外一臺機器,或刪除某個數據塊。若是超過10分鐘沒有收到某個datanode的心跳,則認爲該節點不可用。oop

(4)集羣運行中能夠安全加入和退出一些機器。學習

二、時限參數設置

datanode進程死亡或者網絡故障形成datanode沒法與namenode通訊,namenode不會當即把該節點斷定爲死亡,要通過一段時間,這段時間暫稱做超時時長。ui

HDFS默認的超時時長爲10分鐘+30秒。若是定義超時時間爲timeout,則超時時長的計算公式爲:this

timeout  = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval。

默認的dfs.namenode.heartbeat.recheck-interval大小爲5分鐘,dfs.heartbeat.interval默認爲3秒。咱們能夠查看其默認配置:spa

<property>
  <name>dfs.namenode.heartbeat.recheck-interval</name>
  <value>300000</value>
  <description>
    This time decides the interval to check for expired datanodes.
    With this value and dfs.heartbeat.interval, the interval of
    deciding the datanode is stale or not is also calculated.
    The unit of this configuration is millisecond.
  </description>
</property>

<property>
  <name>dfs.heartbeat.interval</name>
  <value>3</value>
  <description>Determines datanode heartbeat interval in seconds.</description>
</property>

須要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的單位爲毫秒,dfs.heartbeat.interval的單位爲秒。code

三、數據完整性

  • 當DataNode讀取block的時候,它會計算checksum
  • 若是計算後的checksum,與block建立時值不同,說明block已經損壞。client轉而讀取其餘DataNode上的block.
  • datanode在其文件建立後周期驗證checksum

關於數據校驗的相關知識,能夠參考一些其餘的資料,這是一門很值得學習的學科。

四、DataNode的目錄結構

和namenode不一樣的是,datanode的存儲目錄是初始階段自動建立的,不須要額外格式化。

一、在/opt/module/hadoop-2.7.2/data/tmp/dfs/data/current這個目錄下查看版本號

[root@h135 current]# pwd
/opt/module/hadoop-2.7.2/data/tmp/dfs/data/current
[root@h135 current]# cat VERSION 
#Sun Jan 06 03:09:44 CST 2019
storageID=DS-dac42eb2-3c51-4489-9d89-b88f3a70a604
clusterID=CID-5b84c9ed-504a-4885-9e26-b9e99eefaf21
cTime=0
datanodeUuid=c36a1e36-33fd-4074-b13a-ba1e632762bd
storageType=DATA_NODE
layoutVersion=-56
  • storageID:存儲id號
  • clusterID集羣id,全局惟一
  • cTime屬性標記了datanode存儲系統的建立時間,對於剛剛格式化的存儲系統,這個屬性爲0;可是在文件系統升級以後,該值會更新到新的時間戳。
  • datanodeUuid:datanode的惟一識別碼
  • storageType:存儲類型
  • layoutVersion是一個負整數。一般只有HDFS增長新特性時纔會更新這個版本號。

二、在這裏深層次進入,還有一個current,這個目錄下查看該數據塊的版本號

[root@h135 current]# pwd
/opt/module/hadoop-2.7.2/data/tmp/dfs/data/current/BP-2054658932-192.168.102.133-1546499444184/current
[root@h135 current]# cat VERSION 
#Sun Jan 06 03:09:44 CST 2019
namespaceID=1140718114
cTime=0
blockpoolID=BP-2054658932-192.168.102.133-1546499444184
layoutVersion=-56
  • namespaceID:是datanode首次訪問namenode的時候從namenode處獲取的。storageID對每一個datanode來講是惟一的(但對於單個datanode中全部存儲目錄來講則是相同的),namenode可用這個屬性來區分不一樣datanode。
  • cTime屬性標記了datanode存儲系統的建立時間,對於剛剛格式化的存儲系統,這個屬性爲0;可是在文件系統升級以後,該值會更新到新的時間戳。
  • blockpoolID:一個block pool id標識一個block pool,而且是跨集羣的全局惟一。當一個新的Namespace被建立的時候(format過程的一部分)會建立並持久化一個惟一ID。在建立過程構建全局惟一的BlockPoolID比人爲的配置更可靠一些。NN將BlockPoolID持久化到磁盤中,在後續的啓動過程當中,會再次load並使用。
  • layoutVersion是一個負整數。一般只有HDFS增長新特性時纔會更新這個版本號。
相關文章
相關標籤/搜索