HDFS读取数据过程详解

整个过程可以概括为以下几个核心步骤:

  1. 打开文件:客户端发起请求。

  2. 获取数据块位置:客户端从NameNode获取文件的数据块列表及其存储位置。

  3. 读取数据:客户端直接连接到最近的DataNode,并行读取数据块。

  4. 关闭文件:完成读取后,客户端关闭文件。

 

详细步骤:

第1步:客户端发起读请求

  • 动作:用户在客户端应用程序中调用HDFS的API,例如使用 FileSystem.open(Path path) 方法。

  • 细节:客户端程序(可以是命令行工具、Java程序、Spark作业等)向HDFS发出读取某个指定路径(如 /user/hadoop/data.txt)的请求。

第2步:联系NameNode获取元数据

  • 动作:客户端联系NameNode,询问它要读取的文件的数据块信息。

  • 通信协议:客户端通过RPC(Remote Procedure Call) 与NameNode通信。

  • 请求内容:客户端向NameNode发送请求,包含文件名和读取范围(如果设置了偏移量)。

  • NameNode的处理:

    • NameNode在其内存中的元数据镜像(FsImage + EditsLog)中查找该路径对应的文件。

    • 它验证请求:文件是否存在?客户端是否有权限读取?如果任何一项失败,则抛出异常(如 FileNotFoundException 或 AccessControlException)。

    • 如果验证通过,NameNode会返回该文件前几个块(通常是一次请求返回几个块的信息,而不是全部,以避免过量内存占用)的每个数据块(Block)的副本位置列表。每个数据块(默认128MB)的列表包含存储该块的所有DataNode的地址,这些DataNode地址是根据它们与客户端的拓扑距离排序的(就近原则)。

posted @ 2025-08-25 17:10  景、  阅读(52)  评论(0)    收藏  举报