本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。

支持原生 Kubernetes 的 Apache Spark 2.3

Kubernetes 与大数据

在过去一年中,开源社区一直致力于为 Kubernetes 中的数据处理、数据分析和机器学习工作负载提供一流的支持。Kubernetes 中的新扩展功能,例如自定义资源自定义控制器,可用于与单个应用程序和框架创建深度集成。

传统上,数据处理工作负载一直在 YARN/Hadoop 栈等专用设置中运行。然而,统一 Kubernetes 上所有工作负载的控制平面简化了集群管理,并可以提高资源利用率。

"彭博社在机器学习和自然语言处理方面投入巨资,以在新闻和金融信息方面为我们的客户提供竞争优势,这些新闻和金融信息为他们的投资决策提供动力。通过在 Kubernetes 之上构建我们的数据科学平台,我们正在以一致、易于使用的方式,让公司 5000 多名软件工程师能够访问 Spark、TensorFlow 和我们庞大的 GPU 足迹等最先进的数据科学工具。" - Steven Bower,彭博社搜索和数据科学基础设施团队负责人

隆重推出 Apache Spark + Kubernetes

支持原生 Kubernetes 的Apache Spark 2.3 将两个著名的开源项目——用于大规模数据处理的框架 Apache Spark 和 Kubernetes——的最佳特性结合在一起。

Apache Spark 是数据科学家的必备工具,为从大规模数据转换到分析再到机器学习的各种应用程序提供了强大的平台。数据科学家们正在大规模采用容器,通过实现依赖项打包和创建可复现工件等优势来改进其工作流程。鉴于 Kubernetes 是管理容器化环境的事实标准,在 Spark 中支持 Kubernetes API 是自然而然的事情。

从 Spark 2.3 开始,用户可以在现有的 Kubernetes 1.7+ 集群中运行 Spark 工作负载,并利用 Apache Spark 管理分布式数据处理任务的能力。Apache Spark 工作负载可以利用 Kubernetes 集群通过命名空间配额实现多租户和共享,以及可插拔授权日志记录等管理功能。最重要的是,它不需要对您的 Kubernetes 集群进行任何更改或新安装;只需创建容器镜像并为您的 Spark 应用程序设置正确的RBAC 角色,即可完成所有设置。

具体而言,Kubernetes 中的原生 Spark 应用程序充当自定义控制器,响应 Spark 调度程序发出的请求创建 Kubernetes 资源。与在 Kubernetes 中以独立模式部署 Apache Spark 相比,原生方法提供了对 Spark 应用程序的精细管理、改进的弹性以及与日志记录和监控解决方案的无缝集成。社区还在探索高级用例,例如管理流式工作负载和利用 Istio 等服务网格

要在 Kubernetes 集群上亲自尝试,只需下载官方 Apache Spark 2.3 版本的二进制文件。例如,下面我们描述了运行一个简单的 Spark 应用程序来计算数学常数 Pi,该应用程序跨三个 Spark 执行器运行,每个执行器都在一个单独的 Pod 中运行。请注意,这需要一个运行 Kubernetes 1.7 或更高版本的集群,一个配置为访问它的 kubectl 客户端,以及默认命名空间和服务帐户所需的 RBAC 规则

$ kubectl cluster-info  

Kubernetes master is running at https://xx.yy.zz.ww

$ bin/spark-submit

   --master k8s://https://xx.yy.zz.ww

   --deploy-mode cluster

   --name spark-pi

   --class org.apache.spark.examples.SparkPi

   --conf spark.executor.instances=5

   --conf spark.kubernetes.container.image=

   --conf spark.kubernetes.driver.pod.name=spark-pi-driver

   local:///opt/spark/examples/jars/spark-examples_2.11-2.3.0.jar

要在集群上观察创建的 Spark 资源,您可以在单独的终端窗口中使用以下 kubectl 命令。

$ kubectl get pods -l 'spark-role in (driver, executor)' -w

NAME              READY STATUS  RESTARTS AGE

spark-pi-driver   1/1 Running  0 14s

spark-pi-da1968a859653d6bab93f8e6503935f2-exec-1   0/1 Pending 0 0s

通过运行以下命令,可以在作业执行期间流式传输结果:


$ kubectl logs -f spark-pi-driver

应用程序完成后,您应该会在驱动程序日志中看到计算出的 Pi 值。

在 Spark 2.3 中,我们首先支持用 Java 和 Scala 编写的 Spark 应用程序,并支持从 HTTP、GCS、HDFS 等各种数据源进行资源本地化。我们还密切关注 Spark 执行器的故障和恢复语义,以便为未来的发展奠定坚实基础。立即开始使用开源文档

参与其中

在不久的将来,还有许多令人兴奋的工作要做。我们正在积极开发动态资源分配、集群内依赖项暂存、对 PySpark 和 SparkR 的支持、对 Kerberized HDFS 集群的支持,以及客户端模式和流行笔记本的交互式执行环境等功能。对于那些喜欢以声明式方式管理应用程序的 Kubernetes 用户,我们还在为 spark-submit 开发一个 Kubernetes Operator,它允许用户声明式地指定和提交 Spark 应用程序。

我们才刚刚开始!我们非常希望您能参与进来,帮助我们进一步发展该项目。

衷心感谢 Apache Spark 和 Kubernetes 的贡献者们,他们来自多个组织,为此付出了数百小时的努力。我们期待看到更多人参与该项目,帮助其进一步发展。