前提条件
spark的版本需要在2.3及以上的版本
k8s的版本需要在1.6以上
serviceaccount需要有创建pod,service,configmap的权限
集群中需要有k8s dns
由于是在自己的电脑上,所以采用的是minikube来部署,minikube的安装,可以参考minikube官网
启动minikube及准备
minikub在启动时需要3 cpus和4g以上的资源,在启动前,如果minikube已经存在了,先删除原有的集群
minikube delete
在启动minikube时可采用
minikube start --cpus 3 --memory 4g --image-mirror-country='cn' --kubernetes-version=v1.23.6
或者通过
minikube config set cpus 3
minikube config set memory 4g
minikube start --image-mirror-country='cn' --kubernetes-version=v1.23.6
启动时参数解释:
cpus和memory:指定cpu个数,memory 指定内存大小,默认为gb
image-mirror-country:针对在国内的环境,加快minikube下载相应的镜像速度,如果不加,可能会启动的比较慢
kubernetes-version: 当k8s的版本大于24时,minikube 启动失败,原因暂时还未弄清楚。
创建命名空间
kubectl create namespace spark
创建serviceaccount并赋予权限
kubectl create serviceaccount spark-serviceaccount --namespace spark
kubectl create clusterrolebinding spark-rolebinding --clusterrole=edit --serviceaccount=spark:spark-serviceaccount --namespace=spark
打包spark镜像
spark下载地址:https://spark.apache.org/downloads.html ,下载相应平台的spark,写本文档时的环境为ubuntu 20.04版本,spark版本3.1.3 hadoop版本3.2。将下载下来的文件解压,进入目录中,先执行如下命令:
eval $(minikube docker-env)
docker build -t test/spark:3.1.3 -f kubernetes/dockerfiles/spark/Dockerfile .
打包时的注意事项:
在打包前一定要执行eval $(minikube docker-env),否则后面在提交时,找不到镜像。
在打包前,自己写的spark jar包需要一起打到该镜像中,否则后面提交时,找不到jar包(可能有其他的方法,但暂时未找到)
打包的时候,最后面的点号一定要加,否则有可能报错
提交spark任务
./bin/spark-submit \
--master k8s://https://xxx.xxx.xx.xx:8443 \
--deploy-mode cluster \
--name spark-pi \
--class mainClasss \
--conf spark.executor.instances=1 \
--conf spark.kubernetes.driver.volumes.hostPath.driverv.options.path=/tmp/spark-minikube-demo \
--conf spark.kubernetes.driver.volumes.hostPath.driverv.mount.path=/tmp/spark/k8s-demo \
--conf spark.kubernetes.executor.volumes.hostPath.driverv.options.path=/tmp/spark-minikube-demo \
--conf spark.kubernetes.executor.volumes.hostPath.driverv.mount.path=/tmp/spark-minikube-demo \
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark-serviceaccount\
--conf spark.kubernetes.container.image.pullPolicy=Never \
--conf spark.kubernetes.namespace=spark \
--conf spark.kubernetes.container.image=registry.cn-hangzhou.aliyuncs.com/spark:3.1.3 \
local:///opt/spark/jars/sparkDemo.jar
参数解释:
master: k8s地址,可以执行下面命令获取
kubectl cluster-info
spark.kubernets.driver/executor.volumes.[]volumType].[volumName].options/mount:挂载卷信息
spark.kubernetes.container.image.pullPolicy:获取镜像的方式,Never指的是从本地仓库获取,如果是Always指的是从远程仓库获取。
local:///file:指的是spark jar包在镜像内的位置,在测试中,我的jar包是打在了/opt/spark/jars这个目录下
排错
如果在启动的过程中,遇到执行出错,执行如下命令
kubectl get pods --namespace=spark
找到报错的podid
kubectl logs podId --namespace=spark
查看输出的日志信息,定位问题
参考文章
1、https://blog.csdn.net/john1337/article/details/110261723
2、https://spark.apache.org/docs/latest/running-on-kubernetes.html