如何在 5 分钟内在 Kubernetes 上运行 Apache Spark

像 Ilum 这样的工具将大大简化在 Kubernetes 上安装 Apache Spark 的过程。本指南将逐步引导您了解如何在 Kubernetes 集群上良好运行 Spark。使用 Ilum,可以轻松自然地部署、管理和扩展 Apache Spark 集群。
介绍
今天,我们将展示如何在 K8s 上启动和运行 Apache Spark。有很多方法可以做到这一点,但大多数都很复杂,需要多种配置。我们将使用 伊卢姆 因为这将为我们完成所有的集群设置。在下一篇博文中,我们将使用 Spark 运算符。

Ilum 是一个免费的模块化数据湖仓一体,可轻松部署和管理 Apache Spark 集群。它有一个简单的 API 来定义和管理 Spark,它将处理所有依赖项。它有助于创建您自己的托管 Spark。
借助 Ilum,您可以在几分钟内部署 Spark 集群,并立即开始运行 Spark 应用程序。Ilum 允许您轻松地横向扩展和缩减 Spark 集群,从单个 UI 管理多个 Spark 集群。
如果您对 Kubernetes 上的 Apache Spark 相对较新,那么使用 Ilum 很容易入门。
在 Kubernetes 上安装 Apache Spark 的分步指南
快速开始
我们假设您已经启动并运行了一个 Kubernetes 集群,以防万一您没有,请查看这些说明以在 minikube 上设置 Kubernetes 集群。 检查如何安装 minikube .
设置本地 Kubernetes 集群
- 安装 Minikube: 执行以下命令以安装 Minikube 以及推荐的资源。这将安装具有 6 个 vCPU 和 12288 MB 内存的 Minikube,包括监控所需的指标服务器附加组件。
minikube start --cpus 6 --memory 12288 --addons metrics-server
一旦你有一个正在运行的 Kubernetes 集群,只需几个命令就可以安装 Ilum:
使用 Ilum 在 Kubernetes 上安装 Spark
helm repo add ilum https://charts.ilum.cloud
- 在集群中安装 Ilum
helm install 和 ile/el
minikube ssh docker pull ilum/core:6.2.0
此设置大约需要 2 分钟。Ilum 将部署到您的 Kubernetes 集群中,使其准备好处理 Spark 作业。

安装 Ilum 后,您可以使用 port-forward 和 localhost:9777 访问 UI。
- 端口转发到 Access UI: 使用 Kubernetes 端口转发访问 Ilum UI。
kubectl 端口转发 svc/ilum-ui 9777:9777
用 管理员/管理员 作为默认凭证。您可以在 部署过程 .

就这样,您的 kubernetes 集群现在已配置为处理 Spark 作业。Ilum 提供了一个简单的 API 和 UI,可以轻松提交 Spark 应用程序。您也可以使用旧的 Spark 提交 .
在 Kubernetes 上部署 Spark 应用程序
现在,让我们开始一个简单的 Spark 作业。我们将使用 Spark 中的 “SparkPi” 示例 文档 .您可以从 this 中使用 jar 文件 链接 .
ilum add spark 作业
Ilum 将创建一个 Spark 驱动程序 kubernetes pod,它使用 spark 版本 3.x docker 镜像。您可以通过将 Spark 执行程序 Pod 扩展到多个节点来控制它们的数量。这是向 K8s 提交 Spark 应用程序的最简单方法。

