发明内容
针对现有技术的不足,本发明提出分布式文件***小文件合并的并行追加方法及***。
本发明提出一种分布式文件***小文件合并的并行追加方法,包括:
将小文件上传到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开销,使追加小文件更加高效。
具体实施方式
为了解决现有技术中存在的技术问题,本发明提出一种分布式文件***小文件合并的并行追加方法,包括:
将小文件上传到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,并返回给客户端。