一种基于深度强化学习的Spark Streaming参数优化方法

2021-10-18 09:56申国伟崔允贺蒋朝惠伍大勇
计算机与现代化 2021年10期
关键词:权重状态空间

刘 露,申国伟,郭 春,崔允贺,蒋朝惠,伍大勇

(1.贵州大学计算机科学与技术学院,贵州 贵阳 550025; 2.贵州省软件工程与信息安全特色重点实验室,贵州 贵阳 550025;3.科大讯飞股份有限公司,安徽 合肥 230011)

0 引 言

在大数据时代,批量计算和流计算是2种典型的分布式计算任务。随着广告点击流、网络数据流等流式数据越来越多,分布式流计算受到越来越多的关注。随着开源生态的发展,目前典型的分布式流计算框架有Storm[1]、Flink[2]、Spark Streaming[3]等。Spark Streaming作为Spark core API[4]的扩展,生态圈成熟,支持实时数据流的处理,且具有可扩展、高吞吐量、容错等特点,成为主流的分布式流分析框架。

Spark Streaming作为一种通用的分布式流计算平台,平台的通用性和兼容性是当初设计考虑的重要因素,特定的业务应用依赖于默认参数配置,往往难以发挥最优性能。因此,在Spark Streaming上针对不同的业务应用进行参数配置优化是性能优化的关键。目前围绕Spark Streaming的性能优化主要包括2个方向:调度优化与参数优化。

调度优化是指Spark Steaming针对不同作业进行动态调度,以实现平台的性能提升。Kross等人[5]以Spark Streaming为例,提出一种通过建模和仿真来预测Spark Streaming应用程序响应时间的方法。Venkataraman等人[6]在Spark上构建了一种在线自适应算法,并和Spark Streaming进行集成。该算法允许流平台自动调整批处理大小,能够根据数据速率、工作负载行为和可用资源的变化快速调整批处理大小。Ajila等人[7]在Spark Streaming上实现了一种数据驱动的优先级调度方法,将输入数据项进行优先级配置,确保优先级较高的先于优先级较低的数据项进行处理。

在Spark Streaming性能优化领域中,参数优化是另一个研究热点。在执行流计算任务时需要预先设置配置参数,如果参数配置不当,会降低Spark Streaming执行流作业的执行性能。作为Spark生态圈一员,Spark Streaming可配置参数有200多个。目前针对参数优化的方法大体分为手动方法和自动方法。手动方法对参数调试人员有着较高的要求。调参时不仅需要清楚Spark Streaming中每个配置参数的含义及参数之间的关系,还要明确不同参数配置组合对流作业不同方面的影响。调参过程中最为困难的是可配置参数取值空间大,例如当只调整3个参数时,每个配置参数取值如果有10种可能,则会存在1000种参数组合配置。因此人工调参的方式将耗费大量人力,且难以得到较优的参数配置。

早期Spark参数优化方案主要是设计搜索算法,从较大的配置空间中寻找到较优参数配置。常见的搜索算法有遗传算法[8-9]、爬山算法[10-11]、随机策略法[12]等搜索算法。目前Spark Streaming自动参数配置方法以设计参数调优方案为主,例如Prasad等人[13]通过观察RDD对应Partition数目,建立一种能够在实际部署流应用程序之前预测其性能的线性回归模型来降低Spark Streaming的处理时间,但需要研究者多次人为设置微批处理时间来统计数据。Cheng等人[14]提出了一种基于强化学习中Policy Gradient算法[15]的在线调优方法,动态调度Spark Streaming中的并行微批作业,并自动调整参数,以提高性能和资源效率。上述方法需要研究者对于Spark Streaming内部原理结构深入研究,并修改源码才能实现,很难具有通用性。

在实际应用场景中,直接获得当前流作业在Spark Streaming集群环境的最佳参数配置是困难的。因此,本文提出一种基于深度强化学习[16]的Spark Streaming参数优化方法(A Spark Streaming Parameter Optimization Method Based on Deep Reinforcement Learning, DQN-SSPO),与前人所做工作的不同之处在于,本文方法在不修改Spark Streaming内部程序结构情况下,通过研究Spark Streaming可配置参数与流作业运行性能之间的关系进而得到优化后的参数配置,提高流计算任务的执行性能。主要工作有:

