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实战的主要内容,如果未能解决你的问题,请参考以下文章

Spark on k8s: 配置和使用ConfigMap

Spark on K8S源码解析.md

Spark修炼之道(进阶篇)——Spark入门到精通:第十节 Spark SQL案例实战

Spark on K8S环境部署细节

部署Spark2.2集群(on Yarn模式)

云原生之kubernetes实战在k8s环境下部署Spark分布式计算平台