关键词
Spark SQL
Bayesian Optimization
Transfer Learning
导 读
基于迁移学习的在线Spark SQL调优服务
KDD会议始于1989年,是数据挖掘领域历史最悠久、影响最大的顶级学术年会。KDD广泛的交叉学科性和应用性吸引了来自统计、机器学习、数据库、万维网、生物信息学、多媒体、自然语言处理、人机交互、社会网络计算、高性能计算及大数据挖掘等众多领域的研究者,为来自学术界、企业界和政府部门的相关人员提供了一个学术交流和成果展示的理想场所。本次KDD 23 ADS Track一共收到725篇论文提交,最终录取数量为184篇,接受率为25.4%。
Apache Spark作为主流的分布式计算框架,在工业界得到了广泛的应用。但是,Spark SQL的表现极度依赖于其配置选择,而由于平台默认配置缺乏弹性,任务环境多样,终端用户经验不足等问题,相当数量的计算资源常因不合理的配置而被浪费。传统上,有经验的大数据工程师可以依据每个任务的运行情况,对其配置进行人工分析和调整。然而,这种人工调优方式在面临高维参数组合时往往难以奏效,并伴有运维迭代成本高昂等问题,使得其难以被规模化。
在这篇论文中,我们提出了Rover, 一种结合机器学习方法与人类专家知识的Spark SQL调优框架(如图1所示),该框架以贝叶斯优化算法为基础,使用高斯过程作为代理模型学习配置参数集与任务成本/运行时长的关系,并通过可信赖的迁移学习机制,从人类专家知识编码中获得安全性和可解释性,并从相似的历史任务中获得额外的收敛加速特性。实验结果显示,Rover在公开测试数据集和工业场景任务中都展现出了超越基线的性能。具体地,Rover在12000个工业场景的Spark SQL任务上进行20轮调优后,节约了平均50.1%的内存开销,其中76.2%的任务的内存开销取得了60%以上的显著降低。
论文链接:https://dl.acm.org/doi/10.1145/3580305.3599953
01
问 题 背 景
大数据查询系统,如Hive, Pig, Spark SQL[1]等,已经在工业界广泛应用,为包括推荐系统、广告推送在内的各种下游任务处理大量数据。其中,Spark SQL作为Apache Spark的一个模块,继承了Spark编程模型的优势,为大量数据的分布式处理提供了强大的功能。
然而,如何设置Spark SQL的配置,使其能够获得较优的表现是非常具有挑战性的。以参数spark.executor.memory为例,这一参数指定了每个spark执行进程的内存数量,过大的值会导致冗长的垃圾收集时间,而过小的值可能导致内存溢出错误。因此,合适地调整参数的值对Spark SQL任务取得令人满意的表现具有关键作用。此外,在我们所考虑的在线Spark SQL调优任务场景中,由于离线验证的巨大开销和安全性考虑,每个给出的配置只能在真实的工业生产中被验证,因而调优系统必须仔细选择给出的配置,确保给出的配置能在较少的轮次内快速取得较好的效果(高效),同时只有极低的风险产生负面的效果(安全)。
在在线Spark SQL任务的配置调优过程中,调优系统给出的配置要同时满足高效和安全两方面的要求。现有方法使用贝叶斯优化(BO)框架[2]来减少找到较优配置所需的验证轮次。然而,BO极大地受到重优化问题的困扰。当其被应用于一个每天仅被执行一次的新任务上时,往往需要数月的时间才能找到好的配置,并不高效,并且在优化过程中会给出使表现下降的不安全的配置。这导致经典的BO框架在真实的工业场景中是无法直接应用的。
为了加速BO的搜索进程,一种将外部知识迁移到现有任务,与BO的搜索算法结合的方法,TLBO[3]已经被提出。但是,要将TLBO应用于在线Spark SQL调优场景中,我们发现仍有以下两个问题需要被解决。
C1. 迁移什么?已有的TLBO方法往往考虑使用之前任务的调参历史来进行迁移。然而,在Spark SQL场景下,我们注意到一些领域特定的知识,如富有经验的工程师的参数调整建议,也能被用于进一步提升调优的表现。如何将这些知识进行编码,并和已有的自动化搜索算法结合是一个需要解决的问题。
C2. 如何迁移?已有的TLBO算法往往假设调参历史中总是存在和现有任务相似的任务,并使用其中的一个或全部任务(不超过20个)进行迁移。然而,在真实的工业场景中,历史任务会随着时间大量积累,并且其中大部分任务可能和当前任务并不相似。使用不相似的历史任务进行迁移可能导致调参表现的衰退,从而引发负迁移问题。因此,如何在大量历史任务中鉴别相似任务,并将各个相似任务中的知识进行结合是一个必须解决的问题。
02
Rover 设 计 方 案
2-01
系统框架
图1展示了Rover系统的框架概览。整个框架主要由四部分组成:1)与用户和云平台进行交互,并控制整个调参过程的Rover控制器;2)存储了在不同Spark SQL任务上的不同配置的运行结果及环境信息的观察,以及总结得到的专家经验的知识数据库;3)拟合Spark SQL任务上配置与观察得到的表现之间的关系的代理模型;4)在调参任务的每一轮中给出推荐配置的配置生成器。
图 1 Rover系统结构概览
在系统运行时,用户首先指定调参目标,并将工作负载加载到Rover控制器上,之后,Rover将会开始迭代式的调优。在每一轮调优中,Rover控制器首先将一个新的配置上传到云平台,并在负载执行结束后获取相应的调参目标及环境信息。这些信息将被发送到知识数据库进行存储。基于其中的专家知识和任务历史,Rover控制器将会建立一个代理模型来拟合配置和调参之间的关系,最后,配置生成器将会基于代理模型的预测结果,向Rover控制器采样提供一个新的配置。
值得注意的是,所有的配置都是在真实的工业环境中执行的,Rover并不需要像之前的工作那样花费额外的离线调优开销。当调参任务结束后,云平台将会使用调参过程中发现的最好配置来执行相应的负载。此外,Rover还为用户提供了一系列接口,使用户能够监控调参过程中的实时信息并做出进一步的决定。
2-02
专家辅助的贝叶斯优化
为了解决之前提出的迁移什么?的问题,将富有Spark SQL领域调参经验的专家工程师的知识纳入可迁移的知识范围内,我们首先将Spark专家的一些调整Spark参数的经验,写成了由一系列条件操作构成的专家规则树,并从以下3个方面出发,提出了专家辅助的贝叶斯优化方案。
紧凑的搜索空间 由于搜索空间维数的增加会导致可能的Spark配置数的指数增长,搜索空间的大小极大影响着调优的过程。为了降低BO代理模型的拟合难度,Rover结合对历史任务在全空间上调参结果的SHAP分析值和专家给出的建议,选择了一个由固定的10个参数组成的更紧凑的空间作为搜索空间。
基于专家的随机初始化 如图2所示,Rover将专家规则树传统的BO中的随机初始化阶段相结合,构建了基于专家的随机初始化方案。在初始化的每一轮,Rover首先对前一轮的配置应用专家规则树,得到更新过的配置(图中红点)。之后,一个新的配置(图中蓝点)将在该配置的±20%邻域中被随机选取,作为下一轮给出的配置。这一初始化方法在兼顾初始化阶段对搜索空间的探索的同时,保证了Rover不会因为随机选择而推荐过差的配置,一定程度上保证了搜索过程的安全性。
图 2 基于专家的随机初始化
基于专家的配置生成器 为了避免BO在优化早期由于代理模型未拟合完全给出表现过差的配置,在优化的后期又因为过利用的问题而局限在搜索空间一个较小的局部内,我们提出了基于专家的配置生成器。在优化的每一轮,Rover将会对当前优化进程中专家规则树和BO代理模型的置信度进行估计,并分别为它们赋予相应的权重。Rover将会根据这一权重来以一定的概率选择这一轮通过两者中的哪一种方式进行配置推荐。通过专家规则树的介入,在优化前期为配置的表现提供一定保证,在优化后期又给了BO一定的跳出当前局部进行探索的可能性。
2-03
受控制的历史迁移
为了解决之前提出的如何迁移?的问题,在避免负迁移问题的同时,将多个历史任务的知识有效结合起来,我们提出了如下的任务过滤和知识结合模块。
任务过滤 为了避免不相似的历史任务导致迁移反而带来配置表现的下降,我们使用一个回归模型来学习两个给定的调参任务的相似度。对于每个Spark任务,我们借鉴之前的工作,将其运行日志中的17个运行时指标向量化,作为其元特征。回归模型将会以两个任务的元特征的拼接作为输入,并输出这两个任务的相似度。为了训练这一回归模型,我们使用已有的调参历史中的任务生成训练数据,对于已有观察历史的两个任务,我们使用它们对应的代理模型对一些随机生成的配置的预测结果的逆序对比例来作为相似性的度量。在回归模型训练完毕后,给定一个新的任务,我们首先获取新任务的元特征,并利用这一回归模型,计算该新任务和所有历史任务的相似度。之后,我们会基于一个预设立的阈值对历史任务进行过滤,排除掉与当前任务不相关的任务。此外,为了减少额外的计算开销,当有效的历史任务过多时,我们只选择相似度最高的5个任务进行迁移,而当没有任何相似任务被发现时,我们的历史迁移将被取消,算法退化为前一节中的专家辅助的BO。
知识结合 给定了一些相似的历史任务后,下一步就是将它们中蕴含的调优知识和BO框架相结合。由于简单地热启动方法并不能完全挖掘历史任务的潜力,同时又要规避不同任务的结果度量具有不同的规模带来的影响,我们使用一种代理模型结合的方法来结合不同任务的知识。具体的,我们会为当前任务和每个相似的历史任务分别建立代理模型。在调参的每一轮,我们会生成若干候选配置,并用每个任务的代理模型分别对这些配置进行预测、计算EI值并排序。之后,对每个候选配置,我们会将其在各个代理模型上的排名加权求和作为其得分,而权重则由当前调参进程中对各个代理模型准确程度的评估得到。
2-04
整体调参流程
最终,结合之前的专家辅助BO以及受控制历史迁移模块,我们给出Rover调参的整体流程,如图3所示。总体流程分为初始化阶段和搜索阶段两个部分。
图 3 调参过程的流程图
初始化阶段 在初始化阶段,Rover首先验证5个默认配置。之后,它会从任务的运行日志中读取元特征并从历史数据库中选择相似的任务。如果没有相似任务被发现,Rover将应用基于专家的初始化来生成配置,否则,Rover将使用结合代理模型来生成配置,直到初始化阶段的预算耗尽。
搜索阶段 在搜索阶段,Rover首先会评估当前BO和专家规则树的可靠程度,并分别得到对应权重ws和we。接下来,Rover将会基于该权重进行随机采样,来选择下一个配置是由专家规则树推荐,还是由BO代理模型生成。
03
实 验
3-01
端到端对比
我们在广泛使用的Spark评测基准HiBench[4]中的三个Spark SQL任务Join, Scan, Aggregation和200个字节跳动内部的较小任务负载上进行了测试。这些任务负载包含了综合性的Map和Reduce操作的结合。我们将Rover和以下的SOTA的基于BO的调参方法在上面的评测基准进行端到端的比较,包括CherryPick[5],Tuneful[6],LOCAT[7],ResTune[8]。
在所有的实验中,我们以累积内存消耗作为优化目标,即任务的平均内存消耗乘以其运行时间。由于每个任务的规模不同,我们使用每个任务的结果相对于其默认配置的比例作为指标。
端到端对比的实验结果如图4所示,我们展示了分别调参10轮和50轮后,各方法相对于默认配置的内存下降比例。可以观察发现,在所有进行对比的基线方法中,Rover在所有任务上都取得了最大的内存消耗降低,即使是在并未发现相似历史任务的测试基准任务Scan上,只使用了专家知识辅助的Rover表现也超过了其他方法。而在字节跳动内部的实际任务上,Rover相对于基线方法Tuneful和LOCAT分别取得了9.36%和6.76%的进一步内存降低。
图 4 端到端对比实验结果
3-02
工业场景效果
为了展示Rover的实用性,我们在一个产业集群中测试了Rover服务,并使用该系统对12000个真实的Spark SQL任务进行调参。每个任务都是从字节跳动的实际业务中收集,并且每天只执行一次。由于这些任务的验证代价过于昂贵,我们只比较Rover和默认Spark配置之间的结果差异,调参预算为20轮(每天调参一次)。
图 5 Rover产业内表现结果
图5(a)展示了优化过程中的平均累积内存消耗。我们发现Rover在初始化阶段就已经借助基于专家的初始化和受控的历史迁移减少了32.8%的内存消耗。之后,即使在线的任务负载逐渐变化,内存消耗仍然在代理模型的帮助下继续下降。图5(b)进一步展示了获得不同提升的任务数量的直方图,其中76.2%的任务获得了超过60%的显著内存下降,97.7%的任务获得了超过10%的内存下降。经过以上20轮的调参,Rover已经在这12k个任务上节省了约110万美元的年度计算资源开销。在未来,我们将Rover应用在更多更大的任务上后,将会获得更大的开销节约。
总 结
在本研究中,我们提出了Rover,一个提供了用户友好的接口,并能在实际产业负载中进行高效、安全的搜索的在线Spark SQL调参服务。为了解决重优化问题并增强调参表现,Rover将专家知识和历史任务与BO算法结合,提出了专家辅助的贝叶斯优化和受控制的历史迁移两大算法模块。在公开测试基准和真实任务上的实验结果显示,Rover的表现超越了与之对比的其他Spark和数据库调参框架。在字节跳动的实际产业中应用后,Rover已经在12k个真实的Spark SQL任务上取得了非常显著的内存降低。
详细了解本工作,请访问下方链接地址:
论文链接:https://dl.acm.org/doi/10.1145/3580305.3599953
References:
[1] Michael Armbrust, Reynold S Xin, Cheng Lian, Yin Huai, Davies Liu, Joseph K Bradley, Xiangrui Meng, Tomer Kaftan, Michael J Franklin, Ali Ghodsi, et al. 2015. Spark sql: Relational data processing in spark. In Proceedings of the 2015 ACM SIGMOD international conference on management of data. 1383–1394.
[2] James S Bergstra, Rémi Bardenet, Yoshua Bengio, and Balázs Kégl. 2011. Algorithms for hyper-parameter optimization. In Advances in neural information processing systems. 2546–2554.
[3] Matthias Feurer, Benjamin Letham, and Eytan Bakshy. 2018. Scalable metalearning for bayesian optimization using ranking-weighted gaussian process ensembles. In AutoML Workshop at ICML.
[4] Shengsheng Huang, Jie Huang, Jinquan Dai, Tao Xie, and Bo Huang. 2010. The HiBench benchmark suite: Characterization of the MapReduce-based data analysis. In 2010 IEEE 26th International conference on data engineering workshops (ICDEW 2010). IEEE, 41–51.
[5] Omid Alipourfard, Hongqiang Harry Liu, Jianshu Chen, Shivaram Venkataraman, Minlan Yu, and Ming Zhang. 2017. {CherryPick}: Adaptively Unearthing the Best Cloud Configurations for Big Data Analytics. In 14th USENIX Symposium on Networked Systems Design and Implementation (NSDI 17). 469–482.
[6] Ayat Fekry, Lucian Carata, Thomas Pasquier, Andrew Rice, and Andy Hopper. 2020. Tuneful: An online significance-aware configuration tuner for big data analytics. arXiv preprint arXiv:2001.08002 (2020).
[7] Jinhan Xin, Kai Hwang, and Zhibin Yu. 2022. LOCAT: Low-Overhead Online Configuration Auto-Tuning of Spark SQL Applications [Extended Version]. arXiv preprint arXiv:2203.14889 (2022).
[8] Xinyi Zhang, Hong Wu, Zhuo Chang, Shuowei Jin, Jian Tan, Feifei Li, Tieying Zhang, and Bin Cui. 2021. Restune: Resource oriented tuning boosted by metalearning for cloud databases. In Proceedings of the 2021 International Conference on Management of Data. 2102–2114.
END
欢迎关注本公众号,帮助您更好地了解北京大学数据与智能实验室(PKU-DAIR),第一时间了解PKU-DAIR实验室的最新成果!
实验室简介
北京大学数据与智能实验室(Data And Intelligence Research Lab at Peking Univeristy,PKU-DAIR实验室)由北京大学计算机学院崔斌教授领导,长期从事数据库系统、大数据管理与分析、人工智能等领域的前沿研究,在理论和技术创新以及系统研发上取得多项成果,已在国际顶级学术会议和期刊发表学术论文100余篇,发布多个开源项目。课题组同学曾数十次获得包括CCF优博、北大优博、微软学者、苹果奖学金、谷歌奖学金等荣誉。PKU-DAIR实验室持续与工业界展开卓有成效的合作,与腾讯、阿里巴巴、苹果、微软、百度、快手、中兴通讯等多家知名企业开展项目合作和前沿探索,解决实际问题,进行科研成果的转化落地。