首页> 中国专利> 基于分布式文件系统小文件合并的并行追加方法及系统

基于分布式文件系统小文件合并的并行追加方法及系统

摘要

本发明提出基于分布式文件系统小文件合并的并行追加方法及系统,该方法包括将小文件上传到Memcache步骤,客户端上传的小文件到目标文件中,将所述小文件的名称作为key,将所述小文件的内容作为value,上传到Memcache中,将所述key写到表key_list上,所述表key_list存储在所述Memcache中,所述表key_list记录所述Memcache中存储的所有小文件的key;小文件追加到目标大文件步骤,从所述Memcache中下载所述表key_list,根据所述表key_list中所述小文件的名称与所述目标文件,构建Hash表,其中每个Hash值对应一个线性表,所述线性表中储存所述小文件,如果所述目标文件相同,则将与所述目标文件相对应的所述小文件合并。

著录项

  • 公开/公告号CN105868286A

    专利类型发明专利

  • 公开/公告日2016-08-17

    原文格式PDF

  • 申请/专利权人 中国科学院计算技术研究所;

    申请/专利号CN201610169389.1

  • 发明设计人 张笛;孙毓忠;宋莹;

    申请日2016-03-23

  • 分类号G06F17/30(20060101);

  • 代理机构11006 北京律诚同业知识产权代理有限公司;

  • 代理人祁建国;梁挥

  • 地址 100190 北京市海淀区中关村科学院南路6号

  • 入库时间 2023-06-19 00:19:23

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2019-03-12

    授权

    授权

  • 2016-09-14

    实质审查的生效 IPC(主分类):G06F17/30 申请日:20160323

    实质审查的生效

  • 2016-08-17

    公开

    公开

说明书

技术领域

本发明涉及文件处理领域问题,特别涉及基于分布式文件系统小文件合并的并行追加方法及系统。

背景技术

互联网改变了世界,并带动了一系列产业链,每年电子产品等设备产生的数据量都暴增。2013年IDC和EMC发布的“数字宇宙报告”预计,到2020年,数字宇宙规模将达到40ZB,由于网上购物、社交媒体的兴起,产生了大量的图片、邮件、消息、日志文件,在暴增的数据中占有了极大部分,这些文件的大小基本为K级或M级,由于大小小于HDFS上块大小,因此都属于小文件。

Hadoop是一种大数据存储和处理平台,能够对大规模分布式数据集进行处理,被业界广泛使用,尽管如此,Hadoop并不适合大量小文件的存储,在NameNode上会产生大量的元数据,给性能带来极大的影响。

解决小文件的存储和处理问题,主要有以下这些方式:

1.Hadoop自带功能:

(1)Archive:Archive是一种文件存档工具,能够高效地将HDFS中的小文件合并为一个HAR文件,形成文件存储二级结构,对外,HAR是一个大文件,在NameNode中保存它的元数据;对内建立索引,用来访问合并的小文件,从而降低了NameNode中元数据的数据量,Archive并不完美,它的缺点是,将小文件合并为HAR文件的过程是一个MapReduce作业,速度比较慢;且文件一旦创建,便不可改变。

(2)SequenceFile:SequenceFile由一系列二进制key/value组成,当小文件名作为key,文件内容作为value,可将大批小文件序列化到一个大文件中,作为一个二进制序列化过的字节流组成的文本存储文件,能够在map/reduce过程中被使用。

(3)CombineFileInputFormat:在执行MapReduce任务时,若每个小文 件产生一个mapper,会造成资源浪费的问题,CombineFileInputFormat在mapper中将多个文件合成一个split作为输入,减少mapper数量,提高MapReduce任务的执行速度,且提高资源利用率。

2.其他方法:

现有的研究情况主要在两个场景下研究小文件的合并:(1)HDFS海量小文件存储(2)MapReduce中小文件合并。Hadoop的自带功能中,Archive属于(1);SequenceFile和CombineFileInputFormat都属于(2),除此以外,本发明也是在(1)的场景下进行研究。

