本文发布已超过一年。较早的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已不再正确。
支持原生 Kubernetes 的 Apache Spark 2.3
Kubernetes 与大数据
开源社区在过去一年里一直致力于在 Kubernetes 中为数据处理、数据分析和机器学习工作负载提供一流支持。Kubernetes 中的新扩展特性,例如自定义资源 (Custom Resources) 和 自定义控制器 (Custom Controllers),可用于与单个应用和框架创建深度集成。
传统上,数据处理工作负载运行在专门的设置中,如 YARN/Hadoop 栈。然而,统一 Kubernetes 上所有工作负载的控制平面可以简化集群管理并提高资源利用率。
“彭博社在机器学习和自然语言处理 (NLP) 方面投入巨大,以便在驱动客户投资决策的新闻和金融信息方面提供竞争优势。通过在 Kubernetes 之上构建我们的数据科学平台,我们正以一致、易用的方式,让 Spark、TensorFlow 等最先进的数据科学工具以及我们庞大的 GPU 资源 footprint,可供公司 5000 多名软件工程师使用。” - 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 集群通过 Namespaces 和 Quotas 实现多租户和共享,以及利用 可插拔授权 (Pluggable Authorization) 和 日志 (Logging) 等管理特性。最棒的是,它不需要对你的 Kubernetes 集群进行任何更改或新的安装;只需创建一个容器镜像 并为你的 Spark Application 设置正确的 RBAC 规则 即可。
具体来说,Kubernetes 中的原生 Spark Application 充当一个自定义控制器 (Custom Controller),它响应 Spark 调度器发出的请求来创建 Kubernetes 资源。与在 Kubernetes 中以 Standalone 模式部署 Apache Spark 不同,原生方法提供了对 Spark Application 的细粒度管理、改进的弹性以及与日志和监控解决方案的无缝集成。社区还在探索更高级的用例,例如管理流式工作负载和利用 Istio 等服务网格。
要亲自在 Kubernetes 集群上尝试此功能,只需下载官方 Apache Spark 2.3 版本 的二进制文件。例如,下面我们描述了如何运行一个简单的 Spark 应用,该应用通过三个 Spark executor(每个运行在一个独立的 Pod 中)计算数学常数 Pi。请注意,这需要一个运行 Kubernetes 1.7 或更高版本的集群,一个配置好可以访问它的 kubectl 客户端,以及为默认 Namespace 和 Service Account 设置必要的 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
应用完成后,你应该能在 Driver 日志中看到计算出的 Pi 值。
在 Spark 2.3 中,我们首先支持使用 Java 和 Scala 编写的 Spark 应用,并支持从包括 HTTP、GCS、HDFS 等多种数据源进行资源本地化。我们还密切关注 Spark executor 的故障和恢复语义,以为将来在此基础上进行构建奠定坚实的基础。立即查阅开源文档开始吧。
参与其中
在不久的将来还有很多令人兴奋的工作要做。我们正积极开发动态资源分配、集群内依赖项暂存、支持 PySpark & SparkR、支持 Kerberized HDFS 集群以及客户端模式和流行 Notebook 的交互式执行环境等特性。对于喜欢 Kubernetes 声明式应用管理方式的人来说,我们还一直在开发一个用于 spark-submit 的 Kubernetes Operator,它允许用户声明式地指定和提交 Spark Application。
而我们才刚刚开始!我们非常希望你能参与进来,帮助我们进一步发展这个项目。
非常感谢分布在多个组织中的 Apache Spark 和 Kubernetes 贡献者们,他们为此付出了数百小时的辛勤工作。我们期待看到更多人对项目做出贡献,并帮助它进一步发展。