以下内容基本都是自己的语言进行描述的,并不全是官方的说法,若有哪里说的不对可以在下面进行交流。
一 、角色 : Namenode ,DataNode ,Client
1 NameNode
namenode 负责维护整个文件系统的信息,包括:整个文件树,文件的块分布信息,文件系统的元数据,数据复制策略等 以下简称NN
2 DataNode
存储文件内容,负责文件实际的读写操作,保持与namenode的通信,同步文件块信息 以下简称DN
3 Client
发出存储文件请求 以下简称C
二 具体过程
1 C 向NN发出创建文件请求 客户端可以指定两个变量 ① dfs.replcation :3 ② block.size:128m 【副本数默认为3,块大小默认为128M】 切分文件block【hdfs的传输单位】
此时NN 要做以下事情:
(1) 检查C是否有创建文件权限
(2) 检查目录结构是否可用
(3) 检查集群是否可用
(4) 检查租约(HDFS会给每一个客户端一个租约lease,通过租约的持有来限制并行写入文件)
2 NN在以上校验都通过的情况下会给客户端一个返回确认信息。
3 客户端拿到确认信息后,发出addblock 操作。
(1)此时NN会给block分配可以写入的DN信息,分配考虑的因素有 ① 数据可靠性 ② 数据的写入效率 ③ DN的负载均衡策略
(2)默认的分配DN的策略是:第一个副本存入离客户端最近的机架的DN上,第二个副本存入与第一个副本不同机架上的DN,第三个副本存放在与第二个同一机架上不同DN上。
4 考虑以上因素后会返回给客户端可写入的DN节点队列。
5 客户端收到DN队列信息后,以pipeline形式写入block数据。在写入过程中每个步骤都会有ack确认,当得到成功写入副本的数量小于最小写入副本数时,会重新发送此写请求。最小写入副本数默认是1 ,与此同时DN和NN也会进行心跳,对于那些副本小于三的进行副本的生成,生成考虑的策略与选择DN节点需要考虑的一致。
6 当client收到ack消息确认完成后,向NN汇报block完成。
7 添加下一个block【从3流程开始】。
8 最终客户端汇报完成,NN更新文件状态,客户端释放租约