`
spark_li
  • 浏览: 19897 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

 
阅读更多
读取文件:

 

下图是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个可用的节点上去。

 

 

  • 大小: 32.1 KB
  • 大小: 61.2 KB
分享到:
评论
2 楼 spark_li 2015-05-29  
wantodare 写道
对于这句
引用
3. 当客户端收到全部写入成功的回执(ack packet)之后,这时会把队列中上一个Block的数据删掉。然后进行下一个Block的写入。

数据块的写入是以流水线的形式传输的,当前副本在写入第一个datanode后,第一个datanode会继续把副本往下一个datanode拷贝传输,但此时下一个副本也同时写入其datanode列表的第一个datanode,而不是在客户端全部写入第一个block所有副本后才进行下一个block的传输


这里我没有写清楚,这里不是block,是packet。
整个流程是一个写block的过程。
1 楼 wantodare 2013-11-17  
对于这句
引用
3. 当客户端收到全部写入成功的回执(ack packet)之后,这时会把队列中上一个Block的数据删掉。然后进行下一个Block的写入。

数据块的写入是以流水线的形式传输的,当前副本在写入第一个datanode后,第一个datanode会继续把副本往下一个datanode拷贝传输,但此时下一个副本也同时写入其datanode列表的第一个datanode,而不是在客户端全部写入第一个block所有副本后才进行下一个block的传输

相关推荐

Global site tag (gtag.js) - Google Analytics