想在一台 8G 内存的虚拟机上把数仓链路完整跑一遍,卡死与端口冲突几乎必然发生:五个组件的默认堆内存相加就超过物理内存,HBase 还非要等 HDFS、ZooKeeper 都就绪才肯起来。
网上常见教程一次只讲一个组件,装完 Hadoop 就收工,Kafka 与 DataX 怎么衔接、CDC 增量如何与全量对齐全靠自己猜,缺一张把版本、端口、内存、启动顺序一次钉死的总表。
本文分享一套单机可复用的落地路径:资源规划表 + 启动编排脚本 + DataX 全量与 Flink CDC 增量双通道,可直接落地。
一、问题:单机全家桶最容易翻车的三处
单机环境翻车通常只有三个来源,逐条拆开看:
- 内存超卖:NameNode、RegionServer、Kafka Broker、TaskManager 各按默认堆分配,8G 机器直接被 OOM Killer 杀掉。
- 启动顺序错:ZooKeeper 没稳就启 HBase,或 HDFS 未就绪就跑 DataX,报错信息却指向毫不相干的组件。
- 端口互相踩:默认端口在同一网卡上抢占,服务进程都在,连接却全部 refused。
核心结论:先把资源预算和依赖顺序写死,再谈任何参数调优。
二、规划:版本、端口与内存一张表锁死
版本与端口先钉死,后面每次排错都有参照基准:
| 组件 | 版本 | 关键端口 | 内存预算 |
|---|---|---|---|
| JDK | 8u372 | - | - |
| Hadoop | 3.3.6 | 9870 / 9866 / 8088 | 1.5G |
| ZooKeeper | 3.8.4 | 2181 | 0.5G |
| HBase | 2.5.8 | 16010 / 16000 | 1.5G |
| Kafka | 3.6.1 | 9092 | 1.0G |
| Flink | 1.18.1 | 8081 | 1.5G |
- DataX 不常驻:它在提交端以进程方式跑,单任务给 1G 堆即可,跑完即退出,不占长期预算。
- ZooKeeper 复用:HBase 自带单机 ZK,省掉一个独立进程的 0.5G。
预算口诀:常驻组件 6G + 系统与 DataX 2G,绝不让默认堆配置自己做主。

三、启动:JDK、免密与依赖顺序编排
按依赖顺序写死一份启动脚本,比手工逐条敲命令稳得多:
#!/usr/bin/env bash
# 单机启动编排:按依赖顺序拉起,任一步失败立即退出
set -e
export HADOOP_HOME=/opt/hadoop-3.3.6
export HBASE_HOME=/opt/hbase-2.5.8
$HADOOP_HOME/sbin/start-dfs.sh # HDFS 先行,HBase 的 rootdir 在其上
$HADOOP_HOME/sbin/start-yarn.sh
$HBASE_HOME/bin/start-hbase.sh # 自带单机 ZooKeeper
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties
# NameNode 没就绪就不算启动成功,避免 DataX 早跑早失败
until curl -sf http://localhost:9870 >/dev/null; do sleep 2; done
jps | grep -E "NameNode|DataNode|HMaster|Kafka"
- SSH 免密前置:
ssh-keygen -t rsa后把公钥写进authorized_keys,否则start-dfs.sh会卡在密码提示。 - 就绪探针兜底:用
curl轮询 9870,比sleep 10这种拍脑袋等待可靠得多。
强依赖顺序:HDFS → YARN → HBase → Kafka,且必须等 NameNode 就绪。
四、入仓:Kafka 主题与 DataX 全量任务
全量补数交给 DataX,一次性把 MySQL 历史订单灌进 HBase:
{
"job": {
"setting": {"speed": {"channel": 2}, "errorLimit": {"record": 0}},
"content": [{
"reader": {"name": "mysqlreader", "parameter": {
"connection": [{"table": ["orders"], "jdbcUrl": ["jdbc:mysql://192.168.56.10:3306/shop"]}],
"username": "root", "password": "root",
"column": ["id", "amount", "update_time"]}},
"writer": {"name": "hbase11xwriter", "parameter": {
"zkQuorum": "localhost:2181", "table": "orders", "mode": "hbase",
"encoding": "utf-8", "nullMode": "skip",
"rowkeyColumn": [{"name": "rowkey", "column": "id", "type": "string"}],
"column": [{"name": "cf:amount", "column": "amount", "type": "string"}]}}
}]
}
}
- 先建主题:
kafka-topics.sh --create --topic order_binlog --partitions 3 --replication-factor 1,分区数在创建时就要给够。 - 通道分工:DataX 只负责历史全量,写入用 rowkey = 业务主键,保证与后续增量天然可去重。
全量补数走 DataX,增量变更走 CDC,两条通道互不阻塞。

五、增量:Flink CDC 捕获变更并分流到 Kafka
增量变更交给 Flink CDC,订阅 binlog 后直接分流到 Kafka:
-- Flink 1.18 SQL Client 中执行:订阅 MySQL binlog 并写入 Kafka
CREATE TABLE orders_cdc (
id BIGINT, amount DECIMAL(10,2), update_time TIMESTAMP(3),
PRIMARY KEY (id) NOT ENFORCED
) WITH (
'connector' = 'mysql-cdc', 'hostname' = '192.168.56.10', 'port' = '3306',
'username' = 'flink', 'password' = 'flink',
'database-name' = 'shop', 'table-name' = 'orders'
);
CREATE TABLE order_sink (
id BIGINT, amount DECIMAL(10,2)
) WITH (
'connector' = 'kafka', 'topic' = 'order_binlog',
'properties.bootstrap.servers' = 'localhost:9092', 'format' = 'json'
);
INSERT INTO order_sink SELECT id, amount FROM orders_cdc;
- 前置条件:
my.cnf里必须binlog_format=ROW,否则 CDC 只能拿到语句拿不到行镜像。 - 账号权限:给 Flink 单独建只读账号并授予
REPLICATION SLAVE、SELECT,不要复用 root。
核心结论:全量定基准、增量跟变更,Flink CDC 保证断点续读不丢一行。
六、验证:端到端联调与排错对照
端到端跑通后,把最常见的四类故障固化成对照表:
| 现象 | 定位点 | 处置 |
|---|---|---|
| HBase UI 打不开 | jps 缺 HMaster | 先起 start-dfs.sh,rootdir 在 HDFS 上 |
| DataX 报 connection refused | jdbcUrl 用的宿主机地址 | 改成 VM 内网 IP,网卡别用仅主机模式 |
| CDC 读不到数据 | binlog_format 非 ROW | 改 binlog_format=ROW 并重启 MySQL |
| Kafka 消费为空 | 主题分区数为 0 | 建主题时显式 --partitions 3 |
验证顺序建议:先 hbase shell 查一行全量数据,再改 MySQL 触发一条 UPDATE,最后 kafka-console-consumer 看增量是否到位。
端到端判据:全量可查、增量可追、断点可续,三者齐了才算链路真正跑通。

结语
单机环境的价值不在于性能,而在于把整条链路的依赖关系、资源边界和故障形态压缩到一个可观测的盒子里:HDFS 就绪与否、CDC 断点在哪、DataX 走的哪条通道,全部能在一台机器上看到全过程。这套规划表 + 启动脚本 + 双通道作业的组合,既能作为学习样板,也能在扩容到多节点时直接复用配置思路。
真正可迁移的经验是两条:资源先预算、依赖先排序,其余参数调优都是在此之上的微调。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/2301_78967866/article/details/169844983




