在Hadoop中我们一定会使用hdfs的传输,那么,hdfs的读写流程究竟是什么,我利用了一点时间整理了一下
首先就是官网的图,介绍了HDFS

hdfs写流程
1,客户端client调用DistributedFileSystem这个对象的create方法去和NameNode这个节点进行rpc通信,然后NameNode来检查create这个方法所传输过来的hdfs_path这个路径是否已经存在以及是否有这个权限在这个路径里创建文件,都没有问题的话就在这个路径下创建一个新的空文件,由于是空文件因此没有和任何block关联,同时返回一个FSDataOutputStream对象给client(这整个过程对于用户来说是完全透明的,我们并不知道发生了什么,我们只是使用了hdfs dfs -put file hdfs_path这个命令,而hdfs_path这个路径就是create里的那个路径参数)。如果路径无效就返回一个错误提示或者无权限创建都会返回错误异常。(因此第一步最终要的是从NameNode那里拿到一个FSDataOutputStream的对象)

2,client调用FSDataOutputStream对象的write方法将第一个块写给要存储的第一个DataNode(这里简称DN1),当第一个副本写入完成后,DN1将数据复制到DN2,当DN2写入完成后,DN2又将数据复制到DN3,当DN3也写入完成后,DN3将返回一个ack确认包给DN2,DN2受到DN3的ack确认包后,也返回一个ack确认包给DN1,当DN1受到来自DN2的ack确认包时就意味着DN3和DN2都完成写入了,这个时候DN1也返回一个ack确认包给FSDataOutputStream对象,这就标志着第一个数据块已完成所有副本的写入过程了。

接下来的数据块也是按照这个逻辑顺序继续执行下去的,直到最后一个数据块完成写入。

3,当整个文件完成写入后client调用FSDataOutputStream的close方法来关闭输出流,然后flush掉缓存区的数据包。

4,最后client再次调用FileSystem对象的complete方法告诉NameNode,文件完成写入流程了,同时记录一个editlog编辑日志文件。

这里我们再总结一下,就是client要写入的话首先要通过NameNode来确定写入的路径没有文件同时有权限写入新文件到指定路径,这样才能从NameNode那里获取到FSDataOutputStream这个输出流的对象。而client要将文件的数据块写入到DataNode就是要通过FSDataOutputStream对象的write方法来写入,而完成写入后client也是通过调用FileSystem对象的complete方法来告诉NameNaode写入完成。

所以我们可以理解为:FileSystem这个对象是client和NameNode进行沟通的对象,而FSDataOutputStream则是client和DataNode进行沟通的对象。
hdfs读流程
读流程所涉及到的有client,NameNode和DataNode这个三个,我们来了解下这三个之间在读流程里都是干什么的。

1,当我们输入一条读入数据的命令的时候,如:hdfs dfs -ls / 或者 hdfs dfs -cat /user/hadoop/xxx时,client就通过DistributedFileSystem这个对象的open方法去和NameNode进行rpc通信,其中open方法会将一个path路径传递过去,这个path路径就是我们要查看的文件或者文件夹的路径。NameNode会对这个path进行交验,判断是否存在这个路径以及你要读取的路径你是否拥有权限去读取,如果都没问题的话就接着第二步,否则报错。

2,交验完成后返回一个FSDataInputStream对象,当要读取前client还要向NameNode发送一次请求,然后NN将会返回要读取的文件的全部或者一部分block列表,这些就是blockmap的内容嘛,还记不记得前几篇的有介绍到hdfs的写流程,其中说到DataNode会返回心跳包给NameNode以及每隔10个心跳包就会返回一个blockmap给NameNode,里面就记录了每个文件所对应的block以及其存储的节点位置。

3,client调用FSDataInputStream对象的read方法去读取每一个block最近地址的副本(虽然有多个副本但是并不是要读取全部副本的,所以会根据一个算法来读取离client最近节点上的副本),读取完成后回去交验这个block是否有损坏,假如没有任何问题会自动关闭与当前DataNode的通信。如果check失败了,会记录下这个受损的block在哪个DataNode节点上,下次不会再读取了。

4,然后就是下个block的读取,当我们把block列表里面的block读取完后,文件还没有结束将继续向NameNode申请下一批block列表。

