基于Spark平台的分布式大数据函数依赖发现方法与流程

文档序号:17990013发布日期:2019-06-22 00:42阅读:236来源:国知局
基于Spark平台的分布式大数据函数依赖发现方法与流程

本发明属于函数依赖发现技术领域,特别是设计一种基于spark平台的分布式大数据函数依赖发现方法。



背景技术:

本发明涉及的相关技术介绍如下:

(1)函数依赖发现算法

函数依赖表示一个属性或属性集合的值对另一个属性或属性集合的值的依赖性。在传统关系数据库中,函数依赖发现在知识发现、数据库语义分析、数据质量评估以及数据库设计等领域有着广泛的应用。当前大数据背景下,数据呈现出4v特性,即数据量大(volumn)、数据种类多(variety)、数据更新速度快(velocity)、数据价值密度低(value)等特点。在此背景下,传统的函数依赖发现算法很难适合大数据环境。

[文献1]阐述了一种经典的函数依赖发现算法tane。tane根据元组的属性值将元组划分成不同的集合,然后在不同的划分上对候选函数依赖进行检测。通过逐层发现的方法,在每一层对候选函数依赖进行验证,生成符合条件的函数依赖,然后根据发现的结果生成下一层的候选函数依赖。[文献2]同样利用逐层发现的思想生成满足要求的函数依赖,然后利用迭代的思想产生下一层候选函数依赖,以此得到所有候选函数依赖集并从中找出函数依赖关系。[文献3]考虑函数依赖armstrong公理系统得到候选函数依赖剪枝策略,在逐层发现过程中对候选函数依赖进行剪枝。[文献4]和[文献5]从初始数据库中得到数据集划分,根据这些划分计算出一致集合和差异集合,并最终根据得到的一致集合和差异集合可以发现最小的函数依赖覆盖。两篇文献的主要区别在于,[文献4]使用了深度优先的搜索策略,而[文献5]使用了逐层搜索的策略。

以上函数依赖发现方法主要针对传统集中环境下函数依赖的发现。在当前的大数据时代背景下,数据分布在不同的节点,上述函数依赖发现算法直接使用容易引起判断误差。[文献6]研究了分布式数据库函数依赖挖掘方法,给出了一个分布式数据库函数依赖挖掘框架。该计算框架首先在各个节点进行函数依赖发现,然后根据发现的结果对候选函数依赖集合进行剪枝,最后将各个节点的数据集中到一个中心节点,在中心节点执行集中式环境下的函数依赖挖掘算法。该方法主要的挖掘执行过程还是在集中式环境进行,实际的执行效率较低,不适合大规模海量数据。[文献7]考虑在大数据背景下,利用函数依赖的左部特征,对函数依赖候选集进行分组,针对每一组候选函数依赖并行执行分布式环境发现算法,最终得到所有函数依赖。这种方法基于hama平台,需要在不同节点间依据函数依赖候选集的哈希值将数据进行重分布,极端情况下需要消耗节点间计算和带宽资源,影响最终的计算效率。

(2)hadoop计算平台

随着大数据时代的到来,hadoop平台各项技术发展迅猛。hadoop由apache软件基金会于2005年秋天作为lucene的子项目nutch的一部分正式引入。hadoop的核心架构由多个模块组成,[文献8]介绍了hadoop分布式文件系统(hdfs),用来存储hadoop集群所有存储节点上的文件。[文献9]介绍了hadoop默认的mapreduce计算框架,采用了概念“map(映射)”和“reduce(归约)”,用于大规模数据集的并行运算。用户只需编写两个称作map和reduce的函数即可,系统能够管理map或reduce并行任务的执行以及任务之间的协调,并且能够处理上述某个任务失败的情况,并且同时能够保障对硬件故障的容错性。此外,[文献10]介绍了hadoop平台的资源调度系统yarn。

(3)spark云计算平台

spark是由ucberkeleyamp实验室开发的开源通用并行云计算平台,spark基于mapreduce思想实现分布式计算,拥有hadoopmapreduce所具有的优点;但是不同地方是运算中间输出结果能存储在内存中,从而不在需要读写分布式文件系统(hdfs),因此spark能更好的运行数据挖掘与机器学习等需要迭代的mapreduce算法。spark启用了内存分布数据集,它可以提供交互式查询,除此之外还可以将数据集缓存在内存中,提高数据集读写速率实现计算过程中的数据集的重用,优化迭代工作负载。spark底层可使用多种分布式文件系统如hdfs文件系统存放数据,不过更多的是与资源调度平台mesos和yarn一起合作出现。

[文献11]介绍了spark的核心抽象概念:弹性分布式数据库rdd(resilientdistributeddatasets),该抽象是分布在计算集群上的可恢复数据集。rdd是spark的核心,rdd是分布于各个计算节点存储于内存中的数据对象集合,rdd允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大地提升了查询速度。rdd分布在多个节点上,并可以对其进行并行处理。rdd是可扩展、弹性的,在运算过程中,内存小于rdd时,可以转存到磁盘上,确保内存足够继续运算。rdd是已被分区、只读的、不可变的并能够被并行操作的数据集合,只能通过在其它rdd执行确定的转换操作(如map、join、filter和groupby)而创建,然而这些限制使得实现容错的开销很低。与分布式共享内存系统需要付出高昂代价的检查点和回滚不同,rdd通过lineage来重建丢失的分区:一个rdd中包含了如何从其它rdd衍生所必需的相关信息,从而不需要检查点操作就可以重构丢失的数据分区。尽管rdd不是一个通用的共享内存抽象,但却具备了良好的描述能力、可伸缩性和可靠性,并能够广泛适用于数据并行类应用。

相关文献:

[文献1]huhtalay,j,porkkap,etal.tane:anefficientalgorithmfordiscoveringfunctionalandapproximatedependencies[j].thecomputerjournal,1999,42(2):100-111.

[文献2]novellin,cicchettir.fun:anefficientalgorithmforminingfunctionalandembeddeddependencies[c].procofthe8thintconfofdatabasetheory.newyork:acm,2001:189-203

[文献3]hongyao,howardj,hamilton.miningfunctionaldependenciesfromdata[j].dataminingandknowledgediscovery,2008,16(2):197-219

[文献4]wyssc,giannellac,robertsone.fastfds:aheuristic-driven,depth-firstalgorithmforminingfunctionaldependenciesfromrelationinstances[c].procofthe3rdintconfondatawarehousingandknowledgediscovery.newyork:acm,2001:101-110

[文献5]lopess,petitj,lakhall.efficientdiscoveryoffunctionaldependenciesandarmstrongrelations[c].procofthe7thintconfonextendingdatabasetechnology.newyork:acm,2000:350-364

[文献6]yefeiyue,liujixue,qianjin,xuexiaofeng.aframeworkforminingfunctionaldependenciesfromlargedistributeddatabases[c].procof2010intconfonartificialintelligenceandcomputationalintelligence.alamitos,ca:ieee,2010:109-113.

[文献7]李卫榜,李战怀,陈群,姜涛,刘海龙,潘巍.分布式大数据函数依赖发现[j].计算机研究与发展.2015(2):283-283.

[文献8]shvachkok,kuangh,radias,chanslerr.thehadoopdistributedfilesystem[c].in:massstoragesystemsandtechnologies(msst),2010ieee26thsymposiumon.nevada:ieee,2010.1-10.

[文献9]deanj,ghemawats.mapreduce:simplifieddataprocessingonlargeclusters.in:proceedingsofthe6thconferenceonsymposiumonopeartingsystemsdesignandimplementation[c].sanfrancisco:usenixassociationberkeley,2004.137-149.

[文献10]vavilapallivk,murthyac,douglasc,agarwals,konarm,evansr,gravest,lowej,shahh,seths.apachehadoopyarn:yetanotherresourcenegotiator[c].in:proceedingsofthe4thannualsymposiumoncloudcomputing.californiaacm,2013.1-16.

[文献11]zahariam,chowdhurym,dast,davea,maj,mccauleym,franklinmj,shenkers,stoicai.resilientdistributeddatasets:afault-tolerantabstractionforin-memoryclustercomputing[c].in:proceedingsofthe9thusenixconferenceonnetworkedsystemsdesignandimplementation.sanjose:usenixassociationberkeley,2012.1-14.



技术实现要素:

针对现有的函数依赖发现算法主要面向集中式数据的处理环境,以及现有基于hadoop平台的处理算法具有较高io开销和负载不均衡的问题,本发明提供了一种基于spark平台的分布式大数据函数依赖发现方法。

本发明所采用的技术方案是一种基于spark平台的分布式大数据函数依赖发现方法,包括以下步骤:

步骤1,数据分区,包括根据spark集群各节点分配的cpu内核数对数据进行分区;

步骤2,生成属性集合的所有非空子集,包括通过数据库中的所有属性集合,生成含有所有非空子集的集合,为求解所有属性集合的等价类个数作准备;

步骤3,累加各节点属性集合的等价类数量,通过等价类计算得到全局数据库的(属性集合,等价类数)集合;

步骤4,迭代包含各属性集合的函数依赖关系,构建下一层候选函数依赖关系,判断各层函数依赖关系是否成立。

而且,步骤1包括以下子步骤,

步骤1.1,设置spark集群节点,设置hdfs默认的block大小调整分区数;

步骤1.2,按照spark集群的节点将整个数据集进行分区,并装载到spark运行环境当中。

而且,步骤2的实现过程如下,

按照所有属性的自由排列组合方式,计算出所有的非空子集属性,对于有n个属性的数据集来说,所有的非空子集数量为2n-1。

而且,步骤3的实现包括以下子步骤,

步骤3.1,对于步骤2计算出的非空子集,逐条扫描每条数据,当发现新的数据时在哈希表中新建key值,value值标为1;

步骤3.2,在逐行扫描数据时,如果遇到哈希表中已有的值,则将value值加1,直至扫描完毕,得到该非空子集的等价类;

步骤3.3,依次迭代所有非空子集,得到该节点所有非空自己的等价类;

步骤3.4,调用spark的reducebykey算子,将各节点的所有属性集合进行累加,得到全局数据库的(属性集合,等价类数)。

而且,步骤4的实现包括以下子步骤,

步骤4.1,由输入函数依赖关系t生成下一层候选函数依赖关系得到集合γ,从步骤3得到的(属性集合、等价类个数)数组中查找每个候选函数依赖关系的左部和整体属性集合的等价类个数;

步骤4.2,遍历集合γ中候选函数依赖关系,当遍历到一个候选函数依赖关系时,若该函数依赖关系左部属性集合的等价类个数大于或等于整体属性集合的等价类个数,表明该候选函数依赖关系在数据集中成立,此时将函数依赖关系左部作为输入返回步骤4.1,进行下一层迭代;反之,则该函数依赖关系不存在,进入步骤4.3;

步骤4.3,此时函数依赖关系不存在,则对候选函数依赖集合进行剪枝,在集合γ中删除该关系及所有子关系,然后判断是否对集合γ中候选函数依赖关系遍历完成,是则进入步骤4.4,否则返回步骤4.2,继续遍历集合γ中候选函数依赖关系,从集合γ剩余候选函数依赖关系取一个进行同样处理;

步骤4.4,此时当前的集合γ遍历完毕,若集合中每个关系都不成立,则此时输入函数依赖关系为最小函数依赖关系,将结果进行保存,然后进入步骤4.5;否则直接进入步骤4.5;

步骤4.5,判断输入函数依赖关系是否包含所有属性集合,是则表明当前所有迭代已经完成,结束程序;否则表明当前函数依赖关系为步骤4.2迭代进入的下一层候选函数依赖关系,此时返回上一层迭代关系,继续遍历上层集合γ的候选函数依赖关系,执行步骤4.2。

本发明针对当前函数依赖方法主要应用场合为传统集中式环境的执行现状,以及分布式平台环境下现有方法处理能力低效的问题,设计了基于属性集合等价类来发现函数依赖的方法和相应的剪枝策略,通过利用属性集合的等价类数量来判断函数依赖是否成立,最大限度的解决了传统计算模式下计算效率不高的问题,并充分利用spark云计算平台的大规模并行计算能力,大幅度减小了函数依赖发现的时间。本发明的技术方案具有简单快速的特点,能够大幅度提高大数据环境下函数依赖的发现效率。

附图说明

图1为本发明实施例的流程图;

图2为本发明实施例的数据分区示意图;

图3为本发明实施例的属性集合所有非空子集的示意图;

图4为本发明实施例的使用spark的reducebykey算子累加各节点函数依赖的示意图;

图5为本发明实施例的函数依赖不成立情况下的剪枝示意图。

具体实施方式

为了便于本领域普通技术人员理解和实施本发明,下面结合附图及实施例对本发明作进一步的详细描述,应当理解,此处所描述的实施示例仅用于说明和解释本发明,并不用于限定本发明。

