骑着蜗牛撵大象327头像
一台虚拟机跑通 Hadoop → HBase → Kafka → DataX → Flink CDC:全量与增量双通道落地封面图

一台虚拟机跑通 Hadoop → HBase → Kafka → DataX → Flink CDC:全量与增量双通道落地

想在一台 8G 内存的虚拟机上把数仓链路完整跑一遍,卡死与端口冲突几乎必然发生:五个组件的默认堆内存相加就超过物理内存,HBase 还非要等 HDFS、ZooKeeper 都就绪才肯起来。

网上常见教程一次只讲一个组件,装完 Hadoop 就收工,Kafka 与 DataX 怎么衔接、CDC 增量如何与全量对齐全靠自己猜,缺一张把版本、端口、内存、启动顺序一次钉死的总表。

本文分享一套单机可复用的落地路径:资源规划表 + 启动编排脚本 + DataX 全量与 Flink CDC 增量双通道,可直接落地。

一、问题:单机全家桶最容易翻车的三处

单机环境翻车通常只有三个来源,逐条拆开看:

  • 内存超卖:NameNode、RegionServer、Kafka Broker、TaskManager 各按默认堆分配,8G 机器直接被 OOM Killer 杀掉。
  • 启动顺序错:ZooKeeper 没稳就启 HBase,或 HDFS 未就绪就跑 DataX,报错信息却指向毫不相干的组件。
  • 端口互相踩:默认端口在同一网卡上抢占,服务进程都在,连接却全部 refused。

核心结论:先把资源预算和依赖顺序写死,再谈任何参数调优。

二、规划:版本、端口与内存一张表锁死

版本与端口先钉死,后面每次排错都有参照基准:

组件版本关键端口内存预算
JDK8u372--
Hadoop3.3.69870 / 9866 / 80881.5G
ZooKeeper3.8.421810.5G
HBase2.5.816010 / 160001.5G
Kafka3.6.190921.0G
Flink1.18.180811.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 refusedjdbcUrl 用的宿主机地址改成 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

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--