使用 Ilum 在 Kubernetes 上运行 Spark 非常简单且顺畅。它将配置您的整个集群,并为您提供一个界面,您可以在其中管理和监控您的 Spark 集群。我们相信 Kubernetes 上的 Spark 应用程序是大数据的未来。借助 Kubernetes,Spark 应用程序将能够更可靠地处理大量数据,从而提供准确的见解并能够利用大数据推动决策。
向 Kubernetes 提交 Spark 应用程序(旧式)
将 Spark 作业提交到 Kubernetes 集群涉及使用 spark-submit
脚本。以下是分步指南:
步骤 :
-
准备 Spark 应用程序 :将 Spark 应用程序打包到 JAR 文件(适用于 Scala/Java)或 Python 脚本中。
-
用
spark-submit
部署 :执行spark-submit
命令替换为 Kubernetes 特定的选项:./bin/spark-submit \ --master k8s://https://<k8s-apiserver-host>:<k8s-apiserver-port> \ --deploy-mode 集群 \ --name spark-app \ --class org.apache.spark.examples.SparkPi \ --conf spark.executor.instances=3 \ --conf spark.kubernetes.container.image=<your-spark-image> \ local:///path/to/your-app.jar
取代:
<k8s-apiserver-host>
:您的 Kubernetes API 服务器主机。<k8s-apiserver-port>
:您的 Kubernetes API 服务器端口。<your-spark-image>
:包含 Spark 的 Docker 镜像。local:///path/to/your-app.jar
:Docker 映像中应用程序 JAR 的路径。
关键配置 :
--主人
:指定 Kubernetes API URL。--部署模式
:设置为簇
在 Kubernetes 集群中运行驱动程序。--名字
:为您的 Spark 应用程序命名。--类
:应用程序的主类。--conf spark.executor.instances
:执行程序 Pod 的数量。--conf spark.kubernetes.container.image
:Spark Pod 的 Docker 映像。
有关更多详细信息,请参阅 有关在 Kubernetes 上运行的 Apache Spark 文档 .
2. 为 Spark 创建自定义 Docker 镜像
通过构建自定义 Docker 映像,您可以打包 Spark 应用程序及其依赖项,从而确保跨环境的一致性。
步骤 :
-
创建 Dockerfile :定义环境和依赖关系。
# 使用官方 Spark 基础镜像 从 spark:3.5.3 开始 # 设置环境变量 ENV SPARK_HOME=/opt/spark 环境路径=$PATH:$SPARK_HOME/bin # 将你的应用程序 JAR 复制到镜像中 复制 your-app.jar $SPARK_HOME/examples/jars/ # 设置运行应用程序的入口点 入口点 [“spark-submit”, “--class”, “org.apache.spark.examples.SparkPi”, “--master”, “local[4]”, “/opt/spark/examples/jars/your-app.jar”]
在此 Dockerfile 中:
从 spark:3.5.3 开始
:以 Spark 官方镜像为基础。环境
:设置 Spark 的环境变量。复制
:将应用程序 JAR 添加到映像中。入口点
:定义用于运行 Spark 应用程序的默认命令。
-
构建 Docker 镜像 :使用 Docker 构建您的镜像。
docker build -t your-repo/your-spark-app:latest 的 .
取代
your-repo/your-spark-app
替换为您的 Docker 存储库和镜像名称。 -
将镜像推送到注册表 :将映像上传到 Kubernetes 集群可访问的 Docker 注册表。
docker push your-repo/your-spark-app:latest
使用 spark-submit
是部署 Spark 应用程序的常用方法,但它可能不是生产环境的最有效方法。手动提交可能会导致不一致,并且难以集成到自动化工作流程中。为了提高效率和可维护性,建议使用 Ilum 的 REST API。
使用 Ilum 的 REST API 自动执行 Spark 部署
Ilum 提供强大的 RESTful API,支持与 Spark 集群的无缝交互。此 API 有助于作业提交、监控和管理的自动化,使其成为持续集成/持续部署 (CI/CD) 管道的理想选择。
使用 Ilum 的 REST API 的好处:
- 自动化 :将 Spark 作业提交集成到 CI/CD 管道中,减少人工干预和潜在错误。
- 一致性 :确保跨不同环境的统一部署流程。
- 可扩展性 :以编程方式轻松管理多个 Spark 集群和作业。
示例:通过 ILUM 的 REST API 提交 Spark 作业
要使用 Ilum 的 REST API 提交 Spark 作业,您可以使用必要的参数发出 HTTP POST 请求。下面是一个使用 卷曲
:
curl -X POST <ilum-server>https:///api/v1/job/submit \
-H “内容类型:multipart/form-data” \
-F “名称=示例任务” \
-F “clusterName=default” \
-F “jobClass=org.apache.spark.examples.SparkPi” \
-F “jars=@/path/to/your-app.jar” \
-F “jobConfig=spark.executor.instances=3;spark.executor.memory=4g”
在此命令中:
名字
:指定作业名称。clusterName (集群名称)
:表示目标集群。job类
:定义 Spark 应用程序的主类。罐子
:上传您的应用程序 JAR 文件。jobConfig
:设置 Spark 配置,例如 Executor 数量和内存分配。
有关 API 端点和参数的详细信息,请参阅 Ilum API 文档 .
使用交互式 Spark 作业提高效率
除了自动提交作业之外,将 Spark 作业转换为交互式微服务还可以显著优化资源利用率和响应时间。Ilum 支持创建长时间运行的交互式 Spark 会话,这些会话可以处理实时数据,而不会产生为每个请求初始化新 Spark 上下文的开销。
交互式 Spark 作业的优点:
- 减少延迟 :无需为每个作业启动新的 Spark 上下文,从而加快执行速度。
- 资源优化 :维护持久的 Spark 上下文,从而实现高效的资源管理。
- 可扩展性 :在同一 Spark 会话中同时处理多个请求。
要使用 Ilum 实现交互式 Spark 作业,您可以定义一个 Spark 应用程序来侦听传入数据并实时处理这些数据。这种方法对于需要即时数据处理和响应的应用程序特别有用。
有关设置交互式 Spark 作业和优化 Spark 集群的全面指南,请参阅 Ilum 的博客文章: 如何使用交互式 Spark 作业优化 Spark 集群 .
通过集成 Ilum 的 REST API 并采用交互式 Spark 作业,您可以简化 Spark 工作流程、增强自动化并实现更高效、可扩展的数据处理环境。
使用 Ilum 在 Kubernetes 上运行 Spark 的优势
Ilum 配备了直观的 UI 和弹性 API,用于扩展和处理 Spark 集群,从一个界面配置几个 Spark 应用程序。以下是这方面的一些很棒的功能:
- 易用性 :Ilum 通过直观的 Spark UI 简化了 Kubernetes 上的 Spark 配置和管理,消除了复杂的设置过程。
- 快速部署: 在几分钟内设置、部署和扩展 Spark 集群,以加快立即执行和测试应用程序的速度。
- 可扩展性: 使用 Kubernetes API,轻松扩展或缩减 Spark 集群以满足您的数据处理需求,确保最佳资源利用率。
- 模块性 : Ilum 带有一个模块化框架,允许用户选择和组合不同的组件,例如 Spark History Server、Apache Jupyter、Minio 等等。
从 Apache Hadoop Yarn 迁移
现在 Apache Hadoop Yarn 处于深度停滞状态,越来越多的组织正在寻求从 Yarn 迁移到 Kubernetes。这归因于几个原因,但最常见的是 Kubernetes 在管理大数据工作负载方面提供了更具弹性和灵活性的平台。
通常,很难将数据处理平台从 Apache Hadoop Yarn 迁移到任何其他平台。进行此类转换时,需要考虑许多因素 - 数据兼容性、速度和处理成本。但是,如果程序计划和执行得当,它将顺利而成功。

