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,因此这样的设计也很是天然了。设计

相关文章
相关标签/搜索