基于kubernetes构建spark集群(RC模式)

基于kubernetes部署spark的两种方式

  • 方式一:使用kubernetes作为集群管理器(Cluster Manager),类似与mesos和yarn,使用方式可搜索github查看running-on-kubernetes。但这个部署方式,一是还不成熟(目前Deprecated),不推荐在生产环境使用.
  • 方式二:standalone的方式,即便是不用集群也能很方便的调用sbin下的脚本来部署,而使用k8s有几点好处,一是提高机器使用率(一般服务器资源白天使用率较高,晚上空闲,刚好能拿来跑数据);二是方便一键扩容,一键升级;三是能复用本身在k8s集群上做好的监控以及日志收集.

因此,我们选择使用第二种方式部署集群,写到这里时候spark 为2.4.x版本。假设为ecc电商项目构建spark集群,规划如下

命名空间账户rbacmasterworkerpvc
ecc-spark-clusterspark-cdpecc-spark-masterecc-spark-workerecc-spark-pvc

1、spark rbac配置

创建rbac账户,并分配资源权限,Pod服务账户创建参考

cat > ecc-spark-rbac.yaml << EOF
---
apiVersion: v1
kind: Namespace
metadata:
  name: ecc-spark-cluster
  labels:
    name: ecc-spark-cluster
---
#基于namespace创建服务账户spark-cdp
apiVersion: v1
kind: ServiceAccount
metadata:
  name: spark-cdp
  namespace: ecc-spark-cluster

---
#创建角色资源权限
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: spark-cdp
  namespace: ecc-spark-cluster
rules:
  - apiGroups:
      - ""
    resources:
      - pods
    verbs:
      - '*'
  - apiGroups:
      - ""
    resources:
      - configmaps
    verbs:
      - '*'
  - apiGroups:
      - ""
    resources:
      - services
      - secrets
    verbs:
      - create
      - get
      - delete
  - apiGroups:
      - extensions
    resources:
      - ingresses
    verbs:
      - create
      - get
      - delete
  - apiGroups:
      - ""
    resources:
      - nodes
    verbs:
      - get
  - apiGroups:
      - ""
    resources:
      - resourcequotas
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - ""
    resources:
      - events
    verbs:
      - create
      - update
      - patch
  - apiGroups:
      - apiextensions.k8s.io
    resources:
      - customresourcedefinitions
    verbs:
      - create
      - get
      - update
      - delete
  - apiGroups:
      - admissionregistration.k8s.io
    resources:
      - mutatingwebhookconfigurations
      - validatingwebhookconfigurations
    verbs:
      - create
      - get
      - update
      - delete
  - apiGroups:
      - sparkoperator.k8s.io
    resources:
      - sparkapplications
      - scheduledsparkapplications
      - sparkapplications/status
      - scheduledsparkapplications/status
    verbs:
      - '*'
  - apiGroups:
      - scheduling.volcano.sh
    resources:
      - podgroups
      - queues
      - queues/status
    verbs:
      - get
      - list
      - watch
      - create
      - delete
      - update

---
#服务账户spark-cdp绑定角色
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: spark-cdp
  namespace: ecc-spark-cluster
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: spark-cdp
subjects:
  - kind: ServiceAccount
    name: spark-cdp
    
EOF

2、spark pv,pvc

  • 构建pv
    挂载NFS,定义pv访问模式(accessModes)和存储容量(capacity);
cat >ecc-spark-pv.yaml <<EOF
apiVersion: v1
kind: PersistentVolume
metadata:
  name: ecc-spark-pv-static
  namespace: ecc-spark-cluster
spec:
  capacity:
    storage: 10Gi
  accessModes:
    #访问三种模式:ReadWriteOnce,ReadOnlyMany,ReadWriteMany
    - ReadWriteOnce
  nfs:
    path: /data/nfs
    server: 192.168.0.135
    
EOF
  • 构建pvc
cat >ecc-spark-pvc.yaml <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ecc-spark-pvc-static
  namespace: ecc-spark-cluster
spec:
  accessModes:
    #匹配模式
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

EOF

3、spark master创建

spark master分为两个部分,一个是类型为ReplicationController的主体,命名为ecc-spark-master.yaml,另一部分为一个service,暴露master的7077端口给slave使用。
(1)可调节参数

  • 副本数(replicas);
  • args参数,日志打印路径;
  • 挂载pvc(ecc-spark-pvc),挂载到容器路径(/opt/usrjars);
  • resources资源分配等;
cat >ecc-spark-master.yaml <<EOF
kind: ReplicationController
apiVersion: v1
metadata:
  name: spark-master-controller
  namespace: ecc-spark-cluster
