一种分布式文件重复数据删除系统及方法与流程

文档序号:21819534发布日期:2020-08-11 21:34阅读:174来源:国知局
一种分布式文件重复数据删除系统及方法与流程

本发明涉及数据重复删除技术领域,尤其涉及一种分布式文件重复数据删除系统及方法。



背景技术:

hadoop在处理某些特定数据时,特定数据中冗余的数据会影响系统的存储效率,浪费存储资源。而重复数据删除技术可以有效识别系统中重复的文件或数据块,节省系统存储空间,提高系统资源有效使用率。hadoop是当前大数据领域中主流的开发平台,如能将重复数据删除技术应用在hadoop平台当中,可有效促进当前大数据的发展。

目前在hadoop上实现重复删除技术的相关设计,过多的关注于重复数据删除技术本身,而没有贴合hadoop自身的一些特性去分析设计,导致其并不适合在hadoop中应用。目前设计中的主要缺点有:

1、首先服务端只有一个而且只有这个服务端能与hdfs交互,这使得服务端成为系统的瓶颈所在,没有充分发挥分布式系统的优势;

2、其次系统中客户端只提供文件的下载与上传,缺少流式数据访问和存储的功能;

3、与hadoop的抽象文件系统不兼容,hadoop上的应用功能程序如mapreduce程序无法直接使用,这严重限制了重删系统的使用范围;

4、没有考虑故障恢复问题,hbase和redis没有隔离级别,不带回滚功能,不适合作为元信息信息的管理。



技术实现要素:

本发明的目的在于克服现有技术的不足,提供一种带有重复数据删除功能的分布式文件系统,能在hdfs客户端完成文件分块、指纹计算和去重,将去重后的数据块和索引数据重组后生成新的索引文件写入到hdfs系统中。

本发明的目的是通过以下技术方案来实现的:

一种分布式文件重复数据删除系统,包括元信息服务节点、元信息表、至少一个hdfs客户端。元信息服务节点和元信息表设置在hdfs客户端上。

元信息服务节点,元信息服务节点用于管理数据块的内容地址;元信息表,用于存储hdfs系统中所有数据块的内容地址。

hdfs客户端,去重文件在hdfs客户端上写入,hdfs客户端将去重文件切分为多个数据块随机读取去重文件,将去重文件切分为多个数据块,计算每个数据块的指纹值,并调用元信息服务节点查询元信息表,去除重复的数据块,之后将剩余数据块和索引数据重组后生成新的索引文件,并与namenode节点交互将索引文件存储到hdfs上,同时将新产生的数据指纹存储在数据库的元信息表中。

具体的,所述数据块的内容地址包括数据块的指纹值、引用者数量、文件路径及名字、数据块相对文件的偏移、数据块的大小以及文件创建时间。

具体的,所述hdfs客户端数据库为mysql数据库,其事物隔离级别设置为读已提交,用于保证去重后的数据块指纹值能够并发的写入到元信息表。

具体的,所述元信息表中增加一个id值以替换hash值作为元信息表的主键,用于避免元信息表并发写入文件时发生主键冲突。

一种分布式文件重复数据删除方法,包括以下步骤:

文件读取,hdfs客户端随机读取去重文件,并核对去重文件的文件权限等属性信息,无误后打开去重文件,同时将文件打开信息存储到元信息表中;

数据切分,hdfs客户端并行调用基于内容的切块算法对打开的去重文件数据进行切分,将去重切分为多个数据块;

计算指纹值,hdfs客户端根据哈希函数计算出多个数据块的指纹值;

数据块去重,hdfs客户端根据计算出的多个数据块指纹值,通过元信息服务节点查询元信息表中hdfs系统所有数据块的指纹值,并将二者进行比较,去掉重复的数据块,同时将剩余数据块的指纹值写入到hdfs客户端数据库的元信息表中;

文件存储,hdfs客户端将并将剩余的数据块和索引数据重组为新的索引文件,将索引文件存储到hdfs上。

本发明的有益效果:

1、能在提供文件的下载与上传的同时,实现流式数据访问和存储的功能;

2、能兼容hadoop的抽象文件系统,直接使用hadoop上的应用功能程序;

