[EDP] 添加一个新的作业类型端点

https://blueprints.launchpad.net/sahara/+spec/edp-job-types-endpoint

添加一个新的作业类型端点,该端点可以报告 Sahara 实例支持的所有作业类型以及支持它们的插件。

问题描述

目前 Sahara 中存在两个关于作业类型的问题,影响用户体验

  • 当前的 /jobs/config-hints/<job_type> 端点不足以提供配置提示,因为它没有考虑到插件类型或框架版本。该端点原本旨在为用户提供一个可能需要修改的作业的可能配置值列表(曾经 UI 也将提示整合进去)。虽然一些配置在多个插件之间是通用的,但提示需要特定于插件和框架版本才能有用。该端点不接受集群或插件参数,因此提示必须是通用的。

  • 用户目前没有指示器来了解 Sahara 实例中实际可用的作业类型(UI 列出了所有类型)。有效的作业类型集基于当前实例加载的插件。此外,并非所有作业类型都可用于用户启动的所有集群,因为它们依赖于插件。

应该在不破坏 REST API 向后兼容性的前提下解决这些问题。

提议的变更

添加一个新的端点,该端点将指示正在运行的 Sahara 实例中哪些插件的哪些版本支持哪些作业类型。可选地,对于每个支持的作业类型,将包含特定于插件和版本的配置提示。

由于配置提示可能非常长,因此默认情况下不会在响应中包含它们。将使用查询字符串参数来指示应包含它们。

该端点将支持以下可选查询字符串进行过滤。每个查询字符串可以多次使用,以查询一个值列表,例如 type=Pig&type=Java

  • type 要考虑的作业类型。默认值为所有作业类型。

  • plugin 要考虑的插件。默认值为所有插件。

  • version 要考虑的插件版本。默认值为所有版本。

REST API 方法在下文的 REST API 影响 中详细说明。

我们需要在 Plugin SPI 中添加两个新的可选方法。这些信息最终来自插件使用的 EDP 引擎,但我们不想实际分配 EDP 引擎对象,因此现有的 get_edp_engine() 将不足(而且,它需要一个集群对象)

@abc.abstractmethod
def get_edp_job_types(self, versions=[]):
    return []

@abc.abstractmethod
def get_edp_config_hints(self, job_type, version):
    return {}

这些特定方法在此处提及,因为它们代表了对公共 Plugin SPI 的更改。

替代方案

修复现有的 /jobs/config-hints 端点,使其接受集群 ID 或插件-版本对,并返回适当的配置提示。但是,这将破坏向后兼容性。

仍然添加一个额外的端点来检索 Sahara 实例支持的作业类型,与配置提示分开。

然而,废弃当前的 config-hints 接口并添加一个新的端点,该端点同时服务于这两个目的更有意义。

数据模型影响

REST API 影响

将保持向后兼容性,因为这是一个新的端点。

GET /v1.1/{tenant_id}/job-types

正常响应代码:200 (OK)

错误:无

指示当前实例中哪些插件的哪些版本支持哪些作业类型。

示例

请求

GET http://sahara/v1.1/775181/job-types

response

HTTP/1.1 200 OK
Content-Type: application/json
{
    "job_types": [
        {
            "name": "Hive",
            "plugins": [
                {
                    "description": "The Apache Vanilla plugin.",
                    "name": "vanilla",
                    "title": "Vanilla Apache Hadoop",
                    "versions": {
                        "1.2.1": {}
                    }
                },
                {
                    "description": "The Hortonworks Sahara plugin.",
                    "name": "hdp",
                    "title": "Hortonworks Data Platform",
                    "versions": {
                        "1.3.2": {},
                        "2.0.6": {}
                    }
                }
            ]
        },
        {
            "name": "Java",
            "plugins": [
                {
                    "description": "The Apache Vanilla plugin.",
                    "name": "vanilla",
                    "title": "Vanilla Apache Hadoop",
                    "versions": {
                        "1.2.1": {}
                    }
                },
                {
                    "description": "The Hortonworks Sahara plugin.",
                    "name": "hdp",
                    "title": "Hortonworks Data Platform",
                    "versions": {
                        "1.3.2": {},
                        "2.0.6": {}
                    }
                }
            ]
        },
        {
            "name": "MapReduce",
            "plugins": [
                {
                    "description": "The Apache Vanilla plugin.",
                    "name": "vanilla",
                    "title": "Vanilla Apache Hadoop",
                    "versions": {
                        "1.2.1": {}
                    }
                },
                {
                    "description": "The Hortonworks Sahara plugin.",
                    "name": "hdp",
                    "title": "Hortonworks Data Platform",
                    "versions": {
                        "1.3.2": {},
                        "2.0.6": {}
                    }
                }
            ]
        },
        {
            "name": "MapReduce.Streaming",
            "plugins": [
                {
                    "description": "The Apache Vanilla plugin.",
                    "name": "vanilla",
                    "title": "Vanilla Apache Hadoop",
                    "versions": {
                        "1.2.1": {}
                    }
                },
                {
                    "description": "The Hortonworks Sahara plugin.",
                    "name": "hdp",
                    "title": "Hortonworks Data Platform",
                    "versions": {
                        "1.3.2": {},
                        "2.0.6": {}
                    }
                }
            ]
        },
        {
            "name": "Pig",
            "plugins": [
                {
                    "description": "The Apache Vanilla plugin.",
                    "name": "vanilla",
                    "title": "Vanilla Apache Hadoop",
                    "versions": {
                        "1.2.1": {}
                    }
                },
                {
                    "description": "The Hortonworks Sahara plugin.",
                    "name": "hdp",
                    "title": "Hortonworks Data Platform",
                    "versions": {
                        "1.3.2": {},
                        "2.0.6": {}
                    }
                }
            ]
        }
    ]
}

job-types 端点返回一个列表。列表中的每个项目都是一个字典,描述了正在运行的 Sahara 支持的作业类型。请注意,例如,Spark 作业类型缺失了。

每个作业类型字典包含作业类型的名称以及支持它的插件列表。

对于每个插件,我们包含基本标识信息,然后是 versions 字典。versions 字典中的每个条目都以版本名称作为键,并将相应的配置提示作为值。由于此示例未请求配置提示,因此字典为空。

这是一个使用插件和版本过滤器的请求示例

示例

请求

GET http://sahara/v1.1/775181/job-types?plugin=hdp&version=2.0.6

response

HTTP/1.1 200 OK
Content-Type: application/json
{
    "job_types": [
        {
            "name": "Hive",
            "plugins": [
                {
                    "description": "The Hortonworks Sahara plugin.",
                    "name": "hdp",
                    "title": "Hortonworks Data Platform",
                    "versions": {
                        "2.0.6": {}
                    }
                }
            ]
        },
        {
            "name": "Java",
            "plugins": [
                {
                    "description": "The Hortonworks Sahara plugin.",
                    "name": "hdp",
                    "title": "Hortonworks Data Platform",
                    "versions": {
                        "2.0.6": {}
                    }
                }
            ]
        },
        {
            "name": "MapReduce",
            "plugins": [
                {
                    "description": "The Hortonworks Sahara plugin.",
                    "name": "hdp",
                    "title": "Hortonworks Data Platform",
                    "versions": {
                        "2.0.6": {}
                    }
                }
            ]
        },
        {
            "name": "MapReduce.Streaming",
            "plugins": [
                {
                    "description": "The Hortonworks Sahara plugin.",
                    "name": "hdp",
                    "title": "Hortonworks Data Platform",
                    "versions": {
                        "2.0.6": {}
                    }
                }
            ]
        },
        {
            "name": "Pig",
            "plugins": [
                {
                    "description": "The Hortonworks Sahara plugin.",
                    "name": "hdp",
                    "title": "Hortonworks Data Platform",
                    "versions": {
                        "2.0.6": {}
                    }
                }
            ]
        }
    ]
}

这是另一个启用配置提示并同时按插件、版本和作业类型进行过滤的示例。

示例

请求

GET http://sahara/v1.1/775181/job-types?hints=true&plugin=hdp&version=1.3.2&type=Hive

response

HTTP/1.1 200 OK
Content-Type: application/json
{
    "job_types": [
        {
            "name": "Hive",
            "plugins": [
                {
                    "description": "The Hortonworks Sahara plugin.",
                    "name": "hdp",
                    "title": "Hortonworks Data Platform",
                    "versions": {
                        "1.3.2": {
                            "job_config": {
                                "args": {},
                                "configs": [
                                    {
                                        "description": "Reduce tasks.",
                                        "name": "mapred.reduce.tasks",
                                        "value": "-1"
                                    }
                                ],
                                "params": {}
                            }
                        }
                    }
                }
            ]
        }
    ]
}

这是一个缩写的示例,显示了想象中的配置提示。

其他最终用户影响

python-saharaclient 也应扩展以支持此功能

$ sahara job-types-list [--type] [--plugin [--plugin-version]]

输出应如下所示(不确定在哪里指定此信息)

+---------------------+-----------------------------------+
| name                | plugin(versions)                  |
+---------------------+-----------------------------------+
| Hive                | vanilla(1.2.1), hdp(1.3.2, 2.0.6) |
| Java                | vanilla(1.2.1), hdp(1.3.2, 2.0.6) |
| MapReduce           | vanilla(1.2.1), hdp(1.3.2, 2.0.6) |
| MapReduce.Streaming | vanilla(1.2.1), hdp(1.3.2, 2.0.6) |
| Pig                 | vanilla(1.2.1), hdp(1.3.2, 2.0.6) |
+---------------------+-----------------------------------+

由于配置提示可以返回大量信息,并且描述字段可以包含大量文本,因此如何通过 python-saharaclient 支持配置提示还有待确定。

如上所述,Plugin SPI 将扩展为包含可选方法。支持 EDP 的现有插件将在本次更改中进行修改。

部署者影响

开发者影响

Sahara-image-elements impact

Sahara-dashboard / Horizon 影响

UI 可以利用此信息,并在表单中过滤用户可用的作业类型。它还可以利用配置提示。

实现

负责人

主要负责人

tmckay

其他贡献者

工作项

  • 添加基本的端点支持以及插件 SPI 中的可选方法

  • 为支持 EDP 的每个插件实现这些方法

    这可以作为一系列单独的小 CR 完成

  • 为 python-saharaclient 添加支持

  • Update documentation

依赖项

测试

  • 单元测试

  • API 的 Tempest 测试

文档影响

它应该添加到 REST API 文档中。

参考资料