很多研究与本发明一样,将文件合并后,再上传到存储位置(如“李铁,《面向海量小文件存取的HDFS优化研究》,东华大学学位论文,2015年”、发明专利“一种小文件处理方法及装置”、发明专利“一种Hadoop存取海量小文件的优化方法”、发明专利“海量小文件分级存储方法及系统”、“杨彬,“分布式文件系统HDFS处理小文件的优化方案”,软件2014年第35卷第6期,2014年”、发明专利“一种小文件的存储、查询及删除方法和系统”、发明专利“一种集群存储中并行访问大量小文件的方法及系统”)。“李铁,“面向海量小文件存取的HDFS优化研究”,东华大学学位论文,2015年”设计了一个基于HDFS的中间件,在用户接口与HDFS之间建立一个任务层,每个功能对应自己的缓冲区,将需要合并或删除的文件先暂时存入各自的缓冲区中,当文件达到一定数量或过了一定时间,再统一对需要处理的一批文件进行操作,然而这个方法不能将文件追加到已有的文件中,只能和新的文件一起合并。发明专利“一种小文件处理方法及装置”将具有相同文件标识的文件组合在一起,将每个小文件的索引关键值封装到文件块中,存入第一内存区中,与本发明不同的地方是,发明专利“一种小文件处理方法及装置”进行文件查询时,将文件块整体读入第二内存区中,本发明不需要将整个文件块读出。发明专利“一种集群存储中并行访问大量小文件的方法及系统”将小文件存放在缓存中,根据文件大小,当缓存的小文件的大小的总和达到第一预设值时,将所述缓存的小文件合并成一个临时文件,存放在缓存中。发明专利“海量小文件分级存储方法及系统”与发明专利“一种集群存储中并行访问大量小文件的方法及系统”类似,采用存储池,但不同的是发明专利“海量小文件分级存储方法及系统”中存储池是合并后的大文件的最终存储位置。“杨彬,“分布式文件系统HDFS 处理小文件的优化方案”,软件2014年第35卷第6期,2014年”将索引表放置在合并文件块开头,形成HDFS的扩展类型,用来记录合并块中每个小文件的偏移位置;在NameNode中记录每个合并文件包含哪些块的信息,查询时通过文件名称,就能查找到文件的具体位置。发明专利“一种小文件的存储、查询及删除方法和系统”在上传前就将小文件合并为了大文件,大文件由索引区偏移量存储区域,小文件存储区域以及小文件索引信息存储区域组成,且三个文件区域连续存放,当需要将小文件并入大文件时,将小文件存入小文件存储区域后,需要将小文件索引信息存储区域向后偏移小文件大小,这与本发明中三个部分是作为单独文件存在不同。

发明内容

针对现有技术的不足,本发明提出分布式文件系统小文件合并的并行追加方法及系统。

本发明提出一种分布式文件系统小文件合并的并行追加方法,包括:

将小文件上传到Memcache步骤,客户端上传的小文件到目标文件中,将所述小文件的名称作为key,将所述小文件的内容作为value,上传到Memcache中,将所述key写到表key_list上,所述表key_list存储在所述Memcache中,所述表key_list记录所述Memcache中存储的所有小文件的key;

小文件追加到目标大文件步骤,从所述Memcache中下载所述表key_list,根据所述表key_list中所述小文件的名称与所述目标文件,构建Hash表,其中每个Hash值对应一个线性表,所述线性表中储存所述小文件,如果所述目标文件相同,则将与所述目标文件相对应的所述小文件合并。

所述步骤1还包括当所述客户端上传所述小文件后,发出一个追加请求,将所述追加请求放入请求队列request_queue中;

从所述请求队列request_queue中取出所述追加请求,创建一个线程处理所述追加请求,分别执行以下步骤:判断所述请求队列request_queue中是否是空的,若为空,则重新进行判断,否则判断当前处理的所述追加请求的线程数count是否小于最大并发处理数若所述线程数count<=所述最大并发处理数未超过最大并发数,则将所述线程数count加1,若所述线程数 count>所述最大并发处理数则不取出所述追加请求,当存在上传文件的线程结束后再取出所述追加请求,并对所述追加请求进行处理。