3、具备故障恢复功能,hdfs可以同时和多个客户端端进行交互。

附图说明

图1是本发明的系统结构图。

图2是本发明的随机读取实施例图。

图3是本发明的metablock逻辑结构图。

图4是本发明的文件删除实施例图。

图5是本发明索引文件的结构示意图。

图6是本发明索引文件的逻辑存储结构图。

图7是本发明索引文件索引部分的逻辑结构图。

图8是本发明索引文件的写入流程图。

图9是本发明索引文件的读取流程图。

图10是本发明的方法流程图。

具体实施方式

为了对本发明的技术特征、目的和效果有更加清楚的理解,现对照附图说明本发明的具体实施方式。

本实施例中,如图1所示,一种分布式文件重复数据删除系统,包括元信息服务节点、元信息表、至少一个hdfs客户端。元信息服务节点和元信息表分别设置在hdfs客户端上。

其中,元信息服务节点用于管理数据块的内容地址,其数据块的内容地址包括数据块的指纹值、引用者数量、文件路径及名字、数据块相对文件的偏移、数据块的大小以及文件创建时间。元信息服务节点建立通过接口blockmeta,来完成包括数据块内容地址的插入、更新和查询等操作。blockmeta接口中主要操作有:putblock操作,完成对数据块内容地址的插入,主要信息有数据块md5指纹摘要、数据块内容地址。getblock操作,根据数据块md5指纹摘在元信息表中获取数据块的内容地址。removeblock操作,移除数据块内容地址。isexist操作,判断数据块是否已存在。commit操作,一个文件写入成功之后,提交此次事物,并针对索引列表中所有的内容地址引用数原子性自动增加一。abort操作,如文件写入过程中发生错误,可用此操作完成对元信息数据库事物的回滚。

元信息表,用于存储hdfs系统中所有数据块的内容地址,元信息表应包括7个字段分别是主键id、hash值、文件路径及名字、数据块相对文件的偏移、数据块的大小、文件创建时间以及使用者数量。在重复数据删除系统中,元信息表需要考虑文件并非更新的问题,文件并发更新问题主要是系统在并发写入时遇到的文件存储问题。并发的文件写入对于元信息表来说是并发的事务,事务并发就要考虑对存储元信息表的数据库设置隔离级别。常见事务隔离级别包含读未提交、读已提交、可重复读和可串行性化四种。为了保证并发写入下系统运行稳定,系统选择将元信息表设置在mysql数据库中,将数据库的事物隔离级别设置为读已提交。此外,在元信息表中,不再以hash值做主键,增加另一个id值作为表的主键,允许h个别hash值重复即数据块重复,以牺牲一小部分系统磁盘存储空间来降低文件写入过程中文件写入失败的风险,以此提高系统的稳定性。

客户端在写入文件过程中,需要将去重文件的数据流切分为多个数据块,根据数据块进行重复数据删除。一般数据划分的粒度越小,能查找到重复数据的可能性越高,重删率越高;数据块划分的越大,查找到重复数据的可能性越低,重删率越低。所有本系统中使用基于内容的切块算法来完成对文件数据的切分,算法中使用min和max来保证数据块的最小值和最大值,避免数据块太小或太大,以此保证能使系统获取最大的重删率。切分成功后,还需要使用哈希函数计算出各个数据块的指纹值,用于去除重复的数据块。

在进行重复数据删除的过程中,hdfs客户端首先对输入的去重文件进行随机读取,主要是通过去重文件的读取输入流实现的,系统不在首先恢复文件所有的数据,而是根据用户访问的文件位置和访问数据的大小,动态恢复所需的文件数据。随机读取实现的一个优选实施例如图2所示。其中,在文件索引部分中的metablock区域中增加了一个bitmap区域,此区域是indexblock的一个索引,根据localoffset大小存储每个indexblock的位置信息,可有效减少系统随机读取时从datanode传输的数据量,增加bitmap区域的metablock逻辑结构如图3所示。随机读取时,系统不再读取全部的indexblock,而是先读取bitmap信息,在bitmap里locaoffset是按顺序固定排列的,因此可以使用二分查找快速查找目标位置position所在的内容地址indexblock,然后再根据其内容地址读取相关数据块的数据,有效地避免了hdfs客户端和数据节点之间不必要的数据传输。

