前置:集群规划

机器信息

Hostname

k8s-master

k8s-node1

k8s-node2





内网IP

192.168.113.131

192.168.113.132

192.168.113.133

spark on k8s 的工作原理

spark on k8s 性能 spark on k8s operator原理_kubernetes

 

spark-submit 可以直接用于将 Spark 应用程序提交到 Kubernetes 集群。

提交机制的工作原理:

1.Spark创建一个Spark driver 在Kubernetes pod 运行。

2.driver 程序创建也在Kubernetes pods中运行的执行器,并连接到它们,然后执行应用程序代码。

3.当应用程序完成时,执行程序pod将终止并被清理,但驱动程序pod会保存日志并在Kubernetes API中保持“已完成”状态,直到最终进行垃圾收集或手动清理。

请注意,在完成状态下,驱动程序 pod 不使用任何计算或内存资源。

驱动程序和执行程序 pod 调度由 Kubernetes 处理。与 Kubernetes API 的通信是通过 fabric8 完成的可以通过使用配置属性的节点选择器在可用节点的子集上安排驱动程序和执行程序 pod,在未来的版本中将有可能使用更高级的调度提示,如节点/pod 亲和力。

  1. spark下载并解压

1.1在k8s-master执行

#创建安装目录
mkdir -p /home/install/spark
mkdir -p /home/module/spark

#上传  spark-3.3.2-bin-hadoop3.tgz 到 /home/install/spark目录下
#进入安装目录
cd /home/install/spark

#解包目录 
tar -zxvf /home/install/spark/spark-3.3.2-bin-hadoop3.tgz -C /home/install/spark/

#设定变量用于后续的操作
export SPARK_HOME=/home/install/spark/spark-3.3.2-bin-hadoop3
#查看路径
echo $SPARK_HOME

1.2拉取镜像

(推荐)直接使用 Apache Spark Docker

这里建议使用直接使用 Apache Spark Docker 映像(例如 apache/spark:<version>)

#直接使用 https://hub.docker.com/r/apache/spark/tags 已经做成镜像的包
docker pull apache/spark:v3.3.2

(不推荐)也可以使用包内的工具文件(可以自行构建镜像)

(不推荐网速慢经常导致打包镜像失败,还是直接使用官方镜像稳妥)

Spark(从 2.3 版开始)附带一个 Dockerfile,可以kubernetes/dockerfiles/ 目录中找到。Spark 还附带一个 bin/docker-image-tool.sh 脚本,可用于构建和发布 Docker 镜像以与 Kubernetes 后端一起使用,用于构建和上传镜像。

#设定变量用于后续的操作
export SPARK_HOME=/home/install/spark/spark-3.3.2-bin-hadoop3

#显示解压文件目录
echo $SPARK_HOME
#找到dockerfiles镜像目录
cd $SPARK_HOME/kubernetes/dockerfiles/

# 打包镜像的示例 Example usage
#$ ./bin/docker-image-tool.sh -r  -t my-tag build
#$ ./bin/docker-image-tool.sh -r  -t my-tag push

1.3 配置spark的用户权限

#创建spark的命名空间
kubectl create ns spark
#创建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

2 以Cluster模式去提交spark任务

21 指定spark所在目录变量

#设定变量用于后续的操作
export SPARK_HOME=/home/install/spark/spark-3.3.2-bin-hadoop3

2.2 在hdfs上上传jar包

#在hadoop上创建Sparklog目录
#(执行前请确保hadoop已经启动 如果未启动请使用命令)
#start-all.sh

#在hdfs上创建spark的jar包文件夹
hadoop fs -mkdir -p  /spark/jar
#授予hdfs上的spark的jar包文件夹文件夹执行权限
hadoop fs -chmod 777 /spark/jar

#上传示例文件到 spark/jar 目录
hadoop fs -put $SPARK_HOME/examples/jars/spark-examples_2.12-3.3.2.jar /spark/jar

可以通过网页端查看jar是否已经正确上传

http://192.168.113.131:9870/explorer.html#/spark/jar

spark on k8s 性能 spark on k8s operator原理_容器_02


2.3  使用spark-submit提交

#设定变量用于后续的操作
export SPARK_HOME=/home/install/spark/spark-3.3.2-bin-hadoop3

#查看k8s apiserverd地址
kubectl cluster-info

#返回内容
#Kubernetes control plane is running at https://k8s-apiserver:6443
#CoreDNS is running at #https://k8s-apiserver:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
#To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

#进入解压的spark目录
cd $SPARK_HOME

#向apiserver提交任务
./bin/spark-submit \
    --master k8s://https://k8s-apiserver:6443 \
    --deploy-mode cluster \
    --name spark-pi \
    --class org.apache.spark.examples.SparkPi \
    --conf spark.executor.instances=5 \
    --conf spark.kubernetes.namespace=spark \
    --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
    --conf spark.kubernetes.container.image=apache/spark:v3.3.2 \