Kubernetes 在大数据工作负载方面几乎是天作之合,因为它具有能够水平扩展的固有能力。但是,使用 Hadoop Yarn 时,您会受到集群中节点数量的限制。您可以根据需要增加和减少 Kubernetes 集群内的节点数量。
它还允许 Yarn 中不可用的功能,例如:自我修复和水平缩放。
是时候切换到 Kubernetes 了?
随着大数据世界的不断发展,用于管理大数据的工具和技术也在不断发展。多年来,Apache Hadoop YARN 一直是大数据环境中资源管理的事实标准。但是,随着 Kubernetes 等容器化和编排技术的兴起,是时候进行转换了吗?
Kubernetes 作为容器编排平台越来越受欢迎,这是有充分理由的。它灵活、可扩展且相对易于使用。如果您仍在使用基于 VM 的传统基础架构,现在可能是切换到 Kubernetes 的时候了。
如果您正在使用容器,那么您绝对应该关心 Kubernetes。它可以帮助您更有效地管理和部署容器,如果您正在使用大量容器或将容器部署到云平台,它尤其有用。

如果您正在寻找由大型科技公司支持的编排工具,Kubernetes 也是一个不错的选择。多年来,Google 一直在使用 Kubernetes 来管理自己的容器化应用程序,他们投入了大量时间和资源来使其成为一个出色的工具。
在 YARN 与 Kubernetes 的争论中没有明显的赢家。适合您组织的最佳解决方案将取决于您的特定需求和使用案例。如果您正在寻找更灵活、可扩展的资源管理解决方案,Kubernetes 值得考虑。如果您需要更好地支持旧应用程序,YARN 可能是更好的选择。
无论您选择哪个平台,Ilum 都可以帮助您充分利用它。我们的平台旨在与 YARN 和 Kubernetes 配合使用,我们的专家团队可以帮助您为您的组织选择和实施正确的解决方案。
托管 Spark 集群
托管的 Spark 集群是一种基于云的解决方案,可让您轻松预置和管理 Spark 集群。它提供了一个基于 Web 的界面,用于创建和管理 Spark 集群,以及一组用于自动执行集群管理任务的 API。托管的 Spark 集群通常由数据科学家和开发人员使用,他们希望快速预置和管理 Spark 集群,而无需担心底层基础设施。
Ilum 提供了创建和管理您自己的 Spark 集群的功能,该集群可以在任何环境中运行,包括云、本地或两者的混合。

