Apache Sedona 集群架构与部署详解

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 设计原则

  1. 高可用性 (High Availability)

    • 所有关键组件都有冗余
    • 无单点故障 (No Single Point of Failure)
    • 自动故障转移 (Automatic Failover)
  2. 水平扩展性 (Horizontal Scalability)

    • 可按需添加节点扩展集群
    • 线性性能提升
    • 动态资源分配
  3. 数据本地性 (Data Locality)

    • 计算靠近数据
    • 减少网络传输
    • 提升处理性能
  4. 故障隔离 (Fault Isolation)

    • 节点故障不影响整体
    • 任务自动重试
    • 数据多副本保护
  5. 可观测性 (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秒                                      │   │
│  └──────────────────────────────────────────────────────┘   │
│                             │
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容