[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” 序列应该如下所示

  1. “cancel_job(id)” 在 job_manager.py 中被调用

  2. 作业管理器检索作业执行对象和集群对象,并分配合适的作业引擎

  3. 作业管理器调用 engine.cancel_job(job_execution)

  4. 引擎执行必要的步骤来取消作业

  5. 作业管理器捕获并记录任何异常

  6. 作业管理器调用 engine.get_job_status(job_execution)

  7. 引擎返回作业的状态(如果可能)

  8. 作业管理器使用指示的状态(如果有)更新 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

工作项

依赖项

测试

测试将主要通过当前的单元和集成测试进行。可能会添加测试来测试作业引擎的选择。

文档影响

参考资料