基于Kubernetes的Spark集群部署和测试
Spark是新一代分布式内存计算框架,Apache开源的顶级项目。相比于Hadoop Map-Reduce计算框架,Spark将中间计算结果保留在内存中,速度提升10~100倍;同时它还提供更丰富的算子,采用弹性分布式数据集(RDD)实现迭代计算,更好地适用于数据挖掘、机器学习算法,极大提升开发效率。
Docker是轻量级虚拟化容器技术,具有轻便性、隔离性、一致性等特点,可以极大简化开发者的部署运维流程,降低服务器成本。
Kubernetes是Google开源的容器集群管理系统,提供应用部署、维护、 扩展等功能,能够方便地管理大规模跨主机的容器应用。
Spark集群在Kubernetes运行的工作原理,如下图所示。
接下来,我们开始使用 Docker和Kubernetes创建Spark集群(其中包含1个spark-master和N个spark-workers)。
首先需要准备以下条件:
- (1)部署并正常运行的 Kubernetes集群
- (2)Docker的私有仓库Harbor(具体步骤可参考网上相关教程)
- (3)spark镜像安装包(百度云链接:
链接:https://pan.baidu.com/s/1s83Jj16BKrTQL3Cuk5tu_Q
提取码:noh8
)
一、构建Docker镜像
1.首先从本地把spark镜像安装包上传到虚拟机,并导出镜像。
root@linux-harbor:~# rz
root@linux-harbor:~# docker load --input spark_1.5.2.tar
root@linux-harbor:~# docker images
2.把虚拟机的saprk镜像上传到自己的私有仓库Harbor。
root@linux-harbor:~# docker tag caicloud/spark:1.5.2 192.168.185.130/library/spark:1.5.2
root@linux-harbor:~# docker push 192.168.185.130/library/spark:1.5.2
注意事项:
- 当镜像有版本号的时候,tag和push的时候要加上版本号,否则会提示找不到镜像。
- 192.168.185.130/library/spark:1.5.2是本人自己Harbor中的镜像地址,你需要修改为自己的镜像地址,否则上传镜像会失败。
二、在Kubernetes上创建Spark集群
在Kubernetes上创建spark集群,是通过执行ymal文件来创建的,下面会给出相关的yaml文件和具体步骤。
1.创建spark-master:先创建命名空间Namespace,接着创建Secret,用来保存密码、私钥、口令等敏感信息,然后创建spark-master的ReplicationController,最后创建spark所提供的Service(spark-master-service)。spark-workers使用spark-master-service来连接spark-master。
root@linux-node1:~# mkdir -p yaml/spark/
root@linux-node1:~# cd yaml/spark/
root@linux-node1:~/yaml/spark# vim spark-master.yaml
apiVersion: v1
kind: Namespace
metadata:
name: spark-cluster
labels:
name: spark-cluster
---
apiVersion: v1
kind: Secret
metadata:
name: secret-n
namespace: spark-cluster
data:
.dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjE4NS4xMzYiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dGeVltOXlNVEl6TkRVPSIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2VyLUFnZW50IjogIkRvY2tlci1DbGllbnQvMTcuMDkuMC1jZSAobGludXgpIgoJfQp9
type: kubernetes.io/dockerconfigjson
---
kind: ReplicationController
apiVersion: v1
metadata:
name: spark-master
namespace: spark-cluster
spec:
replicas: 1
selector:
component: spark-master
template:
metadata:
labels:
component: spark-master
spec:
containers:
- name: spark-master
image: 192.168.185.130/library/spark:1.5.2
command: ["/start-master"]
ports:
- containerPort: 7077
- containerPort: 8080
resources:
requests:
cpu: 100m
imagePullSecrets:
- name: secret-n
---
kind: Service
apiVersion: v1
metadata:
name: spark-master
namespace: spark-cluster
spec:
ports:
- port: 7077
targetPort: 7077
selector:
component: spark-master
---
root@linux-node1:~/yaml/spark# kubectl create -f spark-master.yaml
查看一下pod和service的运行状态:
root@linux-node1:~/yaml/spark# kubectl get pod -n spark-cluster
root@linux-node1:~/yaml/spark# kubectl get svc -n spark-cluster
注意事项:
- 第38行image后面的地址192.168.185.130/library/spark:1.5.2是本人自己Harbor中的镜像地址,你需要修改为自己的镜像地址,否则在拉取镜像的过程中会提示失败。
2.创建spark-workers:先创建spark所提供的Services(spark-webui),,然后创建spark-workers的ReplicationController。spark-workers启动时需要 spark-master service处于运行状态,我们可以通过修改replicas来设定worker数目(比如设定 replicas: 4,即可建立4个spark-workers)。我们也可以为每一个worker节点设置了CPU和内存的配额,保证Spark的worker应用不会过度抢占集群中其他应用的资源。
root@linux-node1:~/yaml/spark# vim spark-workers.yaml
kind: Service
apiVersion: v1
metadata:
name: spark-webui
namespace: spark-cluster
spec:
ports:
- port: 8081
targetPort: 8081
selector:
component: spark-master
---
kind: ReplicationController
apiVersion: v1
metadata:
name: spark-worker-controller
namespace: spark-cluster
spec:
replicas: 4
selector:
component: spark-worker
template:
metadata:
labels:
component: spark-worker
spec:
containers:
- name: spark-worker
image: 192.168.185.130/library/spark:1.5.2
command: ["/start-worker"]
ports:
- containerPort: 8088
resources:
requests:
cpu: 100m
imagePullSecrets:
- name: secret-n
root@linux-node1:~/yaml/spark# kubectl create -f spark-workers.yaml
查看一下pod和service的运行状态:
root@linux-node1:~/yaml/spark# kubectl get pod -n spark-cluster
root@linux-node1:~/yaml/spark# kubectl get svc -n spark-cluster
注意事项:
- 第30行image后面的地址192.168.185.130/library/spark:1.5.2是本人自己Harbor中的镜像地址,你需要修改为自己的镜像地址,否则在拉取镜像的过程中会提示失败。
通过浏览器访问Kubernetes,在命名空间查看Spark集群的运行状态:
三、测试Spark的一个简单应用
计算圆周率 π \pi π的近似值。通过Spark-client,可以利用spark-submit来提交复杂的Python脚本、Java/Scala的jar包代码。
root@linux-node1:~# kubectl exec spark-worker-controller-7htn6 -n spark-cluster -it /bin/bash
root@spark-worker-controller-7htn6:/# spark-submit \
--class org.apache.spark.examples.SparkPi \
--executor-memory 1G \
--master spark://spark-master:7077 \
$SPARK_HOME/opt/spark/lib/spark-examples-1.5.2-hadoop2.6.0.jar
运行结果如图所示:
注意事项:
- spark-examples-1.5.2-hadoop2.6.0.jar包是Spark自带的,jar包路径$SPARK_HOME/opt/spark/lib/spark-examples-1.5.2-hadoop2.6.0.jar要修改成自己的准确路径,否则会提示java.lang.ClassNotFoundException。
- executor-memory设置不要等于或超过虚拟机的内存,否则会提示check your cluster UI to ensure that workers are registered and have sufficient resources。