数据源和作业二进制文件的可插拔性¶
https://blueprints.launchpad.net/sahara/+spec/data-source-plugin
Sahara 允许多种类型的数据源和作业二进制文件。然而,围绕它们缺乏清晰的抽象,处理它们的代码通常很难阅读和修改。本次更改建议创建清晰的抽象,每个数据源类型和作业二进制文件类型都可以根据自身需求以不同的方式实现这些抽象。
问题描述¶
目前,数据源和作业二进制文件的代码分散在 Sahara 的不同文件夹和文件中,这使得这些代码难以更改和扩展。现在,想要创建新的数据源的开发人员需要查看所有代码并修改很多地方(而且在没有深入了解代码的情况下几乎不可能知道所有这些地方)。一旦本次更改完成,开发人员将能够在单个目录中创建代码,并通过实现抽象类来编写其数据源。这将允许用户更容易地启用他们自己编写的数据源(并希望贡献上游),并允许操作员禁用其自身堆栈不支持的数据源。
提议的变更¶
本次更改建议将数据源和作业二进制文件的抽象作为插件创建,以便动态地提供加载代码,并具有明确定义的接口。现有的数据源和作业二进制文件类型将被重构。
将实现的接口如下所述
数据源接口
prepare_cluster(cluster, kwargs) - 使集群准备好使用此数据源。每个数据源的不同实现:对于 Manila,将挂载共享;对于 Swift,将验证凭据等。
construct_url(url, job_exec_id) - 解析数据源 URL 中的占位符。
get_urls(cluster, url, job_exec_id) - 返回数据源 URL 和数据源必须引用的运行时 URL。返回:形式为 (url, runtime_url) 的元组。
get_runtime_url(url, cluster) - 如果需要,将为数据源构建运行时 URL,默认情况下,如果不需要运行时 URL,将返回本机 URL。
validate(data) - 检查通过 API 传递以创建或更新数据源的数据是否有效。
_validate_url(url) - 此方法是可选的,可以由 validate 方法用于检查数据源 URL 是否有效。
作业二进制文件接口
prepare_cluster(cluster, kwargs) - 使集群准备好使用此作业二进制文件。每个数据源的不同实现:对于 Manila,将挂载共享;对于 Swift,将验证凭据等。
copy_binary_to_cluster(job_binary, cluster) - 如果需要,从二进制存储中提取二进制数据,并将其复制到集群上的有用路径。
get_local_path(cluster, job_binary) - 返回集群上二进制文件的本地路径。
validate(data) - 检查通过 API 传递以创建或更新作业二进制文件的数据是否有效。
_validate_url(url) - 此方法是可选的,可以由 validate 方法用于检查作业二进制文件 URL 是否有效
validate_job_location_format(entry) - 预先检查 API 条目是否有效。
get_raw_data(job_binary, kwargs) - 仅由 API 使用,返回原始二进制文件。如果该类型不支持此操作,则应引发 NotImplementedException。
这些接口将组织在以下文件夹结构中
services/edp/data_sources - 将包含数据源接口和数据源类型实现。
services/edp/job_binaries - 将包含作业二进制文件接口和作业二进制文件类型实现。
services/edp/utils - 将包含数据源实现和作业二进制文件实现可以共享的实用代码。例如:Manila 数据源实现可能与作业二进制文件实现共享一些代码。
在更改实现之前,接口可能会发生一些变化(参数、方法名称、参数名称),但主要结构和思想应保持不变。
还需要一个插件管理器来直接处理不同类型的数据源和作业二进制文件,并为操作员提供动态禁用/启用数据源和作业二进制文件的方法。由于此插件管理器将类似于已经存在的集群插件管理器,因此未详细说明。
替代方案¶
一个明确的替代方案是保持现状,但 Sahara 将更难扩展和理解;在“Proposed Change”部分中定义的抽象的替代方案是,对于数据源和作业二进制文件,只使用一个抽象而不是两个接口,因为这些接口有很多共同之处,实现此替代方案将删除 edp/service/utilities 文件夹,使代码更加统一和紧凑,但作业二进制文件和数据源代码将被视为单个插件,这可能会使此更改的可插拔性(例如:提供程序将无法禁用 Manila 的数据源,但可以启用它用于作业二进制文件)因此,我们选择将作业二进制文件和数据源分开,但作为补偿,我们需要 utilities 文件夹以避免代码复制。
数据模型影响¶
无
REST API 影响¶
可能需要一些新的方法来管理支持的数据源和作业二进制文件类型(类似于插件已经提供的那些方法)。
data_sources_types_list() ; job_binaries_types_list()
data_sources_types_get(type_name) ; job_binaries_types_get(type_name)
data_sources_types_update(type_name, data) ; job_binaries_types_update(type_name, data)
其他最终用户影响¶
无
部署者影响¶
无
开发者影响¶
在本次更改实施后,开发人员将能够通过仅实现抽象来轻松添加和启用新的数据源和作业二进制文件。
Sahara-image-elements impact¶
无
Sahara-dashboard / Horizon 影响¶
无
实现¶
负责人¶
主要负责人:mariannelinharesm
其他贡献者:egafford
工作项¶
创建包含数据源抽象的数据源插件
创建包含作业二进制文件抽象的作业二进制文件插件
HDFS 插件 内部
HDFS 插件 外部
Swift 插件
Manila 插件
允许作业引擎声明它们能够使用哪些数据源/作业二进制文件(这可能需要或不需要,具体取决于是否存在不支持特定数据源或作业二进制文件类型的作业类型)
API 中的更改
依赖项¶
无
测试¶
本次更改只需要对现有的单元测试进行更改。
文档影响¶
需要添加关于创建的抽象的 devref 文档。
参考资料¶
无