1.一般的文件读取操作包括:open 、read、close等

客户端读取数据过程,其中1、3、6步由客户端发起:

客户端首先获取FileSystem的一个实例,这里就是HDFS对应的实例:

①客户端调用FileSystem实例的open方法,获得这个文件对应的输入流,在HDFS中就是DFSInputStream

②构造第一步中的输入流DFSInputStream时,通过RPC远程调用NameNode可以获得NameNode中此文件对应的数据块的保存位置,包括这个文件的副本的保存位置(主要是各DataNode的地址)。注意,在输入流中会按照网络拓扑结构,根据与客户端距离对DataNode进行简单排序

③④获得此输入流之后,客户端调用read方法读取数据。输入流DFSInputStream会根据前面的排序结果,选择最近的DataNode建立连接并读取数据。如果客户端和其中一个DataNode位于一个机器中(比如MapReduce过程中的mapper和reducer),那么就会直接从本地读取数据。

⑤如果已达到数据块末端,那么关闭与这个DataNode的连接,然后重新查找下一个数据块。

不断执行②-⑤直到数据全部读完,然后调用close

⑥客户端调用close,关闭输入流DFSInputStream

另外如果DFSInputStream和DataNode通信时出现错误,或者是数据校验出错,那么DFSInputStream就会重新选择DataNode传输数据。

2、数据的写入过程 一般文件写入操作不外乎create、write、close几种,

客户端写入数据过程,其中1、3、6由客户端发起

客户端首先要获取FileStream的一个实例,这里就是HDFS的实例,

①②客户端调用FileSystem实例的create方法,创建文件。NameNode通过检查,比如文件是否存在,客户端是否拥有创建权限等;通过检查之后,在NameNode添加文件信息。注意,因为此时文件没有数据,所以NameNode上也没有文件数据块信息。创建结束后,HDFS会返回一个输出流DFSDataOutputStream给客户端。

③客户端调用输出流DFSDataOutputStream的write方法向HDFS中对应的文件写入数据。数据首先会被分包,这些分包会写入一个输入流内部队列Data队列中,接收完整数据分包,输出流DFSDataOutputStream会向nameNode申请保存文件和副本数据块的若干个DataNode,这若个个DataNode会形成一个数据传输管道。

④DFSDataOutputStream会(根据网络拓扑结构排序)将数据传输给距离上最短的DataNode,这个DataNode接收到数据包之后会传递给下一个DataNode,数据在各DataNode之间通过管道流动,而不是全部由输出流分发,这样可以减少传输开销。

⑤因为DataNode位于不同机器上,数据需要通过网络发送,所以,为了保证所有的DataNode的数据都是准确的,接收到数据的DataNode要向发送者发送确认包(ACKPacket)。对于某个数据块,只有当DFSDataOutputStream收到了所有DataNode的正确ACK,才能确认传输结束。DFSDataOutputStream内部专门维护了一个等待ACK队列,这一队列保存已经进入管道传输数据、但是并未被完全确认的数据包。

不断③-⑤直到数据全部写完,客户端调用close关闭文件。

⑥客户端调用close方法,DFSDataOutputStream继续等待直到所有数据写入完毕并被确认,调用complete方法通知NameNode文件写入完成。

⑦NameNode接收到complete消息之后,等待相应数量的副本写入完毕后,告知客户端即可。

3、在传输过程中,如果发现某个DataNode失效(未联通,ACK超时),那么HDFS执行如下操作:

①关闭数据传输的管道

②将等待ACK队列中的数据放到Data队列的头部

③更新正常DataNode中所有数据块的版本;当失效的DataNode重启之后,之前的数据块会因为版本不对而被清除。

④在传输管道中删除失效DataNode,重新建立管道并发送数据包。

