Spark on k8s Operator 部署安装
Spark on k8s Operator 部署安装1. 背景受限于公司内网环境,无法构建梯子及部分网络策略,不能使用网络资源直接部署,需要手动编译安装2. 环境准备centos 7Kubernetes > 1.18helm > 3KubeSphere > 3.0githarborgolang(第4步可选)3. 镜像编译受限于内网网络环境及大陆网络情况,采用阿里云容器镜像服务--
Spark on k8s Operator 部署安装
1. 背景
受限于公司内网环境,无法构建梯子及部分网络策略,不能使用网络资源直接部署,需要手动编译安装
2. 环境准备
centos 7
Kubernetes > 1.18
helm > 3
KubeSphere > 3.0
git
harbor
golang(第4步可选)
3. 镜像编译
受限于内网网络环境及大陆网络情况,采用阿里云容器镜像服务-------海外机器构建镜像并拉取到本地,上传harbor
1) 编写spark基础镜像工程
vim Dockerfile
FROM gcr.io/spark-operator/spark:v3.0.0
:wq
2) 编写spark-operator基础镜像工程
vim Dockerfile
FROM gcr.io/spark-operator/spark-operator:v1beta2-1.2.0-3.0.0
:wq
3) 将上述两个dockerfile分别上传至github不同项目工程, eg:
①https://github.com/leihongyang/gcr.io-spark-operator-spark-v3.0.0
②https://github.com/leihongyang/gcr.io-spark-operator-spark-operator-v1beta2-1.2.0-3.0.0
4) 采用阿里云容器镜像服务海外构建
https://cr.console.aliyun.com/cn-hangzhou/instance/repositories
第一步,创建镜像仓库(仓库名称和摘要任意填);
第二步,选择github并绑定自己账号,从git仓库中找到之前的项目工程,创建
第三步,在刚刚的镜像仓库中构建规则,并勾选海外构建,立即构建
另一个镜像同样如此操作
5) 拉取镜像至本地,并修改tag上传至内网harbor
拉取操作如图
## 拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/leihongyang/gcr_spark:1.0
## 镜像更名,修改仓库
docker tag registry.cn-hangzhou.aliyuncs.com/leihongyang/gcr_spark:1.0 xxxxx:8000/spark-operator/spark:v3.0.0
## 推送镜像
docker push xxxxx:8000/spark-operator/spark:v3.0.0
## 删除老镜像
docker image rm registry.cn-hangzhou.aliyuncs.com/leihongyang/gcr_spark:1.0
4. spark-operator安装
1) 下载源码
git clone http://10.10.12.117/bigdata/spark-on-k8s-operator.git
cd spark-on-k8s-operator
2) 安装,有两种方式
① yaml 手动模式
a. 修改manifest/spark-operator.yaml文件中的image值为之前创建的spark-operator镜像
## 安装crd
kubectl apply -f manifest/crds
## 安装operator的服务账号与授权策略
kubectl apply -f manifest/spark-operator-rbac.yaml
## 安装spark任务的服务账号与授权策略
kubectl apply -f manifest/spark-rbac.yaml
## 安装spark-on-k8s-operator
kubectl apply -f manifest/spark-operator.yaml
② helm chart模式
修改charts/spark-operator-charts/values.yaml文件中的image.repository值为harbor中的spark-operator镜像目录
## 修改相关镜像参数后
helm install -n spark spark charts/spark-operator-chart
3) 安装完成
可以看到启动了一个sparkoperator的deployment,伴随着sparkoperator pod,负责监听spark请求
# kubectl get pods -n spark
NAME READY STATUS RESTARTS AGE
sparkoperator-7c57499f7b-6rwcf 1/1 Running 0 23s
4) 运行示例
运行官方自带示例
## 修改examples/spark-pi.yaml中的容器镜像为我们之前创建的spark镜像
## 如下所示, 主要修改spec.image 和 imagePullPolicy
## 其中,需要注意namespace和serviceAccount的对应关系,如果运行不成功,大概率是这两个导致的权限问题
apiVersion: "sparkoperator.k8s.io/v1beta2"
kind: SparkApplication
metadata:
name: spark-pi
namespace: spark
spec:
type: Scala
mode: cluster
image: "xxxxx:8000/spark-operator/spark:v3.0.0"
imagePullPolicy: IfNotPresent
mainClass: org.apache.spark.examples.SparkPi
mainApplicationFile: "local:///opt/spark/examples/jars/spark-examples_2.12-3.0.0.jar"
sparkVersion: "3.0.0"
restartPolicy:
type: Never
volumes:
- name: "test-volume"
hostPath:
path: "/tmp"
type: Directory
driver:
cores: 1
coreLimit: "1200m"
memory: "512m"
labels:
version: 3.0.0
serviceAccount: sparkoperator
volumeMounts:
- name: "test-volume"
mountPath: "/tmp"
executor:
cores: 1
instances: 2
memory: "512m"
labels:
version: 3.0.0
volumeMounts:
- name: "test-volume"
mountPath: "/tmp"
然后运行kubectl执行创建任务
kubectl apply -f examples/spark-pi.yaml
查看结果
# kubectl get pods -n spark-operator
NAME READY STATUS RESTARTS AGE
spark-pi-driver 0/1 Completed 0 2m
sparkoperator-7c57499f7b-6rwcf 1/1 Running 0 23m
# kubectl get sparkapplications -n spark-operator
NAME AGE
spark-pi 2m
容器运行完毕,可以查看容器日志,了解任务详细情况
# kubectl logs spark-pi-driver -n spark-operator
...
...
...
Pi is roughly 3.140515702578513
...
## 在许多info日志中看到我们的输出结果
5. sparkctl编译(可选)
# 启用 Go Modules 功能
export GO111MODULE=on
# 配置 GOPROXY 环境变量
export GOPROXY=https://goproxy.io
# 或者
export GOPROXY=https://mirrors.aliyun.com/goproxy/
# 编译sparkctl工具
cd sparkctl && go build -o sparkctl && cp sparkctl /usr/bin/
这个工具是spark-operator在kubectl上的二次封装
更加规范化,简洁的查看spark任务生命周期
6. FAQ
问题1:
User "system:serviceaccount:sparknamespace:spark" cannot list resource "sparkapplications" in API group "sparkoperator.k8s.io" at the cluster scope
原因: sparknamespace 命名空间中的spark对这个api没有访问权限
解决:查看用户是否存在于这个命名空间中,查看用户是否绑定了clusterrole权限(需要edit,或者完全使用manifest下的授权策略)
问题2:只有driver启动,没有excutor执行
原因:一个可能是k8s apiserver未正常运行,一个是镜像有问题。
解决:在apiserver运行正常的情况下,检查spark task driver的日志,若command是spark-operator则是镜像使用错误,换成spark镜像,正确的command是spark-submit
7. 监控
## 需要额外获取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/leihongyang/gcr_spark_monitor:1.0
docker tag registry.cn-hangzhou.aliyuncs.com/leihongyang/gcr_spark_monitor:1.0 xxxxx:8000/spark-operator/spark:v3.0.0-gcs-prometheus
## 然后将运行的spark job中yaml的image从
## xxxxx:8000/spark-operator/spark:v3.0.0
## 改为
## xxxxx:8000/spark-operator/spark:v3.0.0-gcs-prometheus
## 在spec下添加以下内容
============================
monitoring:
exposeDriverMetrics: true
exposeExecutorMetrics: true
prometheus:
jmxExporterJar: "/prometheus/jmx_prometheus_javaagent-0.11.0.jar"
port: 8090
============================
## 重新apply
[root@k8s-master-1 spark-on-k8s-operator]# kubectl get pods -n spark-operator -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
spark-pi-d457cb78fd3a5777-exec-1 1/1 Running 0 52s 179.10.196.4 k8s-master-1 <none> <none>
spark-pi-driver 1/1 Running 0 66s 179.10.69.244 k8s-worker-3 <none> <none>
sparkoperator-7c57499f7b-6rwcf 1/1 Running 3 13d 179.10.140.6 k8s-worker-2 <none> <none>
# curl 179.10.69.244:8090
...
## 获得的就是本次spark任务的运行时资源使用明细
1/1 Running 0 66s 179.10.69.244 k8s-worker-3 <none> <none>
sparkoperator-7c57499f7b-6rwcf 1/1 Running 3 13d 179.10.140.6 k8s-worker-2
curl 179.10.69.244:8090
…
获得的就是本次spark任务的运行时资源使用明细
更多推荐
所有评论(0)