HDFS读写过程

一、HDFS读文件过程

1、客户端调用DistributedFileSystem的对象实例FileSystem的open方法来打开希望读取的文件,调用open后会返回一个FSDataInputStream对象。

2、分布式文件系统DistributedFileSystem通过RCP(远程过程调用)来调用namenode,以确定文件的起始块的位置(这些信息都存储在namenode的内存中)。对于每个块,namenode都返回该块的所有副本对应的datanode地址,在真正读取的过程中,这些datanode根据他们与客户端的距离来排序,使用距离最近的那个datanode上的副本

3、得到FSDataInputStream对象后,封装一个DFSInputStream对象,DFSInputStream随即连接距离最近的datanode。该对象的功能是管理者datanode和namenode的IO通信,并且也存储着文件的起始块。

4、FSDataInputStream反复调用read方法,将数据从datanode传输到客户端。

5、当到达块的末端时,DFSInputStream关闭与该datanode的连接,然后寻找下一个块的最佳的datanode。

6、读取完毕,DFSInputStream调用close方法关闭RCP通信

注:如果DFSInputStream与datanode通信时遇到错误,会尝试从距离次佳的datanode读取数据,并记录那个发生故障的datanode以保证以后不会反复读取该节点上的后续的块。

二、HDFS读文件过程

1、客户端通过调用DistributedFileSystem的实例对象FileSystem的create方法来新建文件。

2、DistributedFileSystem对namenode创建一个RPC调用,在文件系统的命名空间中新建一个文件信息的记录,这个时候,该文件中还没有分配相应的数据块。

3、新建如果成功,就会返回FSDataOutputStream对象,该对象继而封装一个DFSOutputStream对象。

4、DFSOutputStream维护着一个内部的数据队列和一个确认队列。在写入数据时,DFSOutputStream将数据分成一个个数据包写入数据队列,

5、DataStreamer处理数据队列,它的责任是根据datanode列表来要求namenode分配适合的新块来存储数据副本,这个datanode列表是一个数据块的存储位置,是为了备份数据。假如列表中有三个节点,DataStreamer就会把数据包传输到第一个datanode,该datanode存储数据包并将它发送到第二个datanode,第二个datanode存储数据包并转发到第三个datanode。

6、当一个数据包存储完毕,datanode就会发送确认回执到DFSOutputStream的确认队列中,当收到所有的确认后,该数据包就会被删除。

7、写入完成后,FSDataOutputStream调用close方法。

时间: 2024-10-11 11:55:31

HDFS读写过程的相关文章

Hadoop源码分析(1):HDFS读写过程解析

一.文件的打开 1.1.客户端 HDFS打开一个文件,需要在客户端调用DistributedFileSystem.open(Path f, int bufferSize),其实现为: public FSDataInputStream open(Path f, int bufferSize) throws IOException { return new DFSClient.DFSDataInputStream( dfs.open(getPathName(f), bufferSize, verif

Hadoop学习总结之二:HDFS读写过程解析

一.文件的打开 1.1.客户端 HDFS打开一个文件,需要在客户端调用DistributedFileSystem.open(Path f, int bufferSize),其实现为: public FSDataInputStream open(Path f, int bufferSize) throws IOException { return new DFSClient.DFSDataInputStream( dfs.open(getPathName(f), bufferSize, verif

HDFS读写过程简析

2.1.读文件的过程 客户端(client)用FileSystem的open()函数打开文件 DistributedFileSystem用RPC调用元数据节点,得到文件的数据块信息. 对于每一个数据块,元数据节点返回保存数据块的数据节点的地址. DistributedFileSystem返回FSDataInputStream给客户端,用来读取数据. 客户端调用stream的read()函数开始读取数据. DFSInputStream连接保存此文件第一个数据块的最近的数据节点. Data从数据节点

HDFS追本溯源:租约,读写过程的容错处理及NN的主要数据结构

1.      Lease 的机制: hdfs支持write-once-read-many,也就是说不支持并行写,那么对读写的互斥同步就是靠Lease实现的.Lease说白了就是一个有时间约束的锁.客户端写文件时需要先申请一个Lease,对应到namenode中的LeaseManager,客户端的client name就作为一个lease的holder,即租约持有者.LeaseManager维护了文件的path与lease的对应关系,还有clientname->lease的对应关系.LeaseM

Hadoop之HDFS文件读写过程

一.HDFS读过程 1.1 HDFS API 读文件 1 Configuration conf = new Configuration(); 2 FileSystem fs = FileSystem.get(conf); 3 Path file = new Path("demo.txt"); 4 FSDataInputStream inStream = fs.open(file); 5 String data = inStream.readUTF(); 6 System.out.pri

Hadoop -- HDFS 读写数据

一.HDFS读写文件过程 1.读取文件过程 1)       初始化FileSystem,然后客户端(client)用FileSystem的open()函数打开文件 2)       FileSystem用RPC调用元数据节点,得到文件的数据块信息,对于每一个数据块,元数据节点返回保存数据块的数据节点的地址. 3)       FileSystem返回FSDataInputStream给客户端,用来读取数据,客户端调用stream的read()函数开始读取数据. 4)       DFSInpu

HBase 文件读写过程描述

HBase 数据读写过程描述 我们熟悉的在 Hadoop 使用的文件格式有许多种,例如: Avro:用于 HDFS 数据序序列化与 Parquet:常见于 Hive 数据文件保存在 HDFS中 HFile HFile 是 HBase 使用的一种柱状存储文件,非常适合随机和实时读写. HFile 文件的头部记载 FileInfo 和 Meta 这是元数据.在启动 RegionServer 后每一个RegionServer 节点会将本地 DataNode 保存的 HFile 文件中的 FileInf

mmc驱动的读写过程解析

mmc io的读写从mmc_queue_thread()的获取queue里面的request开始. 先列出调用栈,看下大概的调用顺序, 下面的内容主要阐述这些函数如何工作. host->ops->request() // sdhci_request() mmc_start_request() mmc_start_req() mmc_blk_issue_rw_rq() mmc_blk_issue_rq() Mmc_queue_thread() mmc_queue_thread()  struct

HDFS读写数据块--${dfs.data.dir}选择策略

最近工作需要,看了HDFS读写数据块这部分.不过可能跟网上大部分帖子不一样,本文主要写了${dfs.data.dir}的选择策略,也就是block在DataNode上的放置策略.我主要是从我们工作需要的角度来读这部分代码的. 1 hdfs-site.xml 2 <property> 3 <name>dfs.data.dir</name> 4 <value>/mnt/datadir1/data,/mnt/datadir2/data,/mnt/datadir3/