在数据块的去重过程中,hdfs客户端根据计算出的各个数据块的指纹值,调用元信息服务节点到数据库中元信息表的所有数据块指纹值进行匹配查询,查找出重复的数据块,剩余查找不到的数据库指纹值即是“新指纹”,元信息服务节点将“新指纹”插入到元信息表后,将“新指纹”回复给hdfs客户端。若节点匹配不到某一数据块的指纹值时,则证明该数据块是唯一的,直接将数据块的指纹值插入元信息表,并返回到hdfs客户端。

hdfs客户端根据节点返回数据块指纹值,删除掉重复的数据块,将剩余数据块重组为文件的数据部分。在系统进行文件删除或重命名过程中,现需要保存每个文件的创建时间,以此来区分不同时间点创建的文件,满足删除功能的需要。系统利用hadoop平台的扩展属性特性,来存储文件创建时间。具体是为每个写入的文件添加一个key为user.createtime的扩展属性,扩展属性的value保存64位的创建时间戳。当文件被删除或被移动或重命名时,则直接将文件移至/delete目录空间下,并在/delete空间下创建路径为“/delete+文件绝对路径+/文件名字”的目录,修改文件名字为其扩展属性里的创建时间并将文件移至上述创建的目录当中,以创建时间戳命名文件的目的是为了区分不同时期删除的文件。具体删除示例如图4所示,图4中系统最初有一个file1.txt,当用户执行删除操作时,file1文件以其user.createtime中的时间戳1584190386649重命名,并将文件移至/delete/usr/file1.txt/目录下,这样操作可以不影响以后文件相同文件名的创建和删除。当其他文件以数据块内容地址查找此文件时,系统会先行判断文件是否存在以及创建时间是否匹配,当文件不存或时间戳不匹配意味着文件已被删除,这时则去“/delete+文件绝对路径+/文件名字”目录下查找以创建时间戳命名的文件。文件删除还可以继续优化下,若文件内数据并没有新数据块,即文件内全是索引部分并没有数据部分,那么这种文件可以直接从hdfs上删除,不用再移入/delete目录下。文件重命名包括用户重新修改文件所在路径或文件名字,这时要用到hdfs下的符号连接技术。文件重命名的操作和文件删除类似,只不过多了一步创建符号连接文件。当用户重命名文件时,系统首先执行文件删除操作,然后在新目录下创建新的符号连接文件,符号连接指向被删除的文件。如重命名/usr/local/file1.txt为/usr/local/data/file2.txt,系统首先执行删除文件操作,然后创建新目录/usr/local/data,并在新目录下创建一个file2.txt的符号连接,此符号连接指向/delete/usr/local/file1.txt,最终重命名后hdfs上的文件为/usr/local/data/file2.txt(symboliclink>/delete/usr/local/file1.txt)。

客户端将文件数据块去重后,会在hdfs创建一个索引文件,此索引文件包括数据部分和索引部分。在本系统中,由于存储的是原始文件中不重复的数据块,存储时直接将多个数据块合并顺序存储,便于系统恢复文件。在系统的索引结构中,数据部分是文件不重复的数据块,而索引部分是原始文件所有数据块的内容地址。为了保证系统能正确恢复文件数据,索引部分必须含有所有数据块内容地址和数据块所在原始文件的位置信息,数据块内容地址就是元信息表所存储的信息,包括数据块hash值和数据块所在文件路径、偏移、大小等。

索引文件的设计过程中,系统将索引文件的前部分作为数据部分,后部分作为索引部分。设计好的索引文件结构如图5所示,新的设计下,索引部分数据直接追加在数据文件的后面,索引可以指向其他文件中的数据,也可以指向本文件前部分的数据,这种设计保证了数据文件和索引文件是用一个文件,相比之前的设计有效减少了文件数量,避免过多的创建文件进而导致namenode内存被占用的问题。索引文件中数据部分是原始文件不重复的数据块,而索引部分是原始文件所有数据块的内容地址。为了保证系统能正确恢复文件数据,索引部分必须含有所有数据块内容地址和数据块所在原始文件的位置信息,数据块内容地址就是元信息表所存储的信息,包括数据块所在文件路径、偏移、大小、文件名和创建时间等。

