从零打通 MySQL → DataX → Doris:Windows 11 + Docker 本地环境搭建全记录
一个 Java 后端开发的数据仓库入门实战笔记。
一、背景
公司用 DataX + Doris 搭数据仓库。我只写过 SpringBoot,对大数据这套东西完全陌生。花了一个周末把 MySQL → DataX → Doris 的第一条同步链路跑通了,记录一下过程,给同样背景的人参考。
二、这些东西分别是干什么的
1. MySQL 和 Doris 的分工
MySQL 管业务(下单、付款),Doris 管分析(报表、排行)。
MySQL 擅长单次少量行的增删改查。当老板要看"上个月各地区销售额排行",一条 SQL 要扫几百万行,MySQL 跑不动,还会拖慢正常的下单接口。Doris 就是为这种扫描大量数据做汇总的场景设计的。
2. 数据怎么从 MySQL 到 Doris
数仓有一套标准的加工流水线,叫 ETL(抽取→转换→加载):
MySQL 业务表 → DataX 搬运 → Doris 原样落表(ODS层)→ SQL 清洗(DWD层)→ SQL 聚合(DWS层)→ 报表查询各层职责:
- ODS(操作数据层):源表原样搬过来,不改
- DWD(明细数据层):清洗、去重、关联
- DWS(汇总数据层):按维度预聚合(按天/按区域的销售额汇总)
- ADS(应用数据层):直接给报表用的最终结果表
DataX 在这条链里只做一件事:搬运。从 A 读到内存,写到 B,不改数据。配置一个 JSON 文件,指定 reader(从哪读)和 writer(往哪写)就行。
三、环境搭建
1. 总体架构
Windows 11 宿主机 ├── Docker Desktop │ ├── mysql-learn (MySQL 8.0, 端口 3306) │ ├── doris-fe (Doris 前端节点, 端口 9030) │ └── doris-be (Doris 后端节点, 端口 8040) └── DataX (本机 Python 3.8 启动)所有容器在一个自定义 Docker 网络datax-net里,互相用容器名通信。DataX 跑在宿主机上,通过localhost:3306和localhost:9030连数据库。
2. 启动 MySQL
docker network create--subnet=172.19.0.0/16 datax-net docker run-d--name mysql-learn--network datax-net `-e MYSQL_ROOT_PASSWORD=root123 `-e MYSQL_DATABASE=test_db `-p 3306:3306 mysql:8.03. 启动 Doris FE 和 BE
Doris 分两种节点:FE(管理调度)和 BE(存储计算)。学习环境各一个就够了。
# FEdocker run-d--name doris-fe--network datax-net--ip 172.19.0.10 `-e FE_SERVERS="fe1:172.19.0.10:9010"-e FE_ID=1 `-p 8030:8030-p 9030:9030 apache/doris:fe-2.1.9# BEdocker run-d--name doris-be--network datax-net--ip 172.19.0.4 `-e FE_SERVERS="fe1:172.19.0.10:9010"-e BE_ADDR="172.19.0.4:9050"`-p 8040:8040 apache/doris:be-2.1.9关键:固定 IP。容器重启后 IP 会变,BE 失联排查很麻烦。
启动后等 30 秒,验证 BE 存活:
docker exec doris-fe mysql-h 127.0.0.1-P 9030-uroot `-e"SHOW BACKENDS\G"Alive: true即可。
4. 安装 DataX
DataX 是 Python + Java 跑的。官方提供编译好的压缩包,解压即用。
坑点:Python 3.10+ 不兼容。DataX 的启动脚本用了imp模块,Python 3.12 已彻底移除。另装一个 Python 3.8,不改系统 PATH,启动时指定完整路径:
&"C:\Python38\python.exe"datax\bin\datax.py job\job.json四、打通第一条链路
1. 建表
MySQL:
CREATETABLEorders(idBIGINTAUTO_INCREMENTPRIMARYKEY,order_noVARCHAR(32)NOTNULL,user_idBIGINTNOTNULL,productVARCHAR(100)NOTNULL,amountDECIMAL(10,2)NOTNULL,regionVARCHAR(20)NOTNULL,statusTINYINTDEFAULT0,create_timeDATETIMEDEFAULTCURRENT_TIMESTAMP);INSERTINTOorders(...)VALUES(...);-- 插 10 条测试数据Doris:
CREATETABLEorders(idBIGINT,order_noVARCHAR(32),user_idBIGINT,productVARCHAR(100),amountDECIMAL(10,2),regionVARCHAR(20),statusTINYINT,create_timeDATETIME)DUPLICATEKEY(id)DISTRIBUTEDBYHASH(id)BUCKETS4PROPERTIES("replication_num"="1");注意:学习环境只有 1 个 BE,replication_num必须设 1,Doris 默认 3 会报错。
2. DataX 任务 JSON
{"job":{"setting":{"speed":{"channel":1}},"content":[{"reader":{"name":"mysqlreader","parameter":{"username":"root","password":"root123","connection":[{"jdbcUrl":["jdbc:mysql://localhost:3306/test_db"],"table":["orders"]}],"column":["*"]}},"writer":{"name":"mysqlwriter","parameter":{"username":"root","password":"root123","writeMode":"insert","connection":[{"jdbcUrl":"jdbc:mysql://localhost:9030/test_db?useServerPrepStmts=false","table":["orders"]}],"column":["*"]}}}]}}这里有一个反直觉的地方:writer 用的是mysqlwriter,不是doriswriter。因为 Doris 兼容 MySQL 协议,DataX 直接用 JDBC 往 9030 端口写就行。useServerPrepStmts=false必须加,Doris 不支持 MySQL 的预处理语句。
3. 执行
&"C:\Python38\python.exe"datax\bin\datax.py mysql_to_doris_orders.json日志末尾看到读写失败总数 : 0就通了。
五、踩过的坑
1. Docker 内网 IP 宿主机不通
这是最大的坑,绕了最久。
DataX 如果用doriswriter,它会通过 FE 获取 BE 地址,然后直接 HTTP 连 BE(8040 端口)写数据。BE 注册的地址是 Docker 内网 IP(172.19.0.4),宿主机 Windows 根本连不上。
试过 DataX 也放 Docker 里跑——但 Docker Hub 上的 DataX 镜像(beginor/datax)不带doriswriter插件。换datax_web镜像,登录卡了半天,进去后发现也没插件。自己挂载插件又遇到 httpclient jar 版本冲突。
最终解决方案:不用 doriswriter,用 mysqlwriter。Doris 本身就是 MySQL 协议,DataX 通过 JDBC 直接 INSERT,完全不需要走 Stream Load。
2. Python 版本坑
Python 3.14 跑 DataX 直接报错。另装 Python 3.8,不改全局 PATH,启动时指定路径即可。
3. PowserShell 编码
DataX 输出 UTF-8,PowerShell 默认 GBK,中文日志乱码。加上这行:
[System.Console]::OutputEncoding =[System.Text.Encoding]::UTF84. Windows 防火墙
IDEA 连 Docker 里的 MySQL 超时。不关防火墙,只开放端口:
New-NetFirewallRule-DisplayName"MySQL 3306"`-Direction Inbound-Protocol TCP-LocalPort 3306-Action Allow5. MySQL 8.0 认证
JDBC 驱动和caching_sha2_password不兼容:
ALTERUSER'root'@'%'IDENTIFIEDWITHmysql_native_passwordBY'root123';6. Doris 容器重启丢数据
Docker 容器没挂 volume,重启后建过的库表全没了。学习阶段忍了,生产环境必须做持久化。
六、总结
datax-learn/ ├── datax/ # DataX 解压目录 ├── jobs/ │ └── mysql_to_doris_orders.json ├── docs/ │ └── stage1-environment-setup.md └── LEARNING_PLAN.md作为一个只写过 Java 的后端,第一天把三个组件(MySQL、DataX、Doris)串通,感触最深的是:大数据工具的很多问题不是技术难,而是配置多、厂商杂、网络隔离要自己摸索。
把这条路走通了,后面学 DataX 的增量同步、Doris 的数据模型和分区,心里就有底了。