5,最后client调用FSDataInputStream对象的close方法关闭输入流。

Hadoop理论——hdfs读、写流程相关推荐

  1. Hadoop之HDFS读写数据流程

    Hadoop之HDFS读写数据流程 目录 HDFS写数据流程 HDFS读数据流程 网络拓扑概念 机架感知 1. HDFS写数据流程 HDFS写数据流程,如下图 客户端通过Distributed Fil ...

  2. HDFS的读/写流程

    1.HDFS读流程 HDFS读流程 1.1 .Client通过FileSystem.open(filePath)方法,与NN节点进行[rpc]协议通信,校验是否有权限是否存在,假如都ok,返回该文件的 ...

  3. HDFS 读/写数据流程

    1. HDFS 写数据流程 客户端通过 Distributed FileSystem 模块向 NameNode 请求上传文件, NameNode 检查目标文件是否已存在,父目录是否存在: NameNo ...

  4. Hadoop中HDFS的读写流程详解

    一.HDFS写流程示意图: (1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在,检查客户端是否有权限 ...

  5. [Hadoop基础]--HDFS的读写流程和原理

    感谢原文作者:https://www.jianshu.com/p/29ebfbd766e6 根据Maneesh Varshney的漫画改编,以简洁易懂的漫画形式讲解HDFS的存储机制与运行原理. 1. ...

  6. Hadoop-HDFS读文件

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 1.客户端向NameNode发送读取请求. 2.Na ...

  7. hdfs写流程和MR缓冲区

    一.hdfs的写流程 1. 客户端发起RPC请求到NameNode 2. NameNode收到请求之后,进行校验: a. 校验用户是否有操作权限 b. 校验这个文件是否存在 3. 记录元数据,计算这个 ...

  8. Hadoop之HDFS常见面试题

    大数据面试题+ 一:HDFS面试题 1. HDFS的写流程 1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录 ...

  9. Hadoop之HDFS面试知识复习

    Hadoop之HDFS面试知识复习 目录 HDFS的存储机制 secondary namenode工作机制 NameNode与SecondaryNameNode 的区别与联系? hdfs整体架构介绍 ...

最新文章

  1. github 思维导图开元软件_画思维导图记笔记的工具软件
  2. NASA 开放巨量 VICAR 源码:近 350 款应用程序
  3. 5G LAN — Overview
  4. 业界率先支持 MCP-OVER-XDS 协议,Nacos 2.0.1 + 1.4.2 Release 正式发布
  5. pip时read time out
  6. Boost::context模块fiber的jump_void测试程序
  7. 最小二乘法普通定义法证明
  8. 次方求模 http://acm.nyist.net/JudgeOnline/problem.php?pid=102
  9. 2019DTCC大会分享:分布式数据库全局读一致性
  10. 连数据都读不懂,你凭什么说会数据分析?
  11. oracle 监听 多个实例,oracle 监听(多实例监听配置)
  12. Linux系统瓶颈分析(经典)
  13. 使用Slim框架创建一个JSON RESTfull API
  14. Java (计算机编程语言)
  15. Navicat for mysql破解版安装步骤
  16. PyQt在qrc文件中添加自定义字体并使用
  17. 内温的整体优先效应实验_认知
  18. 旧词新解:项目与产品,项目经理与产品经理
  19. js 判断图片和视频是否加载成功
  20. json数组排序,深拷贝,浅拷贝,删除,增加,筛选,

热门文章

  1. 条形码生成器:TBarCode SDK 11.X
  2. 常太晚睡觉等于自杀!!熬夜也要有技巧!!
  3. 蔡徐坤打篮球and源码
  4. ubuntu smba常用设置
  5. 假设R1、R2、R3采用RIP协议交换路由信息,且均已收敛。若R3检测到网络201.1.2.0/25不可达,并向R2通告一次新的距离向量,则R2更新后,其到达该网络的距离是
  6. 使用 dotnet *.dll启动项目,修改产品模式为开发模式
  7. CSDN电子书PC端上线:打造高效阅读、助力问题解决
  8. 你的颈椎还好吗?得了颈椎病,不妨试试这几个方法
  9. 闲鱼卖家近期发货后被退款15笔,请谨慎交易 怎么消除
  10. linux中内核4c,一台Linux服务器(4C8G配置)可以负载百万个连接?