一种基于Spark算子的序列化存储优化方法与流程

文档序号:12719457阅读:920来源:国知局
一种基于Spark算子的序列化存储优化方法与流程

本发明涉及大数据、内存计算领域,更为具体地讲,涉及一种自定义的序列化存储策略。



背景技术:

大数据时代的到来,也引领了大数据处理平台生态圈的不断更新。由于MapReduce框架仅支持Map和Reduce两种操作,迭代计算效率低下,在交互式处理及流式计算环境下具有局限性,于是,一种可同时进行批处理、流式计算、交互式计算的高效分布式计算框架Spark应运而生。该框架采用弹性分布式数据集(RDD)基于缓存进行迭代计算,以提高计算效率。

大部分Spark程序都具有“内存计算”的天性,所以集群中的所有资源:CPU、网络带宽或者是内存都有可能成为Spark程序的瓶颈。由于在迭代计算中,要提高计算效率,最好是将数据全部加载进内存,但在大数据计算环境下,必然会有大的数据集存在,且缓存资源有限匮乏的问题,因此,数据集序列化存储成为关键。

为了提升缓存利用率,需要在RDD序列化过程中保证选出的RDD对象是后面较少会参与计算的RDD,而让后面需要迭代计算或者多次使用的RDD尽量保留在缓存中,然而,由于在任务调度的过程中,需要根据不同的业务逻辑使用不同的算子去处理所得到的RDD集合,而由于不同算子的内部实现不同,导致的在RDD数据集转换的过程中执行效率不同,而数据集本身的大小也不同,另外,RDD的生命周期即某一RDD数据集的使用次数,也对序列化存储策略的选择起到关键性的作用。因此,RDD序列化的选择会受到算子运行代价、RDD执行时间及RDD跨过的Action数量等因素的影响。

在当今大数据时代,大型公司、企事业单位、政府等机构业务系统复杂,数据形式多样化,急需引入新的大数据处理平台处理海量数据,而Spark则是基于内存计算的高效分布式框架,因此其内存称为处理数据速度提升的关键因素,但是由于缓存资源有限,在处理大数据集时仍然需要将部分数据序列化存储到磁盘,影响计算性能,因此合理高效的序列化存储策略,会成为提高基于缓存迭代计算效率亟待解决的问题。



技术实现要素:

有鉴于此,本发明的目的是提供一种基于Spark算子的序列化存储优化方法。该方法应用于现有的Spark大数据平台上,能够在内存资源有限时使整个应用保持较高的执行效率。

本发明的目的是通过以下技术方案来实现的,一种基于Spark算子的序列化存储优化方法,包括以下步骤:

S1)使用ganglia检测应用执行过程中机器的内存使用量,如果检测到当前内存值正常,则继续监测,若检测到已达到指定阈值,则执行步骤S2);

S2)计算RDD的执行时间RDD的执行效率和算子权值Wi;

S3)根据RDD的执行时间RDD的执行效率和算子权值Wi得到已排序的RDD序列即序列化候选集合;

S4)从序列化候选集合中选择值最小的进行序列化存储;

S5)继续步骤1),直到应用执行完毕。

进一步,在步骤S2)中,所述执行时间通过公式(1)获得:

其中,m表示第i个RDD总共有m个分区,Sij表示第i个RDD的第j个分区的大小,Pmem表示机器的处理能力。

进一步,在步骤S2)中,RDD的执行效率通过公式(2)获得:

FTij表示分区完成时间,STij表示分区开始时间,Nij表示表示某个RDD的分区数量;EPij表示第i个RDD上所有分区的执行能力。

进一步,在步骤S2)中,定义Wi(i=1,2,…,M)表示算子权值,每个算子均有一个权值,根据层次分析法得到算子的时间复杂度和空间复杂度之间的度量关系Cv=f(Ot,Os),算子权重Wi通过以下公式获得:

代表算子的时间复杂度,表示算子的空间复杂度,Cv表示时间复杂度和空间复杂度的度量关系。

进一步,在步骤S3)中,RDD权值通过公式(5)获得:

其中,Size(RDD)表示RDD的大小,Wi表示第i个算子的权值,AN表示算子经过的Action个数,表示第i个RDD的处理时间,k表示校正参数,取值为{10,100,1000,…}。

由于采用了上述技术方案,本发明具有如下的优点:

本发明实现在应用执行过程中高效存储有价值的RDD缓存,从而提高内存的使用率。

相比与现有的缓存使用方案,本方法应用于现有的Spark大数据平台上,能够在内存资源有限时使整个应用保持较高的执行效率。

附图说明

为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步的详细描述,其中:

图1为本发明的方法流程图;

图2为本发明的一个使用平台示意图;

图3为迭代计算的重复过程;

图4为内存占用率对比图。

具体实施方式

以下将结合附图,对本发明的优选实施例进行详细的描述;应当理解,优选实施例仅为了说明本发明,而不是为了限制本发明的保护范围。

如图1所示,它是本发明的一个使用平台示意图。在集群调度过程中,每个task执行RDD转换的过程中,添加以上序列化存储策略,实时侦测出要处理的RDD是否需要缓存。

一种基于Spark算子的序列化存储优化方法,包括以下步骤:

