基于Kubernetes摆设Spark:spark on kubernetes

  论坛元老 | 2024-9-15 15:43:54 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1742|帖子 1742|积分 5226

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
什么是spark?

spark是一种基于内存的快速、通用、可扩展的的数据分析计算引擎。
Hadoop、Hive、Spark是什么关系?

大数据技能生态中,Hadoop、Hive、Spark是什么关系?| 平凡易懂科普向_哔哩哔哩_bilibili
Hadoop 与 HDFS (Hadoop Distributed File System):




    • Hadoop 是一个用于处置处罚大数据的开源框架,而HDFS是Hadoop的一个重要构成部分,它是一个分布式文件体系,用于存储大量的数据。
    • HDFS 负责将数据分布在集群中的多个节点上,并提供一个同一的接口,使得这些数据看起来像是存储在一个地方。

MapReduce 与 Hadoop:




    • MapReduce 是Hadoop的一个核心组件,它提供了一个编写并行处置处罚应用的框架。
    • 开辟者可以使用MapReduce API将使命分解成Map(映射)和Reduce(归约)两个阶段,从而实现并行处置处罚。

Hive 与 SQL:




    • Hive 是一个构建在Hadoop之上的数据堆栈工具,它允许用户使用SQL-like语言(HiveQL)来处置处罚存储在Hadoop中的大规模数据集。
    • Hive 提供了更高的抽象条理,简化了数据分析工作,降低了编写复杂MapReduce程序的难度。

Spark 与 Hadoop:




    • Spark 是另一个用于大数据处置处罚的框架,它可以独立运行或运行在Hadoop之上。
    • Spark 与 MapReduce 差别之处在于它提供了内存计算能力,这意味着Spark可以在内存中缓存数据,从而加速数据处置处罚速度。
    • Spark 还提供了多种高级库,如Spark SQL、Spark Streaming、MLlib 和 GraphX,分别用于SQL查询、流式数据处置处罚、机器学习和图计算。




Hadoop 主要用于分布式存储和计算,而Hive和Spark则是建立在其上的更高条理的工具,旨在提高开辟者的生产力并优化数据处置处罚性能。这些技能共同构成了大数据生态体系的重要部分,帮助管理和分析海量数据。选择哪种技能取决于具体的应用需求、数据规模以及对处置处罚速度的要求。
Spark基于Kubernetes摆设上风

Spark是新一代分布式内存计算框架,Apache开源的顶级项目。相比于Hadoop Map-Reduce计算框架,Spark将中间计算结果保留在内存中,速度提升10~100倍;同时它还提供更丰富的算子,采用弹性分布式数据集(RDD)实现迭代计算,更好地适用于数据挖掘、机器学习算法,极大提升开辟效率。
相比于在物理机上摆设,在Kubernetes集群上摆设Spark集群,具有以下上风:
快速摆设:安装1000台级别的Spark集群,在Kubernetes集群上只需设定worker副本数目replicas=1000,即可一键摆设。
快速升级:升级Spark版本,只需更换Spark镜像,一键升级。
弹性伸缩:需要扩容、缩容时,自动修改worker副本数目replicas即可。
高划一性:各个Kubernetes节点上运行的Spark环境划一、版本划一。
高可用性:如果Spark地点的某些node或pod死掉,Kubernetes会自动将计算使命,转移到其他nod或创建新pod。
强隔离性:通过设定资源配额等方式,可与Web、大数据应用摆设在同一集群,提升机器资源使用效率,从而降低服务器成本。
spark-standalone框架



Client:客户端历程,负责提交作业到Master。
Master:Standalone模式中主节点,负责吸收Cient提交的作业管理Worker,并命令Worker启动Driver和Executor。
Worker:Standalone模式中slave节点上的保卫历程,负责管理本节点的资源,定期向Master汇报心跳,吸收Master的命令,启动Driver和Executor。
Driver:一个Spark作业运行时包括一个Driver历程,也是作业的主历程,负责作业的分析、生成Stage并调理Task到Executor上,包括DAGScheduler,TaskScheduler。
Spark提交使命的两种模式


  • 客户端模式 (Client Mode):


  • 在客户端模式下,提交 Spark 应用程序时,驱动程序会在提交使命的客户端机器上运行。
  • 驱动程序不会作为集群的一部分运行,而是从客户端吸收指令,并且客户端需要保持活动状态直到整个 Spark 应用程序实验完毕。

  • 集群模式 (Cluster Mode):


  • 在集群模式下,驱动程序将被摆设到集群中的一个工作节点上运行。
  • 驱动程序成为集群的一部分,并且不再依赖于提交使命的客户端机器。集群模式下,客户端提交完使命后就可以退出,而无需保持连接。
