HDFS的数据读取过程

HDFS数据的读取流程:

1.首先调用FileSystem对象的open方法,其实是一个DistributedFileSystem的实例

2.DistributedFileSystem通过rpc获得文件的第一个block的locations,同一block按照副本数会返回多个locations,这些locations按照hadoop拓扑结构排序,距离客户端近的排在前面.

3.这样会返回一个FSDataInputStream对象,该对象会被封装成DFSInputStream对象,DFSInputStream可以方便的管理datanode和namenode数据流。客户端调用read方法,DFSInputStream会找出离客户端最近的datanode并连接。

4.数据从datanode发送到客户端。

5.如果第一块的数据读完了,就会关闭指向第一块的datanode连接,接着读取下一块。这些操作对客户端来说是透明的,客户端的角度看来只是读一个持续不断的流。

6.如果第一批block都读完了,DFSInputStream就会去namenode拿下一批blocks的location,然后继续读,如果所有的块都读完,这时就会关闭掉所有的流。

如果在读数据的时候,DFSInputStream和datanode的通讯发生异常,就会尝试正在读的block的排第二近的datanode,并且会记录哪个datanode发生错误,剩余的blocks读的时候就会直接跳过该datanode。DFSInputStream也会检查block数据校验和,如果发现一个坏的block,就会先报告到namenode节点,然后DFSInputStream在其他的datanode上读该block的镜像该设计的方向就是客户端直接连接datanode来检索数据并且namenode来负责为每一个block提供最优的datanode,namenode仅仅处理block location的请求,这些信息都加载在namenode的内存中,hdfs通过datanode集群可以承受大量客户端的并发访问。

代码:
  1.public FSDataInputStream open(Path f) throws IOException {
    return open(f, getConf().getInt("io.file.buffer.size", 4096));
  }
  2.(由DistributedFileSystem实现返回一个DFSDataInputStream)public abstract FSDataInputStream open(Path f, int bufferSize)
    throws IOException;
  3.DFSDataInputStream extends HdfsDataInputStream extends FSDataInputStream.
### HDFS 数据读取流程与原理 HDFS(Hadoop Distributed File System)的数据读取流程涉及多个组件之间的交互,主要包括客户端、NameNode 和 DataNode。以下是详细的描述: #### 1. 初始化文件读取请求 当客户端需要读取某个文件时,会通过 `FileSystem` 对象的 `open()` 方法发起请求[^3]。此方法内部实际上是对 NameNode 发起的一个远程过程调用 (RPC),目的是获取目标文件的相关元数据。 #### 2. 查询 Block 位置信息 客户端向 NameNode 提交 RPC 请求,询问所要读取文件的所有 Block 的具体存储位置。NameNode 根据其维护的全局元数据信息,返回文件的部分或全部 Block 列表及其对应的 DataNode 地址[^3]。 在此过程中,NameNode 不仅提供 Block 存储节点的信息,还会基于网络拓扑结构优化排序规则:优先选择离客户端较近的 DataNode,并将状态不佳(如超时未响应)的 DataNode 排在后面[^3]。 #### 3. 并行连接至 DataNode 客户端依据接收到的 DataNode 地址列表,尝试与最近的 DataNode 建立连接以读取第一个 Block 的数据。如果客户端本身也是一个 DataNode,则可能触发 **短路读取** 特性,从而直接从本地磁盘读取数据而无需经过网络传输[^3]。 #### 4. 实际数据读取逻辑 底层实现上,客户端通过创建一个 `Socket Stream`(即 `FSDataInputStream`),不断调用父类 `DataInputStream` 的 `read()` 方法完成单个 Block 的逐字节读取操作[^3]。一旦当前 Block 数据被完全消费掉,便会自动切换到下一个 Block 继续执行相同的操作。 #### 5. 动态扩展 Block 列表 假如初始阶段只获得了部分 Blocks 的详情,在现有 Blocks 已经处理完毕但仍需更多内容的情况下,客户端会再次联系 NameNode 请求额外的一批 Blocks 及它们所在的 DataNodes[^4]。这一循环持续进行,直到整个文件的内容都被成功加载为止。 #### 6. 数据校验与错误恢复 在整个读取过程中,系统会对每一段数据计算校验和并与预先保存于 HDFS 中的元数据副本对比验证准确性[^4]。如果有任何异常发生——比如某台 DataNode 出现故障无法正常交付所需片段,则框架能够迅速调整策略转向其他可用镜像源重试访问^。 #### 7. 关闭资源并重组完整文件 最后一步就是妥善释放所有已使用的输入流等系统级资源,并把先前分别收集来的各独立 Blocks 按顺序拼接组合成最终呈现给用户的整体文件形式[^3]。 ```python with open("/path/to/hdfs/file", 'rb') as f: data = f.read() print(data.decode('utf-8')) ``` 以上代码展示了如何利用 Python 简便地模拟出针对分布式环境下的大容量文档检索行为模式之一隅。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值