所述步骤1包括对当前线程加锁,使当前只有一个线程在修改所述表key_list;从所述Memcache下载所述表key_list;将所述key从尾部追加到所述表key_list里;将修改后的所述表key_list上传到所述Memcache中;对所述当前线程解锁,并将所述线程数count减1。

所述步骤2包括从所述Memcache下载所述表key_list,重命名为表key_list_local;判断key_list是否为空,若所述表key_list为空,则用变量T来记录时间,t时间后对下一批小文件进行追加;否则创建空的表key_list,将其上传到所述Memcache中。

所述步骤2包括:打开所述表key_list_local,读取所述小文件的名称与所述目标文件;将所述目标文件作为hash值,将所述小文件的名称分别存入hash表中,当两个及以上的小文件的目标文件相同时,则将所述两个及以上的小文件加入到对应的线性表后。

本发明还提出一种分布式文件系统小文件合并的并行追加系统,包括:

上传模块,用于客户端上传的小文件到目标文件中,将所述小文件的名称作为key,将所述小文件的内容作为value,上传到Memcache中,将所述key写到表key_list上,所述表key_list存储在所述Memcache中,所述表key_list记录所述Memcache中存储的所有小文件的key;

合并模块,用于从所述Memcache中下载所述表key_list,根据所述表key_list中所述小文件的名称与所述目标文件,构建Hash表,其中每个Hash值对应一个线性表,所述线性表中储存所述小文件,如果所述目标文件相同,则将与所述目标文件相对应的所述小文件合并。

所述上传模块还包括当所述客户端上传所述小文件后后,发出一个追加请求,将所述追加请求放入请求队列request_queue中;

从所述请求队列request_queue中取出所述追加请求,创建一个线程处 理所述追加请求,分别执行以下步骤:判断所述请求队列request_queue中是否是空的,若为空,则重新进行判断,否则判断当前处理的所述追加请求的线程数count是否小于最大并发处理数若所述线程数count<=所述最大并发处理数未超过最大并发数,则将所述线程数count加1,若所述线程数count>所述最大并发处理数则不取出所述追加请求,当存在上传文件的线程结束后再取出所述追加请求,并对所述追加请求进行处理。

所述上传模块包括对当前线程加锁,使当前只有一个线程在修改所述表key_list;从所述Memcache下载所述表key_list;将所述key从尾部追加到所述表key_list里;将修改后的所述表key_list上传到所述Memcache中;对所述当前线程解锁,并将所述线程数count减1。

所述合并模块包括从所述Memcache下载所述表key_list,重命名为表key_list_local;判断key_list是否为空,若所述表key_list为空,则用变量T来记录时间,t时间后对下一批小文件进行追加;否则创建空的表key_list,将其上传到所述Memcache中。

所述合并模块包括:打开所述表key_list_local,读取所述小文件的名称与所述目标文件;将所述目标文件作为hash值,将所述小文件的名称分别存入hash表中,当两个及以上的小文件的目标文件相同时,则将所述两个及以上的小文件加入到对应的线性表后。

由以上方案可知,本发明的优点在于:

本发明并行地向分布式文件系统的目标大文件中追加小文件,使小文件按类有序存储,同时减少了NameNode中的元数据,减轻NameNode的压力;降低了上传时的IO开销,使追加小文件更加高效。

附图说明

图1是文件上传Memcache流程图;

图2是小文件追加到目标大文件图。

图3是访问小文件流程图。

具体实施方式

为了解决现有技术中存在的技术问题,本发明提出一种分布式文件系统小文件合并的并行追加方法,包括:

将小文件上传到Memcache步骤,客户端上传的小文件到目标文件中,将所述小文件的名称作为key,将所述小文件的内容作为value,上传到Memcache中,将所述key写到表key_list上,所述表key_list存储在所述Memcache中,所述表key_list记录所述Memcache中存储的所有小文件的key,memcache是一套分布式的高速缓存系统;