当使用 spark-submit 命令提交 Spark 应用程序时,可以通过添加 --deploy-mode 参数来指定提交模式。例如:


  • 使用客户端模式:spark-submit --deploy-mode client
  • 使用集群模式:spark-submit --deploy-mode cluster
spark on k8s 的两种方式

1.Standalone on Kubernetes摆设
spark以pod的形式运行在k8s里。
2.Spark 的原生 Kubernetes 调理
k8s只作为调理器和容器运行时,spark-submit命令实验后k8s调理pod实验计算,实验完pod自动释放
在 Kubernetes 上运行 Spark - Spark 3.5.1 文档 - Spark 中文 (apache.ac.cn)
Standalone on Kubernetes摆设

Spark Standalone 集群中有Master和Worker两种角色,基于Kubernetes进行摆设,即将两种对象以pod的方式摆设到Kubernetes集群中,Master和Worker所需要的资源由Kubernetes集群提供。
构建镜像

Spark官方没有提供Spark的容器镜像,需要本身构建,构建Spark镜像的步骤如下:
1.下载Spark安装包
  1. mkdir -p /root/spark && cd spark
  2. wget https://mirrors.huaweicloud.com/apache/spark/spark-3.3.1/spark-3.3.1-bin-hadoop3.tgz
  3. wget https://mirrors.huaweicloud.com/apache/hadoop/core/hadoop-3.1.4/hadoop-3.1.4.tar.gz
  4. [root@master spark]# ls
  5. hadoop-3.1.4.tar.gz  spark-3.3.1-bin-hadoop3.tgz
复制代码
2.编写DockerFile
vim Dockerfile
  1. FROM openjdk:8u151
  2. ENV hadoop_version 3.1.4
  3. ENV spark_version 3.3.1
  4. ADD hadoop-3.1.4.tar.gz /opt
  5. ADD spark-3.3.1-bin-hadoop3.tgz /opt
  6. RUN mv /opt/hadoop-3.1.4 /opt/hadoop && mv /opt/spark-3.3.1-bin-hadoop3 /opt/spark && \
  7.     echo HADOOP ${hadoop_version} installed in /opt/hadoop && \
  8.     echo Spark ${spark_version} installed in /opt/spark
  9. ENV SPARK_HOME=/opt/spark
  10. ENV PATH=$PATH:$SPARK_HOME/bin
  11. ENV HADOOP_HOME=/opt/hadoop
  12. ENV PATH=$PATH:$HADOOP_HOME/bin
  13. ENV LD_LIBRARY_PATH=$HADOOP_HOME/lib/native
  14. ADD start-common.sh start-worker start-master /
  15. ADD spark-defaults.conf /opt/spark/conf/spark-defaults.conf
  16. ENV PATH $PATH:/opt/spark/bin
  17. ENV SPARK_WORKER_MEMORY=1024m
  18. ENV SPARK_WORKER_CORES=2
复制代码
3.上传Dockerfile构建需要的文件
vim start-common.sh
  1. #!/bin/sh
  2. unset SPARK_MASTER_PORT
  3. export SPARK_DIST_CLASSPATH=$(hadoop classpath)
  4. export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/opt/hadoop/lib/native
复制代码
vim start-master
  1. #!/bin/sh
  2. . /start-common.sh
  3. echo "$(hostname -i) spark-master" >> /etc/hosts
  4. /opt/spark/bin/spark-class org.apache.spark.deploy.master.Master --ip spark-master --port 7077 --webui-port 8080
复制代码
vim start-worker
  1. #!/bin/sh
  2. . /start-common.sh
  3. if ! getent hosts spark-master; then
  4.   echo "=== Cannot resolve the DNS entry for spark-master. Has the service been created yet, and is SkyDNS functional?"
  5.   echo "=== See http://kubernetes.io/v1.1/docs/admin/dns.html for more details on DNS integration."
  6.   echo "=== Sleeping 10s before pod exit."
  7.   sleep 10
  8.   exit 0
  9. fi
  10. /opt/spark/bin/spark-class org.apache.spark.deploy.worker.Worker spark://spark-master:7077 --webui-port 8081
复制代码
vim spark-defaults.conf
  1. spark.master                            spark://spark-master:7077
  2. spark.driver.extraLibraryPath           /opt/hadoop/lib/native
  3. #spark.driver.extraClassPath             /opt/spark/jars/hadoop-aws-2.8.2.jar:/opt/spark/jars/aws-java-sdk-1.11.712.jar
  4. #spark.hadoop.fs.s3a.impl                org.apache.hadoop.fs.s3a.S3AFileSystem
  5. #spark.fs.s3a.connection.ssl.enabled     false
  6. #spark.executor.extraJavaOptions         -Dcom.amazonaws.sdk.disableCertChecking=1
  7. spark.app.id                            KubernetesSpark
  8. spark.executor.memory 512m
  9. spark.executor.cores 1
复制代码
添加权限
  1. chmod +x ./start-common.sh  ./start-master ./start-worker
复制代码
4.构建Spark容器镜像
实验如下命令,构建Spark容器镜像:
  1. #构建spark 容器镜像
  2. [root@master spark]# docker build -t myspark:v1 .
  3. #查看spark 容器镜像
  4. [root@master spark]# docker images
  5. [root@master spark-standalone-deployment]# docker images
  6. REPOSITORY                                           TAG       IMAGE ID       CREATED         SIZE
  7. myspark                                              v1        fabd9ffaef9f   3 hours ago     3.12GB
复制代码
5.将镜像上传到 harbor
后续基于Kubernetes摆设Spark standalone集群时需要使用该spark容器镜像,需要从harbor私有镜像堆栈进行拉取,这里我们将myspark:v1镜像上传至Harbor私有镜像堆栈,步骤如下:
  1. #给当前镜像打标签
  2. [root@master spark]# docker tag myspark:v1 192.168.86.218:8080/library/spark:v1
  3. #上传到harbor
  4. [root@master spark]# docker push 192.168.86.218:8080/library/spark:v1
复制代码
登录harbor观察对应的镜像是否上传乐成,通过webui观察,上传已经乐成。


配置containerd源(每个节点都要):
  1. vim /etc/containerd/config.toml
  2.   [plugins."io.containerd.grpc.v1.cri".registry.configs."192.168.86.218:8080".tls]
  3.           insecure_skip_verify = true
  4.   [plugins."io.containerd.grpc.v1.cri".registry.configs."192.168.86.218:8080".auth]
  5.           username = "admin"
  6.           password = "xxxxxxx"
  7.   [plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.86.218:8080"]
  8.           endpoint = ["http://192.168.86.218:8080"]
复制代码
yaml资源清单文件

创建/root/spark-standalone-deployment目次:
  1. [root@master ~]# mkdir -p /root/spark-standalone-deployment
  2. [root@master ~]# cd /root/spark-standalone-deployment/
复制代码
在该目次中创建如下yaml资源清单文件:
spark-master-controller.yaml:
  1. kind: ReplicationController
  2. apiVersion: v1
  3. metadata:
  4.   name: spark-master-controller
  5. spec:
  6.   replicas: 1
  7.   selector:
  8.     component: spark-master
  9.   template:
  10.     metadata:
  11.       labels:
  12.         component: spark-master
  13.     spec:
  14.       hostname: spark-master-hostname
  15.       subdomain: spark-master-nodeport
  16.       containers:
  17.         - name: spark-master
  18.           image: 192.168.86.218:8080/library/spark:v1
  19.           imagePullPolicy: Always
  20.           command: ["/start-master"]
  21.           ports:
  22.             - containerPort: 7077
  23.             - containerPort: 8080
  24.           resources:
  25.             requests:
  26.               cpu: 100m
复制代码
spark-master-service.yaml:
  1. kind: Service
  2. apiVersion: v1
  3. metadata:
  4.   name: spark-master-nodeport
  5. spec:
  6.   ports:
  7.   - name: rest
  8.     port: 8080
  9.     targetPort: 8080
  10.     nodePort: 30080
  11.   - name: submit
  12.     port: 7077
  13.     targetPort: 7077
  14.     nodePort: 30077
  15.   type: NodePort
  16.   selector:
  17.     component: spark-master
  18. ---
  19. kind: Service
  20. apiVersion: v1
  21. metadata:
  22.   name: spark-master
  23. spec:
  24.   ports:
  25.     - port: 7077
  26.       name: spark
  27.     - port: 8080
  28.       name: http
  29.   selector:
  30.     component: spark-master
复制代码
spark-worker-controller.yaml:
  1. kind: ReplicationController
  2. apiVersion: v1
  3. metadata:
  4.   name: spark-worker-controller
  5. spec:
  6.   replicas: 2
  7.   selector:
  8.     component: spark-worker
  9.   template:
  10.     metadata:
  11.       labels:
  12.         component: spark-worker
  13.     spec:
  14.       containers:
  15.         - name: spark-worker
  16.           image: 192.168.86.218:8080/library/spark:v1
  17.           imagePullPolicy: Always
  18.           command: ["/start-worker"]
  19.           ports:
  20.             - containerPort: 8081
  21.           resources:
  22.             requests:
  23.               cpu: 100m
复制代码
摆设yaml资源清单文件

通过以下命令进行摆设以上yaml资源清单文件:
  1. #部署yaml资源清单文件
  2. [root@master spark-standalone-deployment]# kubectl create -f .
  3. [root@master spark-standalone-deployment]# kubectl get pod
  4. NAME                            READY   STATUS             RESTARTS      AGE
  5. spark-master-controller-rv4bw   1/1     Running            0             23m
  6. spark-worker-controller-n82r8   1/1     Running            0             12m
  7. spark-worker-controller-wmlxw   1/1     Running            0             23m
  8. [root@master spark-standalone-deployment]# kubectl get svc
  9. NAME                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                         AGE
  10. kubernetes              ClusterIP   10.68.0.1      <none>        443/TCP                         28h
  11. spark-master            ClusterIP   10.68.33.230   <none>        7077/TCP,8080/TCP               24m
  12. spark-master-nodeport   NodePort    10.68.84.103   <none>        8080:30080/TCP,7077:30077/TCP   24m
复制代码
访问spark:IP:30080


验证spark是否正常运行:
  1. #进入容器,执行spark shell
  2. [root@master ~]# kubectl exec -it spark-master-controller-rv4bw -- bash
  3. root@spark-master-hostname:/#  /opt/spark/bin/spark-shell
  4. ...
  5. #编程scala代码进行测试
  6. scala> val rdd = sc.makeRDD(List("hello k8s","hello k8s","hello spark"))
  7. rdd: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[0] at makeRDD at <console>:23
  8. scala> rdd.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect()
  9. res0: Array[(String, Int)] = Array((spark,1), (k8s,2), (hello,3))
  10. ...
复制代码


Spark 的原生 Kubernetes 调理摆设

参考文档:在 Kubernetes 上运行 Spark - Spark 3.5.1 文档 - Spark 中文 (apache.ac.cn)
spark-submit 可以直接用于将 Spark 应用程序提交到 Kubernetes 集群。提交机制的工作原理如下


  • Spark 创建一个在 Kubernetes Pod 中运行的 Spark 驱动程序。
  • 驱动程序创建实验器,它们也运行在 Kubernetes Pod 中,并连接到它们,并实验应用程序代码。
  • 当应用程序完成时,实验器 Pod 会终止并被清理,但驱动程序 Pod 会保留日记并保持在 Kubernetes API 中的“已完成”状态,直到它终极被垃圾回收或手动清理。


使用spark官方的脚本构建镜像并上传镜像到harbor
  1. mkdir -p /opt/software
  2. tar -xzvf spark-3.3.1-bin-hadoop3.tgz -C /opt/software
  3. cd /opt/software/spark-3.3.1-bin-hadoop3/bin/
  4. ./docker-image-tool.sh -r 192.168.86.218:8080/library -t v2 build
  5. docker login 192.168.86.218:8080 -uadmin -pAbc@1234
  6. docker push 192.168.86.218:8080/library/spark:v2
复制代码
后续基于Kubernetes提交Spark使命时需要指定用户,Kubernetes是基于角色进行授权,所以这里创建对应的serviceaccount,然后给serviceaccount进行角色赋权。
  1. #创建命名空间
  2. [root@master ~]# kubectl create ns spark
  3. namespace/spark created
  4. #创建serviceaccount
  5. [root@master ~]# kubectl create serviceaccount spark -n spark
  6. serviceaccount/spark created
  7. #给serviceaccount进行角色赋权
  8. [root@master ~]# kubectl create clusterrolebinding spark-role --clusterrole=edit --serviceaccount=spark:spark
  9. clusterrolebinding.rbac.authorization.k8s.io/spark-role created
复制代码
提交使命需要在节点上有Spark安装包,使用spark-submit命令进行使命提交。
  1. cd /opt/software/spark-3.3.1-bin-hadoop3/bin/
  2. [root@master ~]# cd /software/spark-3.3.1-bin-hadoop3/bin/
  3. ./spark-submit \
  4. --master k8s://https://192.168.86.206:6443 \
  5. --deploy-mode client \
  6. --name spark-pi \
  7. --class org.apache.spark.examples.SparkPi \
  8. --conf spark.kubernetes.namespace=spark \
  9. --conf spark.executor.instances=2 \
  10. --conf spark.kubernetes.container.image=192.168.86.218:8080/library/spark:v2 \
  11. --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
  12. --conf spark.driver.host=192.168.86.206 \
  13. /opt/software/spark-3.3.1-bin-hadoop3/examples/jars/spark-examples_2.12-3.3.1.jar
复制代码
开启另外一个终端,可以查察到启动了两个pod,使命实验完后pod自动消失。
  1. kubectl get all -n spark
  2. spark         spark-pi-cf4e8c91e429aa9a-exec-1             1/1     Running   0             30s
  3. spark         spark-pi-cf4e8c91e429aa9a-exec-2             1/1     Running   0             29s
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表