Apache Sedona 集群架构与部署详解
文档说明: 本文档深度解析Apache Sedona的集群化部署架构,包含7层架构详解、组件通信机制、网络拓扑、端口配置、高可用方案等内容。
创建时间: 2025年12月10日
文档版本: v1.0
适用场景: 生产环境集群化部署
目录
1. 集群架构总览
1.1 七层架构全景图
╔════════════════════════════════════════════════════════════════════════════════════════╗
║ Apache Sedona 生产级集群化部署架构 (7层完整架构) ║
╚════════════════════════════════════════════════════════════════════════════════════════╝
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 第1层: 用户接入层 (Client Access Layer) ┃
┃ 职责: 提供多种客户端访问方式 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┌────────────────────┐ ┌────────────────────┐ ┌────────────────────┐
│ Python/Scala IDE │ │ Jupyter Notebook │ │ BI工具/可视化 │
│ (VSCode/PyCharm) │ │ (JupyterHub) │ │ (Tableau/Superset) │
│ │ │ │ │ │
│ 开发者工作站 │ │ 数据科学家工作台 │ │ 业务分析师 │
└─────────┬──────────┘ └─────────┬──────────┘ └─────────┬──────────┘
│ │ │
│ HTTPS (443) │ WebSocket (8888) │ JDBC (10000)
│ SSH (22) │ │
└───────────────────────┼───────────────────────┘
│
┌───────────▼───────────┐
│ 公网IP/VPN入口 │
│ 防火墙/安全组 │
└───────────┬───────────┘
│
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━▼━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 第2层: 负载均衡与网关层 (Load Balancer & Gateway Layer) ┃
┃ 职责: 请求分发、SSL终止、会话保持、健康检查 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┌───────────────────────────────────────────────────────────────────────┐
│ Nginx/HAProxy 负载均衡器集群 (主备HA) │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ 虚拟IP: 192.168.1.100 (VIP通过Keepalived实现) │ │
│ │ ├─ Nginx-1 (192.168.1.101) - Master │ │
│ │ └─ Nginx-2 (192.168.1.102) - Backup │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
│ 功能模块: │
│ ├─ SSL终止 (HTTPS → HTTP) │
│ ├─ 反向代理 (到Spark Master/History Server) │
│ ├─ 请求路由 (基于URL路径) │
│ ├─ 健康检查 (HTTP GET /health 每5秒) │
│ ├─ 连接池管理 (keepalive 64) │
│ └─ 访问日志 (ELK Stack收集) │
└───────────────────────────┬───────────────────────────────────────────┘
│
┌──────────────┼──────────────┐
│ │ │
┏━━━━━━━━━━▼━━━━━━━━━━━━━━▼━━━━━━━━━━━━━▼━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 第3层: Spark管理层 (Spark Management Layer) ┃
┃ 职责: 集群资源管理、任务调度、应用监控 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┌──────── Spark Master高可用 (ZooKeeper协调) ────────┐
│ │
┌────▼─────────────────┐ ┌─────────────────────▼──┐
│ Master Node 1 │ │ Master Node 2 │
│ (Active) │◄────────►│ (Standby) │
│ IP: 192.168.1.10 │ ZK协调 │ IP: 192.168.1.11 │
├──────────────────────┤ ├────────────────────────┤
│ Spark Master │ │ Spark Master │
│ - 端口: 7077 (RPC) │ │ - 端口: 7077 │
│ - WebUI: 8080 │ │ - WebUI: 8080 │
│ │ │ │
│ History Server │ │ History Server (备) │
│ - 端口: 18080 │ │ - 端口: 18080 │
│ │ │ │
│ ZooKeeper Client │ │ ZooKeeper Client │
│ - 连接: zk集群 │ │ - 连接: zk集群 │
└──────────┬───────────┘ └────────────────────────┘
│
│ 心跳和命令 (RPC)
│
┏━━━━━━━━▼━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 第4层: 资源管理层 (Resource Management Layer) ┃
┃ 职责: 集群资源协调、服务发现、配置管理 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┌────────────────────────────────────────────────────────────────┐
│ ZooKeeper集群 (奇数节点,建议3或5个) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ ZK-1 (192.168.1.20:2181) - Leader │ │
│ │ ZK-2 (192.168.1.21:2181) - Follower │ │
│ │ ZK-3 (192.168.1.22:2181) - Follower │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ 存储内容: │
│ ├─ Spark Master选举信息 │
│ ├─ HDFS NameNode HA状态 │
│ ├─ Worker节点注册信息 │
│ └─ 应用程序状态 │
└─────────────────────────────────────────────────────────────────┘
│
│ 状态同步
│
┏━━━━━━━━▼━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 第5层: 计算执行层 (Compute Execution Layer) ┃
┃ 职责: 实际数据处理和计算任务执行 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌──────────────┐
│ Worker Node 1 │ │ Worker Node 2 │ │ Worker Node N │ ... │ Worker Node │
│ 192.168.1.31 │ │ 192.168.1.32 │ │ 192.168.1.40 │ │ 192.168.1.50 │
├─────────────────┤ ├─────────────────┤ ├─────────────────┤ ├──────────────┤
│ 硬件配置: │ │ 硬件配置: │ │ 硬件配置: │ │ (扩展节点) │
│ CPU: 32核 │ │ CPU: 32核 │ │ CPU: 32核 │ │ │
│ 内存: 128GB │ │ 内存: 128GB │ │ 内存: 128GB │ │ │
│ 磁盘: 4TB SSD │ │ 磁盘: 4TB HDD │ │ 磁盘: 4TB HDD │ │ │
│ 网卡: 10Gbps │ │ 网卡: 10Gbps │ │ 网卡: 10Gbps │ │ │
├─────────────────┤ ├─────────────────┤ ├─────────────────┤ ├──────────────┤
│ Spark Worker │ │ Spark Worker │ │ Spark Worker │ │ Spark Worker │
│ - 端口: 8081 │ │ - 端口: 8081 │ │ - 端口: 8081 │ │ │
│ │ │ │ │ │ │ │
│ Executor Pool: │ │ Executor Pool: │ │ Executor Pool: │ │ │
│ ┌─────────────┐ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │ │ │
│ │ Executor 1 │ │ │ │ Executor 4 │ │ │ │ Executor 7 │ │ │ │
│ │ 16GB/4核 │ │ │ │ 16GB/4核 │ │ │ │ 16GB/4核 │ │ │ │
│ │ + Sedona库 │ │ │ │ + Sedona库 │ │ │ │ + Sedona库 │ │ │ │
│ │ + JTS库 │ │ │ │ + JTS库 │ │ │ │ + JTS库 │ │ │ │
│ └─────────────┘ │ │ └─────────────┘ │ │ └─────────────┘ │ │ │
│ ┌─────────────┐ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │ │ │
│ │ Executor 2 │ │ │ │ Executor 5 │ │ │ │ Executor 8 │ │ │ │
│ │ 16GB/4核 │ │ │ │ 16GB/4核 │ │ │ │ 16GB/4核 │ │ │ │
│ └─────────────┘ │ │ └─────────────┘ │ │ └─────────────┘ │ │ │
│ ┌─────────────┐ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │ │ │
│ │ Executor 3 │ │ │ │ Executor 6 │ │ │ │ Executor 9 │ │ │ │
│ │ 16GB/4核 │ │ │ │ 16GB/4核 │ │ │ │ 16GB/4核 │ │ │ │
│ └─────────────┘ │ │ └─────────────┘ │ │ └─────────────┘ │ │ │
│ │ │ │ │ │ │ │
│ HDFS DataNode │ │ HDFS DataNode │ │ HDFS DataNode │ │ HDFS DataNode│
│ - 端口: 50010 │ │ - 端口: 50010 │ │ - 端口: 50010 │ │ │
└────────┬────────┘ └────────┬────────┘ └────────┬────────┘ └──────┬───────┘
│ │ │ │
└────────────────────┼────────────────────┴───────────────────────┘
│
数据块读写 (TCP 50010)
│
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━▼━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 第6层: 分布式存储层 (Distributed Storage Layer) ┃
┃ 职责: 海量数据持久化存储、数据副本管理、数据块分布 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┌──────────────────── HDFS高可用集群 ────────────────────────────────┐
│ │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ NameNode 1 (Active) │◄───────►│ NameNode 2 (Standby)│ │
│ │ 192.168.1.60 │ QJM同步 │ 192.168.1.61 │ │
│ ├─────────────────────┤ ├─────────────────────┤ │
│ │ 元数据管理: │ │ 元数据管理: │ │
│ │ ├─ 文件目录树 │ │ ├─ 文件目录树(副本) │ │
│ │ ├─ 数据块映射 │ │ ├─ 数据块映射(副本) │ │
│ │ └─ 权限管理 │ │ └─ 权限管理(副本) │ │
│ │ │ │ │ │
│ │ 端口: │ │ 端口: │ │
│ │ - RPC: 9000 │ │ - RPC: 9000 │ │
│ │ - HTTP: 50070 │ │ - HTTP: 50070 │ │
│ └──────────┬──────────┘ └─────────────────────┘ │
│ │ │
│ │ 元数据查询 │
│ │ │
│ ┌──────────▼──────────────────────────────────────────────┐ │
│ │ JournalNode集群 (QJM - Quorum Journal Manager) │ │
│ │ ├─ JN-1 (192.168.1.70:8485) │ │
│ │ ├─ JN-2 (192.168.1.71:8485) │ │
│ │ └─ JN-3 (192.168.1.72:8485) │ │
│ │ 作用: 同步NameNode的EditLog,保证主备一致 │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ DataNode集群 (10-100个节点) │ │
│ │ ┌────────────────┬────────────────┬────────────────┐ │ │
│ │ │ DataNode 1 │ DataNode 2 │ DataNode N │ │ │
│ │ │ 192.168.1.31 │ 192.168.1.32 │ 192.168.1.50 │ │ │
│ │ ├────────────────┼────────────────┼────────────────┤ │ │
│ │ │ 存储Block: │ 存储Block: │ 存储Block: │ │ │
│ │ │ Block-1(副本1) │ Block-1(副本2) │ Block-2(副本1) │ │ │
│ │ │ Block-3(副本1) │ Block-2(副本3) │ Block-3(副本2) │ │ │
│ │ │ Block-5(副本2) │ Block-4(副本1) │ Block-1(副本3) │ │ │
│ │ │ ... │ ... │ ... │ │ │
│ │ │ │ │ │ │ │
│ │ │ 磁盘使用: │ 磁盘使用: │ 磁盘使用: │ │ │
│ │ │ 3.2TB / 4TB │ 2.8TB / 4TB │ 3.5TB / 4TB │ │ │
│ │ └────────────────┴────────────────┴────────────────┘ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ 存储策略: │
│ ├─ 数据副本数: 3 (可配置) │
│ ├─ 块大小: 128MB (默认) │
│ ├─ 副本放置策略: 跨机架 │
│ │ └─ 副本1: 本地机架 │
│ │ └─ 副本2: 不同机架 │
│ │ └─ 副本3: 不同机架不同节点 │
│ └─ 空间回收: 定期清理删除的数据 │
└─────────────────────────────────────────────────────────────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 第7层: 监控与日志层 (Monitoring & Logging Layer) ┃
┃ 职责: 集群监控、日志收集、性能分析、告警通知 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┌───────────────────────── 监控系统 ─────────────────────────────┐
│ Prometheus + Grafana │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Prometheus Server (192.168.1.80:9090) │ │
│ │ ├─ 数据采集: │ │
│ │ │ ├─ Node Exporter (各节点系统指标) │ │
│ │ │ ├─ JMX Exporter (Spark/HDFS JVM指标) │ │
│ │ │ └─ Custom Metrics (Sedona自定义指标) │ │
│ │ ├─ 存储: TSDB (时序数据库) │ │
│ │ └─ 告警: AlertManager │ │
│ └──────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Grafana Dashboard (192.168.1.81:3000) │ │
│ │ ├─ 集群总览大屏 │ │
│ │ ├─ Spark任务监控 │ │
│ │ ├─ HDFS存储监控 │ │
│ │ ├─ 节点健康监控 │ │
│ │ └─ Sedona性能监控 │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
┌───────────────────────── 日志系统 ─────────────────────────────┐
│ ELK Stack (Elasticsearch + Logstash + Kibana) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Logstash (192.168.1.85:5044) │ │
│ │ ├─ 日志收集: │ │
│ │ │ ├─ Spark Driver日志 │ │
│ │ │ ├─ Spark Executor日志 │ │
│ │ │ ├─ HDFS服务日志 │ │
│ │ │ ├─ 应用程序日志 │ │
│ │ │ └─ 系统日志 (syslog) │ │
│ │ ├─ 日志解析和过滤 │ │
│ │ └─ 日志转发到Elasticsearch │ │
│ └──────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Elasticsearch集群 (192.168.1.86-88) │ │
│ │ ├─ 日志存储和索引 │ │
│ │ ├─ 全文搜索 │ │
│ │ └─ 聚合分析 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Kibana (192.168.1.89:5601) │ │
│ │ ├─ 日志查询界面 │ │
│ │ ├─ 日志可视化 │ │
│ │ └─ 日志告警 │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
┌───────────────────────── 告警系统 ─────────────────────────────┐
│ AlertManager + 企业通知系统 │
│ ├─ 告警规则引擎 │
│ ├─ 告警聚合和去重 │
│ ├─ 告警路由: │
│ │ ├─ 邮件通知 (SMTP) │
│ │ ├─ 短信通知 (阿里云SMS) │
│ │ ├─ 企业微信/钉钉机器人 │
│ │ └─ PagerDuty (国际化场景) │
│ └─ 值班人员轮换 │
└─────────────────────────────────────────────────────────────────┘
1.2 架构设计理念
1.2.1 设计原则
-
高可用性 (High Availability)
- 所有关键组件都有冗余
- 无单点故障 (No Single Point of Failure)
- 自动故障转移 (Automatic Failover)
-
水平扩展性 (Horizontal Scalability)
- 可按需添加节点扩展集群
- 线性性能提升
- 动态资源分配
-
数据本地性 (Data Locality)
- 计算靠近数据
- 减少网络传输
- 提升处理性能
-
故障隔离 (Fault Isolation)
- 节点故障不影响整体
- 任务自动重试
- 数据多副本保护
-
可观测性 (Observability)
- 全面监控指标
- 集中日志管理
- 实时告警通知
1.2.2 核心特性
| 特性 | 说明 | 实现方式 |
|---|---|---|
| 弹性计算 | 根据负载动态调整资源 | Spark动态资源分配 |
| 数据容错 | 数据不丢失 | HDFS 3副本机制 |
| 服务容错 | 服务不中断 | Master/NameNode HA |
| 负载均衡 | 任务均匀分布 | KDB-Tree空间分区 |
| 性能监控 | 实时性能可视化 | Prometheus + Grafana |
| 安全隔离 | 多租户隔离 | YARN队列 + Kerberos |
2. 各层详细解析
2.1 用户接入层
2.1.1 客户端类型
1. Python开发环境
# 开发者工作站配置示例
from pyspark.sql import SparkSession
from sedona.spark import SedonaContext
# 连接到远程Spark集群
spark = SparkSession.builder \
.appName("Spatial Analysis") \
.master("spark://192.168.1.100:7077") \ # 通过VIP连接
.config("spark.executor.memory", "16g") \
.config("spark.executor.cores", "4") \
.getOrCreate()
sedona = SedonaContext.create(spark)
访问方式:
- 开发IDE: VSCode/PyCharm通过SSH连接跳板机
- Jupyter: 通过HTTPS访问JupyterHub (端口8888)
- 命令行: spark-submit提交任务
2. Scala开发环境
// Scala应用连接集群
val spark = SparkSession.builder()
.appName("Spatial Processing")
.master("spark://192.168.1.100:7077")
.config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
.getOrCreate()
3. BI工具连接
连接方式: JDBC/ODBC
地址: jdbc:hive2://192.168.1.100:10000
认证: Kerberos或用户名/密码
2.1.2 网络接入
┌─────────────────────────────────────────────────┐
│ 网络接入拓扑 │
├─────────────────────────────────────────────────┤
│ │
│ 互联网 │
│ │ │
│ ▼ │
│ 公网IP (xxx.xxx.xxx.xxx) │
│ │ │
│ ▼ │
│ 企业防火墙/VPN │
│ ├─ 端口白名单: 443, 22, 8888 │
│ ├─ IP白名单: 公司出口IP │
│ └─ SSL证书验证 │
│ │ │
│ ▼ │
│ 内网VIP: 192.168.1.100 │
│ └─ 负载均衡器 (Nginx/HAProxy) │
│ ├─ 到Spark Master (7077) │
│ ├─ 到History Server (18080) │
│ └─ 到JupyterHub (8888) │
└─────────────────────────────────────────────────┘
2.2 负载均衡与网关层
2.2.1 Nginx配置示例
# /etc/nginx/nginx.conf
# Nginx负载均衡配置
# 上游Spark Master服务器池
upstream spark_masters {
# 主Master
server 192.168.1.10:8080 weight=5 max_fails=3 fail_timeout=30s;
# 备Master (权重较低)
server 192.168.1.11:8080 weight=1 backup;
}
# 上游History Server池
upstream spark_history {
server 192.168.1.10:18080;
server 192.168.1.11:18080 backup;
}
# HTTPS服务器配置
server {
listen 443 ssl http2;
server_name spark.company.com;
# SSL证书配置
ssl_certificate /etc/nginx/ssl/spark.crt;
ssl_certificate_key /etc/nginx/ssl/spark.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# 访问日志
access_log /var/log/nginx/spark_access.log;
error_log /var/log/nginx/spark_error.log;
# Spark Master WebUI
location / {
proxy_pass http://spark_masters;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 连接超时
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 健康检查
proxy_next_upstream error timeout http_502 http_503 http_504;
}
# History Server
location /history/ {
proxy_pass http://spark_history/;
proxy_set_header Host $host;
}
# 健康检查端点
location /health {
access_log off;
return 200 "healthy\n";
}
}
# HTTP到HTTPS重定向
server {
listen 80;
server_name spark.company.com;
return 301 https://$server_name$request_uri;
}
2.2.2 HAProxy配置示例
# /etc/haproxy/haproxy.cfg
# HAProxy负载均衡配置
global
log /dev/log local0
maxconn 4096
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
# Spark Master负载均衡
frontend spark_master_frontend
bind *:7077
mode tcp
default_backend spark_master_backend
backend spark_master_backend
mode tcp
balance roundrobin
option tcp-check
server master1 192.168.1.10:7077 check
server master2 192.168.1.11:7077 check backup
# WebUI负载均衡
frontend spark_ui_frontend
bind *:8080
mode http
default_backend spark_ui_backend
backend spark_ui_backend
mode http
balance roundrobin
option httpchk GET /
http-check expect status 200
server master1 192.168.1.10:8080 check
server master2 192.168.1.11:8080 check backup
# 统计页面
listen stats
bind *:9000
stats enable
stats uri /stats
stats refresh 30s
stats admin if TRUE
2.2.3 Keepalived高可用配置
# /etc/keepalived/keepalived.conf
# Nginx-1 (Master)配置
vrrp_instance VI_1 {
state MASTER # 主节点
interface eth0 # 网卡接口
virtual_router_id 51 # 路由ID (两节点必须相同)
priority 100 # 优先级 (Master > Backup)
advert_int 1 # VRRP通告间隔1秒
authentication {
auth_type PASS
auth_pass your_password
}
virtual_ipaddress {
192.168.1.100/24 # VIP地址
}
# 健康检查脚本
track_script {
chk_nginx
}
}
# Nginx进程检查
vrrp_script chk_nginx {
script "/usr/local/bin/check_nginx.sh"
interval 2 # 每2秒检查
weight -20 # 失败时优先级降20
}
# /usr/local/bin/check_nginx.sh
#!/bin/bash
# Nginx健康检查脚本
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
# Nginx进程不存在,尝试启动
systemctl start nginx
sleep 2
# 如果启动失败,返回失败状态
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
exit 1
fi
fi
exit 0
2.3 Spark管理层
2.3.1 Spark Master高可用配置
配置文件:spark-env.sh
# $SPARK_HOME/conf/spark-env.sh
# Master节点配置
export SPARK_MASTER_HOST=192.168.1.10
export SPARK_MASTER_PORT=7077
export SPARK_MASTER_WEBUI_PORT=8080
# 启用ZooKeeper HA
export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER \
-Dspark.deploy.zookeeper.url=192.168.1.20:2181,192.168.1.21:2181,192.168.1.22:2181 \
-Dspark.deploy.zookeeper.dir=/spark
"
# Master内存配置
export SPARK_MASTER_OPTS="
-Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200
"
# Worker配置
export SPARK_WORKER_MEMORY=96g # 每个Worker可用内存
export SPARK_WORKER_CORES=28 # 每个Worker可用核心
export SPARK_WORKER_INSTANCES=1 # 每个节点Worker实例数
export SPARK_WORKER_PORT=8081
export SPARK_WORKER_WEBUI_PORT=8081
# History Server配置
export SPARK_HISTORY_OPTS="
-Dspark.history.fs.logDirectory=hdfs://mycluster/spark-logs \
-Dspark.history.ui.port=18080
"
配置文件:spark-defaults.conf
# $SPARK_HOME/conf/spark-defaults.conf
# ==================== 基础配置 ====================
spark.master spark://192.168.1.100:7077
spark.eventLog.enabled true
spark.eventLog.dir hdfs://mycluster/spark-logs
# ==================== Sedona配置 ====================
spark.serializer org.apache.spark.serializer.KryoSerializer
spark.kryo.registrator org.apache.sedona.core.serde.SedonaKryoRegistrator
# Sedona SQL扩展
spark.sql.extensions org.apache.sedona.viz.sql.SedonaVizExtensions,org.apache.sedona.sql.SedonaSqlExtensions
# ==================== 资源配置 ====================
spark.driver.memory 8g
spark.driver.memoryOverhead 2g
spark.driver.cores 4
spark.executor.memory 16g
spark.executor.memoryOverhead 4g
spark.executor.cores 4
spark.executor.instances 30
# 动态资源分配
spark.dynamicAllocation.enabled true
spark.dynamicAllocation.minExecutors 5
spark.dynamicAllocation.maxExecutors 100
spark.dynamicAllocation.initialExecutors 10
spark.dynamicAllocation.executorIdleTimeout 60s
# ==================== Shuffle配置 ====================
spark.sql.shuffle.partitions 200
spark.shuffle.service.enabled true
spark.shuffle.service.port 7337
# ==================== 网络配置 ====================
spark.network.timeout 600s
spark.rpc.askTimeout 300s
spark.executor.heartbeatInterval 30s
# ==================== 内存管理 ====================
spark.memory.fraction 0.8
spark.memory.storageFraction 0.3
spark.memory.offHeap.enabled true
spark.memory.offHeap.size 4g
2.3.2 启动Master集群
# 在Master-1节点 (192.168.1.10)
#!/bin/bash
# 启动第一个Master
$SPARK_HOME/sbin/start-master.sh
# 启动History Server
$SPARK_HOME/sbin/start-history-server.sh
# 启动所有Worker
$SPARK_HOME/sbin/start-slaves.sh
echo "Master-1 started"
# 在Master-2节点 (192.168.1.11)
#!/bin/bash
# 启动第二个Master (备用)
$SPARK_HOME/sbin/start-master.sh
# 启动History Server (备用)
$SPARK_HOME/sbin/start-history-server.sh
echo "Master-2 (Standby) started"
2.3.3 集群管理命令
# 查看集群状态
curl http://192.168.1.10:8080/json/
# 提交任务
spark-submit \
--master spark://192.168.1.100:7077 \
--deploy-mode cluster \
--class com.company.SpatialApp \
--executor-memory 16g \
--executor-cores 4 \
--num-executors 20 \
spatial-app.jar
# 杀死应用
$SPARK_HOME/bin/spark-class org.apache.spark.deploy.Client \
kill spark://192.168.1.100:7077 app-20250110-001
# 停止集群
$SPARK_HOME/sbin/stop-all.sh
2.4 资源管理层 (ZooKeeper)
2.4.1 ZooKeeper集群配置
配置文件:zoo.cfg
# ZooKeeper配置文件
# 基础配置
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/var/lib/zookeeper
clientPort=2181
# 集群配置
server.1=192.168.1.20:2888:3888
server.2=192.168.1.21:2888:3888
server.3=192.168.1.22:2888:3888
# 端口说明:
# 2888: Follower与Leader通信端口
# 3888: 选举端口
myid文件配置
# ZK-1节点 (192.168.1.20)
echo "1" > /var/lib/zookeeper/myid
# ZK-2节点 (192.168.1.21)
echo "2" > /var/lib/zookeeper/myid
# ZK-3节点 (192.168.1.22)
echo "3" > /var/lib/zookeeper/myid
2.4.2 ZooKeeper数据结构
ZooKeeper存储的数据结构:
/spark
├─ leader_election
│ ├─ master_lock # Master选举锁
│ └─ master_status # 当前Master信息
├─ workers
│ ├─ worker-192.168.1.31 # Worker注册信息
│ ├─ worker-192.168.1.32
│ └─ ...
├─ applications
│ ├─ app-20250110-001 # 应用状态
│ ├─ app-20250110-002
│ └─ ...
└─ drivers
├─ driver-20250110-001 # Driver信息
└─ ...
2.4.3 ZooKeeper管理命令
# 启动ZooKeeper
/opt/zookeeper/bin/zkServer.sh start
# 查看状态
/opt/zookeeper/bin/zkServer.sh status
# 输出: Mode: leader 或 Mode: follower
# 连接ZooKeeper客户端
/opt/zookeeper/bin/zkCli.sh -server 192.168.1.20:2181
# 在客户端中查看Spark数据
ls /spark
ls /spark/workers
get /spark/leader_election/master_status
# 停止ZooKeeper
/opt/zookeeper/bin/zkServer.sh stop
2.5 计算执行层 (Worker Nodes)
2.5.1 Worker节点配置
单个Worker节点资源规划:
┌────────────────────────────────────────────────┐
│ Worker Node (192.168.1.31) │
├────────────────────────────────────────────────┤
│ 硬件资源: │
│ ├─ CPU: 32核 (Intel Xeon) │
│ ├─ 内存: 128GB │
│ ├─ 磁盘: 4TB SSD (数据) + 500GB SSD (系统) │
│ └─ 网卡: 10Gbps │
│ │
│ 资源分配: │
│ ├─ 系统预留: 4核 + 8GB │
│ ├─ HDFS DataNode: 2核 + 4GB │
│ └─ Spark Worker: 26核 + 96GB │
│ └─ 可运行Executor: 6个 │
│ └─ 每个Executor: 4核 + 16GB │
│ │
│ Executor资源计算: │
│ 可用内存 = 128 - 8(系统) - 4(HDFS) - 20(预留) │
│ = 96GB │
│ Executor数 = 96GB / 16GB = 6个 │
│ 每Executor核数 = 26核 / 6 ≈ 4核 │
└────────────────────────────────────────────────┘
2.5.2 Executor配置详解
# 单个Executor配置说明
# 堆内存 (JVM Heap)
spark.executor.memory=16g
# 用途:
# - Execution Memory: 执行算子操作 (约11GB)
# - Storage Memory: 缓存RDD/DataFrame (约5GB)
# 堆外内存 (Off-Heap Memory)
spark.executor.memoryOverhead=4g
# 用途:
# - Shuffle缓冲
# - Network缓冲
# - JVM元空间
# - 压缩/解压缩缓冲
# CPU核心数
spark.executor.cores=4
# 说明:
# - 每个核心运行一个Task
# - 同时并行4个Task
# - 不建议超过6核 (GC压力过大)
# 总内存需求
总内存 = 16GB (heap) + 4GB (overhead) = 20GB
2.5.3 启动Worker
#!/bin/bash
# start-worker.sh
# 启动Spark Worker
SPARK_HOME=/opt/spark
MASTER_URL=spark://192.168.1.100:7077
# Worker配置
export SPARK_WORKER_MEMORY=96g
export SPARK_WORKER_CORES=26
export SPARK_WORKER_PORT=8081
export SPARK_WORKER_WEBUI_PORT=8081
# 启动Worker
$SPARK_HOME/sbin/start-worker.sh $MASTER_URL
echo "Worker started on $(hostname)"
echo "Memory: 96GB, Cores: 26"
2.6 分布式存储层 (HDFS)
2.6.1 HDFS架构详解
HDFS高可用架构详解:
┌──────────────────────────────────────────────────────┐
│ HDFS NameNode HA │
├──────────────────────────────────────────────────────┤
│ │
│ Active NameNode (192.168.1.60) │
│ ├─ 内存中维护文件系统元数据 │
│ ├─ 处理客户端读写请求 │
│ ├─ 管理DataNode心跳 │
│ └─ 写EditLog到JournalNode集群 │
│ │
│ Standby NameNode (192.168.1.61) │
│ ├─ 从JournalNode读取EditLog │
│ ├─ 保持元数据同步 │
│ ├─ 定期Checkpoint (合并EditLog到FSImage) │
│ └─ 监控Active状态,准备接管 │
│ │
│ 故障转移流程: │
│ 1. ZKFC检测到Active NameNode故障 │
│ 2. ZKFC通知Standby NameNode │
│ 3. Standby读取最新EditLog,更新元数据 │
│ 4. Standby切换为Active模式 │
│ 5. 通知所有DataNode新的Active地址 │
│ 6. 客户端自动重连到新Active │
│ 转移时间: < 30秒 │
└──────────────────────────────────────────────────────┘
2.6.2 HDFS配置文件
core-site.xml
<?xml version="1.0"?>
<configuration>
<!-- HDFS NameService -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- ZooKeeper配置 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>192.168.1.20:2181,192.168.1.21:2181,192.168.1.22:2181</value>
</property>
<!-- HDFS临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop/tmp</value>
</property>
</configuration>
hdfs-site.xml
<?xml version="1.0"?>
<configuration>
<!-- NameService ID -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- NameNode IDs -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- NN1 RPC地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>192.168.1.60:9000</value>
</property>
<!-- NN2 RPC地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>192.168.1.61:9000</value>
</property>
<!-- NN1 HTTP地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>192.168.1.60:50070</value>
</property>
<!-- NN2 HTTP地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>192.168.1.61:50070</value>
</property>
<!-- JournalNode地址 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://192.168.1.70:8485;192.168.1.71:8485;192.168.1.72:8485/mycluster</value>
</property>
<!-- 故障自动转移 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 数据副本数 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- Block大小 -->
<property>
<name>dfs.blocksize</name>
<value>134217728</value> <!-- 128MB -->
</property>
<!-- NameNode数据目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///data/hadoop/hdfs/name</value>
</property>
<!-- DataNode数据目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///data/hadoop/hdfs/data</value>
</property>
</configuration>
2.6.3 HDFS管理命令
# 启动HDFS集群
# 1. 启动所有JournalNode
$HADOOP_HOME/sbin/hadoop-daemons.sh --script hdfs start journalnode
# 2. 格式化NameNode (仅首次)
hdfs namenode -format
# 3. 初始化ZooKeeper HA状态 (仅首次)
hdfs zkfc -formatZK
# 4. 启动第一个NameNode
$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
# 5. 同步第二个NameNode (仅首次)
hdfs namenode -bootstrapStandby
# 6. 启动第二个NameNode
# 在NN2节点执行
$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
# 7. 启动ZKFC (两个NN节点都要启动)
$HADOOP_HOME/sbin/hadoop-daemon.sh start zkfc
# 8. 启动所有DataNode
$HADOOP_HOME/sbin/hadoop-daemons.sh start datanode
# 查看HDFS状态
hdfs dfsadmin -report
# 查看NameNode状态
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
# 手动故障转移
hdfs haadmin -failover nn1 nn2
# 查看文件系统
hdfs dfs -ls /
# 创建目录
hdfs dfs -mkdir -p /user/spark/data
# 上传文件
hdfs dfs -put local_file.csv /user/spark/data/
# 查看文件块分布
hdfs fsck /user/spark/data/local_file.csv -files -blocks -locations
2.6.4 数据块分布示例
文件: /data/points.csv (10GB)
HDFS将文件切分为Block:
┌────────────────────────────────────────────────┐
│ Block-1 (128MB) │
│ 副本1: DataNode-1 (192.168.1.31) Rack1 │
│ 副本2: DataNode-5 (192.168.1.35) Rack2 │
│ 副本3: DataNode-9 (192.168.1.39) Rack2 │
├────────────────────────────────────────────────┤
│ Block-2 (128MB) │
│ 副本1: DataNode-2 (192.168.1.32) Rack1 │
│ 副本2: DataNode-6 (192.168.1.36) Rack2 │
│ 副本3: DataNode-10 (192.168.1.40) Rack3 │
├────────────────────────────────────────────────┤
│ ... │
├────────────────────────────────────────────────┤
│ Block-80 (128MB, 最后一个块可能<128MB) │
│ 副本1: DataNode-3 (192.168.1.33) Rack1 │
│ 副本2: DataNode-7 (192.168.1.37) Rack2 │
│ 副本3: DataNode-11 (192.168.1.41) Rack3 │
└────────────────────────────────────────────────┘
副本放置策略 (跨机架):
- 第1个副本: 写入客户端所在节点 (或随机节点)
- 第2个副本: 放在不同机架的随机节点
- 第3个副本: 与第2个副本同机架的不同节点
优势:
✓ 机架故障不会导致数据丢失
✓ 读取时可以选择最近的副本
✓ 网络带宽利用率高 (2/3副本在同一机架)
2.7 监控与日志层
2.7.1 Prometheus监控配置
prometheus.yml配置
# /etc/prometheus/prometheus.yml
global:
scrape_interval: 15s # 每15秒采集一次
evaluation_interval: 15s # 每15秒评估一次告警规则
external_labels:
cluster: 'sedona-prod'
datacenter: 'dc1'
# 告警管理器配置
alerting:
alertmanagers:
- static_configs:
- targets: ['192.168.1.80:9093']
# 告警规则文件
rule_files:
- "/etc/prometheus/rules/*.yml"
# 数据采集配置
scrape_configs:
# Prometheus自监控
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# Node Exporter (系统指标)
- job_name: 'node'
static_configs:
- targets:
- '192.168.1.10:9100' # Master-1
- '192.168.1.11:9100' # Master-2
- '192.168.1.31:9100' # Worker-1
- '192.168.1.32:9100' # Worker-2
# ... 更多Worker节点
relabel_configs:
- source_labels: [__address__]
target_label: instance
# Spark Master监控
- job_name: 'spark-master'
static_configs:
- targets:
- '192.168.1.10:8080' # Master-1
- '192.168.1.11:8080' # Master-2
metrics_path: '/metrics/master/prometheus'
# Spark Worker监控
- job_name: 'spark-worker'
static_configs:
- targets:
- '192.168.1.31:8081'
- '192.168.1.32:8081'
# ... 更多Worker
metrics_path: '/metrics/worker/prometheus'
# HDFS NameNode监控
- job_name: 'hdfs-namenode'
static_configs:
- targets:
- '192.168.1.60:50070'
- '192.168.1.61:50070'
metrics_path: '/jmx'
# HDFS DataNode监控
- job_name: 'hdfs-datanode'
static_configs:
- targets:
- '192.168.1.31:50075'
- '192.168.1.32:50075'
# ... 更多DataNode
metrics_path: '/jmx'
告警规则配置
# /etc/prometheus/rules/spark_alerts.yml
groups:
- name: spark_alerts
interval: 30s
rules:
# Spark Master宕机告警
- alert: SparkMasterDown
expr: up{job="spark-master"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Spark Master {{ $labels.instance }} 宕机"
description: "Spark Master已宕机超过1分钟"
# Worker节点宕机告警
- alert: SparkWorkerDown
expr: up{job="spark-worker"} == 0
for: 2m
labels:
severity: warning
annotations:
summary: "Spark Worker {{ $labels.instance }} 宕机"
# Executor内存使用率过高
- alert: ExecutorHighMemoryUsage
expr: (spark_executor_memory_used / spark_executor_memory_total) > 0.9
for: 5m
labels:
severity: warning
annotations:
summary: "Executor内存使用率超过90%"
# HDFS磁盘使用率告警
- alert: HDFSDiskUsageHigh
expr: (hdfs_datanode_capacity_used / hdfs_datanode_capacity_total) > 0.85
for: 10m
labels:
severity: warning
annotations:
summary: "HDFS磁盘使用率超过85%"
2.7.2 Grafana Dashboard配置
导入Spark监控Dashboard
{
"dashboard": {
"title": "Apache Sedona Cluster Overview",
"panels": [
{
"title": "集群总览",
"type": "stat",
"targets": [
{
"expr": "count(up{job='spark-worker'}==1)",
"legendFormat": "活跃Worker数"
},
{
"expr": "sum(spark_executor_count)",
"legendFormat": "总Executor数"
},
{
"expr": "sum(spark_application_count)",
"legendFormat": "运行中应用"
}
]
},
{
"title": "CPU使用率",
"type": "graph",
"targets": [
{
"expr": "100 - (avg by(instance) (irate(node_cpu_seconds_total{mode='idle'}[5m])) * 100)"
}
]
},
{
"title": "内存使用率",
"type": "graph",
"targets": [
{
"expr": "(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100"
}
]
},
{
"title": "HDFS存储使用",
"type": "graph",
"targets": [
{
"expr": "hdfs_datanode_capacity_used / hdfs_datanode_capacity_total * 100"
}
]
},
{
"title": "Spark任务执行情况",
"type": "table",
"targets": [
{
"expr": "spark_application_status"
}
]
}
]
}
}
2.7.3 ELK日志收集配置
Filebeat配置 (在各节点部署)
# /etc/filebeat/filebeat.yml
filebeat.inputs:
# Spark Master日志
- type: log
enabled: true
paths:
- /opt/spark/logs/spark-*-master-*.out
fields:
service: spark-master
log_type: application
multiline:
pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
negate: true
match: after
# Spark Worker日志
- type: log
enabled: true
paths:
- /opt/spark/logs/spark-*-worker-*.out
fields:
service: spark-worker
log_type: application
# Spark应用日志
- type: log
enabled: true
paths:
- /opt/spark/work/*/*/stderr
- /opt/spark/work/*/*/stdout
fields:
service: spark-application
log_type: application
# HDFS日志
- type: log
enabled: true
paths:
- /opt/hadoop/logs/hadoop-*-namenode-*.log
- /opt/hadoop/logs/hadoop-*-datanode-*.log
fields:
service: hdfs
log_type: system
# 输出到Logstash
output.logstash:
hosts: ["192.168.1.85:5044"]
compression_level: 3
# 日志处理器
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
Logstash配置
# /etc/logstash/conf.d/spark-pipeline.conf
input {
beats {
port => 5044
}
}
filter {
# 解析Spark日志
if [fields][service] == "spark-master" or [fields][service] == "spark-worker" {
grok {
match => {
"message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{JAVACLASS:class}: %{GREEDYDATA:message}"
}
}
date {
match => [ "timestamp", "ISO8601" ]
target => "@timestamp"
}
}
# 解析HDFS日志
if [fields][service] == "hdfs" {
grok {
match => {
"message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{JAVACLASS:class}: %{GREEDYDATA:message}"
}
}
}
# 添加地理位置信息
geoip {
source => "client_ip"
}
}
output {
elasticsearch {
hosts => ["192.168.1.86:9200", "192.168.1.87:9200", "192.168.1.88:9200"]
index => "spark-logs-%{+YYYY.MM.dd}"
user => "elastic"
password => "${ELASTICSEARCH_PASSWORD}"
}
# 同时输出到标准输出用于调试
# stdout {
# codec => rubydebug
# }
}
3. 网络拓扑与通信
3.1 完整网络拓扑图
┌───────────────────────────────────────────────────────────────────────────────┐
│ 网络拓扑与端口通信图 │
└───────────────────────────────────────────────────────────────────────────────┘
互联网
│
│ HTTPS (443)
│ SSH (22)
▼
┌──────────────────────┐
│ 企业防火墙/VPN │
│ 公网IP: x.x.x.x │
└──────────┬───────────┘
│
┌─────────────────┼─────────────────┐
│ │ │
┌────────────▼───┐ ┌─────────▼────┐ ┌───────▼──────────┐
│ 管理网段 │ │ 业务网段 │ │ 存储网段 │
│ 192.168.1.0/24 │ │ 10.0.0.0/24 │ │ 172.16.0.0/24 │
└────────────────┘ └──────────────┘ └─────────────────┘
│ │ │
│ │ │
┌──────▼──────────────────┐ │ ┌─────────────────▼────────┐
│ 负载均衡层 │ │ │ HDFS存储网络 │
│ VIP: 192.168.1.100 │ │ │ 专用10Gbps网络 │
│ Nginx-1: 192.168.1.101 │ │ │ 低延迟高带宽 │
│ Nginx-2: 192.168.1.102 │ │ └──────────────────────────┘
└────────┬────────────────┘ │
│ │
┌────────▼──────────────────▼──────────────────────┐
│ Spark + HDFS 集群网络 │
│ 192.168.1.0/24 │
│ │
│ Master节点: │
│ ├─ Master-1: 192.168.1.10 │
│ │ ├─ Spark Master: 7077, 8080 │
│ │ └─ History Server: 18080 │
│ └─ Master-2: 192.168.1.11 (备份) │
│ │
│ ZooKeeper集群: │
│ ├─ ZK-1: 192.168.1.20:2181,2888,3888 │
│ ├─ ZK-2: 192.168.1.21:2181,2888,3888 │
│ └─ ZK-3: 192.168.1.22:2181,2888,3888 │
│ │
│ Worker节点 (10-100个): │
│ ├─ Worker-1: 192.168.1.31 │
│ │ ├─ Spark Worker: 8081 │
│ │ └─ HDFS DataNode: 50010, 50075 │
│ ├─ Worker-2: 192.168.1.32 │
│ └─ Worker-N: 192.168.1.50 │
│ │
│ HDFS NameNode: │
│ ├─ NN-1: 192.168.1.60:9000, 50070 │
│ └─ NN-2: 192.168.1.61:9000, 50070 (备份) │
│ │
│ JournalNode集群: │
│ ├─ JN-1: 192.168.1.70:8485 │
│ ├─ JN-2: 192.168.1.71:8485 │
│ └─ JN-3: 192.168.1.72:8485 │
└───────────────────────────────────────────────────┘
3.2 端口详细说明
| 组件 | 端口 | 协议 | 用途 | 访问控制 |
|---|---|---|---|---|
| Spark Master | 7077 | TCP | RPC通信 | 内网 |
| 8080 | HTTP | Web UI | 负载均衡器 | |
| Spark Worker | 8081 | HTTP | Web UI | 内网 |
| Random | TCP | Executor通信 | 内网 | |
| Spark History | 18080 | HTTP | 历史记录UI | 负载均衡器 |
| HDFS NameNode | 9000 | TCP | RPC通信 | 内网 |
| 50070 | HTTP | Web UI | 内网 | |
| HDFS DataNode | 50010 | TCP | 数据传输 | 内网 |
| 50075 | HTTP | HTTP访问 | 内网 | |
| JournalNode | 8485 | TCP | EditLog同步 | 内网 |
| ZooKeeper | 2181 | TCP | 客户端连接 | 内网 |
| 2888 | TCP | Follower通信 | 内网 | |
| 3888 | TCP | Leader选举 | 内网 | |
| Prometheus | 9090 | HTTP | Web UI | 内网 |
| Grafana | 3000 | HTTP | Dashboard | VPN/内网 |
| Elasticsearch | 9200 | HTTP | REST API | 内网 |
| Logstash | 5044 | TCP | Beats输入 | 内网 |
| Kibana | 5601 | HTTP | Web UI | VPN/内网 |
3.3 防火墙规则配置
#!/bin/bash
# firewall-config.sh
# 集群防火墙配置脚本
# ========== Master节点防火墙规则 ==========
# Spark Master
firewall-cmd --permanent --add-port=7077/tcp
firewall-cmd --permanent --add-port=8080/tcp
# History Server
firewall-cmd --permanent --add-port=18080/tcp
# ========== Worker节点防火墙规则 ==========
# Spark Worker
firewall-cmd --permanent --add-port=8081/tcp
# HDFS DataNode
firewall-cmd --permanent --add-port=50010/tcp
firewall-cmd --permanent --add-port=50075/tcp
# ========== HDFS NameNode防火墙规则 ==========
firewall-cmd --permanent --add-port=9000/tcp
firewall-cmd --permanent --add-port=50070/tcp
# ========== ZooKeeper防火墙规则 ==========
firewall-cmd --permanent --add-port=2181/tcp
firewall-cmd --permanent --add-port=2888/tcp
firewall-cmd --permanent --add-port=3888/tcp
# ========== 监控组件防火墙规则 ==========
# Prometheus
firewall-cmd --permanent --add-port=9090/tcp
firewall-cmd --permanent --add-port=9100/tcp # Node Exporter
# Grafana
firewall-cmd --permanent --add-port=3000/tcp
# 重载防火墙规则
firewall-cmd --reload
echo "防火墙规则配置完成"
4. 部署拓扑示例
4.1 小型集群部署 (10节点)
┌─────────────────────────────────────────────────────────┐
│ 小型Sedona集群拓扑 (10节点) │
├─────────────────────────────────────────────────────────┤
│ │
│ 管理节点 (2台): │
│ ┌────────────────────┬────────────────────┐ │
│ │ Master-1 │ Master-2 (备份) │ │
│ │ 192.168.1.10 │ 192.168.1.11 │ │
│ ├────────────────────┼────────────────────┤ │
│ │ - Spark Master │ - Spark Master │ │
│ │ - History Server │ - History Server │ │
│ │ - ZooKeeper │ - ZooKeeper │ │
│ │ - Prometheus │ │ │
│ │ - Grafana │ │ │
│ └────────────────────┴────────────────────┘ │
│ │
│ 元数据节点 (3台): │
│ ┌───────────┬───────────┬───────────┐ │
│ │ NameNode-1│ NameNode-2│ ZooKeeper │ │
│ │ .60 │ .61 │ .62 │ │
│ │ + JN │ + JN │ + JN │ │
│ └───────────┴───────────┴───────────┘ │
│ │
│ 计算+存储节点 (5台): │
│ ┌──────┬──────┬──────┬──────┬──────┐ │
│ │Node-1│Node-2│Node-3│Node-4│Node-5│ │
│ │ .31 │ .32 │ .33 │ .34 │ .35 │ │
│ ├──────┼──────┼──────┼──────┼──────┤ │
│ │Worker│Worker│Worker│Worker│Worker│ │
│ │DataN │DataN │DataN │DataN │DataN │ │
│ └──────┴──────┴──────┴──────┴──────┘ │
│ │
│ 配置规格: │
│ - 管理节点: 16核/64GB/500GB SSD │
│ - 元数据节点: 8核/32GB/500GB SSD │
│ - 计算节点: 32核/128GB/4TB HDD │
│ │
│ 总资源: │
│ - CPU: 208核 │
│ - 内存: 896GB │
│ - 存储: 20TB (HDFS 3副本约6.7TB可用) │
└─────────────────────────────────────────────────────────┘
4.2 中型集群部署 (30节点)
┌─────────────────────────────────────────────────────────┐
│ 中型Sedona集群拓扑 (30节点) │
├─────────────────────────────────────────────────────────┤
│ │
│ 机架1 (10节点): │
│ ┌────────────┐ ┌──────────────────────────────┐ │
│ │ 管理节点×2 │ │ 计算节点×8 │ │
│ │ Master │ │ Worker + DataNode │ │
│ │ + 监控 │ │ 32核/128GB/4TB │ │
│ └────────────┘ └──────────────────────────────┘ │
│ ↕ 10Gbps网络 │
│ 机架2 (10节点): │
│ ┌────────────┐ ┌──────────────────────────────┐ │
│ │ 元数据×3 │ │ 计算节点×7 │ │
│ │ NameNode │ │ Worker + DataNode │ │
│ │ + JN + ZK │ │ 32核/128GB/4TB │ │
│ └────────────┘ └──────────────────────────────┘ │
│ ↕ 10Gbps网络 │
│ 机架3 (10节点): │
│ ┌──────────────────────────────────────┐ │
│ │ 计算节点×10 │ │
│ │ Worker + DataNode │ │
│ │ 32核/128GB/4TB │ │
│ └──────────────────────────────────────┘ │
│ │
│ 总资源: │
│ - CPU: 800核 │
│ - 内存: 3.2TB │
│ - 存储: 100TB (HDFS 3副本约33TB可用) │
│ - 网络: 机架间40Gbps互联 │
└─────────────────────────────────────────────────────────┘
4.3 大型集群部署 (100+节点)
┌───────────────────────────────────────────────────────────┐
│ 大型Sedona集群拓扑 (100节点) │
├───────────────────────────────────────────────────────────┤
│ │
│ 数据中心级别部署 │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 核心机架 (5个机架) │ │
│ │ ├─ 机架1: 管理+监控 (2节点) │ │
│ │ ├─ 机架2: 元数据+协调 (5节点) │ │
│ │ ├─ 机架3: 高性能计算 (20节点, SSD) │ │
│ │ ├─ 机架4: 大容量存储 (20节点, HDD) │ │
│ │ └─ 机架5: 混合节点 (20节点) │ │
│ └─────────────────────────────────────────────────┘ │
│ ↕ 100Gbps核心交换机 │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 扩展机架 (5个机架, 每机架20节点) │ │
│ │ ├─ 机架6-10: 标准计算节点 │ │
│ │ │ 配置: 64核/256GB/8TB │ │
│ │ └─ 总计: 100个计算节点 │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ 资源汇总: │
│ ├─ CPU: 6400+核 │
│ ├─ 内存: 25TB+ │
│ ├─ 存储: 800TB (HDFS约260TB可用) │
│ ├─ 并发Executor: 600+个 │
│ └─ 处理能力: PB级数据/日 │
│ │
│ 网络架构: │
│ ├─ 核心层: 100Gbps │
│ ├─ 汇聚层: 40Gbps │
│ └─ 接入层: 10Gbps │
└───────────────────────────────────────────────────────────┘
5. 高可用架构
5.1 完整HA架构图
┌───────────────────────────────────────────────────────────────┐
│ Apache Sedona 高可用架构 │
├───────────────────────────────────────────────────────────────┤
│ │
│ 第1层: 负载均衡HA │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ VIP: 192.168.1.100 (Keepalived VRRP) │ │
│ │ ├─ Nginx-1 (Master, Priority 100) │ │
│ │ └─ Nginx-2 (Backup, Priority 90) │ │
│ │ 故障转移: <3秒 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │ │
│ 第2层: Spark Master HA │
│ ┌──────────────────────────▼──────────────────────────┐ │
│ │ ZooKeeper选举机制 │ │
│ │ ├─ Master-1 (Active) │ │
│ │ │ └─ 处理所有请求 │ │
│ │ └─ Master-2 (Standby) │ │
│ │ └─ 同步状态,随时接管 │ │
│ │ 故障转移: <30秒 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │ │
│ 第3层: HDFS NameNode HA │
│ ┌──────────────────────────▼──────────────────────────┐ │
│ │ QJM + ZKFC自动故障转移 │ │
│ │ ├─ NN-1 (Active) │ │
│ │ │ ├─ 处理元数据请求 │ │
│ │ │ └─ 写EditLog到JournalNode │ │
│ │ └─ NN-2 (Standby) │ │
│ │ ├─ 从JournalNode读EditLog │ │
│ │ └─ 保持元数据同步 │ │
│ │ 故障转移: <30秒 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │