Docker 大数据集群高可用部署
#Docker Compose 编排的 32 容器全组件 HA 大数据集群,用于本地测试与学习。
架构概述
# ┌─────────────────────────────────────────────────┐
│ Docker Bridge: bigdata-net │
│ 172.25.0.0/16 │
├─────────────────────────────────────────────────┤
│ Layer 0 (base): MySQL + ZooKeeper x3 │
│ Layer 1 (storage): JournalNode x3 │
│ Layer 2 (storage): NameNode x2 + ZKFC x2 │
│ Layer 3 (storage): DataNode x3 │
│ Layer 4 (compute): ResourceManager x2 + NM x3 │
│ Layer 5 (analytics): Hive Metastore/Server2 │
│ Layer 6 (analytics): HBase x5 + Kafka x3 │
│ Layer 7 (analytics): Spark + Flink History │
└─────────────────────────────────────────────────┘
| 组件 | 版本 | HA 方案 | 容器数 |
|---|
| HDFS | 3.3.6 | 双 NameNode + 3 JournalNode + ZKFC | 10 |
| YARN | 3.3.6 | 双 ResourceManager + ZK 状态存储 | 6 |
| ZooKeeper | 3.7.1 | 3 节点仲裁 | 3 |
| HBase | 2.6.4 | 双 Master + ZK 发现 | 5 |
| Hive | 3.1.3 | Metastore + Server2(独立容器) | 2 |
| Kafka | 2.8.0 | 3 Broker + ZK 协调 | 3 |
| Spark | 3.5.8 | History Server(YARN 模式按需提交) | 1 |
| Flink | 1.19.1 | History Server(YARN 模式按需提交) | 1 |
| MySQL | 5.7 | — | 1 |
总计:32 容器,~10-11GB 内存
前置要求
#- Docker Desktop 24+(Windows/Mac/Linux)
- 16GB+ RAM(建议关闭其他大型应用)
- 50GB+ 磁盘空间
- 组件二进制包已缓存到
ansible/files/cache/
快速开始
#cd docker
# 1. 构建统一镜像(首次 ~10-20分钟)
make build
# 2. 分层启动(或一键全量 make all)
make base # Layer 0: MySQL + ZKx3
make storage # Layer 1-3: HDFS HA
make compute # Layer 4: YARN HA
make analytics # Layer 5-7: Hive + HBase + Kafka + Spark/Flink
# 或一键启动
make all
# 3. 首次部署:初始化 HDFS
make init-hdfs
# 4. 验证测试
make verify # Level 1 冒烟测试
make verify-spark # Level 2a Spark
make verify-flink # Level 2b Flink
make verify-ha # Level 3 HA 故障转移
分层启动指南
#从零开始按需启动,低内存环境可不启动全部:
| 层级 | 命令 | 服务 | 内存 |
|---|
| Layer 0 | make base | MySQL, ZKx3 | ~1.5GB |
| Layer 1-3 | make storage | JNx3, NNx2, ZKFCx2, DNx3 | ~3.5GB |
| Layer 4 | make compute | RMx2, NMx3, JobHistory | ~2.5GB |
| Layer 5-7 | make analytics | Hivex2, HBasex5, Kafkax3, Spark/Flink Historyx2 | ~3.5GB |
全部命令参考
#| 命令 | 说明 |
|---|
make build | 构建统一镜像 |
make all | 一键全量启动 |
make base | 启动基础设施层 |
make storage | 启动 HDFS HA 存储层 |
make compute | 启动 YARN HA 计算层 |
make analytics | 启动分析层(Hive/HBase/Kafka/Spark/Flink) |
make status | 容器资源占用 |
make ps | 容器列表 |
make verify | Level 1 冒烟测试(7项) |
make verify-spark | Level 2a Spark 功能验证 |
make verify-flink | Level 2b Flink 功能验证 |
make verify-ha | Level 3 HA 故障转移测试(10项) |
make init-hdfs | HDFS 首次格式化+初始化 |
make stop | 反向停止所有服务 |
make restart | 重启全部 |
make clean | 清理容器和网络 |
make logs | 查看全部日志 |
make logs-<name> | 查看指定容器日志 |
make shell-<name> | 进入指定容器 |
验证测试
#Level 1: 冒烟测试(7项)
#| # | 测试项 | 验证内容 |
|---|
| S1 | HDFS 读写 | 写入→读取→删除 |
| S2 | YARN 节点 | >=3 个 NM RUNNING |
| S3 | ZK 集群 | 1 leader + 2 follower |
| S4 | Hive Metastore | 端口 9083 可达 |
| S5 | HiveServer2 | 端口 10000 可达 |
| S6 | HBase Shell | status 命令正常 |
| S7 | Kafka E2E | 创建→生产→消费→删除 |
Level 2: Spark/Flink 功能测试(6项)
#| # | 测试项 |
|---|
| SP1 | Spark Pi(YARN cluster 模式) |
| SP2 | Spark SQL 查询 |
| SP3 | Spark History Server HTTP |
| FL1 | Flink YARN Session 创建 |
| FL2 | Flink WordCount 批作业 |
| FL3 | Flink History Server HTTP |
Level 3: HA 故障转移测试(10项)
#| # | 测试项 | 故障注入 |
|---|
| HA1 | NN 故障转移 | 停 namenode-active |
| HA2 | NN 恢复 | 启 namenode-active |
| HA3 | HDFS 容错 | NN 切换后读写 |
| HA4 | RM 故障转移 | 停 resourcemanager-1 |
| HA5 | Spark on HA | RM 切换后提交 |
| HA6 | Flink on HA | RM 切换后 Session |
| HA7 | HMaster 转移 | 停 hbase-master-1 |
| HA8 | JN 容错 | 停 1/3 JN |
| HA9 | ZK 容错 | 停 1/3 ZK |
| HA10 | Kafka 容错 | 停 1/3 Broker |
Web UI 访问
#| 服务 | URL |
|---|
| NameNode Active | http://localhost:9870 |
| NameNode Standby | http://localhost:9871 |
| YARN RM1 | http://localhost:8088 |
| YARN RM2 | http://localhost:8089 |
| JobHistory | http://localhost:19888 |
| HBase Master1 | http://localhost:16010 |
| HBase Master2 | http://localhost:16011 |
| Spark History | http://localhost:18080 |
| Flink History | http://localhost:8082 |
故障排查
#容器启动失败
#docker compose --profile <name> logs # 查看该层日志
make logs-<container_name> # 查看特定容器日志
make shell-<container_name> # 进入容器排查
内存不足
#- 调整
.env 中 JVM 堆参数(如 NAMENODE_HEAP=128m) - 按分层启动而非一键全量
- 关闭 Windows 上其他大型应用
HDFS 不正常
#make init-hdfs # 重新格式化(会丢失数据)
docker compose --profile storage restart # 重启存储层
端口冲突
#修改 docker-compose.yml 中 ports 映射(冒号左边为宿主机端口)。
与裸机/Ansible 方案的关系
#| 特性 | Docker 方案 | Ansible 方案 |
|---|
| 用途 | 本地测试/学习 | 生产裸机部署 |
| 内存 | 10-11GB | 12GB+ |
| HA | 全生产级 | 全生产级 |
| 配置 | 独立 config/ 目录 | Jinja2 模板 |
| 管理 | Makefile + docker compose | ansible-playbook |
| 网络 | Bridge(172.25.0.0/16) | 物理网卡 |