[EDP] 重构作业管理器以支持多种实现¶
https://blueprints.launchpad.net/sahara/+spec/edp-refactor-job-manager
Sahara EDP(弹性数据处理)的核心作业管理器最初被设计为通过 Oozie 服务器执行和监控作业。然而,作业管理器应该允许使用替代的 EDP 实现,这些实现可以支持新的集群类型或新的作业执行环境。
问题描述¶
到目前为止,随 Sahara 一起发布的配置插件都支持部署 Oozie 服务器。Oozie 是 Sahara EDP 早期版本的一个合乎逻辑的选择,因为它在多个插件之间提供了通用性,并允许快速开发 EDP 功能。
然而,Oozie 是构建在 Hadoop Mapreduce 之上的,并非每个集群配置都能或应该支持它(例如,Spark 集群,其中 Hadoop Mapreduce 不是安装的必要部分)。随着 Sahara 支持更多的集群类型并获得更广泛的安装基础,EDP 具有在新的集群配置和新的作业执行范例上运行的灵活性至关重要。
当前作业管理器的实现对 Oozie 存在硬编码依赖。这些依赖应该被移除,并且作业管理器应该被重构以支持当前的 Oozie 实现以及新的实现。作业管理器应该根据集群的属性为 EDP 操作选择合适的实现。
提议的变更¶
Sahara EDP 需要对作业执行三个基本操作
启动作业
轮询作业状态
终止作业
目前这些操作是在 job_manager.py 中实现的,并且对 Oozie 服务器和 Oozie 风格的工作流存在显式依赖。
为了将这些依赖从作业管理器中移除,我们可以定义一个包含这三个操作的抽象类
@six.add_metaclass(abc.ABCMeta)
class JobEngine(object):
@abc.abstractmethod
def cancel_job(self, job_execution):
pass
@abc.abstractmethod
def get_job_status(self, job_execution):
pass
@abc.abstractmethod
def run_job(self, job_execution):
pass
对于 Sahara 支持的每个 EDP 实现,都应该从 JobEngine 派生一个类,其中包含详细信息。每个实现及其支持文件都应该包含在其自己的子目录中。
可以在作业管理器中添加逻辑,以根据集群和/或作业类型分配 JobEngine,并且作业管理器可以调用分配的 JobEngine 上的相应方法。
尽可能地,JobEngine 类应该只关注实现操作。它们可以根据需要从 Sahara 数据库读取对象,但对作业执行对象的修改通常应该在 job_manager.py 中完成(在某些情况下,这可能很困难,或者可能需要向 JobEngine 基类添加可选的抽象方法)。
例如,“cancel_job” 序列应该如下所示
“cancel_job(id)” 在 job_manager.py 中被调用
作业管理器检索作业执行对象和集群对象,并分配合适的作业引擎
作业管理器调用 engine.cancel_job(job_execution)
引擎执行必要的步骤来取消作业
作业管理器捕获并记录任何异常
作业管理器调用 engine.get_job_status(job_execution)
引擎返回作业的状态(如果可能)
作业管理器使用指示的状态(如果有)更新 Sahara 数据库中的作业执行对象,然后返回
在此示例中,作业管理器不知道引擎中的操作,只知道编排操作和更新状态的高层逻辑。
替代方案¶
可能可以支持类似于配置插件实现的 EDP 的“真正”插件。在这种情况下,插件将在运行时动态地发现和加载。
然而,这比重构和引入抽象类需要更多的工作,并且可能不适用于 Juno 版本。存在一些需要解决的问题/问题
EDP 接口是否应该简单地作为可选方法添加到当前的配置插件接口中,或者 EDP 插件是否应该作为单独的实体?
提供配置插件的供应商是否也提供 EDP 插件?
如果选择单独的 EDP 插件,则需要一种约定来将 EDP 插件与配置插件关联起来,以便在特定集群的运行时选择正确的 EDP 实现,而无需内部的胶水
对于正在运行 Oozie 服务器的集群,如果未指定集群的其他实现,是否应该始终将 Oozie EDP 实现作为默认实现?或者是否应该为每个集群类型指定一个显式指定的实现?
这不仅需要插件的正式接口,还需要 Sahara 中插件可能需要的元素的正式接口。例如,EDP 插件可能需要与 conductor 的正式接口,以便它可以检索 EDP 对象(作业执行对象、数据源等)。
数据模型影响¶
此更改只会对当前数据模型产生一个小的(可选)更改。目前,JobExecution 对象包含一个名为“oozie_job_id”的字符串字段。虽然几乎肯定仍然需要所有实现中的作业 ID 字段,并且可能可以将其存储为字符串,但名称应更改为“job_id”。
JobExecution 对象还包含一个“extra”字段,在 Oozie 实现的情况下,用于存储 Oozie 服务器的 neutron 连接信息。其他实现可能需要类似的数据,但是由于“extra”字段存储为 JsonDictType,因此无需进行更改。
REST API 影响¶
无
其他最终用户影响¶
无
部署者影响¶
无
开发者影响¶
无
Sahara-image-elements impact¶
无
Sahara-dashboard / Horizon 影响¶
无
实现¶
负责人¶
主要负责人:Trevor McKay
工作项¶
依赖项¶
无
测试¶
测试将主要通过当前的单元和集成测试进行。可能会添加测试来测试作业引擎的选择。
文档影响¶
无
参考资料¶
无