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

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

                    值得注意的是:在 HDFS 中,在同一文件的读请求和写操作之间不存在互斥关系,即 HDFS 允许客户端读取
                 正在写入的文件,此时,读流程在代码中会访问名为 INodeFileUnderConstruction 的类,其中的 target 字段记录了
                 当前未写完的文件块所在节点.为了增强系统的可用性,读操作可以读取任意一个副本,因此只要有一个副本正
                 常工作,就可以提供读服务.对于未写完的文件块,HDFS 的读操作仍然采用了读取任意一个副本的策略,并从上
                 述 target 字段中任意选择一个数据节点进行读取.于是,当不同客户端读取未写完的文件块的不同副本时,这些
                 客户端将读到不一致的结果.
                    若要改进 HDFS 来保证强一致性,则对于这种未写完的文件块可采用特殊的策略:要么对客户端屏蔽未写
                 完的文件块,要么记录每个文件块在不同节点上的完成情况,并将未写完的文件块的读请求统一转发至已经写
                 完的副本.
                 3.4   读流程建模

                 3.4.1    读流程模型概述
                    读流程模型如图 10 所示,主要包含两个子流程:客户端与名字节点交互的子流程 NamenodeRead 和客户端
                 与数据节点交互的子流程 DatanodeRead.读流程的输入是上层应用发送的读文件请求(ReadFileRequest 库所)、
                 第 1 关系(FileINode 库所)、第 2 关系(BlocksMap 库所)和数据节点存储的文件块(MergedBlock 库所),流程的输
                 出是读文件回复(ReadFileResponse 库所).中间结果包括读文件块请求(ReadBlockRequest库所)和读文件块回复
                 (ReadBlockResponse 库所).






















                                               Fig.10    Model of reading process
                                                     图 10   读文件模型

                    主要流程为:接收到读文件请求,名字节点根据文件名检查 FileINode,查询该文件拥有的文件块,再根据文
                 件块检查 BlocksMap,并将文件块和位置信息返回给客户端,客户端根据返回的结果生成读文件块的请求
                 (NamenodeRead 子流程);读文件块请求发送到数据节点,数据节点将数据返回给客户端(DatanodeRead 子流程);
                 客户端合并返回的读文件块请求,生成读文件回复,返回给上层应用(NamenodeRead 子流程).
                 3.4.2    NamonodeRead 流程
                    NamenodeRead 流程是客户端从名字节点获取文件块和位置信息,并以此构造读文件块请求的流程,该流
                 程如图 11 所示.输入为:读文件请求(ReadFileRequest 库所)、第 1 关系(FileINode 库所)和第 2 关系(BlocksMap
                 库所)、读文件块回复(ReadBlockResponse 库所).输出包括读文件块请求(ReadBlockRequest 库所)和读文件回复
                 (ReadFileResponse 库所).中间结果包括等待回复的读文件请求(WaitingRFR 库所)和需要删除的失败读请求
                 (FailedReadToMove 库所).
                    NamenodeRead 流程的步骤如下:从流程外部接收到读文件请求,如果文件不存在,直接返回文件不存在类
   27   28   29   30   31   32   33   34   35   36   37