适用于分布式文件系统的文件随机写方法及系统技术方案

技术编号:23343276 阅读:22 留言:0更新日期:2020-02-15 03:51
本发明专利技术提供了一种适用于分布式文件系统的文件随机写方法及系统,包括:步骤1:将HDFS的写接口更新成支持随机写模式,使随机写操作仅影响直接修改的块或者有限的相邻块;步骤2:扩展HDFS数据传输协议,使客户端可访问任意的数据分块;步骤3:更新服务端数据包处理、更新校验值计算,获取数据副本更新、校验值更新。本发明专利技术中,存储于分布式文件系统的文件在更新数据内容时,只会影响当前数据分块及相邻的数据分块,而不会像原生HDFS需将整个文件写回,造成大量不必要的数据传输,本发明专利技术有效的减少了数据传输和移动,缓解网络带宽压力,降低客户端和服务端的处理资源消耗。

Random write method and system for distributed file system

【技术实现步骤摘要】
适用于分布式文件系统的文件随机写方法及系统
本专利技术涉及分布式存储领域,具体地,涉及一种适用于分布式文件系统的文件随机写方法及系统。
技术介绍
分布式文件存储系统受传统的磁盘文件系统所影响,多数采用固定大小的数据分块来组织和管理文件。当前流行的分布式文件系统HDFS(HadoopDistributedFileSystem)和GFS(GoogleFileSystem)都是将大文件分割成固定大小的块进行存储,通常是64MB。这些文件在创建后,大部分都是追加写到文件尾部,几乎不涉及随机写操作。这种固定长度的分块设计不适合随机写,写入开销大且性能差。但通常用户约有25%的文件操作是进行随机写。针对上述现状,提出一种基于HDFS的文件随机写方法,能对存储于分布式文件系统中的文件进行任意位置的数据写入。专利文献CN106027647B公开了一种LXPFS集群分布式文件存储系统,采用LXPFS集群给应用提供访问方法,通过封装好的JSAPI访问LXPFS中的文件;访问LXPFS文件的方式分为三种:读、写和删除;在前端实现访问LXPFS文件的组件,在Web应用开发中只需生成一个组件,调用相应的接口就能实现访问;系统采用主从模式架构,由一个Dispatchnode和一个及以上的Tasknode组成;Dispatchnode是一个controller服务器,负责调配所有文件的存储以及处理并转发客户端的请求,负责管理它所在节点上的存储和响应客户端的请求;上传文件是将数据写入Tasknode中,下载文件则是读取Tasknode文件数据。该专利并不具有适用于分布式文件系统的文件随机写方法。
技术实现思路
针对现有技术中的缺陷,本专利技术的目的是提供一种适用于分布式文件系统的文件随机写方法及系统。根据本专利技术提供的一种适用于分布式文件系统的文件随机写方法,包括:步骤1:将HDFS的写接口更新成支持随机写模式,使随机写操作仅影响直接修改的块或者有限的相邻块;步骤2:扩展HDFS数据传输协议,使客户端可访问任意的数据分块;步骤3:更新服务端数据包处理、更新校验值计算,获取数据副本更新、校验值更新。优选地,所述步骤1包括:步骤1.1:在DFSOutputStream类中,增加文件偏移方法seek,传入文件偏移量offset,并在方法中调用刷新或关闭当前数据管道中数据节点的连接;步骤1.2:新增成员变量positonCurBlock用于记录当前数据块中的偏移量;步骤1.3:新增成员变量curFileOffset用于记录当前文件中的偏移量;步骤1.4:在seek方法中,根据传入的文件偏移量offset和当前文件偏移量curFileOffset判断是否属于同一个数据块,即curFileOffset/blockSize是否等于offset/blockSize,获取同数据块判断结果信息或者不同数据块结果判断信息;步骤1.5:根据同数据块判断结果信息,调用flushBuffer刷新数据,然后更新bytesCurBlock变量,记录下个数据包在数据块的偏移值;步骤1.6:调用endBlock关闭客户端与当前数据节点的通信连接。优选地,所述步骤2包括:步骤2.1:根据seek方法中发送过来的标志,DataStreamer线程中将关闭当前数据节点的连接并进行数据管道更新;步骤2.2:根据curFileOffset向NameNode请求数据节点,与新数据节点建立数据连接;步骤2.3:修改成员变量bytesCurBlock初始值,在原生HDFS中bytesCurBlock为当前未写满的数据块大小,在随机写方法中bytesCurBlock为传入的随机写位置在该数据块中的位置;步骤2.4:比较bytesCurBlock与数据块大小的值,判断数据块是否写满,获取数据块写满结果信息或者数据块未写满结果信息。优选地,所述步骤2.2包括:步骤2.2.1:根据请求数据节点信息,获取写数据块类型信息;步骤2.2.2:根据写数据块类型信息,获取写新数据块控制信息、写中间数据块控制信息以及写最后一个数据块控制信息;步骤2.2.3:根据写新数据块控制信息,调用原生addBlock实现;步骤2.2.4:根据写中间数据块控制信息,新增方法getBlock,计算curFileOffset所在的数据块;即blockIndex等于curFileOffset/blockSize,positonBurBlock等于curFileOffset%block,并返回LocatedBlock;步骤2.2.5:根据写最后一个数据块控制信息,写最后一个数据块,调用原生append实现。优选地,所述步骤3包括:步骤3.1:服务端收到Packet包后解析包头,获取该包中数据dataBuf、校验值checksumBuf、校验类型、校验长度bytesPerChecksum以及该包中数据在当前数据块的起始位置firstByteInBlock;步骤3.2:计算数据块末尾位置offsetInBlock等于firstByteInBlock加上dataLen;步骤3.3:调用adjustBlkAndCrcFilePosition传入firstByteInBlock值调整指向副本文件和校验文件的写文件句柄偏移位置;步骤3.4:如果该数据包不覆盖磁盘上原始数据内容,则判断当前磁盘上最后一个校验是否为完整的chunk,获取当前校验完整信息或者当前校验不完整信息;步骤3.5:根据当前校验完整信息,将数据包中的校验数据直接写入校验文件;步骤3.6:根据当前校验不完整信息,则进行重新校验,从副本文件中读取不完整校验的数据,起始位置为(onDiskLen/bytesPerChecksum)*bytesPerChecksum,数据长度partialChunkSizeOnDisk为onDiskLen%bytesPerChecksum;步骤3.7:从数据包中取出部分数据与磁盘中读取的数据拼成一个chunk,并计算出校验值,移动校验文件写句柄,将新的校验值覆盖旧校验值;步骤3.8:如果数据包在填满一个chunk后,仍有剩余数据时,将剩余数据重新计算校验,并将校验值写入校验文件末尾;步骤3.9:如果该数据包覆盖当前副本内容,则判断数据包起始位置和末尾位置所在的chunk是否需要重新校验;步骤3.10:数据包起始位置所在chunk校验:从上一个chunk边界开始从副本文件中读取partialChunkSizeOnDisk长度数据和数据包中数据拼成一个chunk,并计算新的校验值;步骤3.11:如果没有拼满一个chunk,则从offsetInBlock开始,从磁盘中读取副本数据,拼成一个chunk,若依然无法拼满一个chunk,则以零填充;步骤3.12:校验数据包末尾位置所在chunk:从数据包中读取endPartialChunkSizeOnDisk长度数据和磁盘数据拼成一个chunk,数据包的起始位置datalen-endPartialChunkSizeOnDisk,磁盘数据的起始位置为offsetInBlock+bytesPerChe本文档来自技高网
...

