写的replication数量与client端的设置(或xml)文件有关,与服务端无关。当服务端的datanode个数小于请求的replication数,只写datanode的个数个replication。50070页面显示的会是你请求的副本数,说明50070页面只是反映了namenode记录的信息,不是真实的。
写:
- client 端向namenode请求上传文件。 namenode响应,看看文件是否已经存在?目录是否存在?如果都没问题,告诉client可以上传。
- client请求上传第一个block(文件的切分是在client端做的),请求返回可以写的datanode。namenode根据datanode的剩余空间和距离(在同一个机架)返回client请求数量备份个数的namenode。(与请求端同机架①,跨机架②,与①同机架但不同机器③)
- client会直接向①发送请求简历block传输的channel。这台datanode再与集群中其他要背写的datanode建立连接,当数据从client端一个个packet(64k)写到①,就会实时的向其他datanode同步。以chunk(512byte)为单位校验。
读:
请求下载文件 /../../...txt
namenode 给相应, 返回目标文件的元数据信息。
3.根据返回的元数据信息,找离自己最近的,请求读取block块,建立nio socket连接,用stream写
4.传输数据,
5.传完一个块儿,再利用元数据找块,继续stream写