小文件追加到目标大文件步骤,从所述Memcache中下载所述表key_list,根据所述表key_list中所述小文件的名称与所述目标文件,构建Hash表,其中每个Hash值对应一个线性表,所述线性表中储存所述小文件,如果所述目标文件相同,则将与所述目标文件相对应的所述小文件合并。

所述步骤1还包括当所述客户端上传所述小文件后后,发出一个追加请求,将所述追加请求放入请求队列request_queue中;

从所述请求队列request_queue中取出所述追加请求,创建一个线程处理所述追加请求,分别执行以下步骤:判断所述请求队列request_queue中是否是空的,若为空,则重新进行判断,否则判断当前处理的所述追加请求的线程数count是否小于最大并发处理数若所述线程数count<=所述最大并发处理数未超过最大并发数,则将所述线程数count加1,若所述线程数count>所述最大并发处理数则不取出所述追加请求,当存在上传文件的线程结束后再取出所述追加请求,并对所述追加请求进行处理。

所述步骤1包括对当前线程加锁,使当前只有一个线程在修改所述表key_list;从所述Memcache下载所述表key_list;将所述key从尾部追加到所述表key_list里;将修改后的所述表key_list上传到所述Memcache中;对所述当前线程解锁,并将所述线程数count减1。

所述步骤2包括从所述Memcache下载所述表key_list,重命名为表key_list_local;判断key_list是否为空,若所述表key_list为空,则用变量T来记录时间,t时间后对下一批小文件进行追加;否则创建空的表key_list, 将其上传到所述Memcache中。

所述步骤2包括:打开所述表key_list_local,读取所述小文件的名称与所述目标文件;将所述目标文件作为hash值,将所述小文件的名称分别存入hash表中,当两个及以上的小文件的目标文件相同时,则将所述两个及以上的小文件加入到对应的线性表后。

本发明还提出一种分布式文件系统小文件合并的并行追加系统,包括:

上传模块,用于客户端上传的小文件到目标文件中,将所述小文件的名称作为key,将所述小文件的内容作为value,上传到Memcache中,将所述key写到表key_list上,所述表key_list存储在所述Memcache中,所述表key_list记录所述Memcache中存储的所有小文件的key;

合并模块,用于从所述Memcache中下载所述表key_list,根据所述表key_list中所述小文件的名称与所述目标文件,构建Hash表,其中每个Hash值对应一个线性表,所述线性表中储存所述小文件,如果所述目标文件相同,则将与所述目标文件相对应的所述小文件合并。

所述上传模块还包括当所述客户端上传所述小文件后后,发出一个追加请求,将所述追加请求放入请求队列request_queue中;

从所述请求队列request_queue中取出所述追加请求,创建一个线程处理所述追加请求,分别执行以下步骤:判断所述请求队列request_queue中是否是空的,若为空,则重新进行判断,否则判断当前处理的所述追加请求的线程数count是否小于最大并发处理数若所述线程数count<=所述最大并发处理数未超过最大并发数,则将所述线程数count加1,若所述线程数count>所述最大并发处理数则不取出所述追加请求,当存在上传文件的线程结束后再取出所述追加请求,并对所述追加请求进行处理。

所述上传模块包括对当前线程加锁,使当前只有一个线程在修改所述表key_list;从所述Memcache下载所述表key_list;将所述key从尾部追加到所述表key_list里;将修改后的所述表key_list上传到所述Memcache中; 对所述当前线程解锁,并将所述线程数count减1。

所述合并模块包括从所述Memcache下载所述表key_list,重命名为表key_list_local;判断key_list是否为空,若所述表key_list为空,则用变量T来记录时间,t时间后对下一批小文件进行追加;否则创建空的表key_list,将其上传到所述Memcache中。

所述合并模块包括:打开所述表key_list_local,读取所述小文件的名称与所述目标文件;将所述目标文件作为hash值,将所述小文件的名称分别存入hash表中,当两个及以上的小文件的目标文件相同时,则将所述两个及以上的小文件加入到对应的线性表后。

下面结合附图1,2,更进一步描述本发明步骤,如图1,2本发明追加文件的步骤包含连续执行:A、上传文件到Memcache;B、小文件追加到目标大文件。具体的一种实施方式如下:

