Executor定时灰度重启方案实践

  其他常见问题
内容纲要

概要描述


在部分业务场景下,需定期对 Quark 服务执行重启操作,以此释放缓存与连接资源,减少节点内存开销,改善 JVM 垃圾回收效果,进而提升 Quark 计算引擎的执行效率。

由于直接重启会造成 Quark 计算服务业务中断,本文提出灰度重启方案,能够在保障业务正常使用的前提下完成服务重启。方案已在多个客户现场实践使用,效果显著,推荐大家使用。

重启周期可根据实际情况灵活设置,理论上越频繁效果越好,比如每日一次;
slipstream组件不支持配置灰度重启

详细说明


功能设计:

  • 根据cron表达式定义时间段来重启executor,如22-2,在22点00分到第二天2点59分间重启注册时间在22点前的executor;如果超过2点59分即使有executor未重启也不会再继续重启操作
  • 重启前会先禁止任务调度到这些executor上,等与这些executor有关联的任务跑完,然后重启
  • 支持参数配置热更新

使用方法:

quark组件新增如下参数配置,然后配置服务,重启quark。

参数 值 配置文件 说明
quark.executor.restart.time.scheduled.enabled true hive-site.xml 默认为false,为true表示开启定时重启功能
quark.executor.restart.time.scheduled.cron.expression * * 22-02 * * ? hive-site.xml 默认为空,该表达式需要严格匹配正则^* * [^*].+$,22-02代表的是22点00分00秒到02点59分59秒(Quartz Cron)
quark.executor.restart.time.scheduled.timeout 1800000 hive-site.xml 默认14400000,单位毫秒。executor会等待任务结束后再去重启,该配置为等待的最大时间
quark.executor.restart.time.scheduled.batch.size 2 hive-site.xml 默认1,一批一批重启executor,该配置指定了批大小 。注意:该配置必须小于executor的总数
quark.executor.restart.time.scheduled.force true hive-site.xml 默认false,该配置定义了超时等待${quark.executor.restart.time.scheduled.timeout} ms后是否要强制重启executor

热更新

config global time.based.executor.restart.plan [key] [value] 

注:热更新生效的前提条件是quark.executor.restart.time.scheduled.enabled = true

监控日志

  • 可以通过 grep TimeBasedExecutorRestartPlan quark-server.log 来查看被重启的executor
  • 可以通过 grep GracefulShutdownExecutorOperator quark-server.log 来查看处于下线(禁止任务调度)和被重启的executor
2026-01-26 22:00:16,964 WARN  executor.GracefulShutdownExecutorOperator: [TimeBasedExecutorRestartPlan()] - Offlined executors 16
2026-01-26 22:00:16,965 ERROR cluster.CoarseGrainedSchedulerBackend: [sparkDriver-akka.actor.default-dispatcher-25()] - Asking executor 16 to suicide, exitCode 42
2026-01-26 22:00:16,966 WARN  executor.GracefulShutdownExecutorOperator: [TimeBasedExecutorRestartPlan()] - Stopped executors 16
2026-01-26 22:00:16,966 WARN  executor.TimeBasedExecutorRestartPlan: [TimeBasedExecutorRestartPlan()] - Successfully stopped executor 16
2026-01-26 22:00:16,967 WARN  executor.GracefulShutdownExecutorOperator: [TimeBasedExecutorRestartPlan()] - Offlined executors 17
2026-01-26 22:00:16,967 ERROR cluster.CoarseGrainedSchedulerBackend: [sparkDriver-akka.actor.default-dispatcher-17()] - Asking executor 17 to suicide, exitCode 42
2026-01-26 22:00:16,967 WARN  executor.GracefulShutdownExecutorOperator: [TimeBasedExecutorRestartPlan()] - Stopped executors 17
2026-01-26 22:00:16,967 WARN  executor.TimeBasedExecutorRestartPlan: [TimeBasedExecutorRestartPlan()] - Successfully stopped executor 17
2026-01-26 22:00:16,968 WARN  executor.GracefulShutdownExecutorOperator: [TimeBasedExecutorRestartPlan()] - Offlined executors 18
2026-01-26 22:00:16,968 ERROR cluster.CoarseGrainedSchedulerBackend: [sparkDriver-akka.actor.default-dispatcher-3()] - Asking executor 18 to suicide, exitCode 42
2026-01-26 22:00:16,969 WARN  executor.GracefulShutdownExecutorOperator: [TimeBasedExecutorRestartPlan()] - Stopped executors 18
2026-01-26 22:00:16,969 WARN  executor.TimeBasedExecutorRestartPlan: [TimeBasedExecutorRestartPlan()] - Successfully stopped executor 18
2026-01-26 22:00:16,969 WARN  executor.GracefulShutdownExecutorOperator: [TimeBasedExecutorRestartPlan()] - Offlined executors 19
2026-01-26 22:00:16,969 ERROR cluster.CoarseGrainedSchedulerBackend: [sparkDriver-akka.actor.default-dispatcher-25()] - Asking executor 19 to suicide, exitCode 42
2026-01-26 22:00:16,970 WARN  executor.GracefulShutdownExecutorOperator: [TimeBasedExecutorRestartPlan()] - Stopped executors 19
2026-01-26 22:00:16,970 WARN  executor.TimeBasedExecutorRestartPlan: [TimeBasedExecutorRestartPlan()] - Successfully stopped executor 19

DBAService页面,执行器-历史活跃执行器,也能看到,执行器ID为16~19的历史记录:

file

metric-util 工具 /var/log/aquila/transwarp-ops/restart.record 也会记录重启操作,可视为合理输出。

file

FAQ


Q1: quark服务未能够正常灰度重启的原因

根据关键字 TimeBasedExecutorRestartPlan 检索日志,能够看到如下信息,Effected tasks 892952 still unfinished after 480000 ms, 表示 sqlid 为 892952 的这个sql语句,在 480000ms (quark.executor.restart.time.scheduled.timeout)内未能执行结束,quark.executor.restart.time.scheduled.force为false的情况下 不会强杀这个sql,最终在quark.executor.restart.time.scheduled.cron.expression的时间范围内未能重启成功。

2026-10-28 03:00:55,054 WARN  executor.GracefulShutdownExecutorOperator: [TimeBasedExecutorRestartPlan()] - Offlined executors 392,420
2026-10-28 03:08:55,059 WARN  executor.GracefulShutdownExecutorOperator: [TimeBasedExecutorRestartPlan()] - Effected tasks 892952 still unfinished after 480000 ms
2026-10-28 03:08:55,062 ERROR executor.TimeBasedExecutorRestartPlan: [TimeBasedExecutorRestartPlan()] - Stop executor 392,420 failed due to Graceful shutdown timeout 480000 ms
2026-10-28 03:08:55,063 WARN  executor.GracefulShutdownExecutorOperator: [TimeBasedExecutorRestartPlan()] - Offlined executors 421,422
2026-10-28 03:16:55,063 WARN  executor.GracefulShutdownExecutorOperator: [TimeBasedExecutorRestartPlan()] - Effected tasks 892952 still unfinished after 480000 ms
2026-10-28 03:16:55,064 ERROR executor.TimeBasedExecutorRestartPlan: [TimeBasedExecutorRestartPlan()] - Stop executor 421,422 failed due to Graceful shutdown timeout 480000 ms

这篇文章对您有帮助吗?

平均评分 0 / 5. 次数: 0

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。