基于Kubernetes的Spark集群部署和测试

  • 一、构建Docker镜像
  • 二、在Kubernetes上创建Spark集群
  • 三、测试Spark的一个简单应用


  Spark是新一代分布式内存计算框架,Apache开源的顶级项目。相比于Hadoop Map-Reduce计算框架,Spark将中间计算结果保留在内存中,速度提升10~100倍;同时它还提供更丰富的算子,采用弹性分布式数据集(RDD)实现迭代计算,更好地适用于数据挖掘、机器学习算法,极大提升开发效率。

  Docker是轻量级虚拟化容器技术,具有轻便性、隔离性、一致性等特点,可以极大简化开发者的部署运维流程,降低服务器成本。

  Kubernetes是Google开源的容器集群管理系统,提供应用部署、维护、 扩展等功能,能够方便地管理大规模跨主机的容器应用。

  Spark集群在Kubernetes运行的工作原理,如下图所示。

spark k8s 部署 k8s安装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

spark k8s 部署 k8s安装spark_spark k8s 部署_02

root@linux-harbor:~# docker load --input spark_1.5.2.tar
root@linux-harbor:~# docker images

spark k8s 部署 k8s安装spark_云计算_03


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

spark k8s 部署 k8s安装spark_Docker_04


注意事项:

  • 当镜像有版本号的时候,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

spark k8s 部署 k8s安装spark_Spark_05


spark k8s 部署 k8s安装spark_Kubernetes_06


注意事项:

  • 第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

spark k8s 部署 k8s安装spark_Docker_07

spark k8s 部署 k8s安装spark_Docker_08


注意事项:

  • 第30行image后面的地址192.168.185.130/library/spark:1.5.2是本人自己Harbor中的镜像地址,你需要修改为自己的镜像地址,否则在拉取镜像的过程中会提示失败。

通过浏览器访问Kubernetes,在命名空间查看Spark集群的运行状态:

spark k8s 部署 k8s安装spark_云计算_09

三、测试Spark的一个简单应用

计算圆周率spark k8s 部署 k8s安装spark_Kubernetes_10的近似值。通过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 k8s 部署 k8s安装spark_spark k8s 部署_11


注意事项:

  • 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。