为 sahara 添加重复 EDP 作业¶
https://blueprints.launchpad.net/sahara/+spec/recurrence-edp-job
本规范旨在允许在 sahara 中运行重复 EDP 作业。
问题描述¶
目前 sahara 仅支持一次性点击 EDP 作业。但有时,我们需要重复 EDP 作业。例如,从上午 8:00 到晚上 8:00,每 5 分钟运行一个作业。通过将重复 EDP 作业添加到 sahara EDP 引擎,我们可以拥有不同的引擎实现(oozie、spark、storm 等)。
提议的变更¶
在 sahara 基础 EDP 引擎中定义 run_recurrence_job() 接口,然后将此接口实现到 oozie 引擎。(Spark 引擎将在后续规范中草拟)
添加一种名为“recurrence”(重复)的作业执行类型。Sahara 基础作业引擎将根据作业执行类型运行不同类型的作业。
添加一个 sahara 定期任务,名为 update_recurrence_job_statuses(),用于更新重复作业的子作业运行状态。
添加对无效数据输入的验证,并检查输出 URL 是否已存在。
重复 EDP 作业请求示例
POST /v1.1/{tenant_id}/jobs/<job_id>/execute
为了支持此功能,添加一个名为 child_job_execution 的新表,该表将存储父重复作业的子作业。创建重复 EDP 作业时,同时创建 M(已配置)个子作业,以便我们可以显示 M 个子作业的状态。定期任务将检查 M 个子作业的状态并更新它们,并且如果有一个子作业完成,我们将创建一个新的 feature-run 子作业来填补空缺,在这种情况下,我们维护一个 M 行窗口在 DB 中,这样可以避免无休止的子作业创建。如果删除此重复作业,我们将删除 child_job_execution 表中的子作业,包括已完成的作业和未来运行的作业。
为了创建子作业执行表,我们只需在作业执行表的基础上添加一列名为“father_job_id”,指向其父重复作业即可。其他列与作业执行表完全相同。
对于 Horizon 的更改,考虑到我们可能有许多子作业,因此当用户单击重复 EDP 作业时,我们仅显示最新的 M 个子作业,并添加两个查询日期时间选择器和一个按钮,供用户搜索历史完成的子作业。
对于 oozie 引擎的重复 EDP 作业实现,我们有如下更改
在基础 EDP 引擎中实现 run_recurrence_job。调用 oozie 客户端提交重复 EDP 作业。添加定期任务 update recurrence job statuses 以更新 child_job_execution 表中的子作业状态。
coordinator.xml 示例
对于 spark 实现,此处没有实现,稍后会添加它们。
替代方案¶
通过登录到 VM 并运行 oozie 命令手动运行 EDP 作业。
数据模型影响¶
添加一个名为 child job execution 的新表。只需比当前作业执行表多一列名为 father_job_id。其他列与作业执行表完全相同。
REST API 影响¶
这里没有变化,我们可以使用当前的 API,POST /v1.1/{tenant_id}/jobs/<job_id>/execute 我们可以将 job_execution_type、开始时间、结束时间、period_minutes 传递到 job_configs 中。
CREATE TABLE child_job_execution (
id VARCHAR(36) NOT NULL,
job_id VARCHAR(36),
father_job_id VARCHAR(36),
tenant_id VARCHAR(80),
input_id VARCHAR(36),
output_id VARCHAR(36),
start_time DATETIME,
end_time DATETIME,
info TEXT,
cluster_id VARCHAR(36),
oozie_job_id VARCHAR(100),
return_code VARCHAR(80),
job_configs TEXT,
extra TEXT,
data_source_urls TEXT,
PRIMARY KEY (id),
FOREIGN KEY (job_id)
REFERENCES jobs(id)
ON DELETE CASCADE
);
其他最终用户影响¶
无
部署者影响¶
无
开发者影响¶
无
Sahara-image-elements impact¶
无
Sahara-dashboard / Horizon 影响¶
在作业启动页面,添加一个选择框供用户选择作业执行类型,它有三个值(basic、scheduled、recurrence),默认值为 basic,即一次性运行作业。如果用户选择 recurrence,将出现两个日期时间选择器,分别命名为开始时间和结束时间,以及一个文本框供用户输入 period_minutes。
实现¶
负责人¶
- 主要负责人
luhuichun(lu huichun)
- 其他贡献者
无
工作项¶
定义重复作业类型
添加一个名为 update_recurrence_job_statuses 的定期任务
在 EDP 引擎中运行作业之前创建 coordinator.xml
将 coordinator.xml 上传到作业的 HDFS 文件夹
在 sahara 基础引擎中添加 run_recurrence_job
修改 sahara api 参考文档
添加任务以在 api-site 上更新 WADL
依赖项¶
无。
测试¶
edp 引擎中的单元测试添加场景集成测试
文档影响¶
需要进行文档说明。
参考资料¶
oozie 计划和递归作业实现 https://oozie.apache.org/docs/4.0.0/CoordinatorFunctionalSpec.html