Page 26 - 《软件学报》2021年第10期
P. 26

2998                                 Journal of Software  软件学报 Vol.32, No.10, October 2021

                 2.3   HDFS数据结构建模
                    HDFS 文件系统是按照树形结构组织而成的.所有文件在文件系统树中就可以用一个节点来唯一对应,该
                 节点称为该文件的 inode.一个文件包含两部分:文件的源信息和文件实际存储的数据.在 HDFS 中,文件的源信
                 息存储在名字节点的 inode 中,文件的数据以文件块的形式存储在数据节点上.文件块默认的容量是 64MB,每个
                 文件会根据数据量的大小存储在一个或多个块中,由此产生了从文件到文件块的一对多映射,本文称这种映射
                 关系为第 1 关系.HDFS 作为分布式系统考虑了节点失效问题,其解决方案就是使用数据副本:当存储某文件块
                 的一些数据节点失效时,由未失效的数据节点上的文件块的副本对外提供服务,保持服务的可用性.由此产生了
                 从文件块到数据节点的一对多映射,本文称这种映射关系为第 2 关系.
                    重要的数据结构及其包含的属性如下所示.
                       文件(FILE):文件名;
                       文件块(BLOCK):块 ID、文件块大小、时间戳;
                       第 1 关系(FILE_INODE):文件名、文件块的列表、是否正在构建、正在写的客户端 ID、正在写的最
                        后一个文件块的数据节点的列表(仅当该文件处于构建状态,客户端 ID 和正在写的数据节点列表才有
                        意义);
                       第 2 关系(LOCATED_BLOCK):文件块、数据节点列表(在写入数据时,按照该列表中的顺序依次发送
                        写请求执行写入);
                       副本位置(STORED_BLOCK):所在数据节点、文件块;
                       租约(LEASE):客户端 ID、文件列表(租约是文件的写锁,写锁不排斥读操作.每个文件只有一个租约,
                        客户端需要定期更新租约,否则租约管理器会回收租约.一个客户端同时可拥有多个文件的租约).

                 3    读写流程建模

                 3.1   写流程概述
                    HDFS 的写文件流程由客户端(client)、名字节点(namenode)和数据节点(datanode)共同完成.一次完整的写
                 文件流程一共分为 6 步,如图 3 所示.
                       第 1 步,客户端向名字节点发送创建文件请求,该请求中只包含文件的元数据,名字节点记录文件的元
                        数据;
                       第 2 步,每次客户端需要写新的文件块时,就向名字节点发送追加该文件块请求,名字节点为此文件块
                        分配多个数据节点,并将当前最后一个文件块(即正在写入的文件块)所在的数据节点记录在名字节点
                        的文件 inode 中,最后将该文件块的标识符和数据节点返回给客户端;
                       第 3 步,客户端发送文件内容给目标数据节点:文件内容以数据流的形式发送给第 1 个数据节点,数据
                        节点接收到数据流后,首先在本地存储文件块,并将该数据流转发给下一个数据节点.值得注意的是:对
                        于一个文件块 A,假设其要被写入到数据节点 a、b、c 中,名字节点首先记录 A 应该存储在节点 a、b、
                        c 中,由于 Hadoop 采用了副本链式传播机制,客户端先将文件块 A 发送给 a 节点,再由 a 传递给 b,b 传
                        递给 c.此时可能出现如下状态:a 已写完文件块,b、c 还未写完文件块.我们称此状态的文件块为未写
                        完的文件块,并将所有副本都写完的文件块称为已写完的文件块;
                       第 4 步,完成写入的数据节点在接收到下游节点的结果后,整合结果并返回给上一个数据节点,直到返
                        回给客户端;
                       第 5 步,在任意一个数据节点写文件块成功后,都会向名字节点发送成功接收文件块通知.名字节点此
                        时会保存该文件块存储的位置,并更新第 2 关系的映射;
                       第 6 步,客户端向名字节点发送关闭文件请求.名字节点会释放相关的资源,写流程结束.
                    当写入的文件包含多个文件块时,则会循环执行第 1 步到第 5 步,直到所有文件块都写完.在此循环过程中,
                 第 1 步客户端发送的信息为申请新文件块,而非创建新文件.
   21   22   23   24   25   26   27   28   29   30   31