【技术保护点】
1.一种适用于分布式文件系统的文件随机写方法,其特征在于,包括:/n步骤1:将HDFS的写接口更新成支持随机写模式,使随机写操作仅影响直接修改的块或者有限的相邻块;/n步骤2:扩展HDFS数据传输协议,使客户端可访问任意的数据分块;/n步骤3:更新服务端数据包处理、更新校验值计算,获取数据副本更新、校验值更新。/n

【技术特征摘要】
1.一种适用于分布式文件系统的文件随机写方法,其特征在于,包括:
步骤1:将HDFS的写接口更新成支持随机写模式,使随机写操作仅影响直接修改的块或者有限的相邻块;
步骤2:扩展HDFS数据传输协议,使客户端可访问任意的数据分块;
步骤3:更新服务端数据包处理、更新校验值计算,获取数据副本更新、校验值更新。


2.根据权利要求1所述的适用于分布式文件系统的文件随机写方法,其特征在于,所述步骤1包括:
步骤1.1:在DFSOutputStream类中,增加文件偏移方法seek,传入文件偏移量offset,并在方法中调用刷新或关闭当前数据管道中数据节点的连接;
步骤1.2:新增成员变量positonCurBlock用于记录当前数据块中的偏移量;
步骤1.3:新增成员变量curFileOffset用于记录当前文件中的偏移量;
步骤1.4:在seek方法中,根据传入的文件偏移量offset和当前文件偏移量;curFileOffset判断是否属于同一个数据块,获取同数据块判断结果信息或者不同数据块结果判断信息;
步骤1.5:根据同数据块判断结果信息,调用flushBuffer刷新数据,然后更新bytesCurBlock变量,记录下个数据包在数据块的偏移值;
步骤1.6:调用endBlock关闭客户端与当前数据节点的通信连接。