1)本文将优化Spark Streaming参数配置问题转化为深度强化学习中的最大回报获得问题,不需要修改Spark Streaming源码,可降低人工参数调优的不确定性。

2)针对Spark Streaming参数空间维度高的问题,本文设计权重状态空间转移方法来提高深度强化学习前期模型训练获得高反馈的概率。

3)在3种典型Spark Streaming流计算任务上实验,当使用DQN-SSPO方法得到优化参数组合配置后,总处理时间及总调度时间都有较大缩减。

1 DQN-SSPO算法

Spark Streaming参数优化问题为:设置合理化参数组合配置从而提高Spark Streaming流计算任务性能,而实际中由于参数空间维度过高导致确定较优参数配置变得尤为困难。

深度强化学习是一种无需人工提取状态和特征,结合深度学习的感知能力以及强化学习的决策能力的新型方法,在计算机视觉、无人驾驶等方面取得了良好的成绩。DQN-SSPO算法设计将深度强化学习应用到Spark Streaming参数优化问题中,将降低Spark Streaming总延迟时间作为最终目标。图1为DQN-SSPO算法中马尔科夫决策过程。

图1 DQN-SSPO马尔科夫决策过程

图1中S表示参数状态空间;A表示参数状态空间转移的动作空间;R表示在状态S下采取动作A所得的即时奖励。DQN-SSPO算法利用马尔科夫决策过程构建参数优化算法。本文对DQN-SSPO马尔科夫决策过程中的关键要素做如下设计。

1)状态空间S。

由每个参数取值范围共同转换为参数状态空间,状态空间转换步长设置为1。Sk表示参数状态,其组成原理如图2所示。其中Pi为第i个参数的参数空间,i∈{0,1,…,N},N为参数个数。

图2 参数状态组合方式

2)动作空间A。

针对每个参数空间设计一个游标指向参数空间的坐标。动作空间A=[A0,A1],分别对应“增加1位”与“减少1位”这2种动作。

3)即时奖励R。

本文为了评估在当前参数状态S下采取动作A后得到的即时奖励R(S,A),设计一种参数动态奖励机制。由流计算任务在参数状态S下进行分析后返回的一组性能评价指标与默认参数下所获得的性能评价指标进行参数动态奖励机制计算后,得到当前状态的奖励R,其中性能评价指标包括总处理时间Tprocess和总调度时间Tschedule,R的具体计算过程如图3所示。

图3 参数动态奖励机制

1.1 权重状态空间转移

深度强化学习模型训练前期,智能体并不清楚环境的情况,所以前期模型训练很缓慢,需要一定的时间熟悉环境才能得到更好的奖励。如何合理化设计深度强化学习Agent探索方向是提高模型训练收敛速度的关键,但由于Spark Streaming参数空间太大,使强化学习模型训练前期探索时间过长,不利于模型收敛。针对此问题,本文提出权重状态空间转移方法,使得模型在探索环境时有引导性地进行参数空间转移,加快模型的训练速度。具体步骤如下所示,其中关键参数的权重作为不同流计算任务模型训练中参数状态转移的指标。

1)根据经验获取候选参数。

2)对候选参数做主成分分析,得到Spark Streaming流计算任务关键参数。

3)针对不同流计算任务获得对应关键参数的权重。

Spark Streaming的可配置参数按照其参数功能可分为13大类[17],但其中很大部分参数并不会对作业产生很大影响,例如作业名、存储路径等。本文去除掉这部分参数后在获取候选参数时,从2个方面进行考虑:1)实验采用Spark的Standalone独立模式进行部署;2)实验中采用Apache Kafka[18]作为流计算任务数据中间缓冲。最后根据自定义6个分类得到63个候选参数,如表1所示。

表1 Spark Streaming候选参数列表

首先通过表1随机设置不同候选参数组合,采取PCA算法对参数组合进行主成分分析,进行初步降维,处理步骤如下:

1)将参数中非数值化数据进行数值化处理。

2)采用p-范数如式(1)进行数据预处理。

(1)

将候选参数进行PCA计算后得到候选参数指标在不同主成分线性组合中的系数,并将其进行Min-Max归一化处理。最终将权重低于0.3的参数剔除后得到9个关键参数。

