spark on k8s两种方式的原理与对比
1、spark on k8s 方式
spark-submit可以直接用来向 kubernetes 集群提交 spark 应用,提交机制如下:
1、spark 创建一个在kubernetes pod中运行的 spark 驱动程序。
2、驱动程序创建在 kubernetes pod 中运行的执行器并连接到它们,然后执行应用程序代码。
3、当应用程序完成时,执行器容器终止并被清理,但驱动程序容器会保留日志并在 kubernetes api 中保持“完成”状态,直到最终被垃圾收集或手动清理。
优点
简单直接:
使用 spark-submit 命令直接提交作业,无需额外学习和配置 spark operator。
原生 spark 体验:
提供原生的 spark 使用体验,熟悉 spark 的用户可以更快上手。
灵活性高:
通过 spark-submit 可以直接控制 spark 作业的配置和运行参数,适应不同的需求。
无需额外组件:
不需要安装和维护 spark operator 这个额外的组件,减少了系统复杂性。
缺点
手动管理:
需要手动管理 spark 作业的生命周期,包括提交、监控、重启等任务,增加了运维负担。
缺乏集中管理:
每次提交作业都需要单独配置,缺乏集中化管理和版本控制的能力。
2、spark on k8s operator 方式
使用 spark operator 是一种更高级的方式,它提供了一个 kubernetes 原生的方法来管理 spark 作业。spark operator 是一个 kubernetes 控制器,负责处理 sparkapplication crd(自定义资源定义)。
1、安装 spark operator,然后定义 spark-app.yaml,再执行 kubectl apply -f spark-app.yaml,这种申明式 api 和调用方式是 k8s 的典型应用方式。
2、使用 kubernetes 自定义资源来指定、运行和显示 spark 应用程序的状态。
核心组件
custom resource definition (crd):
spark operator 定义了一个自定义资源类型,称为 sparkapplication。这个 crd 描述了一个 spark 应用程序的配置,包括应用程序名称、主类、部署模式(cluster 或 client)、资源配置等。
spark operator controller:
spark operator controller 是一个 kubernetes 控制器,它负责监视 sparkapplication crd 的变化(如创建、更新、删除)。当检测到变化时,它会根据 crd 的配置来创建和管理相应的 kubernetes 资源。
工作流程
1、提交 spark 应用:
用户通过 kubectl 或 ci/cd 管道等方式提交一个 sparkapplication crd 对象到 kubernetes 集群。
监视和响应:
spark operator controller 监视 kubernetes 集群中的 sparkapplication 对象。当检测到一个新的 sparkapplication 对象时,控制器会读取其配置,并创建相应的 kubernetes 资源(如 pod、service 等)来运行 spark 应用程序。
创建 driver 和 executor pods:
根据 sparkapplication 的配置,spark operator 会创建 spark driver pod 和相应数量的 executor pods。driver pod 负责协调 spark 应用的执行,而 executor pods 则执行具体的计算任务。
管理生命周期:
spark operator 负责管理整个 spark 应用程序的生命周期,包括启动、监视、失败重启和删除等操作。它会根据 spark 应用的状态更新 sparkapplication 对象的状态字段,用户可以通过查询 sparkapplication 对象来了解应用的当前状态。
优点
1、自动化管理:
spark operator 提供声明式配置,简化了 spark 作业的提交和管理过程。自动处理作业的创建、监控、重启等任务。
2、kubernetes 原生集成:
使用 crd(自定义资源定义)和控制器,深度集成 kubernetes 的功能,充分利用其调度、扩展和管理能力。
3、作业配置集中化:
sparkapplication crd 提供了集中管理和版本控制的能力,可以通过 gitops 等工具更好地管理作业配置。
4、易于扩展和管理:
通过 helm charts 部署和管理 spark operator 及其相关资源,简化了安装和维护过程。
缺点
增加了复杂性:
需要额外学习和维护 spark operator,自带的控制器和 crd 增加了系统复杂性。
调试困难:
调试 spark operator 相关问题可能较为复杂,需要了解 kubernetes 和 spark 的运行机制和日志分析。
版本兼容性:
可能存在 spark operator 和 spark 版本之间的兼容性问题,需要确保两者的版本匹配。
总结
spark on k8s operator 更适合大规模、需要自动化和集中管理的场景。它利用 kubernetes 的原生功能,实现自动化管理和配置集中化,虽然增加了一些复杂性,但在动态和多租户环境中表现出色。
spark on k8s 适合简单、直接的 spark 作业提交和管理场景,特别是对于那些已有 spark 使用经验的用户。它操作简便,无需额外组件,灵活性较高。但在大规模和自动化需求较高的场景中,管理和扩展的能力相对较弱。
发表评论