spec:
  replicas: 1
  selector:
    component: ecc-spark-master
  template:
    metadata:
      labels:
        component: ecc-spark-master
    spec:
      serviceAccountName: spark-cdp
      securityContext: {}
      dnsPolicy: ClusterFirst
      hostname: ecc-spark-master
      containers:
        - name: ecc-spark-master
          image: acpimgehub.com.cn/eccp_dev/spark:202107_YD_0714_v3.2
          imagePullPolicy: IfNotPresent
          command: ["/bin/sh"]
          args: ["-c","sh /opt/spark/sbin/start-master.sh && tail -f /opt/spark/logs/spark--org.apache.spark.deploy.master.Master-1-*"]
          ports:
            - containerPort: 7077
            - containerPort: 8080
          volumeMounts:
            - mountPath: /opt/usrjars/
              name: ecc-spark-pvc
          livenessProbe:
            failureThreshold: 9
            initialDelaySeconds: 2
            periodSeconds: 15
            successThreshold: 1
            tcpSocket:
              port: 7077
            timeoutSeconds: 10
          resources:
            requests:
              cpu: "200m"
              memory: "256Mi"
            limits:
              cpu: "1"
              memory: "1Gi"
      volumes:
        - name: ecc-spark-pvc
          persistentVolumeClaim:
            claimName: ecc-spark-pvc-static
---
kind: Service
apiVersion: v1
metadata:
  name: ecc-spark-master
  namespace: ecc-spark-cluster
spec:
  ports:
    - port: 7077
      targetPort: 7077
      name: spark
    - port: 8080
      targetPort: 8080
      name: http
  selector:
    component: ecc-spark-master

EOF

4、spark worker 创建

在启动spark worker脚本中需要传入master的地址,因为有kubernetes dns且设置了service的缘故,可以通过ecc-spark-master.ecc-spark-cluster:7077访问。
(1)可调节参数

  • 副本数(replicas),replicas设置为N即可启动N个worker;
  • args参数,日志打印路径;
  • 挂载pvc(ecc-spark-pvc),挂载到容器路径(/opt/usrjars);
  • resources资源分配等;
cat >ecc-spark-worker.yaml <<EOF
kind: ReplicationController
apiVersion: v1
metadata:
  name: spark-worker-controller
  namespace: ecc-spark-cluster
spec:
  replicas: 2
  selector:
    component: ecc-spark-worker
  template:
    metadata:
      labels:
        component: ecc-spark-worker
    spec:
      serviceAccountName: spark-cdp
      securityContext: {}
      dnsPolicy: ClusterFirst
      hostname: ecc-spark-worker
      containers:
        - name: ecc-spark-worker
          image: acpimgehub.com.cn/eccp_dev/spark:202107_YD_0714_v3.2
          imagePullPolicy: IfNotPresent
          command: ["/bin/sh"]
          args: ["-c","sh /opt/spark/sbin/start-slave.sh spark://ecc-spark-master.ecc-spark-cluster:7077;tail -f /opt/spark/logs/spark--org.apache.spark.deploy.worker.Worker*"]
          ports:
            - containerPort: 8081
          volumeMounts:
            - mountPath: /opt/usrjars/
              name: ecc-spark-pvc
          resources:
            requests:
              cpu: "200m"
              memory: "128Mi"
            limits:
              cpu: "1"
              memory: "1Gi"
      volumes:
        - name: ecc-spark-pvc
          persistentVolumeClaim:
            claimName: ecc-spark-pvc-static

EOF

5、spark ui proxy

spark ui代理服务,image为elsonrodriguez/spark-ui-proxy:1.0在k8s集群里是不可或缺。它提供查看master的管理页面,并可以从master访问woker的ui页面(因每个worker都有自己的ui地址,ip分配很随机,这些ip只能在集群内部访问)。因此需要一个代理服务,从内部访问完需要的master ui页面后,返回给我们,这样我们只需要暴露一个代理的地址即可。

cat >ecc-spark-ui-proxy.yaml <<EOF
kind: ReplicationController
apiVersion: v1
metadata:
  name: spark-ui-proxy-controller
  namespace: ecc-spark-cluster
spec:
  replicas: 1
  selector:
    component: ecc-spark-ui-proxy
  template:
    metadata:
      labels:
        component: ecc-spark-ui-proxy
    spec:
      containers:
        - name: ecc-spark-ui-proxy
          image: elsonrodriguez/spark-ui-proxy:1.0
          ports:
            - containerPort: 80
          resources:
            requests:
              cpu: 100m
          args:
            - ecc-spark-master:8080
          livenessProbe:
            httpGet:
              path: /
              port: 80
            initialDelaySeconds: 120
            timeoutSeconds: 5
---
kind: Service
apiVersion: v1
metadata:
  name: ecc-spark-ui-proxy
  namespace: ecc-spark-cluster
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
      nodePort: 32180
  selector:
    component: ecc-spark-ui-proxy

EOF