Kubernetes 上的 Apache Spark 的优点
关于 Apache Spark 是否应该在 Kubernetes 上运行,一直存在一些争论。
有些人认为 Kubernetes 太复杂了,Spark 应该继续在自己的专用集群管理器上运行或留在云中。其他人则认为 Kubernetes 是大数据处理的未来,Spark 应该拥抱它。
我们属于后一个阵营。我们相信 Kubernetes 是大数据处理的未来,Apache Spark 应该在 Kubernetes 上运行。
在 Kubernetes 上使用 Spark 的最大好处是,它可以更轻松地扩展 Spark 应用程序。这是因为 Kubernetes 旨在处理大量并发容器的部署。因此,如果您的 Spark 应用程序需要处理大量数据,您只需将更多容器部署到 Kubernetes 集群即可并行处理数据。这比每次需要扩展处理时在 EMR 上设置新的 Spark 集群要容易得多。您可以在任何云平台(AWS、Google Cloud、Azure 等)或本地运行它。这意味着您可以轻松地将 Spark 应用程序从一个环境移动到另一个环境,而无需担心更改集群管理器。
另一个巨大的好处是它允许更灵活的工作流程。例如,如果您需要处理来自多个源的数据,您可以轻松地为每个源部署不同的容器,并并行处理它们。这比尝试在单个 Spark 集群上管理复杂的工作流要容易得多。
Kubernetes 具有多项安全功能,使其成为运行 Spark 应用程序更具吸引力的选择。例如,Kubernetes 支持基于角色的访问控制,这允许您微调谁有权访问您的 Spark 集群。
所以你有它。这些只是我们认为 Apache Spark 应该在 Kubernetes 上运行的部分原因。如果您不相信,我们鼓励您自己尝试一下。我们认为您会对它的效果感到惊讶。
其他资源
结论
Ilum 简化了在 Kubernetes 上安装和管理 Apache Spark 的过程,使其成为初学者和有经验的用户的理想选择。通过遵循本指南,您将立即在 Kubernetes 上运行一个正常运行的 Spark 集群。