1)spark.executor.memory(s.e.m):每个executor进程所需要的内存大小。

2)spark.driver.cores(s.d.c):driver程序运行需要的CPU内核数。

3)spark.executor.cores(s.e.c):每个executor进程所需要的CPU内核数。

4)spark.streaming.kafka.maxRatePerPartition(s.s.k.m):控制从Kafka分区读取数据的速率。

5)spark.default.parallelism(s.d.p):系统使用集群中运行Shuffle操作的默认任务数。

6)spark.streaming.batchInterval(s.s.b):Spark Streaming微批处理时间。

7)spark.driver.memory(s.d.mem):driver程序运行所需内存。

8)spark.driver.maxResultSize(s.d.max):所有分区的序列化结果的总大小限制。

9)spark.serializer(s.s):序列化方式。

在获取到关键参数后,通过获取部分不同流计算任务在Spark Streaming平台上分析的数据,计算出关键参数对应的权重。具体流程为:通过随机设置不同候选参数组合来进行分析。自变量为Spark Streaming关键参数组合配置,因变量是设置参数配置后在Spark Streaming平台上提交流计算任务后分析的总延迟时间Tdelay,Tdelay为总处理时间Tprocess和总调度时间Tschedule之和。使用决策树中的Gini指数来衡量参数对流计算任务的重要性,即参数的权重。式(2)表示A参数特征的Gini指数计算方式。

(2)

其中D为流计算任务随机参数配置所获得的分析样本数据集合,Ck为样本集合D中属于第k类的样本子集。最后聚合所有Gini指数得到特征权重,进行归一化处理后得到关键参数权重。

关键参数的权重是深度强化学习模型训练中状态空间转移的重要参考指标,权重越高的参数,模型训练中Agent探索其参数空间的概率也越高。

1.2 模型训练

深度强化学习DQN使用神经网络来映射状态空间和动作空间,为了让模型减少过拟合现象,本文基于Double DQN[19]模型来进行DQN-SSPO算法构建。DDQN先在估值网络Q中找到最大Q值对应的动作amax(S′,ω)如式(3),再在目标网络Q′中计算目标值yDDQN如式(4)。这个Q值在目标网络中不一定是最大的,所以能有效避免再次选到被高估的动作。

(3)

(4)

DQN-SSPO算法以提高其处理性能为目标,将Spark Streaming流计算任务作为输入,输出调优后的较优参数配置Sbest。具体如算法1所示。

算法1 DQN-SSPO算法。

输入:Spark Streaming流计算任务Job,初始化经验回放单元D;批量梯度下降的样本数m,参数更新频率C。

输出:较优参数配置组合Sbest。

1.初始化最大累计奖励Rmax=0

2.for episode=1 toEdo

3.随机初始化参数配置组合St

4.初始化该episode累计奖励R=0

5.fort=1 toTdo

6.使用ε-greedy策略选择动作At

7.通过权重状态空间转移方法得到新参数状态St+1

9.根据参数动态奖励机制得到即时奖励Rt

10.将〈St,At,Rt,St+1〉存入经验回放集合D

11.从D中随机抽取m个数据样本进行模型训练,见公式(3)及公式(4)

12.根据C使用均方差损失函数MSE进行参数更新

13.R=R+Rt

14.end for

15.如果R>Rmax,则Rmax=R

16.end for

17.根据Rmax获取较优参数配置Sbest

图4为模型训练过程中一个episode中单步参数状态转移的执行过程(s,a,s′,r)。神经网络在接收Spark Streaming参数空间状态s后,从对应动作空间的不同Q值中使用ε-greedy贪婪策略来选择动作a。环境接收到此动作后,利用权重状态空间转移方法得到基于该动作转移后的新参数状态组合s′,将其应用到Spark Streaming流计算任务中进行分析后得到奖励r。此时会根据奖励更新值函数网络的参数,紧接着进行下一步。

图4 参数状态转移的单步执行过程

模型训练中每一步参数空间转换时记录当前的累计奖励,例如在参数状态S得到的累计奖励Rbefore,在执行一步参数状态空间转移后,在新参数状态S′得到的累计奖励为Rnow=Rbefore+R(S,A)。倘若在该episode训练过程中Rnow-Rbefore≥Max_gap时则结束该episode。