A.客户端将文件从本地上传到Memcache中,如图1所示,其实现方法为:

A1.用户在客户端界面,路径pi选择需要的小文件fi,名称为srci,并选择目标文件desti,点击上传小文件fi

A2.客户端点击上传后,会发出一个追加请求,将其放入请求队列request_queue中;

A3.从request_queue中取出请求,创建一个线程处理这个请求,分别执行以下步骤:

A3-1:判断请求队列中是否是空的,有两种可能:1)不空,执行A3-2;2)为空,回到A3-1;

A3-2:判断当前处理请求的线程数count是否小于最大并发处理数这里有两种可能:未超过最大并发数,则将count加1,然后执行A4;则不取出请求,当有上传文件的线程结束后再取出请求,并对其进行处理。

A4.将fi名称srci作为key,将fi内容作为value,上传到Memcache中。

A5.文件fi上传结束后,将key写到文件key_list上,文件key_list存储在Memcache上,记录了Memcache中存储的所有小文件的key。分别执行以下步骤:

A5-1:对当前线程加锁,使当前只有一个线程在修改key_list;

A5-2:将key_list文件从Memcache下载下来;

A5-3:fi的key是其文件名srci,从尾部追加到key_list里;

A5-4:将修改后的key_list上传到Memcache中;

A5-5:对当前线程解锁,并将count减1。

B.将小文件追加到HDFS上的大文件中,如图2所示,其实现方法为:

B1.得到key_list,并更新key_list文件;分别执行以下步骤:

B1-1:从Memcache下载key_list文件,重命名为key_list_local;

B1-2:判断key_list是否为空,有下面两种情况:1)key_list为空,则直接跳到B4;2)key_list不空,则执行B1-3;

B1-3:创建一个空的key_list文件,将其上传到Memcache中。

B2.构建Hash表,用来记录相同目标文件desti的小文件的文件名srci;分别执行以下步骤:

B2-1:打开key_list_local文件,读取每一条记录中的srci和desti

B2-2:将desti作为hash值,将srci分别存入hash表中。当发生冲突时,即两个小文件的desti相同时,则将其加入到对应的线性表后。

B3.将目标文件相同的小文件进行合并,也就是将相同hash地址后对应的线性表中的小文件合并,再追加到目标文件后;分别执行以下步骤:

B3-1:找到θ个不空的hash项,创建θ个线程;

B3-2:在每个线程中,读取相应hash项后面的线性表中的小文件,将这些小文件从Memcache下载下来;

B3-3:将小文件合并为一个中文件fmi,并记录每个文件大小sizei

B3-4:打开HDFS上的目标文件,计算part-x文件追加前的大小part_sizei,将fmi用字节流的形式append到目标文件下的part-x文件后;

B3-5:_index是part-x文件的索引文件,记录了part-x中存储的每个文件的目录,名称,权限,时间戳,起始偏移位置,大小等信息。记录_index文件修改前的大小index_size_before;将srci作为文件名,part_size作为起始偏移位置,sizei作为大小,按照相应的格式,将需要的信息写到_index文件后,并记录修改后_index文件的大小index_size_after;

B3-6:_masterindex文件是_index文件的索引文件,将index_size_before和index_size_after分别作为index文件起始和结束偏 移位置;按照_masterindex文件中记录的格式,将相应信息追加到_masterindex后。

B4.用变量T来记录时间,t时间后处理下一批小文件追加。

如图3,访问小文件,具体的实施方式如下:

C1.客户端发出访问请求,需要访问文件fi,请求中包含文件名srci以及目标文件名desti

C2.从Memcache中的key_list文件上面用文件名查找该文件,执行的具体步骤如下:

C2-1:下载key_list文件;

C2-2:在key_list文件中查找文件名srci,这里包含两种情况:1)key_list中包含该文件,则根据srci从Memcache中取出该文件,并返回给客户端;2)不包含该文件,则执行C3。

C3.从目标文件desti中的_masterindex和_index中查找文件fi,并返回给客户端。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号