DataNode心跳機制的作用講解了DataNode的三個作用:
- 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才正式算啟動完成,可以對外提供服務了。
由於NameNode和DataNode之間存在主從關系,DataNode需要每隔一段時間發送心跳到NameNode,如果NameNode長時間收不到DataNode節點的心跳信息,那么NameNode會認為DataNode已經失效。NameNode如果有一些需要DataNode配合的動作,則會通過心跳返回給DataNode,心跳返回值是一個DataNodeCommand數組,它是一系列NameNode的指令,這樣DataNode就可以根據指令完成指定的動作,比如HDFS文件的刪除。
HDFS文件的刪除
Java基本操作HDFS API的最后講解了HDFS文件的刪除原理,HDFS文件刪除的示例代碼如下:
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文件刪除的流程圖:
流程圖其實也是很簡單,步驟如下:
- 客戶端創建一個
FileSystem
實例 - 調用
FileSystem
的delete
方法,這個時候會向NameNode發起刪除文件的請求,這個時候在NameNode中會刪除對應的文件的元數據,並將這個文件標記為刪除,但是這個文件對應的數據塊並不會刪除 - 當需要刪除的文件對應的數據塊所在的DataNode向NaneNode發了心跳后,NameNode將需要刪除這個文件對應數據塊的指令通過心跳返回給DataNode,DataNode收到指令后才會真正的刪除數據塊
總結
DataNode預NabeNode之間的交互非常的簡單,大部分都是DataNode到NameNode的心跳,考慮到一個規模的HDFS集群,一個名字節點會管理上千個DataNode,所以這樣的設計也非常自然了。