本发明涉及大数据处理技术领域,更具体地,涉及一种分布式sql处理方法及系统。
背景技术:
许多现实中的应用都涉及到结构化查询语言(sql,structuredquerylanguage)数据处理。分布式数据处理系统,通过使用多个机器,并行处理数据,从而达到较高的计算效率,但仍存在着内存资源利用不合理等问题。在学术界,已经有许多关于这些问题的研究。
spark是2009年发源于美国加州大学伯克利分校amplab的集群计算平台的一个研究性项目。之后,2010年spark项目开源,2013年成为apache基金项目,2014年成为apache顶级基金项目。它立足于内存计算,从多迭代批量处理出发,兼收并蓄数据仓库、流处理和图计算等多种计算范式,是罕见的全能选手。但spark对内存的需求很大,内存的大小直接影响spark的性能。
弹性分布式数据集(resilientdistributeddatasets,rdd)是spark中的基本数据结构。在spark进行计算过程中,特别是迭代计算,有些rdd可能会用到多次,把这些rdd缓存到内存中可以提高执行效率,但spark系统本身并没有做这个选择的功能,而是把这个工作交给开发人员。但是随着spark应用程序流程的复杂,选择合适的rdd进行缓存对开发人员来说是一件难事。并且rdd的缓存(cache)级别固定,不能根据动态运行情况来进行调整,这会影响内存使用效率。
关于缓存管理的研究,ganesh等人提出pacman系统,随着集群上机器有了大内存,内存计算输入的cache是一个用来加速数据分析的好方法,但是这些jobs有很多任务,并行运行,一个job只有在他的所有任务都cache才会加速。事实上,单一的任务,当他的输入没有被cache,一样会拖慢整个job。所以为了解决这种要么全部cache,要么全不cache的问题,pacman是一个cache服务,用来管理分布式cache。本质上是为了提高任务完成时间和集群效率。因此pacman实现两个cache替换策略来减小任务平均完成时间,通过驱逐大的未完成的输入,另一种策略是驱逐小的很小访问的输入。
sql应用程序通常同一阶段的多个应用,会处理同一批数据,他们有很多公共的中间结果。spark-sql是基于spark的sql处理系统,他把选择合适数据进行缓存的工作交给编程人员,并且需要编程人员释放缓存数据。
综上所述,在大数据系统中合理管理缓存对程序执行效率有重要的影响;在分布式sql处理系统中,各个应用程序之间和应用程序之内往往存在着可以重复利用以免重复计算的中间结果,但是怎么筛选出这些可以利用的中间结果目前需要编程人员人工确定,这需要编程人员有深厚的编程功底,而且容易出现人工错误。
技术实现要素:
针对现有技术的缺陷,本发明的目的在于解决现有分布式sql处理系统中,各个应用程序之间和应用程序之内往往存在着可以重复利用以免重复计算的中间结果,但是怎么筛选出这些可以利用的中间结果目前需要编程人员人工确定,这需要编程人员有深厚的编程功底,而且容易出现人工错误的技术问题。
为实现上述目的,第一方面,本发明提供一种分布式sql处理方法,包括:
接收用户提交的应用程序,并将提交的应用程序存入应用队列;分析应用队列里面每个应用程序的代码,每个应用程序包括多个中间结果,将每个应用程序中需要在该应用程序中重复使用的中间结果做第一标记,将每个应用程序中需要在其之后的应用程序中重复使用的中间结果做第二标记;在保证数据一致性的同时,完成各个工作节点(worker)上并行运行应用队列中的应用程序,并根据所述第一标记和第二标记直接利用各标记对应的中间结果,提高运行速度。
可选地,该方法还包括:预测当前运行阶段(stage)中最大需要执行内存:通过训练历史实验中取得的样本数据,预测当前stage中最大需要执行内存;通过多组实验统计需要的特征值和预测值,将样本数据划分为训练集和测试集,通过特征筛选和训练,找到最相关的一些特征,来预测当前stage需要的最大执行内存,从而得到当前阶段可以供第一标记的中间结果使用的最大内存空间;根据当前stage需要的最大执行内存将第一标记的中间结果存入内存。
可选地,所述根据当前stage需要的最大执行内存将第一标记的中间结果存入内存,包括:预测当前stage所需最大执行内存,从而得出有多少内存可以用于缓存第一标记的中间结果,如果内存不充足,则需要对当前存储的中间结果进行驱逐,驱逐的方式是通过比较每个中间结果重新计算所需要时间和其占内存大小的比,来得出内存收益,从而驱逐出内存收益小的中间结果,在内存充足后,根据序列化缓存与非序列化缓存所在存储时间与需要使用第一标记的中间结果时的响应时间与当前内存情况进行分析得出合适的缓存方式,以缓存第一标记的中间结果。
可选地,该方法还包括:通过比较存储和重复计算的成本来选择是否将第二标记的中间结果存入磁盘来供后续应用程序使用。
可选地,所述应用程序为sparksql应用程序,所述应用程序的中间结果为弹性分布式数据集rdd。
第二方面,本发明提供一种分布式sql处理系统,包括:用户程序提交模块、程序分析模块以及执行模块;
用户程序提交模块,用于接收用户提交的应用程序,并将提交的应用程序存入应用队列;程序分析模块,用于分析应用队列里面每个应用程序的代码,每个应用程序包括多个中间结果,将每个应用程序中需要在该应用程序中重复使用的中间结果做第一标记,将每个应用程序中需要在其之后的应用程序中重复使用的中间结果做第二标记;执行模块,用于在保证数据一致性的同时,完成各个worker上并行运行应用队列中的应用程序,并根据所述第一标记和第二标记利用各标记对应的中间结果,提高运行速度。
可选地,该系统还包括:机器学习模块,用于预测当前stage中最大需要执行内存:通过训练历史实验中取得的样本数据,预测当前stage中最大需要执行内存;通过多组实验统计需要的特征值和预测值,将样本数据划分为训练集和测试集,通过特征筛选和训练,找到最相关的一些特征,来预测当前stage需要的最大执行内存,从而得到当前阶段可以供第一标记的中间结果使用的最大内存空间。
可选地,所述应用程序为sparksql应用程序,所述应用程序的中间结果为弹性分布式数据集rdd。
可选地,该系统还包括:rdd管理模块,用于根据当前stage需要的最大执行内存将第一标记的中间结果存入内存,根据当前stage所需最大执行内存,从而得出有多少内存可以用于缓存第一标记的中间结果,如果内存不充足,则需要对当前存储的中间结果进行驱逐,驱逐的方式是通过比较每个中间结果重新计算所需要时间和其占内存大小的比,来得出内存收益,从而驱逐出内存收益小的中间结果,在内存充足后,根据序列化缓存与非序列化缓存所在存储时间与需要使用第一标记的中间结果时的响应时间与当前内存情况进行分析得出合适的缓存方式,以缓存第一标记的中间结果。
可选地,所述rdd管理模块,用于通过比较存储和重复计算的成本来选择是否将第二标记的中间结果存入磁盘来供后续应用程序使用。
总体而言,通过本发明所构思的以上技术方案与现有技术相比,具有以下有益效果:
1、本发明可以自动而且更准确的定位需要缓存的数据,传统的rdd缓存需要程序员自己来设置,本发明更精准的选择需要缓存的数据,避免了人工选择的失误,从而提高了程序的性能。
2、本发明不会太大影响执行内存。本发明在进行数据缓存的同时,会通过机器学习模型预测当前stage所需要的最大执行内存,从而保证执行内存充足,不会因为缓存而太大影响执行的时间。
附图说明
图1为本发明提供的分布式sql处理方法流程示意图;
图2为本发明提供的sql程序处理系统结构框图;
图3为本发明提供的程序分析模块执行流程图;
图4为本发明提供的机器学习模型执行流程图;
图5为本发明提供的rdd管理模块执行流程图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
图1为本发明提供的分布式sql处理方法流程示意图,如图1所示,包括:
s1,接收用户提交的应用程序,并将提交的应用程序存入应用队列。
s2,分析应用队列里面每个应用程序的代码,每个应用程序包括多个中间结果,将每个应用程序中需要在该应用程序中重复使用的中间结果做第一标记,将每个应用程序中需要在其之后的应用程序中重复使用的中间结果做第二标记。
s3,在保证数据一致性的同时,完成各个worker上并行运行应用队列中的应用程序,并根据所述第一标记和第二标记直接利用各标记对应的中间结果,提高运行速度。
可选地,该方法还包括:预测当前stage中最大需要执行内存:通过训练历史实验中取得的样本数据,预测当前stage中最大需要执行内存;通过多组实验统计需要的特征值和预测值,将样本数据划分为训练集和测试集,通过特征筛选和训练,找到最相关的一些特征,来预测当前stage需要的最大执行内存,从而得到当前阶段可以供第一标记的中间结果使用的最大内存空间;根据当前stage需要的最大执行内存将第一标记的中间结果存入内存。
可选地,预测当前stage所需最大执行内存,从而得出有多少内存可以用于缓存第一标记的中间结果,如果内存不充足,则需要对当前存储的中间结果进行驱逐,驱逐的方式是通过比较每个中间结果重新计算所需要时间和其占内存大小的比,来得出内存收益,从而驱逐出内存收益小的中间结果,在内存充足后,根据序列化缓存与非序列化缓存所在存储时间与需要使用第一标记的中间结果时的响应时间与当前内存情况进行分析得出合适的缓存方式,以缓存第一标记的中间结果。
可选地,该方法还包括:通过比较存储和重复计算的成本来选择是否将第二标记的中间结果存入磁盘来供后续应用程序使用。
可选地,应用程序可以为spark应用程序,应用程序的中间结果对应为弹性分布式数据集rdd。
本发明针对sql处理程序在串行执行环境下的性能问题,提出了一种基于程序分析和机器学习管理rdd缓存和跨应用rdd缓存的方法。该方法根据程序的rdd地位和机器学习预测当时运行环境下的内存情况来管理rdd,在维持程序执行性能不受到数据缓存所占空间的影响的前提下,通过合理的管理rdd来保证程序的执行性能。
相应地,如图2所示,本发明提供了一种分布式sql处理系统,包括:用户程序提交模块、程序分析模块、机器学习模块、执行模块和rdd管理模块,其中:
用户程序提交模块,用于接收用户提交的应用程序,并将提交的应用程序存入应用队列。
程序分析模块,用于分析应用队列里面每个应用程序的代码,每个应用程序包括多个中间结果,将每个应用程序中需要在该应用程序中重复使用的中间结果做第一标记,将每个应用程序中需要在其之后的应用程序中重复使用的中间结果做第二标记。
执行模块,用于在保证数据一致性的同时,完成各个worker上并行运行应用队列中的应用程序,并根据所述第一标记和第二标记利用各标记对应的中间结果,提高运行速度。
机器学习模块,用于预测当前stage中最大需要执行内存:通过训练历史实验中取得的样本数据,预测当前stage中最大需要执行内存;通过多组实验统计需要的特征值和预测值,将样本数据划分为训练集和测试集,通过特征筛选和训练,找到最相关的一些特征,来预测当前stage需要的最大执行内存,从而得到当前阶段可以供第一标记的中间结果使用的最大内存空间。
其中,应用程序可以为spark应用程序,应用程序的中间结果为弹性分布式数据集rdd。
rdd管理模块,用于根据当前stage需要的最大执行内存将第一标记的中间结果存入内存,根据当前stage所需最大执行内存,从而得出有多少内存可以用于缓存第一标记的中间结果,如果内存不充足,则需要对当前存储的中间结果进行驱逐,驱逐的方式是通过比较每个中间结果重新计算所需要时间和其占内存大小的比,来得出内存收益,从而驱逐出内存收益小的中间结果,在内存充足后,根据序列化缓存与非序列化缓存所在存储时间与需要使用第一标记的中间结果时的响应时间与当前内存情况进行分析得出合适的缓存方式,以缓存第一标记的中间结果。
rdd管理模块,用于通过比较存储和重复计算的成本来选择是否将第二标记的中间结果存入磁盘来供后续应用程序使用。
应用程序分析模块用于分析队列里面应用的代码,通过程序分析,得出该应用中,有哪些中间结果是多次使用的,进行标记;同时分析出当前应用的哪些结果队列中未执行的应用程序也要使用。机器学习模块用于训练样本,这些样本是取自之前的跑的测试样例,来训练并得出一个预测短期内需要的执行内存大小。执行模块用于在保证数据一致性的同时,完成各个worker上并行计算任务的执行。rdd管理模块用于在执行过程中,当在该应用中,某些中间结果在后续需要使用时,选择合适的缓存级别把他缓存;或者当该中间结果需要在后面应用程序中使用时,通过性能分析,选择是否缓存供后面任务使用。
在本发明的一个实施例中,应用程序提交模块采用的程序提交方式为:用户将程序提交到一个作业队列里面,先到先执行。
在本发明的一个实施例中,程序分析模块中的分析方式具体执行过程为:通过符号执行的静态分析方式,得出在当前应用中,有哪些中间结果是多次被后面使用的,并对其被使用情况进行标记。被使用情况分为两种:第一种是在当前应用中被使用,这种被标记为情况1,这种情况下,缓存方式一般为序列化存储在内存里或者非序列化存储在内存里;第二种情况是该中间结果会在后面的应用程序中被使用,这种标记为情况2,这种情况下,缓存方式为设置检查点存储(checkpoint)到磁盘中。
在本发明的一个实施例中,机器学习模块中的执行过程为:首先要运行若干组实验,获得样本;选取合适的特征值,比如当前的分区数、核数、当前执行内存等特征值,预测值为当前stage所需要的最大执行内存;把样本分为训练集和测试集,通过训练筛选出合适的特征值;从而最终得到一个比较准备预测当前stage最大执行内存的模型。
在本发明的一个实施例中,rdd管理模块的具体执行过程为:当代码执行到当初被标记为有必要进行缓存的部分时,会调用rdd管理模块,rdd管理模块会通过机器学习模块得到的预测当前stage所需的最大执行内存模型来预测当前stage的最大执行内存,从而得到当前stage可以留给缓存的最大内存。当内存可以缓存当前rdd时,我们会选择合适的缓存级别来缓存该rdd,例如通过序列化缓存或者非序列化缓存。如果当前缓存空间不足,那么通过rdd置换算法来选择是否把一些rdd驱逐出去来放置最新的rdd。这个驱逐算法是基于一个时间的模型,我们会记录一下这个rdd到上一个缓存的rdd之间所需运行的时间,然后和该rdd缓存所需要占用的内存对比得出一个空间利用值,把空间利用值较小的rdd驱逐出去。
具体的,如图3所示,程序分析模块具体的执行过程为:先将当前应用队列中的应用深拷贝到队列1,之后将新到达的应用拷贝到队列2。对当前需要执行的应用进行符号执行分析,标记需要被其自身重复利用的数据,标记为状态一。对队列1中其他的应用进行符号执行分析,标记当前需要执行应用中可以被这些应用重复利用的数据为状态二。当分析完队列1中的代码后,就可以将当前需要执行的应用提交给执行模块,之后开始执行当前应用,并且开始分析队列2中的程序。如果有队列二中的程序需要利用当前执行应用的中间数据,对执行模块通信,通知他有哪些数据可以重复利用,由rdd管理模块进行管理。
具体的,如图4所示,机器学习模块的具体执行过程为:首先是对特征进行选择,选择多个可能会影响到当前stage最大执行内存的特征,之后跑多组实验数据,并在跑实验过程中,记录所选特征值,和每个stage的最大需要执行内存。之后对这些样本数据进行划分,划分为训练集和测试集,之后对所选特征进行筛选,筛选出影响不大的特征,从而得出预测模型,之后把学习结果,提交给rdd管理模块。
具体的,如图5所示,rdd管理模块的具体执行过程为:对rdd状态进行判断,如果为状态1,则代表这个数据是会在当前应用中重复使用的,那么我们需要用之前训练得到的内存预测模型来预测当前stage所需最大执行内存,从而得出有多少内存可以用于缓存数据,如果内存不充足,则需要对当前存储的rdd进行驱逐,驱逐的方式是通过比较每个rdd重新计算所需要时间和其占内存大小的比,来得出内存收益,从而驱逐出内存收益小的数据集,在内存充足后,根据序列化与非序列化所在存储时间与需要使用数据时的响应时间与当前内存情况进行分析得出合适的缓存方式。如果rdd状态为状态2,则比较该rdd计算时间与存储到磁盘再读入的开销,来判断是否checkpoint到磁盘,这样可以节约后来应用的时间。
本发明采用程序分析和重复利用已经计算过的中间结果,解决了目前基于sql数据处理系统存在着需要人工选择缓存资源和需要重复计算的问题,通过机器学习预测充分利用内存资源来加速数据处理过程。
本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。