背景
在云计算和大数据时代,容器化技术和Kubernetes(K8s)已成为构建和管理大规模数据处理平台的关键。传统应用部署常面临环境不一致、资源利用率低和维护成本高的问题,而容器化通过将应用和依赖打包在轻量级容器中,提供了一致的运行环境,大幅简化了开发和运维流程。
Kubernetes作为强大的容器编排平台,具备自动化部署、扩展和管理容器应用的能力,其自我修复、负载均衡和滚动更新等特性让应用保持高可用性。因此,Kubernetes非常适合于支持计算密集型的Spark集群,使得用户能够高效地部署和管理Spark,充分发挥计算和存储能力。
SuperMap iServer处理自动化服务(GPA),提供了简洁的建模页面,无需编写代码,就能实现数据处理与分析过程的自动化。通过简单的拖拽方式搭建业务流程模型,显著提高工作效率,大幅降低开发成本。
本文将结合SuperMap GPA产品,探讨如何在Kubernetes上配置和使用Spark集群,希望帮助读者理解Kubernetes与Spark的结合及其最佳实践。
一、准备工作
部署Spark on K8S集群前,需要准备如下环境与镜像:
软件 | 版本 | 描述 | 备注 |
---|---|---|---|
Kubernetes | 1.20.0 |
Kubernetes基础环境,可选单节点或集群部署 | SuperMap提供的Kubernetes离线部署方式 |
helm | 3.8.0 |
软件包管理器,用于部署Spark | |
bitnami/spark | 3.3.4 |
Spark镜像 | Spark镜像包 |
Kuboard | 3.5.2.7 | Kubernetes可视化管理平台 | Kuboard安装教程 |
iObjects_bin | 与iServer版本一致 |
iObjectsbin包,可从iServer\support\objectsjava\bin目录获取 | - |
Spark容器依赖项 | - |
用于确保GPA大数据任务的正常提交与执行,需要放在iObjects_bin目录中 | GPA调用Spark必要依赖项 |
二、部署 Spark 集群
1、添加 bitnami 仓库(公网环境下配置)
helm repo add bitnami https://charts.bitnami.com/bitnami
2、保存 bitnami/spark chart 模板(内网环境使用需操作)
//下载模板
helm pull bitnami/spark --untar
//打包模板
helm package spark
3、自定义 spark.yaml
global:
storageClass: "nfs"
ingress:
enabled: true
ingressClassName: "nginx"
hostname: "supermap.spark.com"
master:
configOptions:
-Dspark.ui.reverseProxy=true
-Dspark.ui.reverseProxyUrl=http://supermap.spark.com
worker:
configOptions:
-Dspark.ui.reverseProxy=true
-Dspark.ui.reverseProxyUrl=http://supermap.spark.com
4、在 Kuboard 中添加 storageClass 、ingress
① storageClass 配置:
② ingress 配置:
5、在 Kuboard 中添加 spark 命名空间
6、开始部署 Spark 集群
//有bitnami仓库的公网环境
helm install spark bitnami/spark -f spark.yaml -n spark
//内网环境
helm install spark ./spark-9.2.9.tgz -f spark.yaml -n spark
7、修改 Master 和 Worker 的镜像配置
8、修改 spark-master-svc 为 NodePort 访问
9、为 Master 和 Worker 的 Dspark.ui.reverseProxyUrl 加上端口
10、为Master和Worker添加iObjects_bin挂载
请确保spark所需依赖项已拷贝至iObjects_bin目录中
11、通过访问 Spark 主页,验证 Spark 的运行状态
三、使用 Spark 集群(以 SuperMap iServer GPA 为例)
此种方式配置的 Spark 集群仅支持 Cluster 模式
1、配置 K8S 版 Spark 专用【spark环境设置】,v11.2.0+版本可配置“集群环境参数”方便使用
- spark.executor.extraLibraryPath
- /usr/java/packages/lib
- spark.driver.extraLibraryPath
- /usr/java/packages/lib
- spark.driver.extraJavaOptions
- --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.base/jdk.internal.ref=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/sun.nio.cs=ALL-UNNAMED --add-opens=java.base/sun.security.action=ALL-UNNAMED --add-opens=java.base/sun.util.calendar=ALL-UNNAMED --add-opens=java.security.jgss/sun.security.krb5=ALL-UNNAMED -Duser.language=zh -Duser.country=CN
- spark.executor.extraJavaOptions
- --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.base/jdk.internal.ref=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/sun.nio.cs=ALL-UNNAMED --add-opens=java.base/sun.security.action=ALL-UNNAMED --add-opens=java.base/sun.util.calendar=ALL-UNNAMED --add-opens=java.security.jgss/sun.security.krb5=ALL-UNNAMED
附示例模型:https://download.youkuaiyun.com/download/qq_46005336/90109867
2、执行模型任务,验证Spark可用性