在Kubernetes上运行Apache Spark

321 阅读7分钟

DZone>大数据专区>在Kubernetes上运行Apache Spark

在Kubernetes上运行Apache Spark

本文介绍了在K8s上使用Spark以克服对云供应商的依赖,以及在Kubernetes上运行Apache Spark。

Ramiro Alvarez Fernandez user avatar通过

Ramiro Alvarez Fernandez

-

Jul. 26, 21 - 大数据区 -教程

喜欢 (3)

评论

保存

鸣叫

6.36K浏览次数

加入DZone社区,获得完整的会员体验。

免费加入

在过去的几周里,我一直在Kubernetes(K8s)上部署一个Spark集群。我想和大家分享一下我发现的挑战、架构和解决方案的细节。

挑战

在Empathy,所有在生产中运行的代码都必须与云无关。截至本出版日,Empathy已经通过使用Spark解决方案克服了之前对云供应商的依赖,根据云供应商的说法。EMR(AWS方案),Dataproc(GCP方案),和HDInsight(Azure方案)。

这些云供应商的不同解决方案为在云上部署Spark提供了一个简单易行的方法。然而,当公司规模扩大时,会出现一些限制,从而导致几个关键问题。

  • 你如何协调作业?
  • 如何分配Spark作业?
  • 如何安排夜间作业?
  • 作业的代码配置在哪里?
  • 如何传播变化?
  • 你能重复使用作业定义吗?模板?
  • 你能通过代码引用作业吗?
  • 你能从localhost进行测试吗?

这些都是在尝试执行Spark作业时常见的问题。用Kubernetes解决这些问题可以节省精力,提供更好的体验。

在K8s上运行Apache Spark为我们提供了以下好处。

  • 可扩展性。新的解决方案应该是可扩展的,可以满足任何需求。
  • 可靠性。新的解决方案应该监控计算节点,并在出现故障时自动终止和替换实例。
  • 可移植性。新的解决方案应该可以部署在任何云解决方案中,避免对特定云供应商的依赖。总的来说,这种方法节省了思考协调、分配和调度Spark作业与不同云服务提供商的时间。
  • 成本效益高。你不需要云供应商,所以你可以节省这些成本。
  • 监控。新的解决方案应该包括临时监控。
  • K8s生态系统。与其他工作负载一样使用共同的生态系统,并提供持续部署、RBAC、专用节点池、自动缩放等。

其好处与Empathy为运行在Kubernetes上的Apache Flink提供的解决方案相同,我在之前的文章中探讨过。

Kubernetes上的Apache Spark

Apache Spark是一个用于大数据处理的统一分析引擎,对于分布式处理尤其方便。Spark用于机器学习,是目前技术领域最大的趋势之一。

Apache Spark架构

Spark Submit可以用来直接向Kubernetes集群提交一个Spark应用。其流程如下。

  1. Spark Submit从客户端发送到主节点的Kubernetes API服务器。
  2. Kubernetes会安排一个新的Spark Driver pod。
  3. Spark Driver pod将与Kubernetes通信,请求Spark执行器pod。
  4. 新的执行器pod将被Kubernetes安排。
  5. 一旦新的执行器pod运行,Kubernetes将通知Spark Driver pod,新的Spark执行器pod已经准备就绪。
  6. Spark Driver pod将在新的Spark执行器pod上安排任务。

火花提交流程图

您可以使用Spark Submit(传统方式)或使用Spark Operator来调度Spark应用程序。

火花提交

Spark Submit是一个用于提交Spark应用并在Spark集群上启动应用的脚本。一些不错的功能包括。

  • Kubernetes版本。不依赖于Kubernetes版本。
  • 本地Spark。它包含在Spark镜像中。
  • 非声明性设置。需要计划如何协调作业。
  • 定义需要的K8s资源。安装configmaps、volume、设置anti-affinity、nodeSelectors,等等。
  • 不需要CRD。不需要Kubernetes定制资源。

