一、概述
Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是——Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
官方文档:https://spark.apache.org/docs/latest/
Spark on k8s官方文档:https://spark.apache.org/docs/latest/running-on-kubernetes.html
二、开始 Spark on k8s 运行原理
spark-submit 可以直接用于向Kubernetes集群提交spark应用程序。提交机制的工作原理如下:
Spark创建一个Spark driver 在Kubernetes pod 运行。
driver 程序创建也在Kubernetes pods中运行的执行器,并连接到它们,然后执行应用程序代码。
当应用程序完成时,执行程序pod将终止并被清理,但驱动程序pod会保存日志并在Kubernetes API中保持“已完成”状态,直到最终进行垃圾收集或手动清理。
三、Spark 运行模式
Client :客户端进程,负责提交作业到Master。
Master :Standalone模式中主控节点,负责接收Client提交的作业,管理Worker,并命令Worker启动Driver和Executor。
Worker :Standalone模式中slave节点上的守护进程,负责管理本节点的资源,定期向Master汇报心跳,接收Master的命令,启动Driver和Executor。
Driver : 一个Spark作业运行时包括一个Driver进程,也是作业的主进程,负责作业的解析、生成Stage并调度Task到Executor上。包括 DAGScheduler , TaskScheduler 。
1)cluster 模式
Driver程序在某个worker节点,但是这个节点由Master指定;
Driver程序占据Worker的资源;
cluster mode下Master可以使用–supervise对Driver进行监控,如果Driver挂了可以自动重启;
cluster mode下Master节点和Worker节点一般不在同一局域网,因此就无法将Jar包分发到各个Worker,所以cluster mode要求必须提前把Jar包放到各个Worker节点对应的目录下面。
2)client 模式
Driver进程就是开始执行你Spark程序的那个Main函数,它可以在任何节点(可以是spark集群内的节点,Master节点或Worker节点;也可以是有spark环境但不是spark集群内的某台机器);Worker就是Slave节点,Executor进程必然在Worker节点上,用来进行实际的计算;
client mode下Driver进程不运行在Worker节点上,所以相对于参与实际计算的Worker节点而言,Driver就相当于是一个第三方的“client”;
正由于Driver进程不在Worker节点上,所以不会消耗Worker节点上的资源;
client mode下Master和Worker节点必须处于同一片局域网内,因为Drive要和Executor通信,例如Driver需要将Jar包通过Netty HTTP分发到Executor,Driver要给Executor分配任务等;
client mode下没有监督重启机制,Driver进程如果挂了,需要额外的程序重启。
四、开始Spark on k8s 编排
1)下载Spark包
wget https://dlcdn.apache.org/spark/spark-3.3.0/spark-3.3.0-bin-hadoop3.tgz
tar -xf spark-3.3.0-bin-hadoop3.tgz
export SPARK_HOME=/opt/bigdata/servers/spark/spark-3.3.0-bin-hadoop3
2)构建镜像
Spark(从2.3版开始)附带了一个Dockerfile,可以在kubernetes/dockerfiles/目录中找到它。
Spark还附带一个构建和push镜像的脚本 bin/docker-image-tool.sh。构建镜像命令如下:
cd $SPARK_HOME
# 构建镜像
# -p ./kubernetes/dockerfiles/spark/Dockerfile,-p 指定Dockerfile
$SPARK_HOME/bin/docker-image-tool.sh -r myharbor.com/bigdata -t 3.3.0-hadoop3 build build
# push
$SPARK_HOME/bin/docker-image-tool.sh -r myharbor.com/bigdata -t 3.3.0-hadoop3 push
3)配置 spark 用户权限
ubectl create ns spark
kubectl create serviceaccount spark -n spark
kubectl create clusterrolebinding spark-role --clusterrole=edit --serviceaccount=spark:spark
##在spark-submit中添加
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark
4)提交 Spark 任务(cluster 模式)
# 查看k8s api