TL;DR
- 场景:在 Ubuntu 云主机上用 Docker Compose 快速起 Kudu 集群(Master×3,TServer×5)。
- 结论:示例可直接跑通,但需注意 KUDU_QUICKSTART_IP、NTP、Hole Punching、端口与副本因子。
- 产出:一套可复制的部署骨架 + 版本矩阵 + 常见错误速查卡(含定位/修复指令)。
版本矩阵
| 状态 | 项目 | 说明 |
|---|---|---|
| ✅ | Ubuntu 云服务器 | 三台小规格;h121 运行 Master,h122/h123 运行 TabletServer |
| ✅ | Docker Compose v2 | 使用官方 quickstart.yml(Compose file v3),服务/卷定义可直接 up -d |
| ⚠️ | Kudu 镜像版本 | KUDU_QUICKSTART_VERSION 未固定;建议 pin 到具体 tag(如 1.x.y) |
| ⚠️ | 时钟同步 | 示例中 --use_hybrid_clock=false 便于演示;生产建议开启 NTP + Hybrid Clock |
| ⚠️ | 文件系统 Hole Punching | 需 ext4/xfs 支持;云盘/老内核可能缺特性,影响磁盘回收 |
| ✅ | 端口规划 | 7051/8051/7050 等与示例一致;注意宿主机冲突与安全组 |
| ⚠️ | 存储介质 | 强烈建议 SSD;机械盘可能导致吞吐下降、尾延时飙升 |
| ⚠️ | 副本与容错 | 单 Master 仅演示;生产需 3 Master + ≥3 TServer,表级副本因子≥3 |
安装准备
硬件准备
- 一台或者多台跑kudu-master。建议一个Master(无容错机制)、三个Master(允许一个节点出错)、五个Master(允许两个节点出错)
- 一台或者多台机器跑kudu-server。当需要使用副本,至少需要三个节点运行kudu-server服务。
操作系统
- Ubuntu云服务器(我的环境是三台小云服务器)
- 内核和文件系统支持 Hole Punching 选项。
- NTP 服务
- xfs or ext4 formatterd drivers
存储要求
- 尽量使用固态存储,显著提供kudu性能
环境说明
- 如果你使用的是CDH,需要ClouderaManager 5.4.3 及以上的版本。
- 三台云服务器,h121启动Master,h122和123启动TabletServer。
Dockerfile
https://github.com/apache/kudu/blob/master/docker/quickstart.yml
官方的配置文件为:
- 3个Master
- 4个TabletServer
version: "3"
services:
kudu-master-1:
image: apache/kudu:${KUDU_QUICKSTART_VERSION:-latest}
ports:
- "7051:7051"
- "8051:8051"
command: ["master"]
volumes:
- kudu-master-1:/var/lib/kudu
environment:
- KUDU_MASTERS=kudu-master-1:7051,kudu-master-2:7151,kudu-master-3:7251
- >
MASTER_ARGS=--fs_wal_dir=/var/lib/kudu/master
--rpc_bind_addresses=0.0.0.0:7051
--rpc_advertised_addresses=${KUDU_QUICKSTART_IP:?Please set KUDU_QUICKSTART_IP environment variable}:7051
--webserver_port=8051
--webserver_advertised_addresses=${KUDU_QUICKSTART_IP}:8051
--webserver_doc_root=/opt/kudu/www
--stderrthreshold=0
--use_hybrid_clock=false
--unlock_unsafe_flags=true
kudu-master-2:
image: apache/kudu:${KUDU_QUICKSTART_VERSION:-latest}
ports:
- "7151:7151"
- "8151:8151"
command: ["master"]
volumes:
- kudu-master-2:/var/lib/kudu
environment:
- KUDU_MASTERS=kudu-master-1:7051,kudu-master-2:7151,kudu-master-3:7251
- >
MASTER_ARGS=--fs_wal_dir=/var/lib/kudu/master
--rpc_bind_addresses=0.0.0.0:7151
--rpc_advertised_addresses=${KUDU_QUICKSTART_IP}:7151
--webserver_port=8151
--webserver_advertised_addresses=${KUDU_QUICKSTART_IP}:8151
--webserver_doc_root=/opt/kudu/www
--stderrthreshold=0
--use_hybrid_clock=false
--unlock_unsafe_flags=true
kudu-master-3:
image: apache/kudu:${KUDU_QUICKSTART_VERSION:-latest}
ports:
- "7251:7251"
- "8251:8251"
command: ["master"]
volumes:
- kudu-master-3:/var/lib/kudu
environment:
- KUDU_MASTERS=kudu-master-1:7051,kudu-master-2:7151,kudu-master-3:7251
- >
MASTER_ARGS=--fs_wal_dir=/var/lib/kudu/master
--rpc_bind_addresses=0.0.0.0:7251
--rpc_advertised_addresses=${KUDU_QUICKSTART_IP}:7251
--webserver_port=8251
--webserver_advertised_addresses=${KUDU_QUICKSTART_IP}:8251
--webserver_doc_root=/opt/kudu/www
--stderrthreshold=0
--use_hybrid_clock=false
--unlock_unsafe_flags=true
kudu-tserver-1:
image: apache/kudu:${KUDU_QUICKSTART_VERSION:-latest}
depends_on:
- kudu-master-1
- kudu-master-2
- kudu-master-3
ports:
- "7050:7050"
- "8050:8050"
command: ["tserver"]
volumes:
- kudu-tserver-1:/var/lib/kudu
environment:
- KUDU_MASTERS=kudu-master-1:7051,kudu-master-2:7151,kudu-master-3:7251
- >
TSERVER_ARGS=--fs_wal_dir=/var/lib/kudu/tserver
--rpc_bind_addresses=0.0.0.0:7050
--rpc_advertised_addresses=${KUDU_QUICKSTART_IP}:7050
--webserver_port=8050
--webserver_advertised_addresses=${KUDU_QUICKSTART_IP}:8050
--webserver_doc_root=/opt/kudu/www
--stderrthreshold=0
--use_hybrid_clock=false
--unlock_unsafe_flags=true
kudu-tserver-2:
image: apache/kudu:${KUDU_QUICKSTART_VERSION:-latest}
depends_on:
- kudu-master-1
- kudu-master-2
- kudu-master-3
ports:
- "7150:7150"
- "8150:8150"
command: ["tserver"]
volumes:
- kudu-tserver-2:/var/lib/kudu
environment:
- KUDU_MASTERS=kudu-master-1:7051,kudu-master-2:7151,kudu-master-3:7251
- >
TSERVER_ARGS=--fs_wal_dir=/var/lib/kudu/tserver
--rpc_bind_addresses=0.0.0.0:7150
--rpc_advertised_addresses=${KUDU_QUICKSTART_IP}:7150
--webserver_port=8150
--webserver_advertised_addresses=${KUDU_QUICKSTART_IP}:8150
--webserver_doc_root=/opt/kudu/www
--stderrthreshold=0
--use_hybrid_clock=false
--unlock_unsafe_flags=true
kudu-tserver-3:
image: apache/kudu:${KUDU_QUICKSTART_VERSION:-latest}
depends_on:
- kudu-master-1
- kudu-master-2
- kudu-master-3
ports:
- "7250:7250"
- "8250:8250"
command: ["tserver"]
volumes:
- kudu-tserver-3:/var/lib/kudu
environment:
- KUDU_MASTERS=kudu-master-1:7051,kudu-master-2:7151,kudu-master-3:7251
- >
TSERVER_ARGS=--fs_wal_dir=/var/lib/kudu/tserver
--rpc_bind_addresses=0.0.0.0:7250
--rpc_advertised_addresses=${KUDU_QUICKSTART_IP}:7250
--webserver_port=8250
--webserver_advertised_addresses=${KUDU_QUICKSTART_IP}:8250
--webserver_doc_root=/opt/kudu/www
--stderrthreshold=0
--use_hybrid_clock=false
--unlock_unsafe_flags=true
kudu-tserver-4:
image: apache/kudu:${KUDU_QUICKSTART_VERSION:-latest}
depends_on:
- kudu-master-1
- kudu-master-2
- kudu-master-3
ports:
- "7350:7350"
- "8350:8350"
command: ["tserver"]
volumes:
- kudu-tserver-4:/var/lib/kudu
environment:
- KUDU_MASTERS=kudu-master-1:7051,kudu-master-2:7151,kudu-master-3:7251
- >
TSERVER_ARGS=--fs_wal_dir=/var/lib/kudu/tserver
--rpc_bind_addresses=0.0.0.0:7350
--rpc_advertised_addresses=${KUDU_QUICKSTART_IP}:7350
--webserver_port=8350
--webserver_advertised_addresses=${KUDU_QUICKSTART_IP}:8350
--webserver_doc_root=/opt/kudu/www
--stderrthreshold=0
--use_hybrid_clock=false
--unlock_unsafe_flags=true
kudu-tserver-5:
image: apache/kudu:${KUDU_QUICKSTART_VERSION:-latest}
depends_on:
- kudu-master-1
- kudu-master-2
- kudu-master-3
ports:
- "7450:7450"
- "8450:8450"
command: ["tserver"]
volumes:
- kudu-tserver-5:/var/lib/kudu
environment:
- KUDU_MASTERS=kudu-master-1:7051,kudu-master-2:7151,kudu-master-3:7251
- >
TSERVER_ARGS=--fs_wal_dir=/var/lib/kudu/tserver
--rpc_bind_addresses=0.0.0.0:7450
--rpc_advertised_addresses=${KUDU_QUICKSTART_IP}:7450
--webserver_port=8450
--webserver_advertised_addresses=${KUDU_QUICKSTART_IP}:8450
--webserver_doc_root=/opt/kudu/www
--stderrthreshold=0
--use_hybrid_clock=false
--unlock_unsafe_flags=true
volumes:
kudu-master-1:
kudu-master-2:
kudu-master-3:
kudu-tserver-1:
kudu-tserver-2:
kudu-tserver-3:
kudu-tserver-4:
kudu-tserver-5:
内容解释
- version: "3":指定使用 Docker Compose 文件的版本。版本 3 是当前常用的版本,支持多种高级功能,适用于 Docker 1.13.0 及更高版本。
- services:定义了多个服务,每个服务对应一个 Docker 容器。在本配置中,定义了多个 Kudu Master 和 Kudu Tablet Server(简称 TServer)。
- volumes:定义了持久化存储卷,用于存储各个服务的数据,确保即使容器重新创建或删除,数据仍然保留。
3 个 Kudu Master 节点:
- kudu-master-1
- kudu-master-2
- kudu-master-3
5 个 Kudu Tablet Server 节点:
- kudu-tserver-1
- kudu-tserver-2
- kudu-tserver-3
- kudu-tserver-4
- kudu-tserver-5
Master
每个 Master 节点的配置基本相同,只是端口和持久化卷不同。以下以 kudu-master-1 为例进行解释:
kudu-master-1:
image: apache/kudu:${KUDU_QUICKSTART_VERSION:-latest}
ports:
- "7051:7051"
- "8051:8051"
command: ["master"]
volumes:
- kudu-master-1:/var/lib/kudu
environment:
- KUDU_MASTERS=kudu-master-1:7051,kudu-master-2:7151,kudu-master-3:7251
- >
MASTER_ARGS=--fs_wal_dir=/var/lib/kudu/master
--rpc_bind_addresses=0.0.0.0:7051
--rpc_advertised_addresses=${KUDU_QUICKSTART_IP:?Please set KUDU_QUICKSTART_IP environment variable}:7051
--webserver_port=8051
--webserver_advertised_addresses=${KUDU_QUICKSTART_IP}:8051
--webserver_doc_root=/opt/kudu/www
--stderrthreshold=0
--use_hybrid_clock=false
--unlock_unsafe_flags=true
- udu-master-1:服务名称,标识第一个 Kudu Master 节点。
- image: apache/kudu:${KUDU_QUICKSTART_VERSION:-latest}:指定使用的 Docker 镜像。apache/kudu 是官方 Kudu 镜像。
- ${KUDU_QUICKSTART_VERSION:-latest}:使用环境变量 KUDU_QUICKSTART_VERSION 指定版本,如果未设置,则默认使用 latest。
- ports:"7051:7051":将主机的 7051 端口映射到容器的 7051 端口,用于 Kudu Master 的 RPC 通信。"8051:8051":将主机的 8051 端口映射到容器的 8051 端口,用于 Kudu Master 的 Web 界面。
- command: ["master"]:指定容器启动时运行的命令,这里启动 Kudu Master 进程。
- volumes:kudu-master-1:/var/lib/kudu:将 Docker 卷 kudu-master-1 挂载到容器内的 /var/lib/kudu 目录,用于持久化存储数据。
- KUDU_MASTERS:定义了集群中所有 Master 节点的地址,格式为 hostname:port,以逗号分隔。
启动服务
export KUDU_QUICKSTART_IP=$(ifconfig | grep "inet " | grep -Fv 127.0.0.1 | awk '{print $2}' | tail -1)
docker-compose up -d
访问服务
http://localhost:8051/
这样我们的服务就顺利的启动了:
错误速查
| 症状 | 根因定位 | 修复 |
|---|---|---|
| kudu-master容器反复重启/无法加入集群 | 未设置或设置了错误的KUDU_QUICKSTART_IP,广告地址不可达 | docker logs kudu-master-1查看绑定与Advertised地址;ip addr/hostname -i对比;export KUDU_QUICKSTART_IP=$(hostname -I) |
| 访问http://localhost:8051打不开 | 端口未映射/被占用或安全组未放通 | docker ps看端口;ss -lntp查冲突;云厂商安全组修改Compose映射或释放端口;放通8051 |
| tserver日志报"Could not resolve master addresses" | KUDU_MASTERS主机名不可解析/写错端口 | docker logs kudu-tserver-1;getent hosts kudu-master-1;在Compose网络内使用服务名与正确端口;保持三项一致 |
| 创建表报副本不足或健康度红灯 | TServer数量<副本因子 | kudu cluster ksck或Web UI看副本布局;演示将表副本因子设为1;生产扩容至≥3 TServer |
| 吞吐低/磁盘膨胀明显 | FS不支持Hole Punching/机械盘 | dmesg、xfs_info/tune2fs -l;fallocate -punch自检;切换到xfs/ext4(支持punch);优先SSD |
| 偶发时钟相关告警/事务异常 | 未启用NTP/时间漂移 | timedatectl、chronyc sources -v;启用chrony/systemd-timesyncd;生产启用Hybrid Clock |
| 容器重启后数据丢失 | 卷未持久化或被清理 | docker volume ls/inspect;使用命名卷或绑定宿主目录;避免docker system prune -a |
| Bind报错或端口冲突 | 宿主机已有服务占用 | ss -lntp;调整宿主机端口映射(如7051→17051/8051→18051) |
其他系列
🚀 AI篇持续更新中(长期更新)
AI炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有部署 测试上手 架构研究,持续打造实用AI工具指南! AI-调查研究-108-具身智能 机器人模型训练全流程详解:从预训练到强化学习与人类反馈
💻 Java篇持续更新中(长期更新)
Java-154 深入浅出 MongoDB 用Java访问 MongoDB 数据库 从环境搭建到CRUD完整示例 MyBatis 已完结,Spring 已完结,Nginx已完结,Tomcat已完结,分布式服务正在更新!深入浅出助你打牢基础!
📊 大数据板块已完成多项干货更新(300篇):
包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈! 大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解