hdfs的客户端读写流程以及namenode,secondarynamenode,checkpoint原理

一、客户端写入数据

1、客户端向NameNode发送上传文件的请求。

2、NameNode检查目录(这个文件是否已经存在),若已存在,返回错误,不存在,则继续。

3、NameNode给客户端发送可以上传的信息。

4、客户端再次向NameNode发送上传请求。

5、NameNode检查节点DataNode信息。

6、NameNode根据上传文件大小调度DataNode节点,调度出最合适的DataNode队列返回给客户端(例如dn1,dn2,dn3)。

DataNode会每隔3秒向NameNode发送数据,报告自己的状态。

7、客户端告诉DataNode上传数据。

8、客户端和DataNode建立传输通道。

(客户端接收队列数据通过pop方法:取出第一个节点的地址,然后访问该节点,并把剩下的节点的IP地址带过去。

  第一个DataNode接收数据,再从队列中取出第一个,再把剩下的IP地址带过去,直到最后一个节点结束;

  最后一个节点收到信息后,向源地址发送确认信息,确认信息到第一个DataNode的时候,DataNode会把确认信息返回给客户端。)

9、上传数据。

(客户端接收到确认信息后,开始往每一个DataNode上写入数据。)

10、最终写入成功,会将写入成功的信息返回给客户端。客户端向NameNode汇报数据写入成功,NameNode将信息写入元数据中。

最后NameNode通知DataNode自动做副本平衡。

二、客户端读数据

1、客户端请求NameNode下载文件。(NameNode里面记录了DataNode的地址,存放的是块的编号)

2、NameNode把元数据的信息返回给客户端。

3、客户端接收到信息,去相应的DataNode的具体块上请求数据。

4、传输数据。

三、元数据、NameNode、SecondaryNameNode、checkpoint原理

NameNode中读、写、以及DataNode映射等信息叫做“元数据” ,NameNode元数据存放位置有、内存、fsimage、edits log三个位置。

1、edits log:记录当前最新的元数据。

2、元数据内存:实际在用的元数据。

3、simage:元数据内存实体文件,fsimage与NameNode内容是是一样的(最全元数据)

当edits log文件大小达到阈值,会将edits log元数据写入到fsimage文件,并清除edits log中的元数据。

比如在此目录下fsimage_0000000000000000063就是元数据

NameNode中的fsimage信息每半小时更新一次,新文件和旧文件合并更新

SecondaryNameNode实质是对NameNode数据的备份,如果NameNode的机器挂掉了,可以根据SecondaryNameNode保证机器的正常运作。

所以NameNode和SecondaryNameNode不能放在一起。

修改hdfs.xml配置SecondaryNameNode的地址

<property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hdp02:50090</value>
</property>

Checkpoint原理

参见:https://www.cnblogs.com/hanyuanbo/archive/2012/07/25/2608698.html

原文地址:https://www.cnblogs.com/yangy1/p/12383706.html