基于Headless构建高可用spark+pyspark集群

2023-10-29 01:36

本文主要是介绍基于Headless构建高可用spark+pyspark集群,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、创建Headless Service服务

Headless 服务类型并不分配容器云虚拟 IP,而是直接暴露所属 Pod 的 DNS 记录。没有默认负载均衡器,可直接访问 Pod IP 地址。因此,当我们需要与集群内真实的 Pod IP 地址进行直接交互时,Headless 服务就很有用。
其中Service的关键配置如下:clusterIP: None,不让其获取clusterIP , DNS解析的时候直接走pod。

---
kind: Service
apiVersion: v1
metadata:name: ecc-spark-servicenamespace: ecc-spark-cluster
spec:clusterIP: Noneports:- port: 7077protocol: TCPtargetPort: 7077name: spark- port: 10000protocol: TCPtargetPort: 10000name: thrift-server-tcp- port: 8080targetPort: 8080name: http- port: 45970protocol: TCPtargetPort: 45970name: thrift-server-driver-tcp  - port: 45980protocol: TCPtargetPort: 45980name: thrift-server-blockmanager-tcp    - port: 4040protocol: TCPtargetPort: 4040name: thrift-server-tasks-tcp              selector:app: ecc-spark-serviceEOF

Service的完全域名: ecc-spark-service.ecc-spark-cluster.svc.cluster.local
headless service的完全域名: headless-service.ecc-spark-cluster.svc.cluster.local
在容器里面ping 完全域名, service解析出的地址是clusterIP,headless service 解析出来的地址是 pod IP。

2、构建spark集群

2.1 、创建spark master

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

