HDFS的文件读取与写入流程

简介:

文件读取流程

    1)  客户端首先要调用FileSystem对象的静态方法open()方法来打开一个希望读取文件的路径,在HDFS中文件的对象为Path对象(与Java中的File相对应)。

    2) FileSystem对象就是一个DistributedFileSystem对象,通过利用RPC来调用NameNode节点,(NameNode节点存储着整个文件系统目录、文件以及文件所在块的位置信息),来确定我们需要打开的文件所有数据块的存储位置。文件在被存入HDFS中,会被划分为多个数据块存储的,对于每一个数据块,namenode都会返回存有该数据块副本的datanode地址。数据块副本的datanode地址会根据与客户端的距离来排序。DistributedFileSystem返回一个FSDataInputStream对象给client用来读取数据。FSDataInputStream封装了DFSInputStream对象,该对象用于管理NameNodeDataNodeI/O

   3) 客户端利用该FSDataInputStream对象的输入流调用read()方法。输入流会首先读取距离客户端最近的datanode,反复读取,直到将该datanode数据读取完后,然后就会FSDataInputStream关闭与该datanode的连接,然后继续寻找下一个datanode节点。

  4) 客户端读取文件,数据块都是按照DFSInputStream与datanode连接的距离顺序读取,也会询问namenode下一批数据块的datanode位置,整个文件读取完后,就会马上调用FSDataInputStream的close()方法。

       读取中的失败错误处理:当读取数据时,DFSInputStream与datanode通信失败,则会读取这个块的最接近该datanode的节点来读取数据,并且以后不会反复读取该失败节点。

      namenode仅仅提供给客户端检索文件的作用,告知客户端每个块最佳datanode(利用排序),它仅仅响应数据块位置的请求,而无需响应数据请求。具体的数据流都是由客户端与datanode直接通信的。


文件写入流程

   

1). client通过调用DistributedFileSystemcreate()方法来创建文件。

2). DistributedFileSystem通过RPC调用NameNode在文件系统的名字空间里创建一个新文件,名称节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建新文件,这个时候还没有任何块的信息。DistributedFileSystem返回FSDataOutputStreamclientFSDataOutputStream封装了一个DFSOutputStream对象,该对象负责处理datanodenamenode之间的通讯。

3). 当Client开始写数据的时候,DFSOutputStream把文件的数据分成一个个数据包,并写入内部对列DataQueueDataQueue是由DataStreamer负责读取,DataStreamer通知NameNode分配DataNode,用来存储数据块(每块默认复制3),分配的DataNode列表形成一个管道(pipeline)。在上图中管道由三个datanode组成,这三个datanode的选择有一定的副本放置策略。

4).  DataStreamer将数据块流式传输到pipeline中的第一个DataNode,第一个DataNode存储数据块并将数据块发送给pipeline中的第二个DataNode,同样的,第二个DataNode存储数据块并将数据块发送给pipeline中的第三个DataNode

5). 同时,DFSOutputStream也管理ackqueue(确认队列),ackqueue里存储着等待datanode识别的数据块,只有当管道里所有datanode都返回写入成功,这个数据块才算写成功,才会从ackqueue中删除,开始写下一个数据块。

      如果某个datanode发生故障,写失败了,则会执行如下步骤,但是这些对client是透明的。

     1) 管道关闭。

     2)正常的datanode上的当前block会有一个新ID,并将该ID传送给namenode,以便失败的datanode在恢复后可以删除那个不完整的block

    3) 失败的datanode会被移出管道,余下的数据块继续写入管道的其他两个正常的datanode

    4) namenode会标记这个block的副本个数少于指定值。block的副本会稍后在另一个datanode创建。

     5)有些时候多个datanode会失败,但非常少见。只要dfs.replication.min(缺省是1)datanode成功了,整个写入过程就算成功。缺少的副本会在集群中异步的复制,直到达到正常的副本数。

6. client完成了所有block的写入后,调用FSDataOutputStreamclose()方法关闭文件。

7. FSDataOutputStream通知namenode写文件结束。
    文件写入中的副本策略:

1) Hadoop默认副本策略是将第一个复本放在运行客户端的节点上,即上传文件或者写入文件所在的datanode节点上。如果客户端不在集群中,则就随机选择一个节点。

2) 第二个复本放在与第一个复本不同且随机的另外的机架上。

3) 第三个复本与第二个复本放在相同的机架上。


本文转自 zhao_xiao_long 51CTO博客,原文链接:http://blog.51cto.com/computerdragon/1287660


相关文章
|
存储 安全
HDFS读写流程详解
HDFS读写流程详解
1248 2
HDFS读写流程详解
|
分布式计算 Hadoop 网络安全
Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
197 1
|
存储 机器学习/深度学习 缓存
Hadoop-07-HDFS集群 基础知识 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
Hadoop-07-HDFS集群 基础知识 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
302 1
|
存储 分布式计算 Hadoop
【揭秘Hadoop背后的秘密!】HDFS读写流程大曝光:从理论到实践,带你深入了解Hadoop分布式文件系统!
【8月更文挑战第24天】Hadoop分布式文件系统(HDFS)是Hadoop生态系统的关键组件,专为大规模数据集提供高效率存储及访问。本文深入解析HDFS数据读写流程并附带示例代码。HDFS采用NameNode和DataNode架构,前者负责元数据管理,后者承担数据块存储任务。文章通过Java示例演示了如何利用Hadoop API实现数据的写入与读取,有助于理解HDFS的工作原理及其在大数据处理中的应用价值。
382 1
|
存储 分布式计算 Hadoop
【Hadoop】HDFS 读写流程
【4月更文挑战第9天】【Hadoop】HDFS 读写流程
|
存储 分布式计算 Java
HDFS的数据读取流程是怎样的?请描述数据读取的过程。
HDFS的数据读取流程是怎样的?请描述数据读取的过程。
382 0
|
Java API
HDFS的数据写入流程是怎样的?请描述数据写入的过程。
HDFS的数据写入流程是怎样的?请描述数据写入的过程。
466 0
|
缓存 分布式计算 负载均衡
HDFS 的写数据流程分析
HDFS的写数据流程是一道比较常见的面试题,同时梳理了写流程也可以帮助我们更加深入一点的了解 HDFS 的主要原理和各个组件的交互过程
|
算法 数据中心
HDFS数据的读写流程
HDFS数据的读写流程
352 0
|
机器学习/深度学习 缓存 分布式计算
Hadoop基础学习---4、HDFS写、读数据流程、NameNode和SecondaryNameNode、DataNode
Hadoop基础学习---4、HDFS写、读数据流程、NameNode和SecondaryNameNode、DataNode