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微信公众号。