HDFS原理及架构

HDFS架构

HDFS是一个master/slave结构的服务,其中NameNode是master,一般只在一台节点上启动;DataNode是slave,一般每台节点都会启动一个;DataNode不断地主动向NameNode发送心跳、汇报block信息等;为了对NameNode进行备份,还会有一个SecondaryNameNodeHDFS原理及架构

HDFS各类操作

  1. 创建目录
    HDFS原理及架构
    client与namenode直接交互,在INode中创建目录节点,并将操作写入edit log中即可,全程不需要datanode参与。
  2. 删除文件
    HDFS原理及架构
    客户端与namenode交互删除文件,namenode只是标记要删除,但不会主动通知datanode;
    当对应的datanode向namenode发送心跳时,namnode会把删除指令放到返回值里;
    所以一般删除不是立即删除,而是有一定的延迟。
  3. 读文件
    HDFS原理及架构
    client先与namenode交互,通过getBlockLocatitions方法获取到文件block所在节点,然后client再与datanode交互获取具体数据;
    block可能不是一次全部返回,可能需要多次调用getBlockLocatitions。
    客户端读数据时如果DN发生故障,则会接着读取下一个数据块儿,并记录这个出故障的节点;读数据返回中包含了数据的校验和,如果发现错误,会报告给NN,并从其它副本读取。
  4. 写文件
    HDFS原理及架构
    client先与NN交互,在NN命名空间中创建一个新文件;
    第二步client真正写入之前再跟NN交互获取要在哪儿写,addBlock返回一个LocateBlock对象,包含数据库标志和版本号;
    LocateBlock还提供了跟DN交互的数据流管道,client写入到管道中的数据被分为一个个的文件包,这些被放入到一个输出队列中;
    第三步client跟DN交互写入数据,第一个节点写完,由第一个DN向第二个DN写,写完还要返回ack确认信息;如果收到ack确认信息,则将这个文件包从队列中删除;
    写完一个数据块之后,DN会跟NN交互,向NN提交这个数据块。

对于某个DN发生故障的情况:
1,先关闭数据流通道,正在写的数据包由于没有收到ack,不会从队列中删除,数据不会丢失;
2,正常的DN上的数据块会被赋予一个新的版本号,并通知NN。主要是故障节点恢复后,发现版本号跟NN上的不一致就会自动删除了;
3,数据流管道删除错误节点并重新建立管道,继续在正常几点上写数据;
4,文件关闭后,NN发现此数据库没有达到副本数要求,会选择一个新的DN来复制数据块。

  1. SecNameNode备份
    hdfs的元数据保存在Inode对象中,但是namenode是一个单点master,如果数据都在内存则无法进行故障恢复。
    hdfs有一个检查点机制,会把某个时间点内存中的Inode持久化到fsimage文件中,同时对每个操作记录写入到edit log中。
    SecNameNode则负责把namenode上的fsimage和edit log合并。
    HDFS原理及架构
    1,SecNN不断地获取NN上editlog的大小,如果太小则不做处理;
    2,如果editlog较大,则SecNN通知NN发起一次检查点操作;
    3,NN会产出一个新的editlog——edit.new,此后对元数据的操作都写入到edit.new文件中;
    4,而SecNN则通过http接口分别将NN上的fsimage和editlog拉取到SecNN节点上,并在内存中合并,并产出文件fsimage.ckpt;
    5,SecNN再主动通知NN镜像已合并完成;
    6,NN通过http接口拉取过来fsimage.ckpt并覆盖原来的fsimage,最后将edit.new改回edit

HDFS HA

https://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-name-node/index.html

猜你喜欢

转载自blog.51cto.com/4876017/2379749