Spark运营商

SparkOperator项目是由谷歌开发的,现在是一个开源项目。它使用Kubernetes自定义资源来指定、运行和浮现Spark应用程序的状态。一些不错的功能包括。

  • 声明性。通过自定义资源对应用进行规范和管理。
  • 有计划的重启。可配置的重启策略。
  • K8s资源自动定义。支持挂载configmaps和卷,设置pod亲和力,等等。
  • 依赖性注入。直接注入依赖关系。
  • 度量。支持收集和输出应用级指标和驱动/执行器指标到Prometheus。
  • 开源社区。每个人都可以做出贡献。

Spark Submit与Spark Operator

上面的图片显示了Spark Submit与Spark Operator的主要命令。

Empathy的解决方案更倾向于Spark Operator,因为它可以比Spark Submit更快地进行迭代,在Spark Submit中,你必须为每个用例创建自定义的Kubernetes清单。

解决方案的细节

为了解决挑战部分提出的问题,ArgoCD和Argo Workflows可以帮助你,同时还有CNCF项目的支持。例如,你可以使用ArgoCD从Kubernetes安排你最喜欢的Spark应用工作负载,以创建Argo工作流并定义顺序作业。

流程图如下。

  • 在git上定义你的变化。
  • ArgoCD将你的git修改同步到你的K8s集群(例如,创建一个Argo工作流模板)。
  • Argo工作流模板允许你为多个Spark作业定制输入和重复使用配置,并根据Argo工作流创建夜间作业。

解决方案流程图

ArgoCD

ArgoCD是一个用于Kubernetes的GitOps持续交付工具。其主要优势在于。

  • GitOps:使用git存储库作为定义所需应用程序状态的真理源。
  • 声明式设置。一切都在git上!
  • 可追溯性和自动化。应用程序的部署可以跟踪分支、标签等的更新。应用程序的部署将根据具体的目标环境而自动进行。
  • Web UI。好看的UI可以检查部署的工作负载。
  • K8s清单Kustomize, Helm, ksonnet, jsonnet等。选择你的斗士!

更详细的信息可以在其官方文档中找到。

Argo工作流

Argo Workflows是一个针对Kubernetes的工作流解决方案。主要优点是。

  • 作业编排。这允许按顺序编排作业或创建一个自定义的DAG。
  • 安排工作流程。Cron原生。
  • Spark应用。在任何Kubernetes集群上轻松地协调Spark应用。
  • 工作流模板。为不同的用例重复使用模板。输入可以被参数化。
  • WebUI。优秀的可视化UI,以检查工作流的进展。

更详细的信息可以在其官方文档中找到。

监测

一旦Prometheus刮取了指标,就需要一些Grafana仪表盘。为Apache Spark定制的Grafana仪表盘是基于以下社区仪表盘的。

总结一下

Empathy选择Spark Operator、ArgoCD和Argo Workflows来创建Kubernetes上的Spark应用工作流解决方案,并使用GitOps来传播这些变化。本文所说明的设置已经在生产环境中使用了一个月左右,反馈非常好每个人都对这个工作流感到满意--拥有一个对任何云提供商都有效的单一工作流, 从而摆脱了个别云提供商的解决方案。

要想自己测试它,请跟随这些实践样本 ,享受从本地主机部署一些Spark应用程序,并在本指南中描述的所有设置。Hands-on Empathy Repo

我还借鉴了我在2021年西班牙Kubernetes日的演讲

虽然旅程很漫长,但我们一路上学到了很多。我希望我们的创新也能帮助你变得更适合云计算。

参考资料

主题。

火花、 Kubernetes、 不依赖云、 大数据、 分析

经Ramiro Alvarez Fernandez授权发表于DZone。点击这里查看原文。

DZone贡献者所表达的观点属于他们自己。

DZone上的热门文章


评论

大数据 合作伙伴资源