DataNode心跳機制的做用講解了DataNode的三個做用:java
- register:當DataNode啓動的時候,DataNode須要將自身的一些信息(hostname, version等)告訴NameNode,NameNode通過check後使其成爲集羣中的一員,而後信息維護在
NetworkTopology
中 - block report:將block的信息彙報給NameNode,使得NameNode能夠維護數據塊和數據節點之間的映射關係
- 按期的send heartbeat
- 告訴NameNode我還活着,個人存儲空間還有多少等信息
- 執行NameNode經過heartbeat傳過來的指令,好比刪除數據塊
以上第1和第2個動做都是在DataNode啓動的時候發生的,register的步驟主要功能是使得這個DataNode成爲HDFS集羣中的成員,DataNode註冊成功後,DataNode會將它管理的全部的數據塊信息,經過blockReport方法上報到NameNode,幫助NameNode創建HDFS文件數據塊到DataNode的映射關係,這一步操做完成後,DataNode才正式算啓動完成,能夠對外提供服務了。apache
因爲NameNode和DataNode之間存在主從關係,DataNode須要每隔一段時間發送心跳到NameNode,若是NameNode長時間收不到DataNode節點的心跳信息,那麼NameNode會認爲DataNode已經失效。NameNode若是有一些須要DataNode配合的動做,則會經過心跳返回給DataNode,心跳返回值是一個DataNodeCommand數組,它是一系列NameNode的指令,這樣DataNode就能夠根據指令完成指定的動做,好比HDFS文件的刪除。數組
HDFS文件的刪除
Java基本操做HDFS API的最後講解了HDFS文件的刪除原理,HDFS文件刪除的示例代碼以下:oop
package com.twq.hdfs; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URI; public class FileDeleter { public static void main(String[] args) throws IOException { String dest = "hdfs://master:9999/user/hadoop-twq/cmd/java_writer.txt"; Configuration configuration = new Configuration(); FileSystem fileSystem = FileSystem.get(URI.create(dest), configuration); fileSystem.delete(new Path(dest), false); } }
HDFS文件的刪除很簡單,咱們看下HDFS文件刪除的流程圖: spa
流程圖其實也是很簡單,步驟以下:.net
- 客戶端建立一個
FileSystem
實例 - 調用
FileSystem
的delete
方法,這個時候會向NameNode發起刪除文件的請求,這個時候在NameNode中會刪除對應的文件的元數據,並將這個文件標記爲刪除,可是這個文件對應的數據塊並不會刪除 - 當須要刪除的文件對應的數據塊所在的DataNode向NaneNode發了心跳後,NameNode將須要刪除這個文件對應數據塊的指令經過心跳返回給DataNode,DataNode收到指令後纔會真正的刪除數據塊
總結
DataNode預NabeNode之間的交互很是的簡單,大部分都是DataNode到NameNode的心跳,考慮到一個規模的HDFS集羣,一個名字節點會管理上千個DataNode,因此這樣的設計也很是天然了。設計