启用 Spark 作业访问 Swift URL¶
https://blueprints.launchpad.net/sahara/+spec/edp-spark-swift-integration
Spark 使用 Hadoop 文件系统库来解析输入和输出 URL。因此,如果 Hadoop Swift JAR 包含在镜像中,并且 Spark 作业的 Hadoop 配置包含必要的 Swift 凭据,Spark 就可以访问 Swift 文件系统 URL。本规范描述了一种将 Swift 凭据透明地添加到 Spark 作业的 Hadoop 配置中的方法,这样就不需要修改和重新编译作业源代码来访问 Swift URL。
问题描述¶
如果集群镜像包含 Hadoop Swift JAR,Spark 作业可以访问 Swift URL。为此,作业的 Hadoop 配置必须包含必要的 Swift 凭据(例如 fs.swift.service.sahara.username 和 fs.swift.service.sahara.password)。
与 Oozie Java 操作一样,可以修改和重新编译作业源代码,以将必要的配置值添加到作业的 Hadoop 配置中。但是,这意味着使用 HDFS 输入和输出源成功运行的 Spark 作业不能“原样”与 Swift 输入和输出源一起使用。
Sahara 应该允许用户在不修改作业源代码的情况下运行具有 Swift 输入和输出源的 Spark 作业。
提议的变更¶
此更改遵循 Kazuki Oikawa 在 https://blueprints.launchpad.net/sahara/+spec/edp-improve-compatibility 中为 Java 兼容性开发的方案。
Sahara 将添加一个新的配置值,edp.spark.adapt_for_swift。如果 Spark 作业将此配置值设置为 True,Sahara 将运行一个包装类(SparkWrapper),而不是作业指示的原始类。此配置值的默认值为 False。
Sahara 将生成一个 spark.xml 文件,其中包含必要的 Swift 凭据作为 Hadoop 配置值。此 XML 文件将与包含 SparkWrapper 类的 JAR 一起上传到主节点,以及通常需要执行 Spark 作业的其他文件。
Sahara 的 Spark 启动脚本将运行 SparkWrapper 类,而不是作业指定的主类。启动器会将 XML 配置文件的名称传递给 SparkWrapper,然后是原始类名和任何作业参数。SparkWrapper 会在调用原始类及其任何参数之前,将此 XML 文件添加到作业配置中的默认 Hadoop 资源列表中。
当作业的主类运行时,其默认 Hadoop 配置将包含指定的 Swift 凭据。
主节点上作业目录的权限将被设置为 0x700。这将防止除作业目录所有者以外的其他用户从配置文件中读取 Swift 值。
SparkWrapper 类的源代码将位于 sahara-extra 仓库的 edp-adapt-for-spark 目录下。该目录将包含一个 pom.xml 文件,以便可以使用 maven 构建 JAR。由于 SparkWrapper 类非常简单,因此维护工作应该很轻;除非 Hadoop Configuration 类本身发生更改,否则预计不会更改。
目前,计划是根据需要构建 JAR,并在 service/edp/resources/edp-spark-wrapper.jar 中与 Sahara 一起发布它。或者,可以将 JAR 公开托管,并将其作为元素添加到 Sahara 镜像中。
替代方案¶
目前尚无已知方法可以通过配置值以外的方式向 Hadoop 文件系统库提供 Swift 凭据。此外,没有通过配置文件透明地向 Hadoop 配置添加值的方法。
这确实存在一些安全风险,但与已经存在于包含 Swift 凭据的 Oozie 作业中的风险相比,并不更大。事实上,这可能更安全,因为用户必须直接访问作业目录才能读取 Sahara 写入的凭据。
数据模型影响¶
无
REST API 影响¶
无
其他最终用户影响¶
无
部署者影响¶
无
开发者影响¶
无
Sahara-image-elements impact¶
Spark 的 DIB 镜像需要更改,以包含 Hadoop Swift JAR。为此已经存在一个元素,这很容易实现。
此外,我们仍然需要解决与 jackson-mapper-asl.jar 的兼容性问题。
可以通过在集群节点上包含额外的 JAR 来修补此问题,因此我们可以将额外的 jar 与 Spark 镜像作为补丁捆绑在一起。或者,可以通过升级镜像中使用的 CDH 版本(或 Spark 程序集版本)来解决此问题。
Sahara-dashboard / Horizon 影响¶
Spark 作业提交表单应该有一个输入(复选框?)允许用户将 edp.spark.adapt_for_swift 设置为 True。默认值应为 False。
我们不希望假设仅仅因为将 Swift 路径作为参数传递给 Spark 作业,Sahara 就应该运行包装器。作业本身可能以自己的方式处理 Swift 路径。
实现¶
负责人¶
主要负责人:tmckay
其他贡献者:croberts
工作项¶
添加一个简单的 SparkWrapper 类。这与为 Oozie Java 操作开发的包装类不同。
更新 Spark 镜像以包含 Hadoop Openstack JAR
找到解决 jackson 问题的方法
更新 UI
在 Sahara 中实现对 edp.spark.adapt_for_swift 选项的处理。这包括生成和上传额外的 XML 文件、上传额外的实用程序 jar 以及更改生成用于调用 spark-submit 的命令
更新节点配置 集群中的所有节点都应包含具有通用 Swift 文件系统配置的 Hadoop core-site.xml。此外,spark-env.sh 应该指向 Hadoop core-site.xml,以便 Spark 获取 Swift 配置,并且 spark-defaults.conf 需要设置执行器类路径。
依赖项¶
https://blueprints.launchpad.net/sahara/+spec/edp-improve-compatibility
测试¶
Spark 作业的单元测试和集成测试将识别此更改引入的任何回归。
一旦我们有了包含所有必要元素的 Spark 镜像,我们就可以为具有 Swift URL 的 Spark 添加一个集成测试。
文档影响¶
应更新所有描述作业提交的用户文档,以涵盖 Spark 作业的新选项。