2 实验环境及准备

2.1 实验环境

实验环境分为处理流计算任务的Spark Streaming集群环境及深度强化学习环境2部分。本实验在batchn个微批处理下,进行流计算任务分析。其分布式集群环境配置如表2所示。

表2 分布式集群环境及软件配置

考虑到本实验参数空间维度及任务难度,神经网络采用3层结构、16个神经元,使用Adam梯度下降优化算法更新权重值和偏置值,以学习率0.001进行构建。实验的参数设置如表3所示。

表3 DQN-SSPO算法模型训练相关参数

2.2 流计算任务选择

为了验证DQN-SSPO算法的有效性,选择3种典型的流计算任务进行实验,包含1种实际应用流计算任务和2种通用流计算任务。

1)流检测任务(逻辑回归)。

2)Sort流计算任务。

3)WordCount流计算任务。

流检测任务使用2017年入侵检测数据集CIC-IDS2017[20]中的DDOS检测任务、Slowloris检测任务、PostScan检测任务与SSH暴力攻击检测任务。为了测试参数配置对Spark Streaming并行分析能力的影响,采用4个二分类模型同时对4种攻击检测流计算任务进行并行分析。模型训练使用CICFlowMeter流量分析工具进行76维特征提取后,由Spark Mlib进行分类模型构建,检测过程如图5所示。

图5 流检测任务执行过程

WordCount流计算任务和Sort流计算任务实验数据使用BigDataBench[21]提供的数据生成脚本自动生成2 GB数据集。

3 实验及分析

3.1 基于权重状态空间转移的模型影响分析

为了验证DQN-SSPO算法中权重状态空间转移方法的有效性以及其对模型的影响,本实验以流检测任务为例进行分析,将权重状态空间转移方法应用到模型训练中,与未经过权重设置的参数状态空间转移方法进行对比分析。

流检测任务使用权重状态空间方法得到对应的Spark Streaming关键参数权重如图6所示。其中关键参数使用简写代替。

图6 流检测任务中关键参数归一化权重

将模型训练过程中总episode数平均分为10段,取每一段的平均奖励和平均训练步数来进行对比分析。由图7和图8所示的结果可知,使用默认状态空间转移方法时,模型训练中由于Agent完全对环境不熟悉,刚开始的训练步数和累计奖励很少,模型训练很不稳定。使用权重状态空间转移方法训练模型时,Agent在环境中有一定的方向认知,在进行探索时能获得较好的训练。从图7及图8结果可知,虽然前期有一定的波动,但是随着训练episode的增加,模型获得高反馈的概率在权重状态参数转移方法中高于默认参数状态转移方法。综合上述对比分析,权重参数状态转移方法增加了Q网络的收敛速度,同时增加获得高反馈的概率。

图7 平均累计奖励对比分析

图8 平均累计步数对比分析

3.2 DQN-SSPO参数优化方法实验及分析

3.1节验证了权重状态空间转移方法的有效性,本节首先进行流检测任务参数优化方法实验以检验DQN-SSPO算法的效果。图9为流检测任务模型训练过程中随着episode增加,累计奖励与累计步数的变化图。DQN-SSPO算法将模型训练期间得到的最大累计奖励Rmax所对应的累计步数中终态作为较优参数组合配置Sbest。

图9 流检测任务DQN-SSPO模型训练中累计奖励与累计步数的变化图

由于Spark Streaming流检测任务是微批处理任务,为了测试微批处理能力对Spark Streaming分析性能的影响,本实验加入一组控制s.s.k.m参数情况,即控制Spark Streaming的吞吐量,参数计算方式如式(5)所示。

(5)

其中,H为总吞吐量,batchn为微批处理数,partition为Kafka对应流检测任务的Topic总分区数,batcht为Spark Streaming流检测任务的微批处理间隔时间s.s.b。实验基于3种情况进行,第1种是使用默认参数,未控制Spark Streaming吞吐量情况;第2种是使用默认参数,但控制吞吐量的情况;第3种是控制吞吐量后,并基于DQN-SSPO算法优化后得到的较优参数组合配置情况。

