HDFS架构
HDFS是一个master/slave结构的服务,其中NameNode是master,一般只在一台节点上启动;DataNode是slave,一般每台节点都会启动一个;DataNode不断地主动向NameNode发送心跳、汇报block信息等;为了对NameNode进行备份,还会有一个SecondaryNameNode
成都创新互联公司主要从事成都网站设计、成都网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务吴川,十载网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220
HDFS各类操作
- 创建目录
client与namenode直接交互,在INode中创建目录节点,并将操作写入edit log中即可,全程不需要datanode参与。 - 删除文件
客户端与namenode交互删除文件,namenode只是标记要删除,但不会主动通知datanode;
当对应的datanode向namenode发送心跳时,namnode会把删除指令放到返回值里;
所以一般删除不是立即删除,而是有一定的延迟。 - 读文件
client先与namenode交互,通过getBlockLocatitions方法获取到文件block所在节点,然后client再与datanode交互获取具体数据;
block可能不是一次全部返回,可能需要多次调用getBlockLocatitions。
客户端读数据时如果DN发生故障,则会接着读取下一个数据块儿,并记录这个出故障的节点;读数据返回中包含了数据的校验和,如果发现错误,会报告给NN,并从其它副本读取。 - 写文件
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来复制数据块。
- SecNameNode备份
hdfs的元数据保存在Inode对象中,但是namenode是一个单点master,如果数据都在内存则无法进行故障恢复。
hdfs有一个检查点机制,会把某个时间点内存中的Inode持久化到fsimage文件中,同时对每个操作记录写入到edit log中。
SecNameNode则负责把namenode上的fsimage和edit log合并。
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
网站栏目:HDFS原理及架构
URL分享:
http://cqcxhl.com/article/jiodhi.html