一种数据合并的方法和装置制造方法

文档序号:6634205阅读:125来源:国知局
一种数据合并的方法和装置制造方法【专利摘要】本发明公开了一种数据合并的方法和装置,涉及计算机【
技术领域
】。所述方法包括:获取每个存储表的平均数据长度,并以所述平均数据长度对各个存储表进行分类;所述平均数据长度为存储表中存储的各用户数据的平均数据长度;将同一分类的存储表对应的合并任务提交至负责所述分类的工作队列中;由所述工作队列的工作线程执行所述合并任务。本发明解决了平均数据长度短keyspace的sstable文件的合并阻塞整个各keyspace之间的compaction过程的问题,取得了可使不同数据长度的keyspace均可以及时的完成其SStable的合并,缩短系统整体compaction的时间有益效果。【专利说明】一种数据合并的方法和装置【
技术领域
】[0001]本发明涉及计算机【
技术领域
】,具体涉及一种数据合并的方法和装置。【
背景技术
】[0002]目前几乎所有的大数据存储系统,基于存储与读写性能的考虑,在实现上都采用对了数据Append模式,即所有的写操作都将先将数据写入内存中的Memtable(内存表)即可,Memtable写满后Dump(转储)到磁盘上的SSTable(SortedStringTable,有序字符串表)文件中。[0003]但是,当磁盘上SSTable文件数过多的时候,会导致来自客户端的检索请求所打开的文件数会很多,单个请求的资源消耗大幅增加,从而导致整个系统的吞吐和性能大幅下降。因此,系统需要再后台通过Compact1n(可以理解为合并)机制将全部或部分SSTable文件合并成新的SSTable文件,以达到降低文件个数提高系统吞吐和性能、去除重复数据节省磁盘空间的目的。[0004]但是现有的Compact1n机制如图1所述,系统存在一个Compact1n工作队列TaskQueue,当SSTable个数等满足一定的条件时会将这些SSTable文件作为一个Compact1n(如图1中compact1ntask0>compact1ntaskl>compact1ntask2)任务提交到工作队列中。每一个Compact1n过程就是一个工作任务,工作线程worker按照提交顺序串行的执行Compact1n任务,完成对应SSTable文件的合并。[0005]但是随着用户的Keyspace(在Cassandra中,Keyspace就是数据的存储容器,一般Keyspace的存储大小是一样的)越来越多,以及数据的持续写入,各Keyspace的SSTable文件的个数会越来越多。而由于Compact1n过程本质上是一个多路归并操作,即从若干个参与Compact1n过程的SSTable文件中逐个读取每个key及其数据,进而合并输出到一个SSTable文件中。因此,对于那些平均数据长度很小(如几字节)的Keyspace而言,其做一次Compact1n的时间远大于那些平均数据长度很大(如几百K)的Keyspace的Compact1n时间。因为一般存储系统在keyspace由memtable表dump到磁盘时,memtable的容量是固定的,那么平均数据长度越小的keyspace中,其存储的用户数据条数更多,其key也更多。[0006]那么,由图1的现有技术过程可知,在一个工作队列中,当包括大量的平均数据长度较小的SSTable的Compact1n任务执行时,其Compact1n过程持续时间很长,会严重阻塞其他Keyspace的SSTable的合并,从而导致系统层面整体数据Compact1n执行时间过长,甚至无法保证每天新增数据的合并,进而导致系统访问吞吐性能下降。【
发明内容】[0007]鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的一种数据合并的装置和相应的一种数据合并的方法。[0008]依据本发明的一个方面,提供了一种数据合并的方法,包括:[0009]获取每个存储表的平均数据长度,并以所述平均数据长度对各个存储表进行分类;所述平均数据长度为存储表中存储的各用户数据的平均数据长度;[0010]将同一分类的存储表对应的合并任务提交至负责所述分类的工作队列中;[0011]由所述工作队列的工作线程执行所述合并任务。[0012]优选的,还包括:[0013]创建至少两个工作队列,所述工作队列的个数至少等于所述分类个数。[0014]优选的,所述创建至少两个工作队列包括:[0015]在系统启动时加载配置文件,通过所述配置文件设置并创建至少两个工作队列;所述配置文件中包括平均数据长度的分类与工作队列的对应关系。[0016]优选的,还包括:[0017]针对系统中的每个存储表,获取所述存储表的内存表数据转储至磁盘后的平均数据长度,并将所述平均数据长度存入所述存储表在系统内存的数据结构中。[0018]优选的,针对系统中的每个存储表,获取所述存储表的内存表数据转储至磁盘后的平均数据长度,并将所述平均数据长度存入所述存储表在系统内存的数据结构中,包括:[0019]在系统加载索引时,根据索引中记录的键的文件偏移和数据长度,计算现已存储所述存储表的用户数据的平均数据长度,并将所述平均数据长度存入所述数据结构;[0020]在每次将存储表的内存表数据转储至磁盘时,利用内存表数据中新增的数据长度修正所述平均数据长度,并将修正后的平均数据长度更新至所述数据结构中。[0021]优选的,将各存储表按平均数据长度进行分类包括:[0022]针对每一个存储表,从所述系统内存的数据结构中提取平均数据长度,根据所述平均数据长度对所述存储表进行分类。[0023]优选的,由所述工作队列的工作线程执行所述合并任务包括:[0024]通过至少一个工作线程并行执行所述工作队列中的各个合并任务。[0025]优选的,通过至少一个工作线程执行工作队列中的各个合并任务后,还包括:[0026]当一工作队列中等待执行的合并任务的数量大于阈值时,自动增加新的工作线程以并行执行所述工作队列中的合并任务。[0027]优选的,将各存储表按平均数据长度进行分类之前,还包括:[0028]针对每个存储表生成一个合并任务。[0029]依据本发明了另外一个方面,提供了一种数据合并的装置,包括:[0030]存储表分类模块,适于获取每个存储表的平均数据长度,并以所述平均数据长度对各个存储表进行分类;所述平均数据长度为存储表中存储的各用户数据的平均数据长度;[0031]任务提交模块,适于将同一分类的存储表对应的合并任务提交至负责所述分类的工作队列中;[0032]任务处理模块,适于由所述工作队列的工作线程执行所述合并任务。[0033]优选的,还包括:[0034]工作队列创建模块,适于创建至少两个工作队列,所述工作队列的个数至少等于所述分类个数。[0035]优选的,所述工作队列创建模块包括:[0036]第一工作队列加载模块,适于在系统启动时加载配置文件,通过所述配置文件设置并创建至少两个工作队列;所述配置文件中包括平均数据长度的分类与工作队列的对应关系。[0037]优选的,还包括:[0038]数据长度统计模块,适于针对系统中的每个存储表,获取所述存储表的内存表数据转储至磁盘后的平均数据长度,并将所述平均数据长度存入所述存储表在系统内存的数据结构中。[0039]优选的,所述平均数据长度统计模块,包括:[0040]第一数据长度计算模块,适于在系统加载索引时,根据索引中记录的键的文件偏移和数据长度,计算现已存储所述存储表的用户数据的平均数据长度,并将所述平均数据长度存入所述数据结构;[0041]第二数据长度计算模块,适于在每次将存储表的内存表数据转储至磁盘时,利用内存表数据中新增的数据长度修正所述平均数据长度,并将修正后的平均数据长度更新至所述数据结构中。[0042]优选的,所述存储表分类模块包括:[0043]第一存储表分类模块,适于针对每一个存储表,从所述系统内存数据结构中提取平均数据长度,根据所述平均数据长度对所述存储表进行分类。[0044]优选的,所述任务处理模块还包括:[0045]第一任务处理模块,适于通过至少一个工作线程并行执行所述工作队列中的各个合并任务。[0046]优选的,在第一任务处理模块之后,还包括:[0047]工作线程增加模块,适于当一工作队列中等待执行的合并任务的数量大于阈值时,自动增加新的工作线程以并行执行所述工作队列中的合并任务。[0048]优选的,在存储表分类模块之前,还包括:[0049]任务生成模块,适于针对每个存储表生成一个合并任务。[0050]根据本发明的一种数据合并的方法可以将各存储表(keyspace)按平均数据长度进行分类,所述平均数据长度为存储表中存储的各用户数据的平均数据长度,然后将不同分类的keyspace的compact1n(合并)任务提交至相应的工作队列去执行,一个分类一个工作队列,由此解决了平均数据长度短keyspace的sstable文件的合并阻塞整个各keyspace之间的compact1n过程的问题,取得了可使不同数据长度的keyspace均可以及时的完成其SStable的合并,缩短系统整体compact1n的时间有益效果。[0051]上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的【具体实施方式】。【专利附图】【附图说明】[0052]通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:[0053]图1示出了【
背景技术
】的一种数据合并的方法的队列执行逻辑示例;[0054]图2示出了根据本发明一个实施例的一种数据合并的方法的流程示意图;[0055]图3示出了根据本发明一个实施例的另一种数据合并的方法的流程示意图;[0056]图4示出了根据本发明一个实施例的另一种数据合并的方法的流程示意图;[0057]图5示出了根据本发明图4实施例的队列执行逻辑示例;[0058]图6示出了根据本发明一个实施例的一种数据合并的装置的结构示意图;[0059]图7示出了根据本发明一个实施例的另一种数据合并的装置的结构示意图;以及[0060]图8示出了根据本发明一个实施例的另一种数据合并的装置的结构示意图。【具体实施方式】[0061]下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。[0062]本发明的核心思想之一是:对于若干个存储表,以存储表的平均数据长度进行分类,那么将针对多个存储表的合并任务,分别提交至不同规模的个工作队列进行处理,此解决了平均数据长度短keyspace的sstable文件的合并影响整个工作队列的合并速度,从而导致系统层面整体数据Compact1n执行时间过长,甚至无法保证每天新增数据的合并,进而导致系统访问吞吐性能下降的问题,取得了优化系统层面整体数据Compact1n执行时间的问题,可以避免无法保证每天新增数据的合并而导致的系统访问吞吐性能下降的有益效果。[0063]首先,针对本发明解释涉及到的几个技术术语:[0064]SSTable:SortedStringTable,有序字符串表,是Cassandra系统中数据处理和交换的文件存储格式。SSTable中存储一组任意有序键-值对的文件。SSTable—旦完成写入,就不可更改,只能读取。通过Compact1n压缩机制对多个SSTable文件进行Merge消重后形成新的SSTable文件。[0065]Compact1n:SSTable文件的Compact1n机制,字面上的意思就是SSTable文件的合并。通过文件合并达到降低文件个数提高访问性能、去除重复数据节省磁盘空间的目的。Compact1n有两种,分别为:[0066]MinorCompact1n:部分文件的合并。[0067]MajorCompact1n:全部文件的合并。[0068]Keyspace:在Cassandra中,Keyspace就是数据的存储容器,实现了不同类型的数据的隔离存储。一个Keyspace可以看作一个二维索引结构:[0069].第一层索引所用的key为(row-key,cf-name),即用一个row-key和column-family-name可以定位一个columnfamily。columnfamily是column的集合。[0070].第二层索引所用的key为column-name,即通过一个column_name可以在一个columnfamily中定位一个column。[0071]Column是这个数据模型里面最基本的数据单元,它是一个三元组(name,value,timestamp)。一个columnfamily里面,所有的column是按照column-name排序的。所以可以根据column-name快速找到column。[0072]Keyspace在系统内存中以memtable的形式存储数据,在磁盘中以SStable文件形式存储数据。[0073]本发明实施例中的Compact1n机制按照不同的Keyspace而分别执行。[0074]为了方便后续描述,本发明实施例中存储表以keyspace表示,合并任务以compact1n表不,工作队列以TaskQueue表不,内存表以memtable表不,转储以dump表不。[0075]实施例一[0076]参照图2,其示出了本发明一种数据合并的方法的流程示意图,具体可以包括:[0077]步骤110,获取每个存储表的平均数据长度,并以所述平均数据长度对各个存储表进行分类;所述平均数据长度为存储表中存储的各用户数据的平均数据长度;[0078]对于存储表,也即keyspace,其基本上也是以key为索引,以keyspace中的value为实际存储用户数据的数据结构,其每个key的长度是以value决定的,因此可以统计每个key的value长度,去计算整个keyspace的平均数据长度。[0079]比如keyspaceO中记录的用户数据包括:(key=I,value=XI)、(key=2,value=X2)、(key=3,value=X3)、(key=4,value=X4),其中X1、X2、X3、X4代表具体的用户数据,其长度分别为20k、30k、10k、40k,那么keyspaceO的平均数据长度为25k。[0080]在本发明实施例中,对于针对用户的keyspace,可以对其存储的用户数据进行平均数据长度计算,然后以一个专门的数据结构存储该keyspace的平均数据长度,其平均数据长度为存储表中存储的各用户数据的平均数据长度。在本发明中,针对每个Keyspace,在系统内存中都存在一个与之相对应的数据结构,用于记录该Keyspace所存储数据的平均数据长度以及现已存储的key总条目数。本发明实际上统计的最终目标为针对一个keyspace的各SStable文件中,其存储的所有用户数据的平均数据长度。[0081]在统计的各个keyspace的平均数据长度的基础上,即可对keyspace以数据长度进行分类,比如长度O-1k的keyspace为一类,l_500k的为一类等等。本发明的分类可根据实际情况进行调整。[0082]步骤120,将同一分类的存储表对应的合并任务提交至负责所述分类的工作队列中;[0083]在将各keyspace进行分类后,即可将同一分类的合并任务提交至同一个工作队列中,等待工作队列的线程去执行。在本发明中工作队列创建的个数至少需要等于分类的个数,如此,可保证每个分类均可以有工作队列负责对其中的compact1n任务进行处理,而不用各个平均数据长度的compact1n相互堵塞。[0084]本发明中一个分类至少放入一个工作队列,即可以一个工作队列负责一个分类,或者多个工作队列负责一个分类。[0085]步骤130,由所述工作队列的工作线程执行所述合并任务。[0086]那么每个工作队列即可采用其工作线程对其中的合并任务进行处理。[0087]当然每个工作队列的工作线程可以为一个也可以为多个。[0088]在本发明实施例中,步骤110至130是在Cassandra系统的各服务器中执行的。Cassandra系统是一个分布式Key-Value存储系统。[0089]本发明提出的上述技术方案,通过将系统中各Keyspace的Compact1n按照其平均数据长度进行划分,分别提交到不同的工作队列中去执行。避免了各Keyspace数据的Compact1n过程的相互阻塞影响,保证了系统中各Keyspace均可以及时地完成SSTable的合并。在保证了公平性的同时,大幅缩短了系统整体Compact1n的时间,同时避免了由于未能及时完成数据的Compact1n而带来的访问吞吐性能的降低的情况。[0090]实施例二[0091]参照图3,其示出了本发明优选的一种数据合并的方法的流程示意图,具体可以包括:[0092]步骤210,针对系统中的每个存储表,获取所述存储表的内存表数据转储至磁盘后的平均数据长度,并将所述平均数据长度存入所述存储表在系统内存的数据结构中;[0093]本发明实施例中,各个keyspace在内存中存储的memtable(内存表)数据是需要dump(转储)磁盘中,最终以SStable文件进行存储的。而compact1n本质上也是针对SStable文件的,以达到降低文件个数提高系统吞吐和性能、去除重复数据节省磁盘空间的目的。因此所统计的各个keyspace的平均数据长度,是针对该keyspace的memtable数据dump至磁盘得到SStable文件后,keyspace磁盘中以SStable文件存储的形式下的平均数据长度。[0094]优选的,步骤210包括,包括:[0095]子步骤S212,在系统加载索引时,根据索引中记录的键的文件偏移和数据长度,计算现已存储所述存储表的用户数据的平均数据长度,并将所述平均数据长度存入所述数据结构;[0096]本发明实施例可以在系统启动服务时,在读取SStable文件的索引文件进行加载的过程中完成平均数据的统计。在加载SStable文件的索引时,会根据索引信息中记录的,针对对应各keyspace的,每个SStable文件的key(键)的文件偏移(文件偏移即相对存储文件地址的开始位置的偏移量)和数据长度,计算出每个keyspace中当前已存储数的据平均数据长度,并先将其存储在系统内存与keyspace对应的数据结构中。[0097]子步骤S214,在每次将存储表的内存表数据转储至磁盘时,利用内存表数据中新增的数据长度修正所述平均数据长度,并将修正后的平均数据长度更新至所述数据结构中。[0098]在系统运行过程中,每个keyspace会产生新的数据,该数据写入在memtable中,那么新增的数据会影响该keyspace整体的平均数据长度,本发明则可在该keyspace的memtable数据dump到磁盘的时候,利用该memtable的数据修正该keyspace在所述数据结构中记录的平均数据长度,并将修正后的平均数据长度更新至所属数据结构中。如此循环,可保证每次该keyspace的memtable数据dump到磁盘时,其平均数据长度是实时的、准确的。[0099]当然,对于一个完全新建的keyspace,其数据结构中记录的平均数据长度为O。[0100]比如对于一个keyspace,索引中已经计算其平均数据长度为1k,其所对应的各个SStable文件中记录的key的总量为100个,如果新增的memtable数据中增加的数据总长度为1000k,那么在memtable数据dump到磁盘生成SStable文件时,该keyspace的平均数据长度修正为(10k*100+1000k)/100=20k,更新20k到keyspace记录平均数据长度的数据结构中,即将1k替换掉。[0101]上述过程中对于磁盘中现存的keyspace的SStable文件不再进行计算,只计算该keyspace新增的memtable数据,去修正已有的平均数据长度。计算过程方便,占用系统资源较少。[0102]步骤220,创建至少两个工作队列,所述工作队列的个数至少等于所述分类个数;[0103]本发明可预先构建工作队列与分类的对应关系,使一个分类至少对应一个队列。当然可以多个工作队列负责一个分类的各个compact1n。工作队列与分类可以是一对一的关系,也可以是多对一的关系。[0104]优选的,所述创建至少两个工作队列包括:[0105]子步骤S222,在系统启动时加载配置文件,通过所述配置文件设置并创建至少两个工作队列;所述配置文件中包括平均数据长度的分类与工作队列的对应关系。[0106]本发明实施例可在系统启动时加载配置文件,设置并创建Compact1n工作队列的个数,该工作队列分别对应相应一个分类。[0107]本发明可以通过配置文件对工作队列与分类进行设置,比如tiny、small、normal、Iargy四个队列,然后每个队列负责一个平均数据长度的分类。然后系统加载时即可加载该四个队列,也得到四个分类的范围区间。[0108]步骤230,针对每一个存储表,从所述系统内存的数据结构中提取平均数据长度,根据所述平均数据长度对所述存储表进行分类。[0109]将每个keyspace,从前述系统内存的数据结构中提取其平均数据长度,然后根据该平均数据长度与分类的范围进行比较,即可将该keyspace分入某一类中。[0110]步骤240,将同一分类的存储表对应的合并任务提交至负责所述分类的工作队列中;[0111]步骤250,由所述工作队列的工作线程执行对应分类的合并任务。[0112]即由各个工作队列本身的工作线程执行其队列中的合并任务。[0113]当然,本发明实施例中,也可以根据平均数据长度的范围对keyspace进行分类,再根据分类的个数启动相应的工作队列,本发明不对其加以限制。[0114]当然,本发明实施例中分类的范围,还可通过智能学习进行设置。比如在第一轮预设了分类范围,在系统工作一定时间段内(比如一个周),中间循环进行多次合并,记录每次合并完成时间,然后计算平均完成时长。然后在第二轮调整每个分类的范围,按上述方法统计该轮的平均完成时长,如此循环,直至稳定出现某个范围内的最短时长,即获得最优的分类范围。[0115]本发明实施例与实施例一类似的步骤原理类似,在此不再详述。[0116]本发明提出的上述技术方案,通过将系统中各Keyspace的Compact1n按照其平均数据长度进行划分,分别提交到不同的工作队列中去执行。避免了各Keyspace数据的Compact1n过程的相互阻塞影响,保证了系统中各Keyspace均可以及时地完成SSTable的合并。在保证了公平性的同时,大幅缩短了系统整体Compact1n的时间,同时避免了由于未能及时完成数据的Compact1n而带来的访问吞吐性能的降低的情况。[0117]实施例三[0118]参照图4,其示出了本发明最优的一种数据合并的方法的流程示意图,具体可以包括:[0119]步骤310,在系统加载索引时,根据索引中记录的键的文件偏移和数据长度,计算现已存储所述存储表的用户数据的平均数据长度,并将所述平均数据长度存入所述数据结构;[0120]步骤320,在每次将存储表的内存表数据转储至磁盘时,利用内存表数据中新增的数据长度修正所述平均数据长度,并将修正后的平均数据长度更新至所述数据结构中。[0121]步骤330,创建N个工作队列,所述工作队列的个数N等于所述分类个数;[0122]结合如图5所示,系统在启动时根据配置文件的配置,按照平均数据长度范围共初始化tiny、smal1、normal、large等4个工作队列,分别负责不同平均数据长度的Keyspace的合并任务。比如tiny对应[0byte_500byte]范围,其工作队列为TaskQueueO(tiny);smalI对应[501byte-100k]范围,其工作队列为TaskQueuel(small);normal对应[101k_500k]范围,其工作队列为TaskQueue2(normal);large对应[501k_无穷大]范围,其工作队列为TaskQueue3(large)。[0123]步骤340,针对每个存储表生成一个合并任务;[0124]步骤350,获取每个存储表的平均数据长度,并以所述平均数据长度对各个存储表进行分类;所述平均数据长度为存储表中存储的各用户数据的平均数据长度;[0125]步骤360,将同一分类的存储表对应的合并任务提交至负责所述分类的工作队列中;[0126]步骤350至360的过程中,为系统后台提交compact1n,从系统内存的每个keyspace的数据结构中提取每个keyspace的平均数据长度,然后以该平均数据长度判断其属于哪个分类,进而即可知道该keyspace的compact1n属于哪个工作队列,然后即可将该compact1n提交至相应的工作队列中。[0127]结合图5所不,比如系统现在有KeyspaceO、KeyspaceKKeyspace2>Keyspace3>Keyspace4、Keyspace5共6个Keyspace,根据之前统计的其平均数据长度,判断其落在那个工作队列说负责的范围内,即将其提交到对应的工作队列中去。例如KeyspaceO、Keyspacel的数据Compact1n的任务(keyspaceOTask、keyspacelTask)提交到tiny队列(TaskQueueO(tiny))中,Keyspace2的数据Compact1n的任务(keyspace2Task)提交到small队列(TaskQueuel(small))中,Keyspace3、Keyspace4的数据Compact1n的任务(keyspace3Task、keyspace4Task)提交到normal队列(TaskQueue2(normal))中,而Keyspace5的Compact1n任务(keyspace5Task)则提交到large队列(TaskQueue3(large))中去。[0128]步骤370,针对每个工作队列,通过至少一个工作线程并行执行所述工作队列中的各个合并任务;[0129]如图5所不,工作队列TaskQueueO(tiny)有两个工作线程workerO和workerl去执行;工作队列TaskQueuel(small)有两个工作线程workerO和workerl去执行;工作队列TaskQueue2(normal)有两个工作线程workerO和workerl去执行;工作队列TaskQueue3(large)有两个工作线程workerO和workerl去执行。每两个工作队列之间的工作线程是不冲突的、相互独立的。[0130]步骤380,当一工作队列中等待执行的合并任务的数量大于阈值时,自动增加新的工作线程以并行执行所述工作队列中的合并任务。[0131]如,当在某一时刻,large队列中等待执行的Compact1n任务过多,超过预设的阈值时,则增加额外的工作线程来加快large队列中Compact1n任务的执行。该种情况可根据系统内存的占用量去选择增加多少额外的工作线程。比如图5中TaskQueue3(large)增加的工作线程worker2。[0132]本发明实施例与实施例一、二类似的步骤原理类似,在此不再详述。[0133]在本发明实施例中,以keyspace为compact1n的处理单位,将同一分类的keyspace的compact1n任务放入相应处理该分类的工作队列进行处理,避免了各Keyspace数据的Compact1n过程的相互阻塞影响,保证了系统中各Keyspace均可以及时地完成SSTable的合并;在保证了公平性的同时,大幅缩短了系统整体Compact1n的时间,同时避免了【
背景技术
】中由于未能及时完成数据的Compact1n而带来的访问吞吐性能的降低的情况。并且针对每个工作队列采用了灵活的工作线程处理方式,进一步提缩短了compact1n时间。[0134]实施例四[0135]参照图6,其本发明一种数据合并的装置的结构示意图,具体可以包括:[0136]存储表分类模块410,适于获取每个存储表的平均数据长度,并以所述平均数据长度对各个存储表进行分类;所述平均数据长度为存储表中存储的各用户数据的平均数据长度;[0137]任务提交模块420,适于将同一分类的存储表对应的合并任务提交至负责所述分类的工作队列中;[0138]任务处理模块430,适于由所述工作队列的工作线程执行所述合并任务。[0139]实施例五[0140]参照图7,其本发明一种数据合并的装置的结构示意图,具体可以包括:[0141]数据长度统计模块510,适于针对系统中的每个存储表,获取所述存储表的内存表数据转储至磁盘后的平均数据长度,并将所述平均数据长度存入所述存储表在系统内存的数据结构中。[0142]优选的,所述平均数据长度统计模块510,包括:[0143]第一数据长度计算模块,适于在系统加载索引时,根据索引中记录的键的文件偏移和数据长度,计算现已存储所述存储表的用户数据的平均数据长度,并将所述平均数据长度存入所述数据结构;[0144]第二数据长度计算模块,适于在每次将存储表的内存表数据转储至磁盘时,利用内存表数据中新增的数据长度修正所述平均数据长度,并将修正后的平均数据长度更新至所述数据结构中。[0145]工作队列创建模块520,适于创建至少两个工作队列,所述工作队列的个数至少等于所述分类个数。[0146]优选的,所述工作队列创建模块520包括:[0147]第一工作队列加载模块,适于在系统启动时加载配置文件,通过所述配置文件设置并创建至少两个工作队列;所述配置文件中包括平均数据长度的分类与工作队列的对应关系。[0148]存储表分类模块530,适于获取每个存储表的平均数据长度,并以所述平均数据长度对各个存储表进行分类;所述平均数据长度为存储表中存储的各用户数据的平均数据长度;[0149]任务提交模块540,适于将同一分类的存储表对应的合并任务提交至负责所述分类的工作队列中;[0150]任务处理模块550,适于由所述工作队列的工作线程执行所述合并任务。[0151]实施例六[0152]参照图8,其示出了本发明最优的一种数据合并的装置的结构示意图,具体可以包括:[0153]数据长度统计模块S600,所述数据长度统计模块S600包括:[0154]第一数据长度计算模块610,适于在系统加载索引时,根据索引中记录的键的文件偏移和数据长度,计算现已存储所述存储表的用户数据的平均数据长度,并将所述平均数据长度存入所述数据结构;[0155]第二数据长度计算模块620,适于在每次将存储表的内存表数据转储至磁盘时,利用内存表数据中新增的数据长度修正所述平均数据长度,并将修正后的平均数据长度更新至所述数据结构中。[0156]工作队列创建模块630,适于创建N个工作队列,所述工作队列的个数N等于所述分类个数;[0157]任务生成模块640,适于针对每个存储表生成一个合并任务;[0158]存储表分类模块650,适于获取每个存储表的平均数据长度,并以所述平均数据长度对各个存储表进行分类;所述平均数据长度为存储表中存储的各用户数据的平均数据长度;[0159]任务提交模块660,适于将同一分类的存储表对应的合并任务提交至负责所述分类的工作队列中;[0160]任务处理模S670,所述任务处理模S670包括:[0161]第一存储表分类模块670,适于针对每一个存储表,从所述系统内存数据结构中提取平均数据长度,根据所述平均数据长度对所述存储表进行分类。[0162]工作线程增加模块680,适于当一工作队列中等待执行的合并任务的数量大于阈值时,自动增加新的工作线程以并行执行所述工作队列中的合并任务。[0163]在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。[0164]在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。[0165]类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循【具体实施方式】的权利要求书由此明确地并入该【具体实施方式】,其中每个权利要求本身都作为本发明的单独实施例。[0166]本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。[0167]此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。[0168]本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的数据合并设备中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。[0169]应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。[0170]本发明公开了Al、一种数据合并的方法,包括:[0171]获取每个存储表的平均数据长度,并以所述平均数据长度对各个存储表进行分类;所述平均数据长度为存储表中存储的各用户数据的平均数据长度;[0172]将同一分类的存储表对应的合并任务提交至负责所述分类的工作队列中;[0173]由所述工作队列的工作线程执行所述合并任务。[0174]A2、如Al所述的方法,还包括:[0175]创建至少两个工作队列,所述工作队列的个数至少等于所述分类个数。[0176]A3、如A2所述的方法,所述创建至少两个工作队列包括:[0177]在系统启动时加载配置文件,通过所述配置文件设置并创建至少两个工作队列;所述配置文件中包括平均数据长度的分类与工作队列的对应关系。[0178]A4、如Al所述的方法,还包括:[0179]针对系统中的每个存储表,获取所述存储表的内存表数据转储至磁盘后的平均数据长度,并将所述平均数据长度存入所述存储表在系统内存的数据结构中。[0180]A5、如A4所述的方法,针对系统中的每个存储表,获取所述存储表的内存表数据转储至磁盘后的平均数据长度,并将所述平均数据长度存入所述存储表在系统内存的数据结构中,包括:[0181]在系统加载索引时,根据索引中记录的键的文件偏移和数据长度,计算现已存储所述存储表的用户数据的平均数据长度,并将所述平均数据长度存入所述数据结构;[0182]在每次将存储表的内存表数据转储至磁盘时,利用内存表数据中新增的数据长度修正所述平均数据长度,并将修正后的平均数据长度更新至所述数据结构中。[0183]A6、如A5所述的方法,将各存储表按平均数据长度进行分类包括:[0184]针对每一个存储表,从所述系统内存的数据结构中提取平均数据长度,根据所述平均数据长度对所述存储表进行分类。[0185]A7、如Al所述的方法,由所述工作队列的工作线程执行所述合并任务包括:[0186]通过至少一个工作线程并行执行所述工作队列中的各个合并任务。[0187]A8、如A7所述的方法,通过至少一个工作线程执行工作队列中的各个合并任务后,还包括:[0188]当一工作队列中等待执行的合并任务的数量大于阈值时,自动增加新的工作线程以并行执行所述工作队列中的合并任务。[0189]A9、如Al所述的方法,将各存储表按平均数据长度进行分类之前,还包括:[0190]针对每个存储表生成一个合并任务。[0191]本发明还公开了B10、一种数据合并的装置,包括:[0192]存储表分类模块,适于获取每个存储表的平均数据长度,并以所述平均数据长度对各个存储表进行分类;所述平均数据长度为存储表中存储的各用户数据的平均数据长度;[0193]任务提交模块,适于将同一分类的存储表对应的合并任务提交至负责所述分类的工作队列中;[0194]任务处理模块,适于由所述工作队列的工作线程执行所述合并任务。[0195]B11、如BlO所述的装置,还包括:[0196]工作队列创建模块,适于创建至少两个工作队列,所述工作队列的个数至少等于所述分类个数。[0197]B12、如Bll所述的装置,所述工作队列创建模块包括:[0198]第一工作队列加载模块,适于在系统启动时加载配置文件,通过所述配置文件设置并创建至少两个工作队列;所述配置文件中包括平均数据长度的分类与工作队列的对应关系。[0199]B13、如BlO所述的装置,还包括:[0200]数据长度统计模块,适于针对系统中的每个存储表,获取所述存储表的内存表数据转储至磁盘后的平均数据长度,并将所述平均数据长度存入所述存储表在系统内存的数据结构中。[0201]B14、如B13所述的装置,所述平均数据长度统计模块,包括:[0202]第一数据长度计算模块,适于在系统加载索引时,根据索引中记录的键的文件偏移和数据长度,计算现已存储所述存储表的用户数据的平均数据长度,并将所述平均数据长度存入所述数据结构;[0203]第二数据长度计算模块,适于在每次将存储表的内存表数据转储至磁盘时,利用内存表数据中新增的数据长度修正所述平均数据长度,并将修正后的平均数据长度更新至所述数据结构中。[0204]B15、如B14所述的装置,所述存储表分类模块包括:[0205]第一存储表分类模块,适于针对每一个存储表,从所述系统内存数据结构中提取平均数据长度,根据所述平均数据长度对所述存储表进行分类。[0206]B16、如BlO所述的装置,所述任务处理模块还包括:[0207]第一任务处理模块,适于通过至少一个工作线程并行执行所述工作队列中的各个合并任务。[0208]B17、如B16所述的装置,在第一任务处理模块之后,还包括:[0209]工作线程增加模块,适于当一工作队列中等待执行的合并任务的数量大于阈值时,自动增加新的工作线程以并行执行所述工作队列中的合并任务。[0210]B18、如BlO所述的装置,在存储表分类模块之前,还包括:[0211]任务生成模块,适于针对每个存储表生成一个合并任务。【权利要求】1.一种数据合并的方法,包括:获取每个存储表的平均数据长度,并以所述平均数据长度对各个存储表进行分类;所述平均数据长度为存储表中存储的各用户数据的平均数据长度;将同一分类的存储表对应的合并任务提交至负责所述分类的工作队列中;由所述工作队列的工作线程执行所述合并任务。2.如权利要求1所述的方法,其特征在于,还包括:创建至少两个工作队列,所述工作队列的个数至少等于所述分类个数。3.如权利要求2所述的方法,其特征在于,所述创建至少两个工作队列包括:在系统启动时加载配置文件,通过所述配置文件设置并创建至少两个工作队列;所述配置文件中包括平均数据长度的分类与工作队列的对应关系。4.如权利要求1所述的方法,其特征在于,还包括:针对系统中的每个存储表,获取所述存储表的内存表数据转储至磁盘后的平均数据长度,并将所述平均数据长度存入所述存储表在系统内存的数据结构中。5.如权利要求4所述的方法,其特征在于,针对系统中的每个存储表,获取所述存储表的内存表数据转储至磁盘后的平均数据长度,并将所述平均数据长度存入所述存储表在系统内存的数据结构中,包括:在系统加载索引时,根据索引中记录的键的文件偏移和数据长度,计算现已存储所述存储表的用户数据的平均数据长度,并将所述平均数据长度存入所述数据结构;在每次将存储表的内存表数据转储至磁盘时,利用内存表数据中新增的数据长度修正所述平均数据长度,并将修正后的平均数据长度更新至所述数据结构中。6.如权利要求5所述的方法,其特征在于,将各存储表按平均数据长度进行分类包括:针对每一个存储表,从所述系统内存的数据结构中提取平均数据长度,根据所述平均数据长度对所述存储表进行分类。7.如权利要求1所述的方法,其特征在于,由所述工作队列的工作线程执行所述合并任务包括:通过至少一个工作线程并行执行所述工作队列中的各个合并任务。8.如权利要求7所述的方法,其特征在于,通过至少一个工作线程执行工作队列中的各个合并任务后,还包括:当一工作队列中等待执行的合并任务的数量大于阈值时,自动增加新的工作线程以并行执行所述工作队列中的合并任务。9.如权利要求1所述的方法,其特征在于,将各存储表按平均数据长度进行分类之前,还包括:针对每个存储表生成一个合并任务。10.一种数据合并的装置,包括:存储表分类模块,适于获取每个存储表的平均数据长度,并以所述平均数据长度对各个存储表进行分类;所述平均数据长度为存储表中存储的各用户数据的平均数据长度;任务提交模块,适于将同一分类的存储表对应的合并任务提交至负责所述分类的工作队列中;任务处理模块,适于由所述工作队列的工作线程执行所述合并任务。【文档编号】G06F3/06GK104360824SQ201410645460【公开日】2015年2月18日申请日期:2014年11月10日优先权日:2014年11月10日【发明者】王锋申请人:北京奇虎科技有限公司,奇智软件(北京)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1