3种Spark Streaming参数配置下执行流检测任务的性能对比如图10所示。由图可知,在未控制吞吐量及配置默认参数时,其总调度时间和总处理时间都相对最高。当控制吞吐量后,Spark Streaming总处理时间缩短了14.43%,说明增加微批处理能力是流计算任务调度时间减少的关键。流检测任务参数优化实验在设置较优参数组合Sbest后,相较默认参数(控制吞吐量)情况下,总调度时间缩短了37.50%,总处理时间缩短了50.20%。

图10 3种参数配置下流检测任务的性能对比

同理,WordCount流计算任务与Sort流计算任务使用权重状态空间方法得到对应的关键参数权重如图11及图12所示。由图可知,不同参数对于不同流计算任务的影响程度不同,所以对不同流计算任务分析其参数权重是有必要的。

图11 WordCount流计算任务中关键参数归一化权重

图12 Sort流计算任务中关键参数归一化权重

流检测任务参数优化方法实验结果表明控制吞吐量是总调度时间减少的关键,所以只在配置默认参数(控制吞吐量)及配置优化参数2种情况下进行2种通用流计算任务参数优化方法实验。图13与图14为2种通用流计算任务分别在2种参数配置情况下的性能对比。由图所示,在本实验环境下,DQN-SSPO算法在2种通用流计算任务上也有效果,在总调度时间上分别缩短了12.50%和37.08%,总处理时间上分别缩短了33.82%和39.41%。

图13 2种参数配置下WordCount流计算任务的性能对比

图14 2种参数配置下Sort流计算任务的性能对比

实验表明,3种流计算任务根据DQN-SSPO参数优化算法进行Spark Streaming参数调优后,其流处理性能都有较大幅度的增加,说明了DQN-SSPO算法的有效性及可扩展性。

3.3 DQN-SSPO模型参数调整分析

在DQN-SSPO算法中,超参数设置对深度强化学习模型训练会产生很大影响。随着模型训练episode数的增加,模型获得高反馈的能力增加,模型训练的收敛速度将逐渐加快,反馈会在一个奖励临界点上下波动。此外,在DQN-SSPO方法中引入了经验回收机制,模型训练执行的最大步数Stepmax和经验池D是影响DQN-SSPO模型训练的重要参数。因此,下面将分析调整2个参数对DQN-SSPO方法的鲁棒性影响。

表4 参数调整后模型反馈结果

实验中Stepmax分别设置为5000、10000、15000,经验池容量D分别设置为2500、5000进行模型训练。通过模型训练反馈的信息进行模型训练效果的判断。本文定义Pm来反应模型训练过程中整体的效果,见式(6),Pm越大说明模型训练整体效果越好。

(6)

通过实验反馈可知,当Stepmax设置为10000,经验池含量D设置为5000时,Pm相对最高,并且此时模型训练中最大奖励Rmax值也相对最高。

3.4 不同方法的参数选择对比

目前Spark Streaming的参数优化方案较少,本节将DQN-SSPO算法与一些针对Spark或Spark Streaming的参数优化方法进行对比,对比结果如表5所示。目前大多数参数优化方法在考虑调整参数个数上均依赖人工经验设置,这样会出现局部最优解现象,导致其可扩展性不强。DQN-SSPO针对不同流计算任务进行关键参数权重计算,根据其权重来控制模型训练中参数状态空间的转移方向,更大程度增加参数调优对提升流计算任务性能的影响。

表5 参数选择方法对比

4 结束语

针对Spark Streaming的参数优化配置问题,本文提出DQN-SSPO算法,其是一种基于深度强化学习的Spark Streaming参数优化方法。实验表明,3种流计算任务通过DQN-SSPO算法优化后得到的较优参数配置,使Spark Streaming性能有较大提升。下一步考虑将深度强化学习引入Spark Streaming微批处理能力中,在流计算任务中动态调整微批处理性能来增加流处理性能。

猜你喜欢
权重状态空间
空间是什么?
权重常思“浮名轻”
创享空间
状态联想
为党督政勤履职 代民行权重担当
生命的另一种状态
坚持是成功前的状态
基于局部权重k-近质心近邻算法
层次分析法权重的计算:基于Lingo的数学模型
QQ空间那点事