1.客户端向NameNode 发起RPC 请求上传文件。
2. NameNode 检查目标文件是否已存在,创建者是否有权限进行操作,成功则会为文件创建一个记录,否则会让客户端抛出异常。在此期间,其他的客户端都不能对该文件进行写操作。
3.当客户端开始写入文件的时候,会将文件切分(比如文件有200M,会被切分成两个文件块,分别是128M 和72M)。
4. NameNode 会生成唯一的块ID,分配块空间,以及决定将块和块的备份副本存储到哪些DataNode 节点上。所有DataNode 节点会形成一个管线(pipeline),管线中DataNode 节点的顺序能够确保从客户端到上一DataNode 节点的总体网络距离最小。
5.客户端开始往DataNode 上传第一个文件块,应用程序客户端创建第一个缓冲区,并向其中写入字节。第一个缓冲区被填满后(一般是64KB 大小),数据会被推送到管线。当然在写入的时候DataNode 会进行数据校验,它并不是写入一个包(packet)进行一次校验,而是以文件块为单位进行校验。第一个DataNode 收到一个包就会传给第二个,第二个传给第三个,这就像一个水管一样不停的流式传输数据。
6.最后一个DataNode 成功存储之后会返回一个确认包(ack packet),在管线里传递至客户端,而在客户端内部维护着一个确认队列,成功收到DataNode 返回的确认包后会从确认队列移除相应的包。如果传输过程中有某个DataNode 出现了故障,那么当前的管线会被关闭,出现故障的DataNode 会从当前的管线中移除,文件块会在剩下的DataNode 中继续以管线的形式传输,同时NameNode 会分配一个新的DataNode,保持设定的副本数量。
7.当一个文件块传输完成之后,客户端再次请求NameNode 上传第二个文件块。步骤如4~6 所示,直至文件块上传完毕。(www.daowen.com)
HDFS 文件上传逻辑如图3-5 所示:
图3-5 HDFS 文件写过程
HDFS 中一个文件块默认有三个副本,其存放策略是:
(1)第一个副本放在运行客户端的节点上,即上传文件所在的DataNode 节点上,如果客户端不在DataNode 上,会随机选择一个DataNode 节点。
(2)第二个副本放在与第一个副本不同且随机的另外的机架上。
(3)第三个副本与第二个副本放在相同的机架上。这样做的好处是避免机架因为断电等故障而造成数据不可访问,第二、三个在同一个机架上,会减少副本数据拷贝时间。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。