解决Spark集群重复出现SparkDeploySchedulerBackend: Asked to remove non-existent executor的问题

直接切入正题,spark版本1.3.1,出现这个问题的原因是因为spark上执行的任务异常终止导致的。

我碰到这个问题是因为hive的metastore出现了故障导致很多任务失败了,然后重启spark后,将应用到部署到集群上运行会应用端重复出现这样的错误:

ERROR 15/05/09 19:04:08 SparkDeploySchedulerBackend: Asked to remove non-existent executor 6306  
ERROR 15/05/09 19:04:08 SparkDeploySchedulerBackend: Asked to remove non-existent executor 6307  
ERROR 15/05/09 19:04:09 SparkDeploySchedulerBackend: Asked to remove non-existent executor 6308  
ERROR 15/05/09 19:04:09 SparkDeploySchedulerBackend: Asked to remove non-existent executor 6309  
ERROR 15/05/09 19:04:09 SparkDeploySchedulerBackend: Asked to remove non-existent executor 6310  
ERROR 15/05/09 19:04:09 SparkDeploySchedulerBackend: Asked to remove non-existent executor 6311  
ERROR 15/05/09 19:04:09 SparkDeploySchedulerBackend: Asked to remove non-existent executor 6312  
ERROR 15/05/09 19:04:09 SparkDeploySchedulerBackend: Asked to remove non-existent executor 6313  
...

spark的master不停的出现以下警告:

Got status update for unknown executor app-20150509185326-0001/11158  
...

解决方案

  1. 停掉spark集群
  2. 删除spark集群各节点上spark相关的临时文件,默认位于/tmp/spark-*,具体路径根据spark-env.sh中的SPARK_LOCAL_DIRS配置而定。
  3. 启动spark集群

注意,必须要停掉spark后在删除临时文件才行,不然删除时文件正在使用会出错,删除不成功。

出现这个错误的原因还有可能是集群启动的有问题,比如一台服务器上跑了2个Worker进程(可能其中一个Worker没有杀掉),使用jps命令查看会看到大量的类似如下的进程信息:

17048 -- process information unavailable  
12914 -- process information unavailable  
14540 -- process information unavailable  
13579 -- process information unavailable  
16809 -- process information unavailable  

出现这种现象时,直接把有问题的Worker进程kill掉就行了。

问题排查技巧

放开Spark的日志级别,spark的log4j的默认日志级别是WARN,可以修改为INFO(修改后无须重启Spark),然后使用spark-sql --master spark://your-master-ip:7077去测试,分析日志信息,也能辅助排查错误。