记一次Spark集群查询速度变慢的有关问题调查
现象:针对某张表(下文中用A表代替)的查询速度慢了6s
简单介绍一下系统的架构:Spark + Tachyon + glusterfs+mesos,其中glusterfs负责tachyon数据的持久化,Spark从tachyon上加载数据,mesos负责Spark任务调度
通过对比分析Spark:4040页面提供的任务执行信息发现,A表的Spark任务中,出现了Locality Level为ANY的,这导致后三个任务的起始时间延迟6s,如图.
简单介绍一下Spark的Locality Level
PROCESS_LOCAL: 是指读取缓存在本地节点的数据
NODE_LOCAL: 是指读取本地节点硬盘数据
ANY: 是指读取非本地节点数据
运行速度上由快到慢 PROCESS_LOCAL > NODE_LOCAL > ANY
1.5版本的Spark中引入了两个新的级别NO_PREF RACK_LOCAL
http://spark.apache.org/docs/latest/tuning.html#data-locality
书归正传,以上可以分析出,A表是由于Spark任务中出现了读取非本地节点数据导致的。接下来去Tachyon的web页面中看看能否查出蛛丝马迹,进入到A表的Tachyon文件目录层,
发现有的文件分布在node56上,如下图
原因:由此想起了,在数据导入后我们对mesos集群进行了重新划分,node56只被划分为mesos-master,
这就导致node56上的数据需要被其它的mesos-slave跨节点copy数据,由此产生了Locality Level中的any,
导致查询速度显著变慢
注意: 对集群规模和角色的划分一定要在调整前,考虑到各个方面