HDFS中DataNode的心跳機制

DataNode心跳機制的做用講解了DataNode的三個做用:java

  1. register:當DataNode啓動的時候,DataNode須要將自身的一些信息(hostname, version等)告訴NameNode,NameNode通過check後使其成爲集羣中的一員,而後信息維護在NetworkTopology
  2. block report:將block的信息彙報給NameNode,使得NameNode能夠維護數據塊和數據節點之間的映射關係
  3. 按期的send heartbeat
    1. 告訴NameNode我還活着,個人存儲空間還有多少等信息
    2. 執行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

  1. 客戶端建立一個FileSystem實例
  2. 調用FileSystemdelete方法,這個時候會向NameNode發起刪除文件的請求,這個時候在NameNode中會刪除對應的文件的元數據,並將這個文件標記爲刪除,可是這個文件對應的數據塊並不會刪除
  3. 當須要刪除的文件對應的數據塊所在的DataNode向NaneNode發了心跳後,NameNode將須要刪除這個文件對應數據塊的指令經過心跳返回給DataNode,DataNode收到指令後纔會真正的刪除數據塊

總結

DataNode預NabeNode之間的交互很是的簡單,大部分都是DataNode到NameNode的心跳,考慮到一個規模的HDFS集羣,一個名字節點會管理上千個DataNode,因此這樣的設計也很是天然了。設計

相關文章
相關標籤/搜索