一种针对小文件合并的批量删除/查询方法与装置
技术领域
本发明涉及文件处理领域问题,特别涉及一种针对小文件合并的批量删除/查询方法与装置。
背景技术
目前,随着信息化的发展,各个领域的数据均呈爆炸式增加,这些数据以文件的形式存储,由于各方面原因,大部分都是小文件,小文件是指文件大小比较小的文件,由于数量巨大,难以管理。
HDFS上的文件是以块为单位存储的,当HDFS上存在大量的小文件时,不仅占用DataNode大量的存储空间,在NameNode内存中也产生大量的元数据,Yahoo内部有一个生产集群,统计下来大概有57,000,000个小于一个块大小的小文件,这些小文件消耗了95%的NameSpace,占用了30%的存储空间,也给NameNode带来了压力。
目前有几种处理小文件的方法:
Hadoop自带了几种处理小文件的方法,比如HAR,SequenceFile等,HAR是一个文件存档工具,能够将多个小文件打包成一个HAR文件,再放入HDFS中,也可以通过MapReduce进行操作,打包后的文件包含文件部分以及索引部分,其中索引为二层索引,完成了小文件与目标文件之间的映射,但这种方法有一个不足——创建好的HAR文件不能修改,即不能从目标文件中删除小文件,也不能将小文件追加到合并好的目标文件中,只能重新创建新HAR文件,SequenceFile由一系列的二进制key/value组成,如果key为小文件名,value为文件内容,则可以将大批小文件合并成一个目标文件,SequenceFile是Hadoop一个重要的文本存储文件,能够将小文件合并成目标文件后统一进行存储,在MapReduce中有重要应用。
除了使用Hadoop自带的方法,还有很多其他方案:
采用先合并,再上传的策略。发明专利“一种小文件处理方法及装置”提出一种小文件存储系统,该专利所述方法能够将具有相同文件标志的小文件合并在一起,将小文件预先合并好,放在内存区中,再一同存到硬盘上,这篇专利能够将有关联的小文件整合,由于在合并和查询时都使用了内存暂时存放文件块,提高合并以及检索效率。相对于每篇文章分别作为一个对象的方法而言,无须浪费太多硬盘空间存储非文件数据,这篇专利是先将一段时间收集的小文件进行合并,再上传到磁盘或服务器上。虽然这个方法将文件合并来存储和处理小文件,然而都不能修改合并后的目标文件,包括追加和删除。
发明内容
针对现有技术的不足,本发明提出一种针对小文件合并的批量删除/查询方法与装置。
本发明提出一种针对小文件合并的批量删除/查询方法,包括:
将小文件上传到Memcache步骤,客户端上传的小文件到目标文件中,将所述小文件的名称作为key,将所述小文件的内容作为value,上传到Memcache中,将所述key写到表key_list上,所述表key_list存储在所述Memcache中,所述表key_list记录所述Memcache中存储的所有小文件的key;
小文件删除步骤,在所述目标文件中添加标志文件flag,以及标志文件DE_flag,所述客户端收到删除所述小文件的请求后,先从所述表key_list中查找是否存在所述小文件的所述key,若存在,则从所述Memcache中取出并删除所述小文件,并删除所述表key_list中所述小文件的所述key,否则在所述标识文件flag中记录所述小文件的文件名;
小文件查询步骤,获取需要查询的文件F,查询所述表key_list上记录的所述文件F的key,根据所述key从所述Memcache中取出所述文件F,返回给所述客户端。
所述将小文件上传到Memcache步骤包括预测所述Memcache中是否存在足够的空间容纳所述小文件其中所述Memcache中剩余空间为Li,所述小文件大小为Si,所述Memcache总空间为P,若Li+Si<=P,则将所述小文件放入所述Memcache中,若Li+fi>P,则将所述小文件存储到磁盘上,不再有新的小文件上传后,再将磁盘上的小文件上传到所述Memcache中;将线程进行加锁,保证同时只有一个线程执行写所述表key_list;从所述Memcache上下载所述表key_list;将所述小文件的文件名以及所述目标文件的文件名追加到key_list文件后;将所述表key_list上传到所述Memcache,将线程进行解锁。
所述小文件删除步骤,还包括
根据所述小文件的文件名查找要删除的小文件所在的目标文件的位置;
在与所述目标文件相对于的标志文件flag上记录信息,所述信息为要删除的小文件的文件名;
设置一阈值V,定期遍历每一个合并后的目标文件下的标志文件flag与_index文件,并读取这两个文件的行数c1与c2,当c1/c2<V时,不做任何操作,当c1/c2>=V时,则另外起用一个线程,对目标文件进行重新合并,重新合并步骤为:
在目标文件所在文件夹下新建标志文件DE_flag,把合并后的目标文件恢复成小文件,并下载到本地,把标志文件flag也下载到本地,并清空所述标志文件flag;
读取本地的标志文件flag,按行获取信息,每一行为一个要删除的文件,从本地的小文件中找到要删除的文件并删除;
把删除完成后剩余的小文件上传到HDFS,并利用hadoop archive的方法进行重新合并;
把HDFS上原有的标志文件flag复制到新合并的目标文件中,并用新合并的目标文件替换旧的目标文件。
所述小文件查询步骤包括,步骤21,获取需要访问所述文件F,首先查询所述表key_list上是否记录了所述文件F的key,如果记录了所述文件F,则根据所述key从所述Memcache中取出所述文件F,返回给所述客户端,否则执行步骤22;
步骤22,查询所述表key_process,如果记录了key,则从所述Memcache中用key取出所述文件F,否则执行步骤23;
步骤23,根据所述文件F,查询所述文件F对应的目标文件的位置;
步骤24,查询目标文件中的标志文件flag中是否记录目标文件的文件名,如果有,则返回客户端目标文件不存在,否则执行步骤25;
步骤25,从该目标文件中的_masterindex与_index中查询所述文件F,并返回给客户端。
本发明还提出一种针对小文件合并的批量删除/查询装置,包括:
将小文件上传到Memcache模块,用于客户端上传的小文件到目标文件中,将所述小文件的名称作为key,将所述小文件的内容作为value,上传到Memcache中,将所述key写到表key_list上,所述表key_list存储在所述Memcache中,所述表key_list记录所述Memcache中存储的所有小文件的key;
小文件删除模块,用于在所述目标文件中添加标志文件flag,以及标志文件DE_flag,所述客户端收到删除所述小文件的请求后,先从所述表key_list中查询是否存在所述小文件的所述key,若存在,则从所述Memcache中取出并删除所述小文件,并删除所述表key_list中所述小文件的所述key,否则在所述标识文件flag中记录所述小文件的文件名
小文件查询模块,用于获取需要查询的文件F,查询所述表key_list上记录的所述文件F的key,根据所述key从所述Memcache中取出所述文件F,返回给所述客户端。
所述将小文件上传到Memcache模块包括预测所述Memcache中是否存在足够的空间容纳所述小文件其中所述Memcache中剩余空间为Li,所述小文件大小为Si,所述Memcache总空间为P,若Li+Si<=P,则将所述小文件放入所述Memcache中,若Li+fi>P,则将所述小文件存储到磁盘上,不再有新的小文件上传后,再将磁盘上的小文件上传到所述Memcache中;将线程进行加锁,保证同时只有一个线程执行写所述表key_list;从所述Memcache上下载所述表key_list;将所述小文件的文件名以及所述目标文件的文件名追加到key_list文件后;将所述表key_list上传到所述Memcache,将线程进行解锁。
所述小文件删除模块,还包括
根据所述小文件的文件名查询要删除的小文件所在的目标文件的位置;
在与所述目标文件相对于的标志文件flag上记录信息,所述信息为要删除的小文件的文件名;
设置一阈值V,定期遍历每一个合并后的目标文件下的标志文件flag与_index文件,并读取这两个文件的行数c1与c2,当c1/c2<V时,不做任何操作,当c1/c2>=V时,则另外起用一个线程,对目标文件进行重新合并,重新合并步骤为:
在目标文件所在文件夹下新建标志文件DE_flag,把合并后的目标文件恢复成小文件,并下载到本地,把标志文件flag也下载到本地,并清空所述标志文件flag;
读取本地的标志文件flag,按行获取信息,每一行为一个要删除的文件,从本地的小文件中找到要删除的文件并删除;
把删除完成后剩余的小文件上传到HDFS,并利用hadoop archive的方法进行重新合并;
把HDFS上原有的标志文件flag复制到新合并的目标文件中,并用新合并的目标文件替换旧的目标文件。
还包括小文件查询模块用于执行以下步骤:步骤21,获取需要访问文件F,首先查询所述表key_list上是否记录了所述文件F的key,如果记录了所述文件F,则根据所述key从所述Memcache中取出所述文件F,返回给所述客户端,否则执行步骤22;
步骤22,查询所述表key_process,如果记录了key,则从所述Memcache中用key取出所述文件F,否则执行步骤23;
步骤23,根据所述文件F,查询所述文件F对应的目标文件的位置;
步骤24,查询目标文件中的标志文件flag中是否记录目标文件的文件名,如果有,则返回客户端目标文件不存在,否则执行步骤25;
步骤25,从目标文件中的_masterindex与_index中查询所述文件F,并返回给客户端。
由以上方案可知,本发明的优点在于:
本发明能够对系统中目标文件的内容进行动态调整,满足用户的需要。对于小文件的存储和管理具有重要的作用,具有良好的前景和应用价值。
附图说明
图1是追加文件缓存Memcache流程图;
图2是小文件追加到HDFS上的目标文件中图;
图3是删除小文件图。
具体实施方式
为了解决现有技术中存在的技术问题,本发明提出一种针对小文件合并的批量删除/查询方法与装置,包括:
本发明提出一种针对小文件合并的批量删除/查询方法,包括:
将小文件上传到Memcache步骤,客户端上传的小文件到目标文件中,将所述小文件的名称作为key,将所述小文件的内容作为value,上传到Memcache中,将所述key写到表key_list上,所述表key_list存储在所述Memcache中,所述表key_list记录所述Memcache中存储的所有小文件的key;
小文件删除步骤,在所述目标文件中添加标志文件flag,以及标志文件DE_flag,所述客户端收到删除所述小文件的请求后,先从所述表key_list中查找是否存在所述小文件的所述key,若存在,则从所述Memcache中取出并删除所述小文件,并删除所述表key_list中所述小文件的所述key,否则在所述标识文件flag中记录所述小文件的文件名;
小文件查询步骤,获取需要查询的文件F,查询所述表key_list上记录的所述文件F的key,根据所述key从所述Memcache中取出所述文件F,返回给所述客户端。
所述将小文件上传到Memcache步骤包括预测所述Memcache中是否存在足够的空间容纳所述小文件其中所述Memcache中剩余空间为Li,所述小文件大小为Si,所述Memcache总空间为P,若Li+Si<=P,则将所述小文件放入所述Memcache中,若Li+fi>P,则将所述小文件存储到磁盘上,不再有新的小文件上传后,再将磁盘上的小文件上传到所述Memcache中;将线程进行加锁,保证同时只有一个线程执行写所述表key_list;从所述Memcache上下载所述表key_list;将所述小文件的文件名以及所述目标文件的文件名追加到key_list文件后;将所述表key_list上传到所述Memcache,将线程进行解锁。
所述小文件删除步骤,还包括
根据所述小文件的文件名查找要删除的小文件所在的目标文件的位置;
在与所述目标文件相对于的标志文件flag上记录信息,所述信息为要删除的小文件的文件名;
设置一阈值V,定期遍历每一个合并后的目标文件下的标志文件flag与_index文件,并读取这两个文件的行数c1与c2,当c1/c2<V时,不做任何操作,当c1/c2>=V时,则另外起用一个线程,对目标文件进行重新合并,重新合并步骤为:
在目标文件所在文件夹下新建标志文件DE_flag,把合并后的目标文件恢复成小文件,并下载到本地,把标志文件flag也下载到本地,并清空所述标志文件flag;
读取本地的标志文件flag,按行获取信息,每一行为一个要删除的文件,从本地的小文件中找到要删除的文件并删除;
把删除完成后剩余的小文件上传到HDFS,并利用hadoop archive的方法进行重新合并;
把HDFS上原有的标志文件flag复制到新合并的目标文件中,并用新合并的目标文件替换旧的目标文件。
所述小文件查询步骤包括,步骤21,获取需要访问所述文件F,首先查询所述表key_list上是否记录了所述文件F的key,如果记录了所述文件F,则根据所述key从所述Memcache中取出所述文件F,返回给所述客户端,否则执行步骤22;
步骤22,查询所述表key_process,如果记录了key,则从所述Memcache中用key取出所述文件F,否则执行步骤23;
步骤23,根据所述文件F,查询所述文件F对应的目标文件的位置;
步骤24,查询目标文件中的标志文件flag中是否记录目标文件的文件名,如果有,则返回客户端目标文件不存在,否则执行步骤25;
步骤25,从该目标文件中的_masterindex与_index中查询所述文件F,并返回给客户端。
本发明还提出一种针对小文件合并的批量删除/查询装置,包括:
将小文件上传到Memcache模块,用于客户端上传的小文件到目标文件中,将所述小文件的名称作为key,将所述小文件的内容作为value,上传到Memcache中,将所述key写到表key_list上,所述表key_list存储在所述Memcache中,所述表key_list记录所述Memcache中存储的所有小文件的key;
小文件删除模块,用于在所述目标文件中添加标志文件flag,以及标志文件DE_flag,所述客户端收到删除所述小文件的请求后,先从所述表key_list中查询是否存在所述小文件的所述key,若存在,则从所述Memcache中取出并删除所述小文件,并删除所述表key_list中所述小文件的所述key,否则在所述标识文件flag中记录所述小文件的文件名
小文件查询模块,用于获取需要查询的文件F,查询所述表key_list上记录的所述文件F的key,根据所述key从所述Memcache中取出所述文件F,返回给所述客户端。
所述将小文件上传到Memcache模块包括预测所述Memcache中是否存在足够的空间容纳所述小文件其中所述Memcache中剩余空间为Li,所述小文件大小为Si,所述Memcache总空间为P,若Li+Si<=P,则将所述小文件放入所述Memcache中,若Li+fi>P,则将所述小文件存储到磁盘上,不再有新的小文件上传后,再将磁盘上的小文件上传到所述Memcache中;将线程进行加锁,保证同时只有一个线程执行写所述表key_list;从所述Memcache上下载所述表key_list;将所述小文件的文件名以及所述目标文件的文件名追加到key_list文件后;将所述表key_list上传到所述Memcache,将线程进行解锁。
所述小文件删除模块,还包括
根据所述小文件的文件名查询要删除的小文件所在的目标文件的位置;
在与所述目标文件相对于的标志文件flag上记录信息,所述信息为要删除的小文件的文件名;
设置一阈值V,定期遍历每一个合并后的目标文件下的标志文件flag与_index文件,并读取这两个文件的行数c1与c2,当c1/c2<V时,不做任何操作,当c1/c2>=V时,则另外起用一个线程,对目标文件进行重新合并,重新合并步骤为:
在目标文件所在文件夹下新建标志文件DE_flag,把合并后的目标文件恢复成小文件,并下载到本地,把标志文件flag也下载到本地,并清空所述标志文件flag;
读取本地的标志文件flag,按行获取信息,每一行为一个要删除的文件,从本地的小文件中找到要删除的文件并删除;
把删除完成后剩余的小文件上传到HDFS,并利用hadoop archive的方法进行重新合并;
把HDFS上原有的标志文件flag复制到新合并的目标文件中,并用新合并的目标文件替换旧的目标文件。
小文件查询模块用于执行以下步骤:步骤21,获取需要访问文件F,首先查询所述表key_list上是否记录了所述文件F的key,如果记录了所述文件F,则根据所述key从所述Memcache中取出所述文件F,返回给所述客户端,否则执行步骤22;
步骤22,查询所述表key_process,如果记录了key,则从所述Memcache中用key取出所述文件F,否则执行步骤23;
步骤23,根据所述文件F,查询所述文件F对应的目标文件的位置;
步骤24,查询目标文件中的标志文件flag中是否记录目标文件的文件名,如果有,则返回客户端目标文件不存在,否则执行步骤25;
步骤25,从目标文件中的_masterindex与_index中查询所述文件F,并返回给客户端。
下面结合附图1,2,更进一步描述本发明步骤,如图1,2本发明追加文件的步骤包含连续执行:A、缓存文件;B、将小文件追加到HDFS上的目标文件中。具体的一种实施方式如下:
A.缓存文件,将文件从客户端上传到Memcache中。其实现方法为:
A1.用户从客户端发出追加小文件请求,包括小文件fi,文件路径pi,文件名srci,目标文件名desti;
A2.将文件名srci作为key,fi作为value,然后上传到Memcache中,分别执行以下步骤:
A2-1:预测Memcache中是否有足够的空间能容纳fi。Memcache中剩余空间为Li,fi大小为Si,总空间为P,比较Li+Si与P的大小。这里有两种可能:1)Li+Si<=P,即Memcache的空间足以容纳fi,则将fi放入Memcache中;2)Li+Si>P,也就是说Memcache已经不能容纳下fi了,则将fi存储到磁盘上。不再有新的小文件上传后,再将磁盘上的小文件上传到Memcache中。
A3.将上传文件名srci以及目标文件名desti写入key_list文件中。分别执行以下步骤:
A3-1:加锁,保证同时只有一个线程写key_list文件;
A3-2:从Memcache上下载key_list文件;
A3-3:将需要上传文件的文件名srci以及目标文件名desti追加到key_list文件后;
A3-4:将key_list上传到Memcache,解锁。
B.将小文件追加到HDFS上的目标文件中,其实现方法为:
B1.从Memcache上下载key_list,得到Memcache上的文件名列表,用变量count记录当前正在运行的线程数;
B2.将key_list复制到文件key_process中,清空key_list,上传key_list和key_process;
B3.判断是否开始追加下一个小文件,这里有两种可能情况:1)count<n,则从key_process中取出一个srci和desti,从Memcache上得到相应的fi,执行B4;2)count>=n,则等待有线程执行完毕(其中n为最大并发处理数);
B4.创建一个新线程,判断desti目标文件下是否包含标志文件DE_flag,这里有两种情况:1)包含,则说明该目标文件正在进行删除操作,故挂起线程,等待删除结束;2)不包含,则执行B5;
B5.判断desti目标文件下是否包含标志文件ADD_flag,这里有两种情况:1)包含,则说明目标文件正在进行追加操作,故挂起线程,等待追加结束;2)不包含,则执行B6;
B6.将fi追加到desti中;目标文件所在文件夹下包括四个文件:标志文件:SUCCESS;数据文件:part-x,文件的内容;索引文件:记录part中偏移的_index以及记录_index中的偏移_masterindex。这里要追加后三个文件,步骤如下所示:
B6-1:在desti下查找标号最大的part文件(part-m);在目标文件desti目录下遍历part-x文件,得到各个文件的名称,找到x最大的为part-m;
B6-2:预测fi追加到part-m后是否会超过part-m的最大限制。Fi大小为si,part-m大小为pi,文件大小限制为L。1)若si+pi>L,则新建一个part-(m+1)文件,将fi写入part-(m+1)中;2)若si+pi<=L,则将fi以字节流的形式追加到desti下的part-m文件后面;
B6-3:将文件名srci,文件大小,权限,时间戳,在part-x文件中的起始位置等内容以字节流的形式追加到_index文件后面,其中_index记录了文件在part-x中的存储偏移位置;
B6-4:_masterindex记录了_index文件中的偏移位置,将追加前的_index文件大小以及追加后的文件大小以字节流的形式写入_masterindex中;
B7.删除Memcache中的小文件fi;
B8.T记录当前时间,在t时间后,再进行下一批文件追加。
如图3,将小文件从HDFS上的目标文件中删除,具体的实施方式如下:
C1.客户端发出删除小文件fd的请求。
C2.从key_list文件中查找是否存在该小文件的记录,存在则从Memcache中取出并删除该小文件,并删除key_list文件中的该小文件的记录,删除小文件请求处理结束。若key_list文件中不存在该小文件的key,则继续往下执行。
C3.根据fd找到要删除的小文件所在的目标文件的位置。
C4.在该目标文件所在的文件下的标志文件flag上记录一行信息,该信息即为要删除的小文件的文件名。
C5.设定一个阈值V,定期遍历每一个合并后的目标文件下的标志文件flag和_index文件,并读取这两个文件的行数c1和c2。当c1/c2<V时,不做任何操作;当c1/c2>=V时,则另起一个线程,对该目标文件进行重新合并,重新合并过程如下:
C5-1.在该目标文件所在文件夹下新建DE_flag标志文档,把合并后的目标文件恢复成小文件下载到本地,把标志文件flag也下载到本地,并清空hdfs上的此标志文件flag。
C5-2.读取本地的标志文件flag,按行获取信息,每一行就是一个要删除的文件,从本地的小文件中找到要删除的文件并删除。
C5-3.把剩下的小文件上传到HDFS,并利用hadoop archive的方法进行重新合并。
C5-4.把HDFS上原的标志文件flag复制到新合并好的目标文件.har中,并用该文件夹替换旧的目标文件夹。
访问小文件,具体的实施方式如下:
D1.客户端发出访问请求,需要访问F文件,首先查找key_list文件上面是否记录了key,如果记录了要访问的文件,则直接根据该key从Memcache中取出该文件,返回给客户端。如果没有执行D2。
D2.查找key_process文件,如果记录了key,则从Memcache中用key取出该文件;否则执行D3。
D3.根据F文件,找到该文件对应的目标文件的位置。
D4.查找该目标文件中的标志文件flag中是否记录该文件名,如果有,则返回客户端该文件不存在。如果无,则执行D3。
D5.从该目标文件中的_masterindex和_index中查找F文件,并返回给客户端。