HDFS读写流程
读流程
1.在客户端提交参数后,客户端(Client)通过调用FileSystem对象的open()方法来打开需要读取的文件
2.DistributedFileSystem调用元数据节点,得到Block信息,对于每一个数据块元数据返回保存数据块的数据节点地址
3.DistributedFileSystem返回FsDataInputStream给客户端,用来读取数据
4.客户端调用Stream的read()函数开始读取数据(也会读取block元数据)
5.Data从数据节点读到Client,此块读取完毕时,DFSInpuStream关闭和此节点链接,再连接此文件下一个block最近节点
6.Client读取完毕时,调用FSDataInputStream的close()函数
7.若读取出错,则尝试连接下一个包含此block的节点,故障节点不在连接!
写流程
1.客户端创建DistributedFileSystem对象
2.FS对象调用元数据节点,在文件系统命名空间中创建一个新的文件,元数据节点先确定文件原来不存在,并且客户端创建文件的权限,再创建文件,并标识“上传中”,不能使用
3.FS返回DFSOutputStream,客户端用于写数据
4.Client导入数据,DFSOutputStream将数据分块,写入data queue(由Data Stream读取),再通知元数据节点分配数据节点,用来存储块。
分配的数据节点在一个Pipline中,Data Stream将数据写入第一个数据节点,第二个数据节点将数据发送到第三个节点,在接收到一部分就会进行发送,三个节点几乎同时完整接收。
DFSOutputStream为发出去的数据保存ack queue,等待pipeline中的节点告知数据写入成功。
若block写入失败,则关闭pipeline,将ack queue放入data queue。发生错误的节点重启发现block过时,会被立即删除,失败的节点从pipeline中移除,block的其他副本则写入pipeline
中另外两个节点,元数据被告知副本不足,会创建第三个备份
5.ack queue返回成功
6.写入结束,调用stream的close()函数,通知元数据节点写入完毕