乐趣区

关于云存储:迁移到Spark-Operator和S3的4个集成步骤

2020 年 CNCF 中国云原生考察

10 人将获赠 CNCF 商店 $100 美元礼券!

你填了吗?

问卷链接(https://www.wjx.cn/jq/9714648…)


客座文章作者:万事达卡首席软件开发工程师 Allison Richardet

在万事达,外部云团队保护咱们的 Kubernetes 平台。咱们的工作包含保护 Kubernetes 集群,这是咱们所依赖的外围部署,并为租户提供了日志、监控等服务,并为租户提供了良好的体验。

咱们的租户之一,数据仓库团队,已经在 YARN 和 HDFS 上应用过原生 Apache Spark。他们找了咱们的团队,心愿将他们的大数据工作转移到 Kubernetes;他们想要实现云原生化,而咱们也有机会在 Kubernetes 上与 Apache Spark 单干。

所以,咱们的旅程从 Spark Operator 开始。向 Kubernetes 和 Operators 的迁徙将为咱们的外部客户数据仓库团队关上云原生的可能性。咱们有机会帮忙他们利用可伸缩性和老本改良的劣势,而切换到 S3 将进一步实现这些指标。

背景

操作器(operator)是什么,为什么咱们,或者你,对此感兴趣?首先,操作器应用自定义资源扩大了 Kubernetes API。操作器还定义了一个自定义控制器来监督其资源类型。将自定义资源与自定义控制器联合在一起会产生一个申明性 API,在这个 API 中,操作器会协调集群申明状态与理论状态之间的差别。换句话说,操作器解决与其资源相干的自动化。

有了这些益处,咱们的团队很快乐可能利用 Kubernetes 的 Spark 操作器来反对咱们的租户。通常,原生 Apache Spark 应用 HDFS。然而,迁徙到云端并在 Kuberentes 上运行 Spark 操作器,S3 是 HDFS 的一个很好的代替计划,因为它具备老本劣势,并且可能依据须要进行扩大。乏味的是,S3 在默认状况下不能与 Spark 操作器一起应用。咱们参考了 Spark 操作器以及 Hadoop-AWS 集成文档。此外,咱们将分享以下 4 个步骤的详细信息:镜像更新、SparkApplication 配置、S3 凭据和 S3 款式。遵循咱们的步骤,将 S3 与你的 Spark 作业和 Kubernetes 的 Spark 操作器进行集成。

工作流程

与咱们部署到 Kubernetes 集群的大多数应用程序一样,咱们应用 Helm chart。Kubernetes 的 Apache Spark 操作器的 Helm chart 能够在这里找到。

Values & Helm 模板

咱们更新 values.yaml,而后运行 helm template 生成咱们将部署到 Kubernetes 集群的清单。咱们发现,对将要创立的内容具备可见性和对部署的管制是值得额定步骤的;模板存储在 git 中,咱们的 CD 工具负责部署。

默认的 chart values 将容许你疾速启动和运行。依据你的须要,以下是你可能须要做的一些批改:

  • 启用 webhook:默认状况下,不启用 Mutating Admission Webhook。启用容许自定义 SparkApplication 驱动程序和执行程序 pod,包含挂载卷、ConfigMaps、亲和性 / 非亲和性等等。
  • 定义 ingressUrlFormat:Spark UI 可选的 ingress。

请参阅疾速入门指南和默认 values.yaml 获取更多详细信息和选项。

需要

要运行应用 S3 的 SparkApplication,须要 SparkApplication 的附加配置,包含一个自定义 docker 镜像。Hadoop S3AConnector 是一种能够对 S3 进行读写的工具。

1. 镜像更新

SparkApplication 应用的 docker 镜像须要增加两个 jar(hadoop-aws 和 aws-java-sdk 或 aws-java-sdk-bundle),版本依据 Spark 版本和 Hadoop 配置文件。

在这一步中有几件事件要记住。

  • 用户和权限
  • 额定的 Jar

如果应用 spark 镜像作为终点,在增加 jar 时援用它们各自的 dockerfile 以正确对齐用户和地位。

让咱们来看看 python Dockerfile。在执行任何装置工作之前,用户被设置为 root,而后重置为 ${spark_uid}。

通过查看根本镜像,能够看到 jar 位于 /opt/spark/jars 或 $SPARK_HOME/jars 中。最初,更新 jar 的权限,以便可能应用它们。

上传到 S3 的文档提供了应用 jar 文件的信息;然而,咱们须要一个蕴含 fs.s3a.path.style.access 配置的新 Hadoop 版本——咱们将在前面一节中探讨这个问题。在编写本文时,咱们应用 spark 操作器版本 v1beta2-1.2.0-3.0.0,其中蕴含根本 spark 版本 3.0.0。应用 gcr.io/spark-operator/spark-py:v3.0.0-hadoop3 镜像作为终点,咱们增加了以下 jar:hadoop-aws-3.1.0.jar 和 aws-java-sdk-bundle-1.11.271.jar。它须要一些试验来确定最终能工作的正确镜像组合。

2. SparkApplication 配置

SparkApplication 须要额定的配置能力与 S3 通信。spec.sparkConf 中要求的最小配置如下:

sparkConf:
    spark.hadoop.fs.s3a。端点:< 端点 >
    spark.hadoop.fs.s3a。impl: org.apache.hadoop.fs.s3a.S3AFileSystem

还必须提供拜访 S3 的凭据。有相似于下面的配置选项;然而,这是十分丧气的,因为它们是字符串值,因而与平安最佳实际相违反。

3. S3 凭证

咱们不在 SparkApplication 的 sparkConf 中提供 s3 凭据,而是创立一个 Kubernetes 机密,并为驱动程序和执行程序定义环境变量。Spark 操作器文档提供了几种应用 secret 的选项,以及用于挂载机密或指定环境变量的残缺示例。

接下来,因为咱们应用环境变量来验证 S3,咱们在 sparkConf 中设置以下选项:

sparkConf:
     spark.hadoop.fs.s3a.aws.credentials.provider: com.amazonaws.auth.EnvironmentVariableCredentialsProvider

这是不须要的,如果没有提供,将尝试依照以下程序来尝试凭据提供程序类:

  1. org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider
  2. com.amazonaws.auth.EnvironmentVariableCredentialsProvider
  3. com.amazonaws.auth.InstanceProfileCredentialsProvider

4. S3 款式

在 SparkApplication 的 sparkConf 中有一些其余的选项须要记住,这些选项是基于你特定的 S3 的:

sparkConf:
    extraJavaOptions: -Dcom.amazonaws.services.s3.enableV4=true
    spark.hadoop.fs.s3a.path.style.access:“true”spark.hadoop.fs.s3a.connection.ssl.enabled:“true”

门路款式拜访——通过启用门路款式拜访,将禁用虚拟主机(默认启用)。启用门路款式拜访能够打消为默认虚拟主机设置 DNS 的需要。

启用 SSL——如果你正在应用 TLS/SSL,请确保在 SparkApplication 的 sparkConf 中启用这个选项。

额定的 Java 选项——依据你的须要而变动。

应用 S3

当初你曾经实现了应用 S3 的所有设置,当初有两种抉择:利用 S3 解决依赖项或上传到 S3。

S3 解决依赖项

mainApplicationFile 和 spark 作业应用的附加依赖项(包含文件或 jar)也能够从 S3 中存储和获取。它们能够在 spec.deps 字段中的 SparkApplication 中与其余依赖项一起定义。spark-submit 会别离应用 spec.deps.jar 和 spec.deps.files 中指定的 jar 或文件。s3 中拜访依赖的格局为 s3a://bucket/path/to/file。

上传到 S3

上传到 S3 时,文件地位的格局为 s3a://bucket/path/to/destination。bucket 必须存在,否则上传失败。如果 destination 文件曾经存在,上载将失败。

总结

咱们介绍了启动并运行 Spark 操作器和 S3 所需的 4 个步骤:镜像更新、SparkApplication 的 sparkConf 中所需的选项、S3 凭据以及基于特定 S3 的其余选项。最初,咱们给出了一些对于如何利用 S3 来实现依赖关系和上传到 S3 的倡议。

最初,咱们帮忙咱们的外部客户,数据仓库团队,将他们的大数据工作负载从原生 Apache Spark 转移到 Kubernetes。Kubernetes 上的 Spark 操作器在云计算方面有很大的劣势,咱们想与更大的社区分享咱们的教训。咱们心愿这个对于 Spark 操作器和 S3 集成的演练将帮忙你和 / 或你的团队启动并运行 Spark 操作器和 S3。

点击浏览网站原文。


CNCF (Cloud Native Computing Foundation) 成立于 2015 年 12 月,隶属于 Linux  Foundation,是非营利性组织。
CNCF(云原生计算基金会)致力于培养和保护一个厂商中立的开源生态系统,来推广云原生技术。咱们通过将最前沿的模式民主化,让这些翻新为公众所用。扫描二维码关注 CNCF 微信公众号。

退出移动版