Hadoop学习笔记——Hadoop 读写文件过程剖析

本文详细解析了HDFS中文件的读取和写入流程,包括客户端如何从NameNode获取Block信息、读取Block的过程、遇到错误时的处理方式,以及文件创建和数据冗余复制的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读取文件:

 

下图是HDFS读取文件的流程:


 

这里是详细解释:

 

 

 

1.当客户端开始读取一个文件时,首先客户端从NameNode取得这个文件的前几个blockDataNode信息。(步骤1,2

 

2.开始调用read()read()方法里,首先去读取第一次从NameNode取得的几个Block,当读取完成后,再去NameNode拿下一批BlockDataNode信息。(步骤3,4,5

 

3.  调用Close方法完成读取。(步骤6

 

当读取一个Block时如果出错了怎么办呢。客户端会去另一个最佳的DataNode上读取这个块,并通知NameNode

 

这么一系列复杂的过程对客户端都是透明的。客户端只知道源源不断的从Stream中读取数据。

 

 

 

 

写入文件:

 

1. 首先客户端高速NameNode:”我要创建一个文件NameNode会进行一系列检查,比如文件是否存在。一旦通过检查,则创建一个文件。这时候客户端就可以写入数据了。(步骤12)。如果文件大于一个Block的大小,则一个一个block地写入,下面的步骤是一个block的写入流程。

 

2. 客户端在开始写入数据时,会请求NameNode为当前block分配一个DataNode的列表给客户端来写入数据。上图中是三个,也就是数据冗余三份。数据冗余的复制是在DataNode之间完成的。(步骤3,4,5

然后把一个block的数据分片(packet),放入一个数据发送队列进行发送。

 

3. 发送出去的packet会移入一个回执队列(防止丢数据)。当客户端收到全部写入成功的回执(ack packet)之后,这时会把回执队列中相应的packet删掉。

 

4. packet写入失败怎么办? 如果有一个节点写入失败,则停止当前流水线,把回执队列中的所有数据加到数据队列之前,保证不丢数据。重新分配一个流水线来写入数据。

 

*可以设置一个dfs.replication.min。代表一个block至少被写入几个节点就算成功,默认值是1,就是说只要一个block被写入1个datanode就算写入成功了。随后HDFS会自动把这个block拷贝到3个可用的节点上去。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值