HDFS数据的读写过程相关推荐

  1. HDFS数据的写入过程

    HDFS 文件写入过程 Client 发起文件上传请求, 通过 RPC 与 NameNode 建立通讯, NameNode 检查目标文件是否已存在, 父目录是否存在, 返回是否可以上传 Client ...

  2. MapReduce程序的读写过程

    问题导读 1.HDFS框架组成是什么? 2.HDFS文件的读写过程是什么? 3.MapReduce框架组成是什么? 4.MapReduce工作原理是什么? 5.什么是Shuffle阶段和Sort阶段? ...

  3. Hadoop-HDFS的数据读写过程(详细过程与图解)

    目录 网络拓扑-节点距离 读过程 HDFS客户端与NameNode通信 HDFS客户端与DataNode通信 HDFS读数据的详细过程 代码实现 写数据 HDFS客户端与NameNode通信 HDFS ...

  4. hbase系统架构图以及各部分的功能作用,物理存储,HBase寻址机制,读写过程,Regin管理,Master工作机制

    1.1 hbase内部原理 1.1.1 系统架构 Client 1 包含访问hbase的接口,client维护着一些cache来加快对hbase的访问,比如regione的位置信息. Zookeepe ...

  5. HDFS写入和读取过程

    HDFS写入和读取过程 一.HDFS HDFS全称是Hadoop Distributed System.HDFS是为以流的方式存取大文件而设计的.适用于几百MB,GB以及TB,并写一次读多次的场合.而 ...

  6. HDFS dfsclient写文件过程 源码分析

    HDFS写入文件的重要概念 HDFS一个文件由多个block构成.HDFS在进行block读写的时候是以packet(默认每个packet为64K)为单位进行的.每一个packet由若干个chunk( ...

  7. flume 一对多hdfs_10PB 规模的 HDFS 数据在 eBay 的迁移实战

    导读 INTRODUCTION Hadoop分布式文件系统(HDFS)是指被设计成适合运行在通用硬件上的分布式文件系统(Distributed File System).本文将介绍eBay ADI H ...

  8. HDFS数据平衡:节点间平衡与节点内平衡

    HDFS数据平衡:节点间平衡与节点内平衡 HDFS容易发生数据不平衡的问题. 这其中包括各个DataNode之间存储的数据量差异,以及一个DataNode内部各磁盘之间存储的数据量差异. HDFS专门 ...

  9. (转载)深入分析HDFS原理及读写流程

    一.架构体系 1.1.什么是HDFS? HDFS即Hadoop Distributed File System的简称,采用Master/Slave主从结构模型来管理数据.在设计上采用了分而治之的思想, ...

最新文章

  1. memcached的应用和兼容程序
  2. 【PAT】A1053 Path of Equal Weight
  3. python人工智能_人工智能人才缺口千万!学Python抓住风口机会
  4. mikadonic-RHCE——NFS服务配置图解
  5. [转载]Qt之鼠标样式
  6. C语言描述的数据结构顺序表的置空 slt-size=0含义
  7. oracle服务器结构01
  8. linux zen 补丁,Mageia 7.1 发布,修复AMD Zen 2支持
  9. od反汇编linux,新手学习反汇编之OD寻找功能call
  10. 如何解决笔记本键盘某一个键一直在自动按下
  11. KUDU和IMPALA的结合使用
  12. 电脑快捷键大全详细-基础
  13. 顺应EMM趋势,烽火星空重磅出击
  14. Trojan.DL.Win32.Hmir.hl的清除方法 采用驱动提供服务的木马病毒
  15. 常用电平标准(TTL、CMOS、LVTTL、LVCMOS、ECL、PECL、LVPECL、RS232)
  16. java jdk安装失败 mac_Mac环境下JDK安装方法
  17. 个人金融借贷场景下,大数据风控的行业分析及应用分析
  18. Markdown KaTex 正负号±
  19. LAMP环境搭建wordpress
  20. 膦配体化合物催化剂-Pt(Me-Duphos)催化二取代膦氢与丙烯腈和丙烯酸酯不对称加成反应

热门文章

  1. excel使用小技巧
  2. 三部门联合推进“互联网+不动产登记”,国图一体化平台响应升级!
  3. cfd post session, 自动, 批量 , 后处理计算结果,
  4. 关于英语学习,你想怎么学习,你对英语学习的印象是什么,喜欢什么样的老师,一起来谈谈吧!
  5. 面试官:单核 CPU 支持 Java 多线程吗?什么?
  6. 暗影精灵2pro安装win10+ubuntu16.10双系统
  7. dec-c 怎么改语言,汇编中的dec指令是什么指令
  8. Freeswitch Event Socket IVR外呼方案
  9. RDM-Redis可视化工具图文安装教程
  10. windows重装系统后重用之前安装的oracle配置(转)