3.根据权利要求1所述的适用于分布式文件系统的文件随机写方法,其特征在于,所述步骤2包括:
步骤2.1:根据seek方法中发送过来的标志,DataStreamer线程中将关闭当前数据节点的连接并进行数据管道更新;
步骤2.2:根据curFileOffset向NameNode请求数据节点,与新数据节点建立数据连接;
步骤2.3:修改成员变量bytesCurBlock初始值,bytesCurBlock为传入的随机写位置在设定数据块中的位置;
步骤2.4:比较bytesCurBlock与数据块大小的值,判断数据块是否写满,获取数据块写满结果信息或者数据块未写满结果信息。


4.根据权利要求1所述的适用于分布式文件系统的文件随机写方法,其特征在于,所述步骤2.2包括:
步骤2.2.1:根据请求数据节点信息,获取写数据块类型信息;
步骤2.2.2:根据写数据块类型信息,获取写新数据块控制信息、写中间数据块控制信息以及写最后一个数据块控制信息;
步骤2.2.3:根据写新数据块控制信息,调用原生addBlock实现;
步骤2.2.4:根据写中间数据块控制信息,新增方法getBlock,计算curFileOffset所在的数据块;
步骤2.2.5:根据写最后一个数据块控制信息,写最后一个数据块,调用原生append实现。


5.根据权利要求1所述的适用于分布式文件系统的文件随机写方法,其特征在于,所述步骤3包括:
步骤3.1:服务端收到Packet包后解析包头,获取该包中数据dataBuf、校验值checksumBuf、校验类型、校验长度bytesPerChecksum以及该包中数据在当前数据块的起始位置firstByteInBlock;
步骤3.2:计算数据块末尾位置offsetInBlock;
步骤3.3:调用adjustBlkAndCrcFilePosition传入firstByteInBlock值调整指向副本文件和校验文件的写文件句柄偏移位置;
步骤3.4:如果该数据包不覆盖磁盘上原始数据内容,则判断当前磁盘上最后一个校验是否为完整的chunk,获取当前校验完整信息或者当前校验不完整信息;
步骤3.5:根据当前校验完整信息,将数据包中的校验数据直接写入校验文件;
步骤3.6:根据当前校验不完整信息,则进行重新校验,从副本文件中读取不完整校验的数据,起始位置为(onDiskLen/bytesPerChecksum)*bytesPerChecksum,数据长度partialChunkSizeOnDisk为onDiskLen%bytesPerChecksum;
步骤3.7:从数据包中取出部分数据与磁盘中读取的数据拼成一个chunk,并计算出校验值,移动校验文件写句柄,将新的校验值覆盖旧校验值;
步骤3.8:如果数据包在填满一个chunk后,仍有剩余数据时,将剩余数据重新计算校验,并将校验值写入校验文件末尾;
步骤3.9:如果该数据包覆盖当前副本内容,则判断数据包起始位置和末尾位置所在的chunk是否需要重新校验;
步骤3.10:数据包起始位置所在chunk校验:从上一个chunk边界开始从副本文件中读取partialChunkSizeOnDisk长度数据和数据包中数据拼成一个chunk,并计算新的校验值;
步骤3.11:如果没有拼满一个chunk,则从offsetInBlock开始,从磁盘中读取副本数据,拼成一个chunk,若依然无法拼满一个chunk,则以零填充;
步骤3.12:校验数据包末尾位置所在chunk。

【专利技术属性】
技术研发人员:沈晨杜真真王敬平黄子君徐文远周洁褚少鹤
申请(专利权)人:华东计算技术研究所中国电子科技集团公司第三十二研究所
类型:发明
国别省市:上海;31

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1