至此,spark整个集群搭建完毕。即可通过集群暴露的32180端口访问管理页面。
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 基于Ubuntu的Spark集群部署与测试需要以下步骤: 1. 安装Java和ScalaSpark需要Java和Scala的支持,因此需要先安装这两个软件包。 2. 下载Spark:从Spark官网下载最新版本的Spark。 3. 安装Spark:将Spark解压到一个目录中,并设置环境变量。 4. 配置Spark集群:在Spark的conf目录下,创建一个名为spark-env.sh的文件,并设置SPARK_MASTER_IP和SPARK_WORKER_CORES等参数。 5. 启动Spark集群:在Spark的sbin目录下,运行start-master.sh和start-slaves.sh脚本,启动Spark集群。 6. 测试Spark集群:使用Spark自带的示例程序,如WordCount,测试Spark集群的性能和可靠性。 7. 部署应用程序:将自己的应用程序打包成jar包,并使用spark-submit命令提交到Spark集群中运行。 以上是基于Ubuntu的Spark集群部署与测试的基本步骤,需要注意的是,Spark集群的配置和调优需要根据具体的应用场景进行调整。 ### 回答2: Spark是一个开源的、快速而通用的集群计算系统,主要用于大数据处理。部署Spark集群需要选择操作系统,目前较为流行的是选择Ubuntu作为操作系统。下面介绍基于Ubuntu的Spark集群部署与测试。 1. 安装Ubuntu操作系统 首先需在每个节点上安装Ubuntu系统。推荐使用Ubuntu Server版本,该版本缺省不安装图形界面和大部分的应用程序,更适合用于服务器操作。 2. 安装Java环境 Spark是基于Java编写的,因此每个节点上都必须安装Java环境。可以选择安装OpenJDK或Oracle JDK。建议选择较新的Java版本,可以提高Spark的性能。 3. 下载SparkSpark官网(http://spark.apache.org/)下载最新版本的Spark并解压。 4. 配置Spark 首先在每个节点上创建一个Spark用户,并为其分配一个唯一的用户ID。接下来,需要在Spark的默认配置文件中配置相关参数,例如Worker数量、内存大小、Hadoop配置等。 5. 部署Spark集群 可以使用多种方式来部署Spark集群,例如手动部署、使用Puppet、Chef等自动化配置工具。手动部署需要在每个节点上逐个安装Spark并手动配置,而自动化配置工具则可以自动在多个节点上安装并配置Spark,省时省力。 6. 测试Spark集群Spark集群部署完成后,可以使用Spark自带的示例程序进行测试。可以先在一个节点上运行示例程序,确保程序能够正常运行。 以上就是基于Ubuntu的Spark集群部署与测试的介绍。没有经验的用户可以尝试使用自动化配置工具来部署Spark集群,使部署过程更加轻松。通过合理的配置,Spark集群可以高效地处理海量数据,为用户提供更为便捷、高效的大数据处理体验。 ### 回答3: Ubuntu是一款开源的操作系统,在大数据领域,Ubuntu常被用作Spark集群的部署环境。Spark是一个快速的分布式计算框架,具有高性能和多功能性的设计。在这里,我将为大家介绍基于Ubuntu的Spark集群部署与测试的步骤。 1. 部署Spark Cluster 首先,我们需要在Ubuntu系统上安装Java、ScalaSpark。为了简化部署过程,我们可以使用类似Ansible的自动化工具进行安装和配置。 另一种常用的部署方法是手动安装。我们需要下载相关二进制文件,将它们解压缩到合适的目录,并设置环境变量。这里有一些基本的指令: $ sudo apt-get install default-jre $ sudo apt-get install scala $ wget http://mirror.bit.edu.cn/apache/spark/spark-3.0.0/spark-3.0.0-bin-hadoop2.7.tgz $ tar -xvzf spark-3.0.0-bin-hadoop2.7.tgz $ sudo mv spark-3.0.0-bin-hadoop2.7 /usr/local/spark $ echo "export PATH=$PATH:/usr/local/spark/bin" >> ~/.bashrc $ source ~/.bashrc 2.配置环境变量 在Ubuntu上运行Spark,需要设置以下环境变量: SPARK_HOME:为Spark的安装路径。 JAVA_HOME:为Java的安装路径。 PATH:为Spark二进制文件的可执行路径。 另外,我们需要为每个节点分配IP地址。例如,我们可以在/etc/hosts中添加以下信息: 192.168.1.100 node1 192.168.1.101 node2 192.168.1.102 node3 3.测试Spark Cluster 在Spark集群上进行测试,可以通过启动Spark Shell进行交互式分析。我们可以在Ubuntu命令行中输入: $ spark-shell 这将启动Spark Shell,并显示Spark版本和其他信息。如果成功启动,我们可以使用以下命令测试Spark集群: val arrays = Array(1, 2, 3, 4, 5) val rdd = sc.parallelize(arrays) #创建RDD rdd.collect() #输出RDD中的数据 如果一切正常,Spark Shell将输出包含1、2、3、4、5的表格数据。这说明我们已成功连接到Spark集群并运行RDD分析。 综上所述,基于Ubuntu的Spark集群是一种快速、简单和高效的方式,用于大数据分析和处理。在正确配置环境变量和启动集群后,我们可以通过Spark Shell测试RDD分析,并开始构建自己的大型分布式计算应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Moutai码哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值