@

一、写数据流程

①服务端启动HDFS中的NN和DN进程

②客户端创建一个分布式文件系统客户端,由客户端向NN发送请求,请求上传文件

③NN处理请求,检查客户端是否有权限上传,路径是否合法等

④检查通过,NN响应客户端可以上传

⑤客户端根据自己设置的块大小,开始上传第一个块,默认0-128M,

NN根据客户端上传文件的副本数(默认为3),根据机架感知策略选取指定数量的DN节点返回

⑥客户端根据返回的DN节点,请求建立传输通道

客户端向最近(网络距离最近)的DN节点发起通道建立请求,由这个DN节点依次向通道中的(距离当前DN距离最近)

下一个节点发送建立通道请求,各个节点发送响应 ,通道建立成功

⑦客户端每读取64K的数据,封装为一个packet(数据包,传输的基本单位),将packet发送到通道的下一个节点

通道中的节点收到packet之后,落盘(检验)存储,将packet发送到通道的下一个节点!

每个节点在收到packet后,向客户端发送ack确认消息!

⑧一个块的数据传输完成之后,通道关闭,DN向NN上报消息,已经收到某个块

⑨第一个块传输完成,第二块开始传输,依次重复⑤-⑧,直到最后一个块传输完成,NN向客户端响应传输完成!

⑩客户端关闭输出流

举例:

1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。

2)NameNode返回是否可以上传。

3)客户端请求第一个 Block上传到哪几个DataNode服务器上。

4)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。

5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。

6)dn1、dn2、dn3逐级应答客户端。

7)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。

8)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。

@

二、异常写流程

①-⑥见上

⑦客户端每读取64K的数据,封装为一个packet,封装成功的packet,放入到一个队列中,这个队列称为dataQuene(待发送数据包)

在发送时,先将dataQuene中的packet按顺序发送,发送后再放入到ackquene(正在发送的队列)。

每个节点在收到packet后,向客户端发送ack确认消息!

如果一个packet在发送后,已经收到了所有DN返回的ack确认消息,这个packet会在ackquene中删除!

假如一个packet在发送后,在收到DN返回的ack确认消息时超时,传输中止,ackquene中的packet会回滚到dataQuene。

重新建立通道,剔除坏的DN节点。建立完成之后,继续传输!

只要有一个DN节点收到了数据,DN上报NN已经收完此块,NN就认为当前块已经传输成功!

NN会自动维护副本数!

@

读数据流程

1)客户端通过Distributed FileSystemNameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。

2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。

3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。

4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。

最新文章

  1. java模拟浏览器上传文件
  2. AndroidStudio配置gradle,让App自动签名
  3. jquery 获取多个select name 的值
  4. 【环境配置】Linux环境下下载、配置java环境、安装eclipse、建立eclipse快捷方式详解
  5. css样式自适应,支持数字
  6. Delphi FireMonkey使用UniDAC 连接MySQL
  7. sort merge join,hash join,netsloop join
  8. 【转】爱普生打印机L358
  9. [Elasticsearch] 控制相关性 (一) - 后面的相关度分值理论计算
  10. Struts1——离BeanUtils看struts其原理1
  11. 【css】border-image
  12. java缓存系统
  13. 如何设计一个可用的web容器
  14. Http User Agent Example
  15. ORACLE-016:ora-01720 授权选项对于'xxxx'不存在
  16. 体验异步的终极解决方案-ES7的Async/Await
  17. Lucene第二讲——索引与搜索
  18. leetcode笔记9 Move Zeroes
  19. vue的单文件组件
  20. 洛谷 P4547 & bzoj 5006 随机二分图 —— 状压DP+期望

热门文章

  1. InstallShield 2015 Limited Edition 打包教程
  2. throws,throw,try,catch,finally 分别代表什么 意义?
  3. python2.7 正则表达式的学习
  4. SpringBoot设置mysql的ssl连接
  5. 安装 KubeSphere DevOps 系统
  6. Mysql 视图用途、使用场景、性能问题及使用注意事项
  7. vue入门的第一天:v-clock、v-text、v-html的使用
  8. 【WebLogic使用】3.WebLogic配置jndi数据源
  9. 且谈 Apache Spark 的 API 三剑客:RDD、DataFrame 和 Dataset
  10. MFC线程(二):线程同步临界区CRITICAL SECTION