CN110795407A - 适用于分布式文件系统的文件随机写方法及系统 - Google Patents
适用于分布式文件系统的文件随机写方法及系统 Download PDFInfo
- Publication number
- CN110795407A CN110795407A CN201910973982.5A CN201910973982A CN110795407A CN 110795407 A CN110795407 A CN 110795407A CN 201910973982 A CN201910973982 A CN 201910973982A CN 110795407 A CN110795407 A CN 110795407A
- Authority
- CN
- China
- Prior art keywords
- data
- file
- data block
- module
- writing
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 73
- 230000005540 biological transmission Effects 0.000 claims abstract description 14
- 238000012545 processing Methods 0.000 claims abstract description 12
- 238000012795 verification Methods 0.000 claims description 74
- 238000012546 transfer Methods 0.000 claims description 8
- 238000004891 communication Methods 0.000 claims description 7
- 238000013461 design Methods 0.000 description 2
- 238000010586 diagram Methods 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000007774 longterm Effects 0.000 description 1
- 238000013508 migration Methods 0.000 description 1
- 230000005012 migration Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/17—Details of further file system functions
- G06F16/172—Caching, prefetching or hoarding of files
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/18—File system types
- G06F16/182—Distributed file systems
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供了一种适用于分布式文件系统的文件随机写方法及系统,包括:步骤1:将HDFS的写接口更新成支持随机写模式,使随机写操作仅影响直接修改的块或者有限的相邻块;步骤2:扩展HDFS数据传输协议,使客户端可访问任意的数据分块;步骤3:更新服务端数据包处理、更新校验值计算,获取数据副本更新、校验值更新。本发明中,存储于分布式文件系统的文件在更新数据内容时,只会影响当前数据分块及相邻的数据分块,而不会像原生HDFS需将整个文件写回,造成大量不必要的数据传输,本发明有效的减少了数据传输和移动,缓解网络带宽压力,降低客户端和服务端的处理资源消耗。
Description
技术领域
本发明涉及分布式存储领域,具体地,涉及一种适用于分布式文件系统的文件随机写方法及系统。
背景技术
分布式文件存储系统受传统的磁盘文件系统所影响,多数采用固定大小的数据分块来组织和管理文件。当前流行的分布式文件系统HDFS(Hadoop Distributed FileSystem)和GFS(Google File System)都是将大文件分割成固定大小的块进行存储,通常是64MB。这些文件在创建后,大部分都是追加写到文件尾部,几乎不涉及随机写操作。这种固定长度的分块设计不适合随机写,写入开销大且性能差。但通常用户约有25%的文件操作是进行随机写。针对上述现状,提出一种基于HDFS的文件随机写方法,能对存储于分布式文件系统中的文件进行任意位置的数据写入。
专利文献CN106027647B公开了一种LXPFS集群分布式文件存储系统,采用LXPFS集群给应用提供访问方法,通过封装好的JS API访问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+bytesPerChecksum-endPartialChunkSizeOnDisk并计算新的校验值,如果数据没有拼满一个chunk,则以零填充。
根据本发明提供的一种适用于分布式文件系统的文件随机写系统,包括:模块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+bytesPerChecksum-endPartialChunkSizeOnDisk并计算新的校验值,如果数据没有拼满一个chunk,则以零填充。
与现有技术相比,本发明具有如下的有益效果:
1、本发明中,存储于分布式文件系统的文件在更新数据内容时,只会影响当前数据分块及相邻的数据分块,而不会像原生HDFS需将整个文件写回,造成大量不必要的数据传输,本发明有效的减少了数据传输和移动,缓解网络带宽压力,降低客户端和服务端的处理资源消耗;
2、本发明中,提升分布式文件系统HDFS的扩展性和兼容性,通过增加文件偏移方法和扩展数据传输协议等实现分布式文件的随机写,对于一些具有随机写特性的应用,HDFS能够提供良好的兼容性。
附图说明
通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:
图1为本实施例中分布式文件客户端随机写流程示意图。
图2为本实施例中分布式文件服务端随机写处理流程示意图。
具体实施方式
下面结合具体实施例对本发明进行详细说明。以下实施例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变化和改进。这些都属于本发明的保护范围。
根据本发明提供的一种适用于分布式文件系统的文件随机写方法,包括:步骤1:将HDFS的写接口更新成支持随机写模式,使随机写操作仅影响直接修改的块或者有限的相邻块;步骤2:扩展HDFS数据传输协议,使客户端可访问任意的数据分块;步骤3:更新服务端数据包处理、更新校验值计算,获取数据副本更新、校验值更新。
当前流行的分布式文件系统HDFS主要针对大文件存储而设计的,在大文件操作中几乎不涉及随机写操作,一般文件写完之后,对文件的后续操作通常采取顺序读的方式。HDFS以一次写入、多次读取的访问模式存储大文件和超大文件,数据块生成后一般稳定存储于服务器中,后续将在此数据上进行长期的访问、处理与分析。HDFS中的文件写入只支持追加到文件末尾,并不支持任意位置的随机写。但在许多实际应用中,文件的随机写是有必要的。如分布式文件系统运用于存储大量的遥感影像数据,在遥感影像的多数处理流程中,都会涉及更新影像元数据,而元数据一般都存储于文件头,这就要求分布式文件系统需要支持文件的随机写。本专利正是基于此运用设计实现的,提出了一种用于HDFS的文件随机写方法
优选地,所述步骤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+bytesPerChecksum-endPartialChunkSizeOnDisk并计算新的校验值,如果数据没有拼满一个chunk,则以零填充。
具体地,在一个实施例中,一种适用于分布式文件系统的文件随机写方法,包括:
新增分布式文件偏移步骤如下:
在DFSOutputStream类中,增加文件偏移方法seek,传入文件偏移量offset,并在方法中调用刷新或关闭当前数据管道中数据节点的连接;
新增成员变量positonCurBlock用于记录当前数据块中的偏移量;
新增成员变量curFileOffset用于记录当前文件中的偏移量;
在seek方法中,根据传入的文件偏移量offset和当前文件偏移量curFileOffset判断是否属于同一个数据块,即curFileOffset/blockSize是否等于offset/blockSize;
如果属于同一个数据块,则调用flushBuffer刷新数据,然后更新bytesCurBlock变量,记录下个数据包在数据块的偏移值。否则,调用endBlock关闭客户端与当前数据节点的通信连接。
更新数据传输协议如下:
在原生HDFS中,如果要请求写下一个数据块,因为是顺序写的关系,只需调用addBlock方法从NameNode申请新数据块。而在调用DFSOutputStream.seek时,如果请求的文件偏移位置与当前的curFileOffset位置不是同一数据块或者当写满一个数据块时,都需要请求写下一个数据块,而且打开的下一个数据块可能是已经存在的数据块,此时需添加方法getBlock计算curFileOffset所在的数据块,具体流程如下:
根据seek方法中发送过来的标志,DataStreamer线程中将关闭当前数据节点的连接并进行数据管道更新;
根据curFileOffset向NameNode请求数据节点,与新数据节点建立数据连接,请求数据节点存在以下三种情况;
写新数据块,则调用原生addBlock实现
写最后一个数据块,则调用原生append实现
写中间数据块,则新增方法getBlock,计算curFileOffset所在的数据块,即blockIndex等于curFileOffset/blockSize,positonBurBlock等于curFileOffset%block,并返回LocatedBlock。
修改成员变量bytesCurBlock初始值,在原生HDFS中bytesCurBlock为当前未写满的数据块大小,而在随机写方法中bytesCurBlock为传入的随机写位置在该数据块中的位置;
通过比较bytesCurBlock与数据块大小的值,判断数据块是否写满。
数据副本、校验值更新步骤如下:
在数据服务端修改副本和校验值方法BlockReceiver.receivePacket,将收到的数据写入副本文件中并更新校验文件,新增方法computePartialChunkCrc在接收的数据不足以填满一个chunk时,需要从副本中读取部分内容填满一个chunk,服务端处理流程如下:
服务端收到Packet包后解析包头,获取该包中数据dataBuf、校验值checksumBuf、校验类型、校验长度bytesPerChecksum以及该包中数据在当前数据块的起始位置firstByteInBlock;
计算数据块末尾位置offsetInBlock等于firstByteInBlock加上dataLen;
调用adjustBlkAndCrcFilePosition传入firstByteInBlock值调整指向副本文件和校验文件的写文件句柄偏移位置;
如果该数据包不覆盖磁盘上原始数据内容,则判断当前磁盘上最后一个校验是否为完整的chunk;
当前校验完整,将数据包中的校验数据直接写入校验文件。
当前校验不完整,则进行重新校验,从副本文件中读取不完整校验的数据,起始位置为(onDiskLen/bytesPerChecksum)*bytesPerChecksum,数据长度partialChunkSizeOnDisk为onDiskLen%bytesPerChecksum。
从数据包中取出部分数据与磁盘中读取的数据拼成一个chunk,并计算出校验值,移动校验文件写句柄,将新的校验值覆盖旧校验值
如果数据包在填满一个chunk后,仍有剩余数据时,将剩余数据重新计算校验,并将校验值写入校验文件末尾
如果该数据包覆盖当前副本内容,则判断数据包起始位置和末尾位置所在的chunk是否需要重新校验;
数据包起始位置所在chunk校验:从上一个chunk边界开始从副本文件中读取partialChunkSizeOnDisk长度数据和数据包中数据拼成一个chunk,并计算新的校验值。如果没有拼满一个chunk,则从offsetInBlock开始,从磁盘中读取副本数据,拼成一个chunk,若依然无法拼满一个chunk,则以零填充
数据包末尾位置所在chunk校验:从数据包中读取endPartialChunkSizeOnDisk长度数据和磁盘数据拼成一个chunk,数据包的起始位置datalen-endPartialChunkSizeOnDisk,磁盘数据的起始位置为offsetInBlock+bytesPerChecksum-endPartialChunkSizeOnDisk并计算新的校验值,如果数据没有拼满一个chunk,则以零填充。
本领域技术人员可以将本发明提供的适用于分布式文件系统的文件随机写方法,理解为本发明提供的适用于分布式文件系统的文件随机写系统的一个实施例。即,所述适用于分布式文件系统的文件随机写系统可以通过执行所述适用于分布式文件系统的文件随机写方法的步骤流程实现。
根据本发明提供的一种适用于分布式文件系统的文件随机写系统,包括:模块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+bytesPerChecksum-endPartialChunkSizeOnDisk并计算新的校验值,如果数据没有拼满一个chunk,则以零填充。
具体地,在一个实施例中,新增分布式文件偏移方法,在文件随机写时传入文件偏移量,根据偏移量计算所在的数据分块,并通过更新的数据传输协议访问该数据分块。得到数据分块后,向服务端请求分块所在数据节点并建立数据流管道连接进行数据写入和传输,服务端接收到数据包后,对数据副本和校验值进行更新
本发明中,存储于分布式文件系统的文件在更新数据内容时,只会影响当前数据分块及相邻的数据分块,而不会像原生HDFS需将整个文件写回,造成大量不必要的数据传输,本发明有效的减少了数据传输和移动,缓解网络带宽压力,降低客户端和服务端的处理资源消耗;2、本发明中,提升分布式文件系统HDFS的扩展性和兼容性,通过增加文件偏移方法和扩展数据传输协议等实现分布式文件的随机写,对于一些具有随机写特性的应用,HDFS能够提供良好的兼容性。
本领域技术人员知道,除了以纯计算机可读程序代码方式实现本发明提供的系统及其各个装置、模块、单元以外,完全可以通过将方法步骤进行逻辑编程来使得本发明提供的系统及其各个装置、模块、单元以逻辑门、开关、专用集成电路、可编程逻辑控制器以及嵌入式微控制器等的形式来实现相同功能。所以,本发明提供的系统及其各项装置、模块、单元可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置、模块、单元也可以视为硬件部件内的结构;也可以将用于实现各种功能的装置、模块、单元视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
以上对本发明的具体实施例进行了描述。需要理解的是,本发明并不局限于上述特定实施方式,本领域技术人员可以在权利要求的范围内做出各种变化或修改,这并不影响本发明的实质内容。在不冲突的情况下,本申请的实施例和实施例中的特征可以任意相互组合。
Claims (10)
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。
6.一种适用于分布式文件系统的文件随机写系统,其特征在于,包括:
模块1:将HDFS的写接口更新成支持随机写模式,使随机写操作仅影响直接修改的块或者有限的相邻块;
模块2:扩展HDFS数据传输协议,使客户端可访问任意的数据分块;
模块3:更新服务端数据包处理、更新校验值计算,获取数据副本更新、校验值更新。
7.根据权利要求6所述的适用于分布式文件系统的文件随机写方法,其特征在于,所述模块1包括:
模块1.1:在DFSOutputStream类中,增加文件偏移方法seek,传入文件偏移量offset,并在方法中调用刷新或关闭当前数据管道中数据节点的连接;
模块1.2:新增成员变量positonCurBlock用于记录当前数据块中的偏移量;
模块1.3:新增成员变量curFileOffset用于记录当前文件中的偏移量;
模块1.4:在seek方法中,根据传入的文件偏移量offset和当前文件偏移量,curFileOffset判断是否属于同一个数据块,获取同数据块判断结果信息或者不同数据块结果判断信息;
模块1.5:根据同数据块判断结果信息,调用flushBuffer刷新数据,然后更新bytesCurBlock变量,记录下个数据包在数据块的偏移值;
模块1.6:调用endBlock关闭客户端与当前数据节点的通信连接。
8.根据权利要求6所述的适用于分布式文件系统的文件随机写方法,其特征在于,所述模块2包括:
模块2.1:根据seek方法中发送过来的标志,DataStreamer线程中将关闭当前数据节点的连接并进行数据管道更新;
模块2.2:根据curFileOffset向NameNode请求数据节点,与新数据节点建立数据连接;
模块2.3:修改成员变量bytesCurBlock初始值,bytesCurBlock为传入的随机写位置在设定数据块中的位置;
模块2.4:比较bytesCurBlock与数据块大小的值,判断数据块是否写满,获取数据块写满结果信息或者数据块未写满结果信息。
9.根据权利要求6所述的适用于分布式文件系统的文件随机写方法,其特征在于,所述模块2.2包括:
模块2.2.1:根据请求数据节点信息,获取写数据块类型信息;
模块2.2.2:根据写数据块类型信息,获取写新数据块控制信息、写中间数据块控制信息以及写最后一个数据块控制信息;
模块2.2.3:根据写新数据块控制信息,调用原生addBlock实现;
模块2.2.4:根据写中间数据块控制信息,新增方法getBlock,计算curFileOffset所在的数据块;
模块2.2.5:根据写最后一个数据块控制信息,写最后一个数据块,调用原生append实现。
10.根据权利要求6所述的适用于分布式文件系统的文件随机写方法,其特征在于,所述模块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。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910973982.5A CN110795407B (zh) | 2019-10-14 | 2019-10-14 | 适用于分布式文件系统的文件随机写方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910973982.5A CN110795407B (zh) | 2019-10-14 | 2019-10-14 | 适用于分布式文件系统的文件随机写方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110795407A true CN110795407A (zh) | 2020-02-14 |
CN110795407B CN110795407B (zh) | 2022-06-10 |
Family
ID=69440252
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910973982.5A Active CN110795407B (zh) | 2019-10-14 | 2019-10-14 | 适用于分布式文件系统的文件随机写方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110795407B (zh) |
Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103544045A (zh) * | 2013-10-16 | 2014-01-29 | 南京大学镇江高新技术研究院 | 一种基于hdfs的虚拟机镜像存储系统及其构建方法 |
CN103577339A (zh) * | 2012-07-27 | 2014-02-12 | 深圳市腾讯计算机系统有限公司 | 一种数据存储方法及系统 |
CN103729225A (zh) * | 2014-01-22 | 2014-04-16 | 中国人民解放军国防科学技术大学 | 一种基于内容分块的远程文件实时更新方法 |
US20150363167A1 (en) * | 2014-06-16 | 2015-12-17 | International Business Machines Corporation | Flash optimized columnar data layout and data access algorithms for big data query engines |
CN105630919A (zh) * | 2015-12-22 | 2016-06-01 | 曙光信息产业(北京)有限公司 | 存储方法及系统 |
CN105630808A (zh) * | 2014-10-31 | 2016-06-01 | 北京奇虎科技有限公司 | 基于分布式文件系统的文件读取、写入方法及节点服务器 |
CN106250473A (zh) * | 2016-07-29 | 2016-12-21 | 江苏物联网研究发展中心 | 遥感影像云存储方法 |
CN107341070A (zh) * | 2017-06-30 | 2017-11-10 | 长江大学 | 一种基于纠删码的随机写方法及系统 |
CN107479823A (zh) * | 2016-06-07 | 2017-12-15 | 阿里巴巴集团控股有限公司 | 随机读写文件测试中的数据校验方法和装置 |
-
2019
- 2019-10-14 CN CN201910973982.5A patent/CN110795407B/zh active Active
Patent Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103577339A (zh) * | 2012-07-27 | 2014-02-12 | 深圳市腾讯计算机系统有限公司 | 一种数据存储方法及系统 |
CN103544045A (zh) * | 2013-10-16 | 2014-01-29 | 南京大学镇江高新技术研究院 | 一种基于hdfs的虚拟机镜像存储系统及其构建方法 |
CN103729225A (zh) * | 2014-01-22 | 2014-04-16 | 中国人民解放军国防科学技术大学 | 一种基于内容分块的远程文件实时更新方法 |
US20150363167A1 (en) * | 2014-06-16 | 2015-12-17 | International Business Machines Corporation | Flash optimized columnar data layout and data access algorithms for big data query engines |
CN105630808A (zh) * | 2014-10-31 | 2016-06-01 | 北京奇虎科技有限公司 | 基于分布式文件系统的文件读取、写入方法及节点服务器 |
CN105630919A (zh) * | 2015-12-22 | 2016-06-01 | 曙光信息产业(北京)有限公司 | 存储方法及系统 |
CN107479823A (zh) * | 2016-06-07 | 2017-12-15 | 阿里巴巴集团控股有限公司 | 随机读写文件测试中的数据校验方法和装置 |
CN106250473A (zh) * | 2016-07-29 | 2016-12-21 | 江苏物联网研究发展中心 | 遥感影像云存储方法 |
CN107341070A (zh) * | 2017-06-30 | 2017-11-10 | 长江大学 | 一种基于纠删码的随机写方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN110795407B (zh) | 2022-06-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10922007B2 (en) | High-performance writable snapshots in data storage systems | |
US11119654B2 (en) | Determining an optimal storage environment for data sets and for migrating data sets | |
CN107526743B (zh) | 用于压缩文件系统元数据的方法和设备 | |
CN105474200B (zh) | 具有占位符的水合和脱水 | |
US20210181963A1 (en) | Native key-value storage enabled distributed storage system | |
US10664196B2 (en) | Random access file management | |
CN109271098B (zh) | 一种数据迁移方法及装置 | |
US20120030439A1 (en) | Data Sharing for File Clones Using Reverse Ditto References | |
CN105573667A (zh) | 一种数据读取方法和存储服务器 | |
US7533133B1 (en) | Externally managed file versions | |
JP7378403B2 (ja) | データ処理方法、装置、およびコンピューティングデバイス | |
US20220350779A1 (en) | File system cloning method and apparatus | |
CN110489150A (zh) | 一种虚拟机热升级方法、装置及其相关设备 | |
JP5254141B2 (ja) | アーカイブ装置、データ格納プログラムおよびデータ格納方法 | |
CN112748877A (zh) | 一种文件的整合上传方法及装置、文件的下载方法及装置 | |
US8589454B2 (en) | Computer data file merging based on file metadata | |
CN110990356B (zh) | 一种用于逻辑镜像的实时自动扩容方法和系统 | |
CN105677579A (zh) | 缓存系统中的数据访问方法和系统 | |
CN113127438B (zh) | 用于存储数据的方法、装置、服务器和介质 | |
CN110795407B (zh) | 适用于分布式文件系统的文件随机写方法及系统 | |
US11144243B2 (en) | Method and device for managing redundant array of independent disks and computer program product | |
US20170286442A1 (en) | File system support for file-level ghosting | |
US10915270B2 (en) | Random file I/O and chunked data upload | |
US10831794B2 (en) | Dynamic alternate keys for use in file systems utilizing a keyed index | |
US8909875B1 (en) | Methods and apparatus for storing a new version of an object on a content addressable storage system |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |