引言
本文主要介绍了一种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
$$