索引文件的逻辑存储结构如图6所示。其中datablock存储的是原始文件中不重复的数据块,存储时直接将多个数据块合并顺序存储。indexblock就是存储数据块的内容地址(不包含数据块的hash值)和数据块在原始文件中的位置,并且整个索引部分除去最后8字节内容,其他地址数据都是以字符串的形式存储,详细索引结构如图7所示。metablock则是一个固定8字节长度的数字,放在索引部分的结尾,其存储索引部分在索引文件中的位置信息。图7中,localoffset是数据块在原始文件中的位置信息,另外的path、offset、size分别存储的是数据块内容地址中数据块所在文件路径、偏移和大小,三者信息和元信息表存储的信息保持一致。indexblock与indexblock之间用特殊字符’\n’分割,而indexblock内部不同部分之间用特殊分隔符’#’分割。

构建索引文件,将原始文件不重复的数据块合并顺序存储在索引文件数据部分,同时将数据块在原始文件中的位置信息、数据块的数据内容地址和索引部分在索引文件中的位置信息存储在索引文件的索引部分,生成索引文件并存储在hdfs上。

本实施例中,如图8所示,系统在索引文件下的文件写入流程如下:首先系统会在hdfs创建相关文件并保存文件的创建时间,其次对文件数据进行切块并根据元信息表信息进行比对去重,之后再将去重后的数据写入到索引文件的前面数据部分、索引数据写在索引文件的后面索引部分。

本实施例中,如图9所示,系统在索引文件下的文件读取流程如下:首先当系统会去hdfs上打开索引文件并读取后半部分的索引信息,以获取原始文件数据块的内容地址(包含路径b_path、文件名b_name、文件偏移b_offset、大小b_size,创建时间createtime),然后根据数据块的内容地址去读取数据块数据。使用内容地址去对应文件位置b_path读取文件b_name时,可能会遇到有三种情况:一种是文件存在并且文件创建时间和内容地址中保存的createtime相同,顺利读取数据;第二种是文件存在但创建时间和内容地址中不同,这意味着文件已被用户删除并且有新的相同文件已被创建;第三种就是文件不存,此时文件已被用户删除。后两种情况系统需要去重复数据删除系统中文件删除目录/delete里面查找数据,查找时需要文件名变更成createtime,查找目录路径变为/delete/b_path/b_name。

在系统恢复文件开始时系统会初始化一个hdfs客户端用于访问hdfs上的数据,然后根据要读取的文件去hdfs读取索引文件后8个字节的数据,用于获取索引部分偏移地址indexoffset;然后根据这个偏移地址indexoffset读取索引部分数据indexdata,这个indexdata包含多个indexblock;循环遍历indexdata,读取每个indexblock,根据每个indexblcok内的内容地址去hdfs读取相关数据块的数据blockdata;最后使用这些数据块数据重组原始文件。

本实施例中,如图10所示,一种分布式文件重复数据删除方法,包括以下步骤:

文件读取,hdfs客户端随机读取去重文件,并核对去重文件的文件权限等属性信息,无误后打开去重文件,同时将文件打开信息存储到元信息表中;

数据切分,hdfs客户端并行调用基于内容的切块算法对打开的去重文件数据进行切分,将去重切分为多个数据块;

计算指纹值,hdfs客户端根据哈希函数计算出多个数据块的指纹值;

数据块去重,hdfs客户端根据计算出的多个数据块指纹值,通过元信息服务节点查询元信息表中hdfs系统所有数据块的指纹值,并将二者进行比较,去掉重复的数据块,同时将剩余数据块的指纹值写入到hdfs客户端数据库的元信息表中;

文件存储,hdfs客户端将并将剩余的数据块和索引数据重组为新的索引文件,将索引文件存储到hdfs上。

以上显示和描述了本发明的基本原理和主要特征和本发明的优点。本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的只是说明本发明的原理,在不脱离本发明精神和范围的前提下,本发明还会有各种变化和改进,这些变化和改进都落入要求保护的本发明范围内。本发明要求保护的范围由所附的权利要求书及其等效物界定。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1