[EDP] 添加 Spark 作业类型(代替重载 Java)

https://blueprints.launchpad.net/sahara/+spec/edp-spark-job-type

Spark EDP 最初是使用 Java 作业类型实现的。然而,Spark 的语义略有不同,并且 Spark 作业在未来的开发过程中可能会逐渐偏离 Java 作业。此外,特定的作业类型将帮助用户在 Sahara 数据库中区分 Spark 应用程序和 Java MapReduce 作业。

问题描述

这项工作包括在 Sahara 的作业类型枚举中添加 Spark 作业类型,并扩展仪表板以允许创建和提交 Spark 作业。Sahara 客户端也必须能够创建和提交 Spark 作业(可能不需要在客户端进行任何新工作来支持此操作)。

如果添加新的作业类型导致现有单元测试和集成测试失败,则必须修复它们。应为 Spark 作业类型添加类似于当前作业类型测试的单元测试。

Spark 集群/作业的集成测试将作为单独的工作进行添加。

提议的变更

Sahara-api 代码中的更改

  • 将 Spark 作业类型添加到枚举中

  • 添加作业创建和作业执行创建的验证方法

  • 添加 Spark 作业类型的单元测试

  • 将 Spark 作业类型添加到 Spark 插件支持的作业类型中

    • 在仪表板更改之前,继续支持 Java 类型用于 Spark

  • 添加 Spark 类型的配置提示

    • 这些最初可能是空的

Sahara 仪表板中的更改

  • 在作业创建表单上添加 Spark 作业类型作为可选择的类型。

    • 在“创建作业”选项卡上包含“选择主二进制文件”输入

    • 支持库是可选的,因此表单应包含“Libs”选项卡

  • 为 Spark 作业类型添加“启动作业”表单

    • 该表单应包含“主类”输入。

    • 没有数据源,与 Java 作业一样

    • Spark 作业将与 Java 作业共享 edp.java.main_class 配置。或者,Spark 作业可以使用 edp.spark.main_class 配置

    • 未来可能存在其他配置参数,但目前尚不支持任何参数。可以包含或省略“配置”按钮。

    • 应存在“参数”按钮

替代方案

重载现有的 Java 作业类型。它足够相似,可以作为概念验证,但从长远来看,这可能不清晰、理想或可维护。

数据模型影响

无。作业类型作为字符串存储在数据库中,因此不应产生任何影响。

REST API 影响

无。JSON 模式将列出“Spark”作为有效的作业类型,但 API 调用本身不应受到影响。

其他最终用户影响

部署者影响

开发者影响

Sahara-image-elements impact

Sahara-dashboard / Horizon 影响

在“提议的更改”下描述。

实现

负责人

主要负责人

Trevor McKay (sahara-api)

其他贡献者

Chad Roberts (dashboard)

工作项

关于“提议的更改”下描述的项目实施的补充说明

  • 在实验中,将 JOB_TYPE_SPARK 简单地添加到 sahara.utils.edp.JOB_TYPES_ALL 中并未导致现有的单元测试失败

  • 应调查现有的单元测试,并根据需要为 Spark 作业类型添加类似的测试

  • sahara.service.edp.job_manager.get_job_config_hints(job_type) 需要处理 Spark 作业类型。当前所有配置提示都从 Oozie 作业引擎检索,这将是不正确的。

    • 相关地,为了安全起见,应修改 workflow_creator.workflow_factory.get_possible_job_config() 中 JOB_TYPES_ALL 的使用

  • sahara.service.edp.job_utils.get_data_sources() 需要像 Java 作业一样处理 Spark 作业(没有数据源,只有参数)

  • service.validations.edp.job.check_main_libs() 需要为 Spark 作业需要主应用程序 jar,并允许可选的支持库

  • service.validations.edp.job_executor.check_job_executor()

    • Spark 需要 edp.java.main_class(或 edp.spark.main_class)

    • check_edp_job_support() 在此处调用,应该没问题。默认情况下为空体,并且 Spark 插件不会覆盖此方法,因为 Spark 独立部署是来自 DIB 生成的 Spark 镜像的一部分

  • 由于 Spark 作业不应由作业管理器针对 Oozie 引擎,因此在 sahara.service.edp.oozie.workflow_creator 中使用 EDP 作业类型不应受到影响(但请参阅关于 get_job_config_hints() 和 JOB_TYPES_ALL 的说明)

  • Sahara 客户端似乎没有引用特定的作业类型值,因此客户端可能不需要进行任何工作

依赖项

这取决于 https://blueprints.launchpad.net/sahara/+spec/edp-spark-standalone

测试

将为 Spark 作业类型添加新的单元测试,类似于现有作业类型的测试。现有的单元和集成测试将确保添加 Spark 类型不会破坏其他作业类型。

应在以下蓝图中添加 Spark 集群的集成测试,包括针对 EDP 和 Spark 作业类型的测试

https://blueprints.launchpad.net/sahara/+spec/edp-spark-integration-tests

文档影响

用户指南介绍了 EDP 的不同作业类型的详细信息。需要将 Spark 类型的详细信息添加到此部分。

参考资料

无。