Spark进阶:Spark on k8s实战
Posted xingoo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark进阶:Spark on k8s实战相关的知识,希望对你有一定的参考价值。
Spark有很多种部署的方式,比如standalone、yarn或者k8s,本篇则讲述如何在k8s上部署Spark。
前提条件:有一个正常的k8s集群。
1 Spark on k8s原理
spark-submit可以直接向k8s提交应用程序,提交的机制大致如下:第一步,spark在k8s创建driver,driver是一个pod;第二步,driver与k8s集群沟通创建需要的executor,executor也是一个pod,driver与executor连接并分配任务;第三步,当应用执行完毕,executor的pod会自动清理,driver的pod为了保存日志等数据,会保持completed状态,可以使用k8s的api进行清理。
注意:completed状态的pod不会消耗任何计算资源和内存。
driver和executor的调度都通过k8s控制,spark通过fabric8与k8s api交互。它支持调度driver程序,通过node选择寻找合适的node启动executor。更多内容参考:https://github.com/fabric8io/kubernetes-client
2 部署
2.1 准备跳板机
想要提交Spark任务到k8s上,首先需要有一个客户机,即上面的client。在client上可以下载spark的二进制软件包,主要使用里面的bin脚本和jar包。下载后解压,可以通过./bin/spark-shell来测试是否可用。注意:这里的spark只需要下载就行,不需要安装任何集群。
2.2 准备镜像
k8s上的任务都是基于镜像启动的,因此需要构建一个基于spark的镜像。在下载的spark中可以使用脚本docker-image-tool.sh
来构建镜像。构建镜像的命令为:./bin/docker-image-tool.sh -t my-spark build
。
此处如果构建失败,大多是网络问题。我当时在linux服务器上下载了spark,并执行构建脚本时,总是提示tini无法安装(其实就是服务器无法访问有效的deb源)。因此我在自己本机上的windows来构建的镜像,并推送到了远端docker镜像仓库。然后在linux服务器上下载该镜像,从而绕过网络问题。
2.3 启动任务
任务的启动可以通过spark-submit来提交任务:
./bin/spark-submit \
--master k8s://https://<k8s-apiserver-host>:<k8s-apiserver-port> \
--deploy-mode cluster \
--name spark-pi \
--class org.apache.spark.examples.SparkPi \
--conf spark.executor.instances=5 \
--conf spark.kubernetes.container.image=<spark-image> \
local:///path/to/examples.jar
其中apiserver的host和端口号,可以通过使用命令kubectl cluster-info
来查询:
root:~/spark/spark3.0.1# kubectl cluster-info
Kubernetes master is running at https://10.0.0.1:6443
镜像为上面pull下来的镜像。
需要注意的是后面的jar包是相对于镜像来说的,而非客户机。上面的镜像我在构建的时候把examples.jar已经拷贝进去了,因此可以直接使用。
另外还要注意的是账户权限问题:
# 创建用户
kubectl create serviceaccount spark
# 绑定权限
kubectl create clusterrolebinding spark-role --clusterrole=edit --serviceaccount=default:spark --namespace=default
# 提交时配置账户
spark-submit --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark
综上,我这边的提交命令最终为:
./bin/spark-submit \
--master k8s://https://10.0.0.1:6443 \
--deploy-mode cluster \
--name spark-pi-1 \
--class org.apache.spark.examples.SparkPi \
--conf spark.executor.instances=1 \
--conf spark.kubernetes.container.image=spark-halo:1.0.0 \
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
local:///opt/spark/examples/jars/spark-examples_2.12-3.0.1.jar
3 任务查看
启动任务后,driver的执行过程会直接输出到控制台。
# 查看所有任务
kubectl get pods -A
# 找到对应的pod后,查看日志
kubectl logs -f xxxxx
4 参考
Running Spark on Kubernetes
http://spark.apache.org/docs/latest/running-on-kubernetes.html#prerequisites
Spark on K8S环境部署细节
https://www.cnblogs.com/lanrish/p/12267623.html
Spark on Kubernetes提交测试任务失败报错
https://blog.csdn.net/merrily01/article/details/102934199
Spark on K8S (Kubernetes Native)
https://www.cnblogs.com/moonlight-lin/p/13296909.html
以上是关于Spark进阶:Spark on k8s实战的主要内容,如果未能解决你的问题,请参考以下文章