S1)使用ganglia检测应用执行过程中机器的内存使用量,如果检测到当前内存值正常,则继续监测,若检测到已达到指定阈值,则执行步骤S2);

S2)计算RDD的执行时间RDD的执行效率和算子权值Wi

执行时间和RDD的执行效率的具体计算方法为:

用R={RDD1,RDD2,...,RDDn}表示应用所使用的RDD集合,本文中的集群内存分配为1G,2G,4G,因此本发明使用表示机器的处理能力(其中k=1,2,3),此处使用Sij表示第i个RDD的第j个分区的大小(S1+S2+......+Sn=Size(RDDi))。

可以近似得出每个分区的执行时间:

由于每个RDD中的所有分区都是并行执行的,所以RDD的执行时间即为最长的分区所执行的时间,即

其中,m表示第i个RDD总共有m个分区。

由于在集群中应用执行的过程中,有些分区需要从其他节点上拉去数据,所以需要考虑节点间的通信时间,这里本发明使用分区的完成时间与开始时间之差表示,即:FTij-STij,用Nij表示某个RDD的分区数量,至此本发明可以得到整个RDD的执行效率为:

算子权重的具体计算方法为:

定义Wi(i=1,2,…,M)表示算子权值,其中M表示算子个数。每个算子均有一个权值,根据上述层次分析法可以得到算子的时间复杂度和空间复杂度之间的度量关系Cv=f(Ot,Os)。

其中,Ot代表算子的时间复杂度,Os表示算子的空间复杂度,Cv表示时间复杂度和空间复杂度的度量关系。

S3)根据RDD的执行时间RDD的执行效率和算子权值Wi得到已排序的RDD序列即序列化候选集合;

定义表示a算子后面的第i个RDD数据集权值,根据上述参数定义及计算规则,RDD权值可按照公式(6)表示:

其中,Size(RDD)表示RDD的大小,Wi表示第i个算子的权值,AN表示算子经过的Action个数,表示第i个RDD的处理时间,k表示校正参数,取值为{10,100,1000,…}。

S4)从序列化候选集合中选择值最小的进行序列化存储;

S5)继续步骤1),直到应用执行完毕。

S5)继续步骤1),直到应用执行完毕。

本发明的基本思想是建立一个优化的序列化存储策略,实现在应用执行过程中高效存储有价值的RDD缓存,从而提高内存使用率的目的。

相比与现有的缓存使用方案,本方法应用于现有的Spark大数据平台上,能够在内存资源有限时使整个应用保持较高的执行效率。

下面以图2为例,说明本方法的具体实施过程:

1、加入策略过程。

(1)用户通过下载Spark源码,编译运行成功后将上述自定义序列化存储策略加入task调度RDD的位置,并设置内存阈值Q。

(2)重新编译,打包,运行。

2、PageRank算法执行过程。

(1)使用采样法获取算法中所用到的算子类型及调度的DAG图。

(2)该算法通过多轮迭代计算来不断修正初始值w,直到w的值在某轮计算后的改变小于设定阈值或迭代计算次数达到设定次数上限。

(3)图2中展示了迭代计算的一个重复过程,迭代类型为join->flatMap->reduceByKey->mapValue。所以这其中就涉及了四个算子,因此就需要计算这四个算子对应的算子权值,而从该应用的执行过程来看,RDD跨过的Action个数也即迭代次数,而执行时间也可以根据公式(4)通过加入到源码中的参数侦测到,由此,可以根据公式(5)在Action触发之前计算出一个RDD序列,该序列按照RDD权值从小到大排列,也即是RDD序列化存储到磁盘的顺序(本发明考虑的是内存资源不足的情况,当内存资源充足时,当然是尽可能将所有中间数据都加载到内存)。

3、结果验证过程

(1)由图2可以看出join之后的操作即为重复迭代过程,因此就需要将所有的数据缓存,这样,在下一轮计算过程中,可以直接使用上一轮的计算结果,而在内存资源匮乏时,就需要有所选择,选择算子运行代价大,本身又小的数据缓存,图中的reduceByKey算子即为一个复杂算子,因此reduceByKey之后的RDD需要缓存,而本发明通过序列化存储策略得出的序列化存储策略,reduceByKey算子后面的RDD排在最后,这就说明,该RDD最不能序列化到磁盘。

(2)通过一个开源集群监控项目ganglia可以实时监控出整个集群中每个机器的内存使用情况。图3中,本发明可以看到使用序列化存储策略的应用系统内存占用率明显高于未使用序列化存储策略的应用。根据本发明上面提出的序列化存储策略,能够选择重复使用的RDD缓存,而当该RDD再次出现时,不需要重算他们,这就减少了系统计算开销,加速了整个迭代计算的运行时间。当增加数据集中的边和节点时,内存占用率会更高,这是因为Spark是基于内存计算的,增加边和节点,没有充足的内存存放中间数据,直到最后一次迭代结束才会释放掉内存。因此,默认的Spark序列化存储策略带有很大的随机性,不能够使内存的优势充分体现出来,而改进的算法则能够提高应用的内存占用率,进而提高应用的执行效率。

以上所述仅为本发明的优选实施例,并不用于限制本发明,显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

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