问题来源 企业需要根据经营情况将多个系统的数据同步到一处进行统计然后出报表,比如需要从ERP、CRM和各种遗留系统中同步数据到同一台主机上,每天进行一次清洗计算得出报表,然后做图表辅助分析。
同步的工作使用Flink CDC同步各个来源的binlog到统一的Doris中解决了,手动进行清洗并将结果汇总到一张结果表的工作也已经完成了,现在问题点就是需要人工每天去跑一次清洗逻辑,然后清空昨天的汇总结果,将最新的汇总结果写入目标表。
可选方案 1、使用Doris Job
一开始想,既然使用了Doris,这个任务就使用Doris Job来做,下面是官方对Job的介绍,
CREATE JOB - Apache Doris
看到描述、语法、必选参数这些部分很高兴,于是就开干了。定时任务开始运行时第一步是清空昨天的数据,就有下面的SQL
-- 清空原来的记录
CREATE JOB del_report ON SCHEDULE EVERY 1 DAY STARTS '2025-06-18 01:00:00' DO TRUNCATE TABLE report.r1;
-- 30秒后将最新的清洗逻辑写入目标表
CREATE JOB load_report ON SCHEDULE EVERY 1 DAY STARTS '2025-06-18 01:00:30' DO INSERT INTO report.r1 SELECT ...
上面的SQL第一句报下面的错误,第二句可以正常运行
SQL 错误 [1105] [HY000]: errCode = 2, detailMessage = Not support TruncateTableStmt type in job 看了官方创建Job的注意事项中发现下面这条
走直线不行,那就走曲线,记得INSERT OVERWRITE 可以将表清空, 改为下面的SQL
CREATE JOB del_report ON SCHEDULE EVERY 1 DAY STARTS '2025-06-18 01:00:00' DO INSERT OVERWRITE TABLE report.r1 SELECT * FROM report.r1 WHERE id < 0;
很遗憾,Doris给我报了下面这个错误
SQL 错误 [1105] [HY000]: errCode = 2, detailMessage = Not support InsertOverwriteTableStmt type in job 包括直接使用DELETE也尝试了
CREATE JOB del_report ON SCHEDULE EVERY 1 DAY STARTS '2025-06-18 01:00:00' DO DELETE FROM report.r1 WHERE 1=1;
返回的结果也很明显
SQL 错误 [1105] [HY000]: errCode = 2, detailMessage = Not support DeleteStmt type in job
这么来看的话,不想写代码让Doris搞定还是不现实。
2、使用SpringBoot的定时任务
使用SpringBoot实现就比较简单了,设置程序启动后自动运行,然后使用周期性定时任务线程池
ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(2);
threadPool.scheduleWithFixedDelay(this::job, 0, 1, TimeUnit.DAY); 或者使用Cron方式在配置文件中写cron表达式的
@Scheduled(cron = "0 0 1 * * ?") // 每天凌晨1点执行 都可以,实现效果上仅在临界值的时候会有些许差异。这样写SQL不受Doris Job的限制,可以自由的先TRUNCATE TABLE ,然后INSERT INTO r1 SELECT ...
最终选择 最终使用SpringBoot的方式实现,这里将查看Doris Job和删除Job的命令一起发出来记录一下
-- 查询所有insert类型的Job SELECT * FROM JOBS ("type" = "insert")
-- 删除Job名为load_report的Job DELETE FROM JOBS ("type" = "insert") WHERE Name = 'load_report'