hdfs://192.168.113.131:8020/spark/jar/spark-examples_2.12-3.3.2.jar

注意:最后一行 指定hdfs上的jar包位置

完成执行,正确应该显示如下提示

spark on k8s 性能 spark on k8s operator原理_spark on k8s 性能_03

2.4 查看示例结果的方法

#列出之前运行的Pod
 kubectl get pod   -n spark
 #选择某个pod查看日志
 kubectl logs  spark-pi-123f75881e959947-driver -n spark

spark on k8s 性能 spark on k8s operator原理_容器_04

spark on k8s 性能 spark on k8s operator原理_kubernetes_05

3 配置spark历史服务器

3.1 创建hdfs上spark日志的目录

#在hadoop上创建Sparklog目录
#(执行前请确保hadoop已经启动 如果未启动请使用命令)
#start-all.sh

#建立spark日志的存储目录
#在hdfs上创建spark的日志文件夹
hadoop fs -mkdir -p  /spark/eventLog
#授予hdfs上的spark日志文件夹执行权限
hadoop fs -chmod 777 /spark/eventLog

http://192.168.113.131:9870/explorer.html#/spark/eventLog

spark on k8s 性能 spark on k8s operator原理_kubernetes_06

3.2 编辑spark-history.yaml文件

#设定变量用于后续的操作
export SPARK_HOME=/home/install/spark/spark-3.3.2-bin-hadoop3

#创建一个存放 yaml文件的目录
mkdir -p  $SPARK_HOME/k8syaml
cd  $SPARK_HOME/k8syaml

#编辑文件
vi spark-history.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spark-history-server
spec:
  selector:
    matchLabels:
      run: spark-history-server
  replicas: 1
  template:
    metadata:
      labels:
        run: spark-history-server
    spec:
      containers:
        - image: apache/spark:v3.3.2
          name: spark-history-server
          args: ["/opt/spark/bin/spark-class", "org.apache.spark.deploy.history.HistoryServer"]
          ports:
            - containerPort: 18080
              name: http
          env:
          - name: SPARK_HISTORY_OPTS
            value: "-Dspark.history.fs.logDirectory=hdfs://192.168.113.131:8020/spark/eventLog"
---

apiVersion: v1
kind: Service
metadata:
  name: spark-hs-svc
spec:
  ports:
  - port: 18080
    protocol: TCP
    targetPort: 18080
    nodePort: 31180
  selector:
    run: spark-history-server
  type: NodePort
status:
  loadBalancer: {}

wq 保存。

3.3 执行部署

#执行部署命令
kubectl apply -f spark-history.yaml -n spark

#查看历史服务被部署的情况
kubectl get svc -n spark
kubectl get pods -o wide -n spark

spark on k8s 性能 spark on k8s operator原理_spark_07

访问通过nodeport 暴露的地址查看 history历史服务

spark on k8s 性能 spark on k8s operator原理_spark on k8s 性能_08

 

如果要启动历史任务需要在命令中增加如下

# 增加配置项:
# --conf spark.eventLog.enabled=true \
# --conf spark.eventLog.dir=hdfs://192.168.113.131:8020/spark/eventLog \

4 再次使用spark-submit提交(带历史)

再次提交下任务

#设定变量用于后续的操作
export SPARK_HOME=/home/install/spark/spark-3.3.2-bin-hadoop3

#进入解压的spark目录
cd $SPARK_HOME

#需要增加配置项

#向apiserver提交任务
./bin/spark-submit \
    --master k8s://https://k8s-apiserver:6443 \
    --deploy-mode cluster \
    --name spark-pi \
    --class org.apache.spark.examples.SparkPi \
    --conf spark.executor.instances=5 \
    --conf spark.kubernetes.namespace=spark \
    --conf spark.eventLog.enabled=true \
    --conf spark.eventLog.dir=hdfs://192.168.113.131:8020/spark/eventLog \
    --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
    --conf spark.kubernetes.container.image=apache/spark:v3.3.2 \
hdfs://192.168.113.131:8020/spark/jar/spark-examples_2.12-3.3.2.jar

spark on k8s 性能 spark on k8s operator原理_spark_09

 

spark on k8s 性能 spark on k8s operator原理_容器_10

spark on k8s 性能 spark on k8s operator原理_容器_11

  

spark on k8s 性能 spark on k8s operator原理_容器_12

 

5 清理回收diver的pod资源

#查看spark下所有pod
 kubectl get pods -n spark
 
 #删除指定pod
 kubectl delete pod 【pod的名称】 -n spark