在 K8s 上运行 Spark

本指南介绍如何配置 Apache Spark 来访问 Alluxio。

应用程序如果使用 Spark 1.1 或更高版本,可通过 Alluxio 的 HDFS 兼容接口来访问 Alluxio。当使用 Alluxio 作为数据访问层后, Spark 应用可以透明地访问各种持久化存储服务中的数据。特别是当 Spark 部署远离数据时, 应用可主动抓取数据或将其透明地缓存到 Alluxio 中, 从而加速 I/O 性能。此外,Alluxio 可以通过解耦计算与物理存储来简化架构。当持久化存储中的数据路径对 Spark 隐藏时,对底层存储的更改可以独立于应用程序逻辑; 同时,Alluxio 作为近计算的缓存层,仍然可以为计算框架提供数据本地性支持。

本指南介绍了如何在 Kubernetes 环境下将 Apache Spark 与 Alluxio 集成。

先决条件

本指南假定 Alluxio集群已部署在Kubernetes上

此外,还需使用docker来构建自定义的 Spark 镜像。

准备镜像

要与 Spark 集成,须在 Spark 镜像中添加 Alluxio 的 jar 文件和配置文件。 Spark 镜像修改后需启动 Spark 容器才能连接到 Alluxio 集群。

Alluxio安装说明中列出的下载文件中, 找到名为alluxio-enterprise-DA-3.2-8.0.0-release.tar.gz的压缩包。从压缩包解压以下 Alluxio jar文件:

  • client/alluxio-DA-3.2-8.0.0-client.jar

  • client/ufs/alluxio-underfs-s3a-shaded-DA-3.2-8.0.0.jar (如果使用 S3 存储桶作为 UFS)

准备一个空目录作为构建镜像的工作目录。在此目录中,创建目录files/alluxio/,并将前面提到的 jar 文件复制到其中。

创建一个Dockerfile 来修改基础 Spark 镜像。定义参数示例如下:

  • SPARK_VERSION=3.5.2 作为 Spark 的版本

  • UFS_JAR=files/alluxio/alluxio-underfs-s3a-shaded-DA-3.2-8.0.0.jar作为复制到 files/alluxio/ 的 UFS jar 的路径

  • CLIENT_JAR=files/alluxio/alluxio-DA-3.2-8.0.0-client.jar 作为复制到 files/alluxio/ 的 Alluxio 客户端 jar 的路径

运行以下命令来构建镜像,并将 <PRIVATE_REGISTRY> 替换为您的私有容器仓库的URL,将 <SPARK_VERSION> 替换为相应的 Spark 版本。 在以下示例中,我们将继续使用 3.5.2 作为 Spark 版本,以 <SPARK_VERSION> 表示。

通过运行以下命令来上传镜像:

部署 Spark

在提交 Spark 作业之前,我们需要完成以下几项操作:

  • 安装 Spark operator

  • 设置 Alluxio configMap

  • 为 Alluxio 创建服务账户 (如果使用 IAM)

  • 在Spark 作业中添加其他的参数

安装 Spark Operator

如果您使用 aws-samples/emr-on-eks-benchmark 来创建 EKS 集群,spark-operator 将会被安装在脚本中,因此无需再次安装。

以下说明来自 spark-operator 入门指南

在 Helm 中添加 spark-operator 仓库。

要添加自定义配置,可以创建一个 spark-operator.yaml 文件。例如,以下示例将命名空间设置为 spark(非必需,仅以此为例):

运行以下命令,来使用这些配置安装 spark-operator:

挂载 Alluxio 的 configMaps 需要进行webhook.enable 设置。

检查 spark-operator 的状态。如果状态为Running,则可以提交作业。

完成 Spark 作业后,使用以下命令卸载 Spark operator 及其相关组件:

设置 Alluxio ConfigMap

这里的 configMap 是用于作为 Alluxio 客户端的Spark 作业,使其能够识别 Alluxio 配置。

该 configMap 可以从由 Alluxio operator 构建的现有 Alluxio 集群的 alluxio-site.properties 创建。要显示来自 Alluxio 集群 configMap 的 alluxio-site.properties,运行以下命令:

如果按照在 Kubernetes 上安装 Alluxio 的说明进行操作,<ALLUXIO_NAMESPACE>-<ALLUXIO_CLUSTER_NAME>-conf 的值为default-alluxio-conf

使用以下命令将生成一个 alluxio-config.yaml 文件:

注意:

  • ${alluxioNamespace}${alluxioClusterName} 应与现有 Alluxio 集群的值匹配。如果按照在 Kubernetes 上安装 Alluxio 的说明进行操作,该值应分别为 defaultalluxio

  • jq 命令用于解析 JSON。

运行以下命令来创建 configMap:

为 Alluxio 创建服务账户

如果使用 IAM 进行身份验证/授权,则需使用 Alluxio 服务账户。

创建一个 spark-s3-access-sa.yaml 文件,内容如下:

其中 <YOUR_AWS_ACCOUNT_ID> 应替换为您的 AWS 账户 ID。

使用以下命令创建服务账户:

提供 Alluxio 属性作为 Spark 配置值

要使 Spark 集群与 Alluxio 集群正常通信,须在 Alluxio 客户端和 Alluxio 服务器之间对齐某些属性。

尤其是 hadoopConf 的值应设置为与 Alluxio 部署的值匹配。请注意之前创建的 alluxio-config.yaml 文件中的 alluxio-site.properties 中的以下属性:

  • alluxio.etcd.endpoints

  • alluxio.cluster.name

  • alluxio.k8s.env.deployment

  • alluxio.mount.table.source

  • alluxio.worker.membership.manager.type

在 Spark 应用程序 YAML 文件中添加以下内容以提交作业;有关alluxio-sparkApplication.yaml的完整示例请参见下一节。

上述示例假设 Alluxio 是按照在 Kubernetes 上安装 Alluxio 的说明进行部署的。

示例

使用 Spark 来读写文件

本节通过一个示例来介绍如何使用 Spark 读写文件。在这一简单示例中,我们将统计输入文件中的单词数。

需要执行以下步骤:

  • 创建一个包含任意文本的输入文件。我们将统计该文本文件中每个单词出现的次数。

  • 创建一个包含单词计数代码的 Scala 程序。该程序将读取上述输入文件并将结果输出到指定位置。

  • 打包 Scala 程序,以便 Spark 可以启动和执行。

  • 提交 Spark 作业并验证结果。

创建输入文件

创建一个输入文件 input.txt。输入文件可以包含任何文本内容。该 Scala 示例将统计一个单词在该文件中出现的次数。以下为示例内容,可完整复制粘贴到输入文件中:

创建 Scala 文件

我们需要编写一个 Scala 文件并生成 JAR,然后将 JAR 上传到 S3 供 spark 作业调用。

创建一个 Scala 文件 spark-scala-demo.scala,包含内容示例如下:

inputPath 更新为存放输入文件的 S3 路径,将 outputPath 更新为希望存放输出文件的 S3 路径。这两个路径需能通过提供的凭证访问。

打包 Scala 应用程序

首先创建一个包含 build.sbt 文件的文件夹,内容如下:

在包含 Scala 文件的文件夹下使用 sbt 工具构建 JAR。如果尚未安装 sbt,请运行 $ brew install sbt

./target/scala-2.12/ 目录下找到文件,注意其名称(即 <SPARK_JOB_JAR_FILE>.jar)。将该文件上传到 S3, 如有需要,可以对其重命名。 在此示例中,我们将其命名为 alluxioread\_2.12-0.1.jar

<BUCKET_NAME>/<S3_PATH> 替换为可访问的 S3 位置。

创建 Spark 应用

创建一个 alluxio-sparkApplication.yaml 文件,包含的内容如下所示:

注意以下自定义设置:

  • spec.image 下,指定自定义 Spark 镜像的位置。

  • spec.mainApplicationFile 中设置上传 jar 的 S3 路径,以替代 s3a://<BUCKET_NAME>/<S3_PATH>/alluxioread_2.12-0.1.jar

  • 在以下位置设置 S3 访问凭证:

    • 驱动程序和执行器的javaOptions

    • sparkConf 中的 spark.hadoop.fs.s3a.* 属性

  • 用于 sparkConfhadoopConf的 Alluxio 特定配置,具体参看上一节提供 Alluxio 属性作为 Spark 配置值

提交 Spark 作业并查看结果

运行以下命令来部署 spark 应用:

完成后,您将在输出路径中看到结果,在我们的示例中为:

将输出复制到本地并查看.csv 文件。应该会在 .csv 文件中看到单词和计数对。

注意:

  • 如果要重新运行作业,可能需要删除输出目录。这个操作需要在 Alluxio 层使用 alluxio fs rm 命令完成。示例如下:

  • 如果重新构建了 Scala 应用程序或更改了输入文件,需要让缓存失效,以便新版本能够被 Alluxio 拉取并获得更新。示例如下:

Last updated