健康检查时,误将JDBCServer Kill
问题
健康检查方案中,在并发执行的语句达到线程池上限后依然会导致健康检查命令无法执行,从而导致健康检查程序超时,然后把Spark JDBCServer进程Kill。
回答
当前JDBCServer中存在两个线程池HiveServer2-Handler-Pool和HiveServer2-Background-Pool,其中HiveServer2-Handler-Pool用于处理session连接,HiveServer2-Background-Pool用于处理SQL语句的执行。
当前的健康检查机制是通过新增一个session连接,并在该session所在的线程中执行健康检查命令HEALTHCHECK来判断SparkJDBCServer的健康状况,因此HiveServer2-Handler-Pool必须保留一个线程,用于处理健康检查的session连接和健康检查命令执行,否则将导致无法建立健康检查的session连接或健康检查命令无法执行,从而认为Spark JDBCServer不健康而被Kill。即如果当前HiveServer2-Handler-Pool的线程池数为100,那么最多支持连接99个session。