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 流程的步骤如下:从流程外部接收到读文件请求,如果文件不存在,直接返回文件不存在类