兴盛优选百万级任务调度系统实践
任务调度的背景与系统挑战
-
背景:
- 随着业务发展,任务急剧增加,原有的调度系统出现明显延时和调度卡死情况。
- 需要统一管控公司的大数据任务(包括离线调度任务、实时运行任务等),统一管控数据权限和Yarn队列资源。
- 解决流批之间的依赖关系,如基于每小时的商品销售量来推测当天的销售量。
-
挑战:
- 提升并发能力,保障所有任务正确调度。
- 确保任务准确准时调度。
- 资源不足时保障高优业务调度。
- 实现高精度调度,处理定时器、Worker线程及资源隔离问题。
系统设计与实现
-
整体设计:
- 核心模块包括Master、Worker和算子。
- Master负责流程控制,Worker负责任务执行,算子是对特定类型任务的抽象。
-
任务孵化和执行分离:
- 简化Master职责,提高系统性能。
- 优化后,单台Master管理的workflow实例数量大幅提升,单台Worker对Yarn任务的并发能力显著增强。
-
引入Kafka与Mysql:
- 使用Kafka缓存任务状态,为Master故障恢复提供信息。
- 使用Mysql防僵死,减少消息遗漏。
-
算子优化:
- 在算子中引入回调机制,减少扫描,提升并发度和响应速度。
- 预孵化调度器提前分发任务,减少Master处理延时。
故障处理与系统升级
-
Master与Worker分离:
- 实现故障定点恢复,提升故障处理效率。
- Master和Worker的滚动升级逻辑保障系统优雅升级。
-
弹性伸缩:
- 基于SparkSQL和FlinkSQL重构算子,支持多种类型任务。
- 实现基于k8s的Worker节点弹性伸缩,提高系统稳定性和性能。
未来规划
-
基于DAG血缘的任务串联恢复:
- 支持基于DAG血缘的任务串联恢复,如自动触发任务运行。
-
基于异步回调进一步性能提升:
-
基于k8s实现Worker节点的弹性伸缩:
- 根据任务积压情况自适应进行弹性伸缩,提高系统资源利用率。
通过以上措施,兴盛优选成功构建了一个高效、稳定、可扩展的任务调度系统,有效解决了原有系统面临的问题。