本发明通过spark的相关算子设计了合理的属性集合等价类,最大限度的解决了传统计算模式下计算效率不高的问题,同时使用spark的大规模并行计算大幅度减小了函数依赖发现的时间。本发明的技术方案简单清晰,能够较好提高函数依赖发现的效率。

本发明实施例的基于spark平台的函数依赖发现方法的流程见图1,所有步骤可由本领域技术人员采用计算机软件技术实现流程自动运行。实施案例具体实现过程如下:

步骤1:数据分区;

根据spark集群各节点分配的cpu内核数(虚拟cpu计算内核cores)对数据进行分区;

步骤1的具体实现包括以下子步骤:

步骤1.1:设置spark集群节点,同时配置hdfs默认的block(块)大小,一般默认设置64m,在这个基础上具体实施时可根据数据量大小进行调整,在节点配置很高、数据量很大时,可以设置128m甚至256m的block大小,数据量较小的情况下可以将block设置为32m;

步骤1.2:按照spark集群各节点cpu内核数,将整个数据集进行分区,节点cpu内核数越高,这个节点就可以分配更多的数据分区,节点的数据资源计算并发度也越高。分区划分后,将数据集装载到spark运行环境当中。

实施例中,首先将整个数据集按照spark集群的节点设置进行分区,需要将数据集划分到三个节点上。实施例中,以包含5个元组的数据集为例,如表1所示。

表1

其中,tuple为元组标识,time为时间、name为名称、birthday为生日、supervisor为管理员。

数据分区不涉及数据在节点上的重分布,分区中的数据仍是杂乱的,需要根据每个节点的计算能力来设置每个节点分配到的数据量。在具体设置过程中,通过各节点的cpu内核数来调整分区数,一般要求各节点的分区数大于或等于cpu内核数,这样才能最大限度利用cpu资源,使每个分区的数据都能调用一个独立的cpu内核,从而提高整个spark集群的计算效率,提高并行度。若各节点分区数小于cpu内核数,此时存在cpu内核未充分利用,影响spark环境整体计算性能。实施例中,分区实施之后,三个分区包含的元组数分别为{t1、t2},{t3},{t4、t5},如图2所示。

步骤2:生成属性集合的所有非空子集,记为

通过全局数据库(即整个数据集)中的所有属性集合,生成含有所有非空子集的集合,为求解所有属性集合的等价类数量作准备;

步骤2的具体实现过程如下:

按照所有属性的自由排列组合方式,计算出所有的非空子集属性,对于有n个属性的数据集来说,所有的非空子集数量为2n-1。

实施例中,对于所有属性集合而言,集合的所有非空子集包含了所有属性的自由排列组合,以图2中四个属性a、b、c、d为例,它的所有非空子集如图3所示,包括abcd、abc、abd、acd、bcd、ab、ac、bc、bd、ad、cd、a、b、c、d。对于有n个属性的属性集合,他们所有非空子集中包含n个属性的属性集合数量为包含n-1个属性的属性集合数量为依次类推,所有非空子集数量为

步骤3:累加各节点属性集合的等价类数量;

通过等价类计算得到整个spark平台数据库(全局数据库)的(属性集合,等价类数)集合;

步骤3.1:对于步骤2计算出的非空子集,逐条扫描每条数据,当发现新的数据时,在哈希表中新建键值对,即(key,value),属性值集合作为键(key),它的值(value)设置1;

步骤3.2:在逐行扫描数据时,如果遇到哈希表中已有的值,则将value加1,直至扫描完毕,得到该非空子集的等价类;

步骤3.3:依次迭代所有非空子集,得到该节点所有非空子集的等价类;

步骤3.4:调用spark的reducebykey算子,将各节点的所有属性集合进行累加,得到全局数据库的(属性集合,等价类数)。

reducebykey算子是spark的一种action类算子,作用是通过传入一个相关函数来合并每个key对应的value的值,因此它能够合并位于不同节点上的(key,value)类的数据。

实施例中,要判断函数依赖关系x→y在数据库上是否成立,需要计算以属性x对数据库做划分得到的等价类个数,以及以属性x∪y的集合对数据库做划分得到的等价类个数,这里的x和x∪y即为属性集合。通过计算每个节点每个属性集合的等价类数量,就可以得到每个节点(属性集合,等价类数)的集合,然后通过各节点进行累加,即可得到全局数据库属性集合的等价类数量。例如,对表1数据中的属性集合bcd进行等价类划分,得到三个节点上的等价类数量如表2所示,即在每个节点上都能得到(属性集合,等价类数)的集合。

