zddr commented on code in PR #27703: URL: https://github.com/apache/doris/pull/27703#discussion_r1411524093
########## docs/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-JOB.md: ########## @@ -36,10 +36,24 @@ CREATE JOB Doris Job 是根据既定计划运行的任务,用于在特定时间或指定时间间隔触发预定义的操作,从而帮助我们自动执行一些任务。从功能上来讲,它类似于操作系统上的 定时任务(如:Linux 中的 cron、Windows 中的计划任务)。但 Doris 的 Job 调度可以精确到秒级。 -Job 有两种类型:`ONE_TIME` 和 `BATCH`。其中 `ONE_TIME` 类型的 Job 会在指定的时间点触发,它主要用于一次性任务,而 `BATCH` 类型的 Job 会在指定的时间间隔内循环触发。 -主要用于周期性执行的任务。 +Job 有两种类型:`ONE_TIME` 和 `RECURRING`。其中 `ONE_TIME` 类型的 Job 会在指定的时间点触发,它主要用于一次性任务,而 `RECURRING` 类型的 Job 会在指定的时间间隔内循环触发, 此方式主要用于周期性执行的任务。 Review Comment: ONE_TIME job will it be preserved forever? ########## fe/fe-core/src/main/java/org/apache/doris/job/base/AbstractJob.java: ########## @@ -107,6 +110,27 @@ public void cancelTaskById(long taskId) throws JobException { .orElseThrow(() -> new JobException("no task id:" + taskId)).cancel(); } + public List<T> queryAllTasks() { + List<T> tasks = new ArrayList<>(); + if (CollectionUtils.isEmpty(runningTasks)) { Review Comment: Should be placed at the top of the method ########## regression-test/suites/job_p0/test_base_insert_job.groovy: ########## @@ -97,7 +97,7 @@ suite("test_base_insert_job") { assert true } sql """ - STOP JOB for test_error_starts + STOP JOB where jobname = 'test_error_starts' Review Comment: add some 'cancel' case? ########## fe/fe-core/src/main/java/org/apache/doris/job/extensions/insert/InsertJob.java: ########## @@ -139,6 +142,7 @@ public List<InsertTask> queryTasks() { InsertTask task; try { task = new InsertTask(loadJob.getLabel(), loadJob.getDb().getFullName(), null, getCreateUser()); + task.setCreateTimeMs(loadJob.getCreateTimestamp()); Review Comment: why setCreateTime when queryTasks ########## fe/fe-core/src/main/java/org/apache/doris/job/base/AbstractJob.java: ########## @@ -107,6 +110,27 @@ public void cancelTaskById(long taskId) throws JobException { .orElseThrow(() -> new JobException("no task id:" + taskId)).cancel(); } + public List<T> queryAllTasks() { + List<T> tasks = new ArrayList<>(); + if (CollectionUtils.isEmpty(runningTasks)) { + return queryTasks(); + } + + List<T> historyTasks = queryTasks(); + if (CollectionUtils.isNotEmpty(historyTasks)) { + tasks.addAll(historyTasks); + } + Map<Long, T> loadTask = tasks.stream().collect(Collectors.toMap(AbstractTask::getTaskId, a -> a)); Review Comment: Why is it a map instead of a set? ########## fe/fe-core/src/main/java/org/apache/doris/job/extensions/insert/InsertJob.java: ########## @@ -64,11 +64,14 @@ public class InsertJob extends AbstractJob<InsertTask> { ConcurrentLinkedQueue<Long> taskIdList; // max save task num, do we need to config it? - private static final int MAX_SAVE_TASK_NUM = 50; + private static final int MAX_SAVE_TASK_NUM = 100; @Override public List<InsertTask> createTasks(TaskType taskType) { + if (CollectionUtils.isNotEmpty(getRunningTasks())) { Review Comment: Why not put this logic in `isReadyForScheduling` ########## fe/fe-core/src/main/java/org/apache/doris/job/executor/TimerJobSchedulerTask.java: ########## @@ -40,9 +40,12 @@ public TimerJobSchedulerTask(TaskDisruptor dispatchDisruptor, T job) { @Override public void run(Timeout timeout) { try { + if (!JobStatus.RUNNING.equals(job.getJobStatus())) { + return; Review Comment: add log ########## docs/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-JOB.md: ########## @@ -36,10 +36,24 @@ CREATE JOB Doris Job 是根据既定计划运行的任务,用于在特定时间或指定时间间隔触发预定义的操作,从而帮助我们自动执行一些任务。从功能上来讲,它类似于操作系统上的 定时任务(如:Linux 中的 cron、Windows 中的计划任务)。但 Doris 的 Job 调度可以精确到秒级。 -Job 有两种类型:`ONE_TIME` 和 `BATCH`。其中 `ONE_TIME` 类型的 Job 会在指定的时间点触发,它主要用于一次性任务,而 `BATCH` 类型的 Job 会在指定的时间间隔内循环触发。 -主要用于周期性执行的任务。 +Job 有两种类型:`ONE_TIME` 和 `RECURRING`。其中 `ONE_TIME` 类型的 Job 会在指定的时间点触发,它主要用于一次性任务,而 `RECURRING` 类型的 Job 会在指定的时间间隔内循环触发, 此方式主要用于周期性执行的任务。 +`RECURRING` 类型的 Job 可指定开始时间,结束时间,即 `STARTS\ENDS`, 如果不指定开始时间,则默认首次执行时间为当前时间 + 一次调度周期。如果指定结束时间,则 task 执行完成如果达到结束时间(或超过,或下次执行周期会超过结束时间)则更新为FINISHED状态,此时不会再产生 Task。 + +JOB 共4种状态(`RUNNING`,`STOPPED`,`PAUSED`,`FINISHED`,),初始状态为RUNNING,RUNNING状态的JOB会根据既定的调度周期去生成 TASK 执行,Job 执行完成达到结束时间则状态变更为 `FINISHED`. + +RUNNING 状态的JOB 可以被 pause,即暂停,此时不会再生成 Task。 + +PAUSE状态的 JOB 可以通过 RESUME 操作来恢复运行,更改为RUNNING状态。 + +STOP 状态的 JOB 由用户主动触发,此时会 Cancel 正在运行中的作业,然后删除 JOB。 + +JOB 只描述作业信息, 执行会生成 TASK, TASK 状态分为 PENDING,RUNNNING,SUCCEESS,FAILED,CANCELD +PENDING 表示到达触发时间了但是等待资源 RUN, 分配到资源后状态变更为RUNNING ,执行成功/失败即变更为 SUCCESS/FAILED. +CANCELED 即取消状态 ,TASK持久化最终状态,即SUCCESS/FAILED,其他状态运行中可以查到,但是如果重启则不可见。TASK只保留最新的100条记录。 Review Comment: Each job can save 100 tasks ########## docs/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-JOB.md: ########## @@ -122,6 +136,18 @@ CREATE JOB my_job ON SCHEDULE EVERY 1 DAY STARTS '2020-01-01 00:00:00' DO INSERT ```sql CREATE JOB my_job ON SCHEDULER EVERY 1 DAY STARTS '2020-01-01 00:00:00' ENDS '2020-01-01 00:10:00' DO INSERT INTO db1.tbl1 SELECT * FROM db2.tbl2 create_time >= days_add(now(),-1); ``` +### INSERT JOB +目前仅支持 ***INSERT 内表***,同时只支持新优化器,即`enable_nereids_planner=true`. Review Comment: Is the syntax of create job supported on the new optimizer? ########## fe/fe-core/src/main/java/org/apache/doris/job/extensions/insert/InsertTask.java: ########## @@ -115,8 +115,13 @@ public InsertTask(String labelName, String currentDb, String sql, UserIdentity u @Override public void run() throws JobException { try { + if (isCanceled.get()) { + return; Review Comment: add log ########## fe/fe-core/src/main/java/org/apache/doris/job/extensions/insert/InsertTask.java: ########## @@ -188,4 +193,22 @@ public List<String> getShowInfo() { return jobInfo; } + // if task not start, load job is null,return pending task show info + private List<String> getPendingTaskShowInfo() { Review Comment: Same as above ########## fe/fe-core/src/main/java/org/apache/doris/job/extensions/insert/InsertTask.java: ########## @@ -148,7 +153,7 @@ public void cancel() throws JobException { @Override public List<String> getShowInfo() { if (null == loadJob) { Review Comment: I understand that a task is generated by a job, why does it occur when a task is present but the job is null ########## docs/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-JOB.md: ########## @@ -122,6 +136,18 @@ CREATE JOB my_job ON SCHEDULE EVERY 1 DAY STARTS '2020-01-01 00:00:00' DO INSERT ```sql CREATE JOB my_job ON SCHEDULER EVERY 1 DAY STARTS '2020-01-01 00:00:00' ENDS '2020-01-01 00:10:00' DO INSERT INTO db1.tbl1 SELECT * FROM db2.tbl2 create_time >= days_add(now(),-1); ``` +### INSERT JOB +目前仅支持 ***INSERT 内表***,同时只支持新优化器,即`enable_nereids_planner=true`. + +### CONFIG + +fe.conf + +- job_dispatch_timer_job_thread_num, 用于分发定时任务的线程数, 默认值5,如果含有大量周期执行任务,可以调大这个参数。 + +- job_dispatch_timer_job_queue_size, 任务堆积时用于存放定时任务的队列大小,默认值 1024. Review Comment: What happens if the set value is exceeded ########## fe/fe-core/src/main/java/org/apache/doris/job/base/AbstractJob.java: ########## @@ -107,6 +110,27 @@ public void cancelTaskById(long taskId) throws JobException { .orElseThrow(() -> new JobException("no task id:" + taskId)).cancel(); } + public List<T> queryAllTasks() { + List<T> tasks = new ArrayList<>(); + if (CollectionUtils.isEmpty(runningTasks)) { + return queryTasks(); + } + + List<T> historyTasks = queryTasks(); + if (CollectionUtils.isNotEmpty(historyTasks)) { + tasks.addAll(historyTasks); + } + Map<Long, T> loadTask = tasks.stream().collect(Collectors.toMap(AbstractTask::getTaskId, a -> a)); Review Comment: Why is it a map instead of a set? ########## docs/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-JOB.md: ########## @@ -36,10 +36,24 @@ CREATE JOB Doris Job 是根据既定计划运行的任务,用于在特定时间或指定时间间隔触发预定义的操作,从而帮助我们自动执行一些任务。从功能上来讲,它类似于操作系统上的 定时任务(如:Linux 中的 cron、Windows 中的计划任务)。但 Doris 的 Job 调度可以精确到秒级。 -Job 有两种类型:`ONE_TIME` 和 `BATCH`。其中 `ONE_TIME` 类型的 Job 会在指定的时间点触发,它主要用于一次性任务,而 `BATCH` 类型的 Job 会在指定的时间间隔内循环触发。 -主要用于周期性执行的任务。 +Job 有两种类型:`ONE_TIME` 和 `RECURRING`。其中 `ONE_TIME` 类型的 Job 会在指定的时间点触发,它主要用于一次性任务,而 `RECURRING` 类型的 Job 会在指定的时间间隔内循环触发, 此方式主要用于周期性执行的任务。 Review Comment: ONE_TIME job will it be preserved forever? -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org