基于回归模型的Spark任务性能分析方法

引言

  本文主要介绍了一种Spark作业的性能评估方法,首先对作业进行分类,主要分为IO型和非IO型;之后对不同的作业类型采取不同的分量权重进行打分,由分数高低来评价作业性能。
  评估的数据来源分为集群资源消耗和Spark作业运行效率。前者使用Ganglia进行收集,后者从Spark History Server(SHS)中读取Spark作业运行日志数据。

系统性能数据

集群资源消耗

  下面指标由Ganglia采集

  • cpu:集群cpu使用百分比;
  • io:集群读取速度平均值;
  • network:集群网络丢包率;
  • disk:集群磁盘使用百分比;
  • memory:集群内存使用百分比;
  • load:集群负载。

  我们定义上面组成第i个作业的资源消耗向量为

$$
\alpha_{i}(\alpha_{cpu},\alpha_{io},\alpha_{network},\alpha_{disk},\alpha_{memory},\alpha_{load})
$$

作业运行效率

  下面指标从SHS读取

  • ComTime:任务executor平均计算时间占总运行时间百分比;
  • ShuffleTime:任务shuffle 阶段平均时间占总时间百分比 ;
  • ShuffleBytes:任务Shuffle阶段平均读写大小(bytes);
  • GCTime: 任务GC阶段平均时间占总时间百分比;
  • TotalTime:任务总运行时间(ms);
  • ResultSTime:任务结果序列化时间占总运行时间百分比。

  我们定义上面组成第i个作业运行效率向量为

$$
\beta_{i}(\beta_{ComTime},\beta_{ShuffleTime},\beta_{ShuffleBytes},\beta_{GCTime},\beta_{TotalTime},\beta_{ResultSTime})
$$

        以上12个指标共同组成了系统性能向量

$$
\gamma_{i}(\alpha_{i},\beta_{i})
$$

对作业类型进行分类

  因为在相同配置参数环境下,不同类型的作业会表现出不同的资源消耗以及不同的性能,所以该评估模型首先对作业类型进行分类,这里简单的分为两类IO型和非IO型。
  这里选用了K-means聚类算法,将系统性能向量集合X,已知偏IO密集型任务系统性能向量集Y,已知非IO密集型任务系统性能向量集Z和聚类簇数K[^K=2]作为输入。X、Y和Z中元素为历史任务的系统性能向量$\gamma_{i}$
[^K=2]: 这里简单的设为K=2

对作业进行评分

  • 目标任务性能向量$\gamma_{t}$:每一维度代表任务t在该维度的性能记录值;
  • 维度评价分数向量$Score_{t}$ : 每一维度评价分数值;
  • 权重向量$\omega_{t}$: 对于不同的任务,在进行最后的综合分数评定时,不同的性能指标的重要性不同,所以定义权重向量量化各个性能指标的重要性大小。

  有如下定义
$$
Score_{t_{j}}:对应分数向量的每一维度\\
\omega_{t_{j}}:对应权重向量的每一维度
$$

  最终评分
$$
FS_t=Score_{t}*\omega_{t}
$$

维度评价分数向量

计算公式

$$
Score_{t_{j}}=\frac{M_{j}-\gamma_{t_{j}}}{M_{j}-B_{j}}*60
$$

  • $M_{j}$:历史任务中j维度下最差性能记录值 ;
  • $B_{j}$:历史任务中默认配置下任务的j维度性能记录值;
  • $\gamma_{t{j}}$:目标任务t 的j维度下性能记录值。

权重向量

  $\omega_{t}$的初始值由任务t的类型确定。初始值反映的是任务t所属类型下,大部分任务的性能瓶颈。

$$
if \gamma_{t_{j}}=0 \\
\omega_{t_{TotalTime}}=\omega_{t_{TotalTime}}+\omega_{t_{j}}\\
else \\
\omega_{t_{j}}=\omega_{t_{j}}+(\frac{\gamma_{t_{j}}}{\sum_{i=0}^{11} \gamma_{t_{i}} }-\omega_{t_{j}})*\epsilon
$$