本文发表时间已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。
原生 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 的贡献者,他们来自多个组织,花费了数百个小时来完成这项工作。我们期待看到更多人为此项目做出贡献,并帮助它进一步发展。