学习地址1:https://pan.baidu.com/s/1ELs-pOTNwmEsGSrKxYhGvw 提取码:2k19
学习地址2:https://share.weiyun.com/Y7rFNJ8j 密码:8j8gae
一、前言
在 Kubernetes(K8s)中,Pod 是最小的可调度单元。当 Spark 任务运行在 K8s 上时,无论是 Driver 还是 Executor 都由一个单独的 Pod 来表示。每个 Pod 都被分配了一个唯一的 IP 地址,并且可以包含一个或多个容器(Container)。Driver 和 Executor 的 JVM 进程都是在这些 Container 中启动、运行和销毁的。
当一个 Spark 作业被提交到 K8s 集群后,首先会被启动的是 Driver Pod。然后,Driver 负责按需向 Apiserver 请求创建 Executor Pods。Executor 负责执行具体的 Task。一旦作业完成,Driver 将负责清理所有已创建的 Executor Pods。
二、在将 Spark 任务提交到 K8s 集群上时,不同的公司可能会采取不同的方法。以下是目前常见的几种做法以及我们在线上所采用的任务提交和管理方式。
1、使用原生 spark-submit 原生的 spark-submit 命令可以直接提交作业,集成起来简单且符合用户习惯。然而,这种方法不便于作业状态跟踪和管理,无法自动配置 Spark UI 的 Service 和 Ingress,并且在任务结束后不能自动清理资源。因此,在生产环境中并不适合使用这种方式。
2、使用 spark-on-k8s-operator 这是目前较常用的一种提交作业方式,需要先在 K8s 集群中安装 spark-operator。客户端通过 kubectl 提交 yaml 文件来运行 Spark 作业。本质上,这是对原生方式的扩展,提供了作业管理、Service/Ingress 创建与清理、任务监控、Pod 增强等功能。尽管此方法可在生产环境中使用,但它与大数据调度平台的集成性较差,对于不熟悉 K8s 的用户来说,学习曲线较为陡峭。
3、使用 spark-k8s-cli 在我们的生产环境中,我们使用 spark-k8s-cli 来提交任务。spark-k8s-cli 是一个可执行文件,基于阿里云 emr-spark-ack 提交工具进行了重构、功能增强和深度定制。它融合了 spark-submit 和 spark-operator 两种作业提交方式的优点,所有作业都能通过 spark-operator 管理,并支持交互式 spark-shell 和本地依赖的提交。同时,它的使用方式与原生 spark-submit 完全一致。
三、spark on k8s的优点和缺点
优点:
1. 资源隔离:Spark on Kubernetes可以更好地管理资源,实现资源隔离,避免不同应用之间的资源竞争。
2. 灵活性:Kubernetes支持弹性伸缩,可以根据应用的需求自动扩容或缩容。
3. 易于部署:使用Kubernetes集群部署Spark应用更加简单方便,不需要手动管理集群资源。
缺点:
1. 性能开销:在Kubernetes上运行Spark会带来一定的性能开销,相比传统的YARN或Mesos部署方式可能会有性能损失。
2.学习成本:需要对Kubernetes和Spark有一定的了解,对于初学者来说可能需要花费一定时间学习。
3.依赖外部组件:可能需要额外的监控和调优工具来对Spark应用进行管理,增加了系统的复杂度。
四、Spark 的集群部署模式
Spark 官方提供了四种集群部署的模式:Standalone、YARN、Mesos、 Kubernetes。
Standalone 需要常驻 Master 服务和 Worker 服务。它作为资源调度,只能去调度 Spark 做作业。同时它需要每个节点预先准备好 Spark 运行时环境,所以不太适合生产环境使用。
YARN 在传统的大数据体系下是一个比较好的调度器。它不需要常驻 Spark 相关的服务,YARN 的容器内其实也是可以进行任何作业的,但是需要每个节点去事先准备好运行时环境,YARN 其实是更贴近于我们的传统 Hadoop 生态,它也有一些调度上的优化,比如计算时会尽可能地去找数据所在的 HDFS 节点,不过在我们云原生的场景下就不太适用了。
Mesos 在 Spark 3.2 版本后已经被标记为弃用了,所以我们就不过多谈它。
Kubernetes 也是无需常驻 Spark 相关服务,支持容器化运行任何作业,也不需要依赖节点运行时环境,它是更贴近于云原生生态的。
五、Spark on k8s 如何运行
首先 Spark 有一个客户端,客户端会构建好 driver pod 对象,向 K8s 的 apiserver 发送请求,去创建 driver pod,Spark 的 driver 进程运行在 driver pod 当中。Spark driver 启动之后,会在 driver 内构建 executor pod 的对象,创建 executor pod,并持续 watch and list 去监听每一个 executor pod 的状态。当任务运行结束的时候,executor pod 会被清理,driver pod 会继续以 completed 的状态存在。这就是 Spark on K8s 的运行过程。
六、关于spark配置
使用spark难免会需要一些 hdfs 、hive-metastore 等配置、xml 等,把这些配置打到镜像里显然可以,但很不灵活。
本地spark-submit 进程 创建pod时会将本地的spark配置作为configMap挂在到pod中,所以只要维护好本地提交的spark环境即可,可以先通过 kubectl describe pod ** 来找到对相应的configMap,然后 通过 kubectl describe configmap 来确认配置
有疑问加站长微信联系(非本文作者)