一、客户端写入数据
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