HDFS读取数据过程详解
整个过程可以概括为以下几个核心步骤:
-
打开文件:客户端发起请求。
-
获取数据块位置:客户端从NameNode获取文件的数据块列表及其存储位置。
-
读取数据:客户端直接连接到最近的DataNode,并行读取数据块。
-
关闭文件:完成读取后,客户端关闭文件。
详细步骤:
第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地址是根据它们与客户端的拓扑距离排序的(就近原则)。
-
浙公网安备 33010602011771号