spark-sql退出时打印RejectedExecutionException异常栈
问题
执行大数据量的Spark任务(如2T的TPCDS测试套),任务运行成功后,在spark-sql退出时概率性出现RejectedExecutionException的异常栈信息,相关日志如下所示:
16/07/16 10:19:56 ERROR TransportResponseHandler: Still have 2 requests outstanding when connection from linux-192/10.1.1.5:59250 is closed java.util.concurrent.RejectedExecutionException: Task scala.concurrent.impl.CallbackRunnable@5fc1ab rejected from java.util.concurrent.ThreadPoolExecutor@52fa7e19[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 3025]
回答
出现上述问题的原因是:当spark-sql退出时,应用退出关闭消息通道,如果当前还有消息未处理,需要做连接关闭异常的处理,此时,如果scala内部的线程池已经关闭,就会打印RejectEdExecutionException的异常栈,如果scala内部的线程池尚未关闭就不会打印该异常栈。
因为该问题出现在应用退出时,此时任务已经运行成功,所以不会对业务产生影响。