HDFS的读写流程

HDFS写入数据

宏观流程

1.客户端发送命了hdfs dfs-put user.log

2.HDFS接收请求,并验证命令的准确性,远程调用create()方法

3.检查(是否有权限,路径是否正确,是否存在)

4.检查结果 不通过,抛出对应异常

                      通过,返回成功,创建一个映射对象,该对象存放文件元数据,文件与块的映射关系

5.接收 不通过将异常返回给客户端

            通过,创建一个客户端的输出流,返回给客户端,这个输出流叫FSDataOutputStream

6.文件上传 文件拆分成块进行上传,将块写入输出流

7.询问每个块存放到哪个DataNode节点

8.创建管道  根据NameNode返回的节点创建管道,数据以单个packet来传递

                    每个128大小的块传输完成后关闭管道,然后返回步骤7进行下一个块的传输

9.所有的块传输完成后,关闭输出流

微观流程

1.将硬盘中的内容使用Buffered读到自己的缓存中

2.Buffered中的字节组装到Packet

过程:

使用一个更小的单元chunk存放到packet中

为了提高传输效率,将装好的packet放到一个队列中进行传输

分为两个队列 DataQueue队列 数据队列

                       AckQueue队列  应答队列

由DataStreamer来取出packet发送 发送给输出流 将其挂载到应答队列

ResponseProcess进程接收管道应答:

收到接收成功信息后,将在应答队列删除已经传输成功的块

如果收到哪个块发错的信息,将存在应答队列中的该块以及后面的块重新移到数据队列,重新发送

读取数据流程

1.客户端读取数据发送命令 hdfs dfs -get

2.rpc远程调用open()方法

3.检查

4.检查通过微客户端创建一个输入流FSDataInputStream

5.客户端请求文件和BLK的关系,请求BLK与DD的关系

6.客户端获取文件第一个BLK的信息,返回所在的DN

7.客户端直接就近原则选择DN对应的数据

8.依次类推读取其他块信息,直到最后一个块,将BLK拼成一个文件

9.关闭FSDataInputStream

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值