网站首页 > 博客文章 正文
一、概述
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的介绍,可以参考我这篇文章:大数据Hadoop之——计算引擎Spark
二、开始 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 用户权限
kubectl 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 apiserverl:kubectl cluster-info
cd $SPARK_HOME
./bin/spark-submit \
--master k8s://https://192.168.182.110: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=myharbor.com/bigdata/spark:3.3.0-hadoop3 \
local:///opt/spark/examples/jars/spark-examples_2.12-3.3.0.jar
【注意】这里的 local:///opt/spark/examples/jars/spark-examples_2.12-3.3.0.jar 指的是 容器的文件系统路径,不是执行 spark-submit 的机器的文件系统路径,如果不使用 local 的话,也可以用 HTTP、HDFS 等系统,没指定的话默认是 local 模式
5)配置spark历史服务器
这里依赖与Hadoop hdfs环境,Hadoop on k8s环境部署可以参考我以下两篇文章:
存储目录需要提前创建
kubectl exec -it hadoop-hadoop-hdfs-dn-0 -n hadoop -- bash
hdfs dfs -mkdir hdfs://hadoop-hadoop-hdfs-nn.hadoop:9000/sparkhistory
hdfs dfs -chmod 777 hdfs://hadoop-hadoop-hdfs-nn.hadoop:9000/sparkhistory
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: myharbor.com/bigdata/spark:3.3.0-hadoop3
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://hadoop-hadoop-hdfs-nn.hadoop:9000/sparkhistory"
---
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: {}
执行
kubectl apply -f spark-history.yaml -n spark
web:http://192.168.182.110:31180
再提交任务
# 增加配置项:
# --conf spark.eventLog.enabled=true \
# --conf spark.eventLog.dir=hdfs://hadoop-hadoop-hdfs-nn.hadoop:9000/sparkhistory \
cd $SPARK_HOME
./bin/spark-submit \
--master k8s://https://192.168.182.110: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://hadoop-hadoop-hdfs-nn.hadoop:9000/sparkhistory \
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
--conf spark.kubernetes.container.image=myharbor.com/bigdata/spark:3.3.0-hadoop3 \
local:///opt/spark/examples/jars/spark-examples_2.12-3.3.0.jar
### jar放在hdfs
kubectl cp examples/jars/spark-examples_2.12-3.3.0.jar hadoop/hadoop-hadoop-hdfs-dn-0:/tmp/ -n hadoop
kubectl exec -it hadoop-hadoop-hdfs-dn-0 -n hadoop -- bash
hdfs dfs -put /tmp/spark-examples_2.12-3.3.0.jar hdfs://hadoop-hadoop-hdfs-nn.hadoop:9000/sparkhistory/
cd $SPARK_HOME
./bin/spark-submit \
--master k8s://https://192.168.182.110: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://hadoop-hadoop-hdfs-nn.hadoop:9000/sparkhistory \
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
--conf spark.kubernetes.container.image=myharbor.com/bigdata/spark:3.3.0-hadoop3 \
hdfs://hadoop-hadoop-hdfs-nn.hadoop:9000/sparkhistory/spark-examples_2.12-3.3.0.jar
6)提交 Spark 任务(client 模式)
从Spark 2.4.0开始,可以在客户端模式下在Kubernetes上运行Spark应用程序。当应用程序在客户端模式下运行时,驱动程序可以在k8s pod或物理主机上运行。
1、配置 spark 用户权限
# 上面已经配置,这里可以忽略
kubectl 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
2、准备独立Pod
配置 spark 容器,会在这个容器里以 client 模式 submit spark 程序,所以这个容器也会作为 driver。
spark-client-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: spark-client
spec:
replicas: 1
selector:
matchLabels:
app: spark-client
component: spark-client
template:
metadata:
labels:
app: spark-client
component: spark-client
spec:
containers:
- name: spark-client
image: myharbor.com/bigdata/spark:3.3.0-hadoop3
workingDir: /opt/spark
command: ["/bin/bash", "-c", "while true;do echo spark-client;sleep 6000;done"]
serviceAccountName: spark
3、暴露service
我们任意指定一个端口暴露,后续client mode将通过去DNS去查找Driver Pod的位置,这也是Spark on k8s要求DNS的原因。
spark-client-service.yaml
apiVersion: v1
kind: Service
metadata:
name: spark-client-service
spec:
selector:
app: spark-client
ports:
- protocol: TCP
port: 7321
targetPort: 7321
clusterIP: None
执行
kubectl apply -f spark-client-deployment.yaml -n spark
kubectl apply -f spark-client-service.yaml -n spark
kubectl get pods -n spark
4、提交 spark 任务
cd $SPARK_HOME
./bin/spark-submit \
--master k8s://https://192.168.182.110:6443 \
--deploy-mode client \
--name spark-pi \
--class org.apache.spark.examples.SparkPi \
--conf spark.executor.instances=3 \
--conf spark.kubernetes.namespace=spark \
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
--conf spark.kubernetes.container.image=myharbor.com/bigdata/spark:3.3.0-hadoop3 \
--conf spark.driver.host=spark-client-service \
--conf spark.driver.port=7321 \
file:///opt/bigdata/servers/spark/spark-3.3.0-bin-hadoop3/examples/jars/spark-examples_2.12-3.3.0.jar
client 模式很少使用,稍微了解即可,Spark on k8s讲解与实战操作 就先到这里了,有疑问的小伙伴欢迎给我留言,后续会持续更新【云原生+大数据】相关的文章,请小伙伴耐心等待~
猜你喜欢
- 2024-09-11 K8S从懵圈到熟练 - 我们为什么会删除不了集群的命名空间?
- 2024-09-11 从零开始入门 K8s | Kubernetes 存储架构及插件使用
- 2024-09-11 K8S扫盲什么是云?什么是云架构?什么是云原生?什么是K8S?
- 2024-09-11 K8S | 核心原理分析(k8s原理图)
- 2024-09-11 《深入浅出Prometheus》 原理、应用、源码与拓展详解
- 2024-09-11 Kubernetes原理最全详解(图文全面总结)
- 2024-09-11 Kubernetes(k8s)CNI(flannel)网络模型原理
- 2024-09-11 「云原生」k8s 中的 hostNetwork 和 NetworkPolicy 讲解与实战操作
- 2024-09-11 「云原生」Kubernetes(k8s)最完整版环境部署(V1.24.1)
- 2024-09-11 Kubernetes(k8s)五种控制器详解(k8s controllermanager作用)
你 发表评论:
欢迎- 06-23MySQL合集-mysql5.7及mysql8的一些特性
- 06-23MySQL CREATE TABLE 简单设计模板交流
- 06-23MYSQL表设计规范(mysql设计表注意事项)
- 06-23MySQL数据库入门(四)数据类型简介
- 06-23数据丢失?别慌!MySQL备份恢复攻略
- 06-23MySQL设计规范(mysql 设计)
- 06-23MySQL数据实时增量同步到Elasticsearch
- 06-23MySQL 避坑指南之隐式数据类型转换
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)