网站首页  词典首页

请输入您要查询的论文:

 

标题 基于隐马尔科夫模型的spark作业异常分析
范文

    王欣 周云才

    摘要:随着大数据技术的不断发展,数据分析越来越受到人们的关注,Spark 作为大规模数据处理的快速通用的计算引擎,由于它的高速性而被各大商家应用于实际生产过程中。本文通过隐马尔科夫模型(HMM),选择在实际生产过程中,在进行海量的数据分析过程中出现的异常进行分析,以实际任务执行时的:内存溢出、垃圾回收异常、序列化异常为指标,根据实际出现异常时的提示,来确定HMM状态空间、确定相应的观测值、计算相关的参数,进而构建针对于Spark作业工作过程中的出现异常时的隐马尔科夫模型,用来揭示引发异常的类型,来对实际生产过程中出现此类问题时提供可靠的类型诊断。

    关键词:spark;隐马尔科夫模型;内存溢出;异常;内存管理

    中图分类号:TP31 文献标志码:A 文章编号:1009-3044(2018)11-0198-03

    Spark Operation Anomaly Analysis Based on Hidden Markov Model

    WANG Xin,ZHOU Yun-cai

    (Yangtze University,Jingzhou 434023,China)

    Abstract: With the continuous development of big data technology, data analysis has attracted more and more attention. Spark, a fast and universal computing engine for large-scale data processing, has been used by major merchants in the actual production process due to its high speed. This paper uses hidden Hidden Markov Model (HMM) to select the analysis of abnormalities that occur in the process of mass data analysis in the actual production process. When actual tasks are executed, memory overflow, garbage collection anomalies, and serialization anomalies are Indicators, according to the actual occurrence of abnormal prompts, to determine the HMM state space, determine the corresponding observations, calculate the relevant parameters, and then build a Hidden Markov model for exceptions in the Spark job process, to reveal The type of exception that is thrown to provide a reliable type diagnosis when such problems occur in the actual production process.

    Key words:spark; hidden markov model; memory overflow; exceptions; memory management

    1 概述

    Spark是UC Berkeley计算机教授Ion Stoica 在2009年发起的,随后被Apache软件基金会接管的类似于Hadoop MapReduce的通用并行计算框架,是当前大数据领域最活跃的开源项目之一[1]。Spark是基于MapReduce计算框架实现的分布式计算,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce。

    在现实生活中隐马尔科夫模型广泛应用于图像处理、语音识别、模式识别、信息处理预测以及股票风险预测等领域,同时在机器异常状态预测、风险预警、风投决策等生产环境中都有广泛的应用。在大型的电商公司,对于日常的点击、收藏、购买等行为的日志分析尤为重要,而在针对于海量数据的分析过程中spark作为基于内存的一种大数据处理解决方案,越来越受到各大电商公司的关注[2]。在Spark Streaming持续计算过程中,在针对于日志进行实时、连续的分析中难免会出现很多应用运行异常,而由于内存引起的异常正是其中尤为重要的一种,在实际生产环境中经常遇到。在异常处理过程中,可知的当前异常信息提示只与处理异常的上一次有关,而与之前的状态无关,且该过程满足运用隐马尔科夫模型的无后效性的条件,因此在spark作业中出现内存异常时,可以采用隐马尔科夫模型来分析异常出现的原因以及根据作业内存需要和实际内存的空闲量来预测作业是否会发生内存方面的异常,以便快速的解决问题。

    2 Spark作业执行机制简介

    Spark称为快数据,比Hadoop的传统处理方式MapReduce有着很大的差别,效率至少提高100倍以上。Spark是基于內存的编程模型,它可以把中间的迭代过程不放在磁盘中,直接数据不落地在内存中执行,极大地提高了它的执行速度[1]。Spark主要包括四个大的模块,下面只要介绍下在实际生产过程中尤为重要的、也是出现任务运行异常最多的Streaming模块[6]。

    在实际的生产过程中,流式计算最容易出现的异常就是内存溢出、GC异常以及序列化异常。试想下,在针对于实时数据进行处理时,由于出现各种异常而未能够及时的得到解决,而造成整个应用中止,是会造成巨大损失的。本文主要对在任务执行过程中经常出现的OOM异常、GC异常和序列化异常等,结合隐马尔科夫模型对异常类型进行分析,以便后续解决问题。

    Spark在一个Executor中的内存模型分为三块,一块是execution内存,一块是storage内存,一块是other内存。execution内存是执行内存,shuffle的数据也会先缓存在这个内存中,满了再写入磁盘,能够减少IO。其实map过程也是在这个内存中执行的。同时,这部分内存也是造成OOM的主要地方[4]。storage内存是存储broadcast,cache,persist数据的地方。other内存是程序执行时预留给自己的内存,由此可见,在作业执行的过程中,每次的shuffle操作都会引起大量的map/reduce操作,这也就很有可能产生异常,在实际生产过程中,shuffle操作前后也是最容易发生异常的地方。

    在作业执行过程中,内存十分重要。因为spark这项技术本身就是基于内存的计算模型,因此在作业执行过程中,前期的lazy特性部分执行结束后,涉及内存的使用部分往往就会是异常的高发区。其中OOM异常主要是指内存的溢出;GC异常代表的是垃圾回收异常,作业在执行之中,不可避免的都要创建新的中间变量,这样的变量就会在内存中开辟空间来存储,并且这个可以容纳中间变量的总空间大小是一定的,GC机制会在每次任务过程中以及结束后,及时的清理此空间中的缓存数据,虽然如此,但是试想一下,如果一次传入的中间数据太大的话会出现什么情况?在针对海量数据的处理的时候,可以预见各式各样的数据肯定需要序列化以及反序列化过程,而针对于序列化或者反序列化之后的数据的存储也是在内存中,不同的是,会分批次存储,但是在作业7*24的工作模式下,也是很有可能出现序列化的异常的。

    3 HMM基本原理

    隐马尔科夫模型(HMM)是马尔科夫链的一种实际应用,是用来根据可见状态链去预测未来状态(也叫隐藏状态链)的一种行之有效的方法[3]。

    其模型参数为:

    λ=(N, M, A, B, π)

    其中,N表示的是马尔科夫链中隐含状态的个数;M表示可见状态对应的数目;A表示隐含状态之间的转移概率矩阵;B表示可见状态的概率矩阵;π表示初始状态的概率矩阵。简化的表示方法为λ=(A, B, π)。

    在作业执行出现异常的过程中,基本的隐马尔可夫组成如图1所示。

    在本文中,主要是使用了Viterbi算法对在作业执行过程出现的异常时的可见状态序列(提示信息)来计算出概率最大的隐含状态序列(异常类型),其实就是传统的解码问题,只不过这里主要针对的就是在作业执行到shuffle操作时,出现异常的分析预测[7]。首先,定义一个随机变量qt(i),来表示t时刻沿着路径q1,q2,...,qt来生成相应的可见状态序列Q1,Q2,...,Qt,其中qt=αi,α是来标示在时刻t状态为i的所有单个路径(q1,q2,...,qi)的概率最大值:

    αt(i)=maxq1,q2,...qi-1p(q1,q2,...,qi,qi=αi,Q1,Q2,...,Qt|λ)。

    其中要求的概率最大的状态序列Q推导过程如下。

    首先进行初始化:

    αt(i) = πibi(Qi),其中1≤i≤N

    Φt(i) = Qi,其中1≤i≤N

    然后进行递归计算:

    ΦT(j) = argmax1≤i≤N[α(i)aij],其中1≤t≤T,1≤j≤N

    最终:

    P = max1≤i≤N[αT(i)]

    概率最大的序列求解为:

    Qt = ΦT + 1(Qt + 1),其中t = T-1,T-2,...,1

    图2表示的是各个状态之间的转换概率示意图。有图可以看出在不同的状态之间是存在这转移概率的,也就是说在某一个时刻t时的可见序列Q1,Q2,...,Qt-1的情况下,状态从q1,q2,...,qN到qi的最大转移概率下的路径[9]。

    4 spark异常产生

    随着人类社会的发展,人们越来越重视数据背后隐藏的信息,而Spark作为处理海量中的翘楚。因此在实际生产环境中被广泛使用,此时异常的诊断是尤为重要的,如何快速的根据提示信息确定异常的种类十分重要,因为只有确定了异常的类型才能准确的定位出引发异常的原因,避免多種异常提示信息一样而造成的异常处理失败的情况。而这个过程其实从本质上讲是一个模式识别的问题,而HMM的一个重要功能就是模式识别。因此本文采用隐马尔科夫模型来实现异常类型的诊断。

    在Spark作业执行的过程中,shuffle过程是最容易引起异常的产生,也是作业执行过程中最需要进行优化的地方,其中内存作为整个作业实际的执行位置而显得十分重要。本文主要针对内存溢出(OOM)、垃圾回收异常(GC)、序列化异常等三类异常情况进行分析。

    作业的执行过程是这样的:客户端提交作业应用给Master,Master会随机的在一个Worker节点上面启动Driver进程,其实就是SchedulerBackend。与此同时Worker创建一个DriverRunner线程,作为SchedulerBackend进程的启动进程。 另外Master会在集群中另外的Worker节点上面启动Exeuctor进程,即ExecutorBackend,并且Worker会同时创建一个ExecutorRunner线程,作为ExecutorBackend进程的启动进程[7]。 ExecutorBackend进程启动后会向Driver注册。SchedulerBackend进程是整个作业执行的开始,其中包含了DAGScheduler进程,此进程会根据用户程序,生成执行计划,并调度执行。对于每个stage的task,都会被存放到TaskScheduler中,ExecutorBackend向SchedulerBackend汇报的时候把TaskScheduler中的task调度到ExecutorBackend执行。 所有stage都完成后作业结束[5]。

    在作业的执行过程中,作业的执行目的肯定是为了处理海量的数据,而海量的日志数据在实际的处理过程中,要么是离线分批次分析、要么是实时的传输进行处理,在这个过程中肯定要涉及数据的序列化问题,而在这种异常中,它的提示信息(可见状态)为timeout、内存太小、数据不平衡、序列化异常(数据不可被序列化)等四种。随着作业的执行,前面的transform操作,都是具有lazy特性的,也就是說并不会立即执行,只有遇到action操作(shuffle)时,才会根据上述的过程提交task,来运行作业中的task。而在shuffle过程的前后,分为map操作和reduce操作,会将task提交到TaskScheduler中具体执行。这个过程需要大量的使用内存资源,这样就会很容易引发异常,实际上shuffle过程也是优化的重灾区。其一就是内存溢出(OOM),它的相应的提示信息是大量对象(数据分块不合理)、数据不平衡、单个文件过大等三种。其二就是垃圾回收异常(GC),指的是临时变量异常,它的提示信息是内存太小、分片小(单个文件太大)等两种。

    5 HMM的构建与训练

    首先为上述的在Spark作业执行过程中出现的三类异常分别训练一个HMM模型。其中可见状态分别为当作业执行出现异常时每一种的提示信息,而隐含状态为各种异常的类型,这样就能够快速的定位到出现异常的位置,便于采取后续的异常解决或者优化执行过程。

    训练模型的步骤如下:

    ①采集三大类异常下的5种不同的训练状态,并在具体的作业执行过程中观察具体的提示异常信息,来作为不同类型异常的观察序列的输入模型。

    ②根据之前阐述过的λ=(A, B, π)来建立HMM模型,并且确定此模型的初始值。然后Spark异常的提示类型,来设定初始值的状态概率,初始值状态转换概率矩阵为:

    [A=1/31/31/300001/21/201/41/401/41/4]

    其中,行的概念代表的是异常的三大类型,而列的概念代表的是5种不同的训练状态,也就是不同的提示信息,与状态转换概率矩阵对应的依次是:大量对象、数据不平衡、单个文件太大、内存太小、序列化异常等。

    ③运行不同的测试程序,让其出现不同类型的异常,并且记录下相应的异常提示信息,也就是所谓的可见状态序列,用来计算模型的初始化参数。设定可见状态序列的时间长度是100,通过混合高斯概率密度函数来观测表示实际可见状态的概率矩阵为:

    bj(Qt) =[m=1M]cjmN(QI,ujm,Ujm)

    ④重新计算分析到的初始值参数。

    ⑤将得到的初始值参数记性迭代运算,直到收敛于理想的初始值状态转换概率矩阵。

    异常判定模型得到之后,分别运行100个事先准备的Spark应用,产生不同类型的异常,然后代入到已经训练好的HMM中,计算对数似然概率值P(Q|ɑn),其中对数的似然估计概率P(Q|ɑn),1≦i≦K 为概率最大时对应的异常类型就是所得到的异常识别的结果。

    根据隐马尔科夫模型中的模式识别理论,对数似然估计概率的最大值所对应的模型就是异常的类型判定结果。本文结合100个实验测试样本实例,分别运行观察不同的异常提示,得到可见状态序列,然后将其输入到之前已经训练好的HMM模型中,计算出似然估计概率P(Q|ɑn)。结果如表1所示。

    由表1可知,在样本实例输入到HMM中得到的结果和预期的大相径庭,但是在序列化以上的判定上概率表笑。这是因为在实际的生产环境中,在作业代码的编写过程中一般都会考虑到序列化的问题,而内存溢出和垃圾回收异常时在作业运行过程中才能够发现的,所以才会出现这样的概率差异问题。

    6 结束语

    文中利用隐马尔科夫模型对Spark作业在运行过程中出现的异常类型判定,取得了较好的效果。但是在模型的训练过程中,由于作业代码的不同性以及集群资源的差异性,都会对实验结果产生影响。所以在此模型的基础上需要进一步完善的是在系统资源不同的集群上面运行相同的作业,来进一步完善异常类型的判定。

    参考文献:

    [1] 夏俊鸾.Spark大数据处理技术[M].电子工业出版社.2015

    [2] 黎文阳.大数据处理模型Apache Spark研究[J].现代计算机(专业版),2015(08):55-60.

    [3] 刘河生,高小榕,杨福生.隐马尔可夫模型的原理与实现[J].国外医学.生物医学工程分册,2002(06):253-259.

    [4] 杨志伟,郑烇,王嵩,等.异构Spark集群下自适应任务调度策略[J].计算机工程,2016,42(01):31-35+40.

    [5] 孟红涛,余松平,刘芳,等.Spark内存管理及缓存策略研究[J].计算机科学,2017,44(06):31-35+74.

    [6] 韩德志,陈旭光,雷雨馨, 等.基于Spark Streaming的实时数据分析系统及其应用[J].计算机应用,2017,37(05):1263-1269.

    [7] 吴佳,曾惟如,陈瀚霖, 等.基于隐马尔可夫模型的软件状态评估预测方法[J].软件学报,2016,27(12):3208-3222.

    [8] 李方伟,孙随,朱江, 等.基于隐马尔可夫模型的态势评估方法[J].计算机工程与设计,2015,36(07):1706-1711.

    [9] 赵玲,许宏科.基于改进的灰色马尔可夫链模型的交通事故预测[J].数学的实践与认识,2013,43(20):92-98.

    [10] 李相勇,张南,蒋葛夫.道路交通事故灰色马尔可夫预测模型[J].公路交通科技,2003(04):98-100+104.

随便看

 

科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。

 

Copyright © 2004-2023 puapp.net All Rights Reserved
更新时间:2024/12/23 3:10:59