#如下是把thriftserver部署在master节点,则需要暴露thriftserver端口、driver端口、
#blockmanager端口服务,以提供worker节点executor与driver交互.
cat >ecc-spark-master.yaml <<EOF
kind: Deployment
apiVersion: apps/v1
metadata:name: ecc-spark-masternamespace: ecc-spark-clusterlabels:app: ecc-spark-master
spec:replicas: 1selector:matchLabels:app: ecc-spark-mastertemplate:metadata:labels:app: ecc-spark-masterspec:serviceAccountName: spark-cdpsecurityContext: {}dnsPolicy: ClusterFirsthostname: ecc-spark-mastercontainers:- name: ecc-spark-masterimage: spark:3.4.1imagePullPolicy: IfNotPresentcommand: ["/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: 8080volumeMounts:- mountPath: /opt/usrjars/name: ecc-spark-pvclivenessProbe:failureThreshold: 9initialDelaySeconds: 2periodSeconds: 15successThreshold: 1tcpSocket:port: 8080timeoutSeconds: 10resources:requests:cpu: "2"memory: "6Gi"limits:cpu: "2"memory: "6Gi"- env:- SPARK_LOCAL_DIRSvalue: "/odsdata/sparkdirs/"             volumes:- name: ecc-spark-pvcpersistentVolumeClaim:claimName: ecc-spark-pvc-static

2.2、创建spark worker

在启动spark worker脚本中需要传入master的地址,在容器云kubernetes dns且设置了service的缘故,可以通过ecc-spark-master.ecc-spark-cluster.svc.cluster.local:7077访问。

cat >ecc-spark-worker.yaml <<EOF
kind: Deployment
apiVersion: apps/v1
metadata:name: ecc-spark-workernamespace: ecc-spark-clusterlabels:app: ecc-spark-worker
spec:replicas: 1selector:matchLabels:app: ecc-spark-workertemplate:metadata:labels:app: ecc-spark-workerspec:serviceAccountName: spark-cdpsecurityContext: {}dnsPolicy: ClusterFirsthostname: ecc-spark-workercontainers:- name: ecc-spark-workerimage: spark:3.4.1imagePullPolicy: IfNotPresentcommand: ["/bin/sh"]args: ["-c","sh /opt/spark/sbin/start-worker.sh spark://ecc-spark-master.ecc-spark-cluster.svc.cluster.local:7077;tail -f /opt/spark/logs/spark--org.apache.spark.deploy.worker.Worker*"]ports:- containerPort: 8081volumeMounts:- mountPath: /opt/usrjars/name: ecc-spark-pvcresources:requests:cpu: "2"memory: "2Gi"limits:cpu: "2"memory: "4Gi"- env:- SPARK_LOCAL_DIRSvalue: "/odsdata/sparkdirs/"              volumes:- name: ecc-spark-pvcpersistentVolumeClaim:claimName: ecc-spark-pvc-staticEOF

2.3 构建pyspark提交环境

import json
import flask
from flask import Flask
from concurrent.futures import ThreadPoolExecutorapp = Flask(__name__)
pool = ThreadPoolExecutor(max_workers=8)@app.route('/')
def hello_world():  # put application's code herereturn 'Hello World!'@app.route('/downloadCode', methods=['post'])
def download_file():model_id = flask.request.json.get('modelId')print(model_id)"""异步提交任务:pool.submit()"""return json.dumps(0, ensure_ascii=False)@app.route('/modelRun', methods=['post'])
def model_run():"""异步提交任务:pool.submit()"""return json.dumps(0, ensure_ascii=False)if __name__ == '__main__':app.run()
spark@c67e6477b2f1:/opt/spark$ python3
Python 3.8.10 (default, May 26 2023, 14:05:08) 
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> 

将python的调用整合到:start-master.sh 文件末尾启动调用,便可以通过k8s暴露spark-master的F5端口实现http调用。

3、使用spark-operator安装spark集群方式

可以参考阿里云文章:搭建Spark应用

这篇关于基于Headless构建高可用spark+pyspark集群的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/297377

相关文章

MySQL MHA集群详解(数据库高可用)

《MySQLMHA集群详解(数据库高可用)》MHA(MasterHighAvailability)是开源MySQL高可用管理工具,用于自动故障检测与转移,支持异步或半同步复制的MySQL主从架构,本... 目录mysql 高可用方案:MHA 详解与实战1. MHA 简介2. MHA 的组件组成(1)MHA

SpringBoot整合Apache Spark实现一个简单的数据分析功能

《SpringBoot整合ApacheSpark实现一个简单的数据分析功能》ApacheSpark是一个开源的大数据处理框架,它提供了丰富的功能和API,用于分布式数据处理、数据分析和机器学习等任务... 目录第一步、添加android依赖第二步、编写配置类第三步、编写控制类启动项目并测试总结ApacheS

golang实现nacos获取配置和服务注册-支持集群详解

《golang实现nacos获取配置和服务注册-支持集群详解》文章介绍了如何在Go语言中使用Nacos获取配置和服务注册,支持集群初始化,客户端结构体中的IpAddresses可以配置多个地址,新客户... 目录golang nacos获取配置和服务注册-支持集群初始化客户端可选参数配置new一个客户端 支

MySQL集群高可用架构的两种使用小结

《MySQL集群高可用架构的两种使用小结》本文介绍了MySQL的两种高可用解决方案:组复制(MGR)和MasterHighAvailability(MHA),文中通过示例代码介绍的非常详细,对大家的学... 目录一、mysql高可用之组复制(MGR)1.1 组复制核心特性与优势1.2 组复制架构原理1.3

Docker + Redis 部署集群的实现步骤

《Docker+Redis部署集群的实现步骤》本文详细介绍了在三台服务器上部署高可用Redis集群的完整流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录一、环境准备1. 服务器规划(3 台服务器)2. 防火墙配置(三台服务器均执行)3. 安装 docke

springBoot (springCloud2025)集成redisCluster 集群的操作方法

《springBoot(springCloud2025)集成redisCluster集群的操作方法》文章介绍了如何使用SpringBoot集成RedisCluster集群,并详细说明了pom.xm... 目录pom.XMLapplication.yamlcluster配置类其他配置类连接池配置类Redis

Python连接Spark的7种方法大全

《Python连接Spark的7种方法大全》ApacheSpark是一个强大的分布式计算框架,广泛用于大规模数据处理,通过PySpark,Python开发者能够无缝接入Spark生态系统,本文给大家介... 目录第一章:python与Spark集成概述PySpark 的核心优势基本集成配置步骤启动一个简单的

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可