表2

随后,在各个节点上,利用spark的reducebykey算子,将相同的等价类按照key值进行累加,如表3所示。

表3

具体每个节点计算等价类的计算结果如图4所示,其具体实施过程主要分为如下几步:

(1)按照步骤2当中所有属性的非空子集迭代每个节点的所有数据;

(2)在处理单个属性集时,将不同等价类分别进行计数,其中,属性值作为key存在spark的rdd当中;

(3)在spark环境下,各个节点所有属性集的等价类数量进行同步处理。处理完成后,调用spark的reducebykey算子,累加各节点不同属性集的相同等价类,得到(属性集合、等价类个数)数组。

步骤4:迭代包含各属性集合的函数依赖关系,构建下一层候选函数依赖关系,判断各层函数依赖关系是否成立。

此步骤为生成最终函数依赖关系的迭代过程,具体实施步骤如下:

(1)初始状态,由输入函数依赖关系t(此时包含所有属性集合)生成下一层候选函数依赖关系得到集合γ,从步骤3得到的(属性集合、等价类个数)数组中查找每个候选函数依赖关系的左部和整体属性集合的等价类个数;

(2)遍历集合γ中候选函数依赖关系。当遍历到一个候选函数依赖关系时,若该函数依赖关系左部属性集合的等价类个数大于或等于整体属性集合的等价类个数,即表明该候选函数依赖关系在数据集中成立,此时将函数依赖关系左部作为输入返回步骤(1),进行下一层迭代;反之,则该函数依赖关系不存在,进入步骤(3);

(3)此时函数依赖关系不存在,则对候选函数依赖集合进行剪枝,在集合γ中删除该关系及所有子关系,然后判断是否对集合γ中候选函数依赖关系遍历完成,是则进入步骤(4),否则返回步骤(2),继续遍历集合γ中候选函数依赖关系,从集合γ剩余候选函数依赖关系取一个进行同样处理;

(4)此时当前的集合γ遍历完毕,若集合中每个关系都不成立,则此时输入函数依赖关系为最小函数依赖关系,将结果进行保存,然后进入步骤(5);否则直接进入步骤(5);

(5)判断输入函数依赖关系是否包含所有属性集合,是则表明当前所有迭代已经完成,结束程序;否则表明当前函数依赖关系为步骤(2)迭代进入的下一层候选函数依赖关系,此时返回上一层迭代关系,继续遍历上层集合γ的候选函数依赖关系,返回执行步骤(2)。

实施例具体实现过程的细节如表4,相关的变量说明如下:

设x,y是关系t的两个属性集合,当任意两个元组中的x属性值相同时,它们的y属性值也相同,则称x函数决定y,或y函数依赖于x。由输入函数依赖关系t生成下一层候选函数依赖集合γ,此时γ为属于函数依赖关系t子集的所有候选函数依赖集合,其候选函数依赖用ti表示,且ti∈γ(i=1,2,3…n),ti:xi→yi,其中,xi为候选依赖ti的左部,yi为候选依赖ti的右部,n为候选函数的个数。最终结果保存在最小函数依赖关系集合β当中。

表4

在实施例中,对表1数据中的属性集合abcd进行迭代,他的下一层候选函数依赖关系集合γ={bcd→a,acd→b,abd→c,abc→d},首先判断候选函数依赖bcd→a,若{bcd}的等价类数量与{abcd}的等价类数量相等,则该候选函数依赖成立,此时将进行候选集{bcd}的进一步迭代;若{bcd}的等价类数量与{abcd}的等价类数量不相等,则说明bcd→a不成立,此时则进行剪枝,不需要再对候选集{bcd}及其子关系进行迭代。这是因为当bcd→a不成立时,候选集{bcd}的子关系bc→d或者b→d肯定不成立。图5所示关系集合将bcd进行剪枝后的所有子集,虚线表示将其从关系集合中剪枝。

在对大规模数据集进行函数依赖发现的过程中,由于数据规模的庞大,对候选函数依赖关系的判断所耗费的时间是函数依赖发现的主要消耗时间。通过对关系集合的剪枝能够减少对候选函数依赖关系的判断,很大程度的减小发现代价,从而提高了函数依赖发现效率。

本文中所描述的实施过程仅仅是对本发明精神作举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施过程做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。

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