文章概述
本文介绍离线数仓 ADS 层 Hive 表导出到 MySQL 的完整方案,使用 DataX 的 hdfsreader + mysqlwriter 组合。
一、架构说明
文章描述了离线数仓的整体流程:ODS → DWD → DWS → ADS → DataX 导出到 MySQL。ADS 层有 4 张表需要导出:
- ads.ads_member_active_count(活跃会员数)
- ads.ads_member_retention_count(会员留存数)
- ads.ads_member_retention_rate(会员留存率)
- ads.ads_new_member_cnt(新增会员数)
二、MySQL 建表语句
-- 创建数据库和表
create database dwads;
-- 活跃会员数表
create table dwads.ads_member_active_count(
`dt` varchar(10) COMMENT '统计日期',
`day_count` int COMMENT '当日会员数量',
`week_count` int COMMENT '当周会员数量',
`month_count` int COMMENT '当月会员数量',
primary key (dt)
);
-- 新增会员数表
create table dwads.ads_new_member_cnt(
`dt` varchar(10) COMMENT '统计日期',
`cnt` int,
primary key (dt)
);
-- 会员留存数表
create table dwads.ads_member_retention_count(
`dt` varchar(10) COMMENT '统计日期',
`add_date` varchar(10) comment '新增日期',
`retention_day` int comment '截止当前日期留存天数',
`retention_count` bigint comment '留存数',
primary key (dt)
);
-- 会员留存率表
create table dwads.ads_member_retention_rate(
`dt` varchar(10) COMMENT '统计日期',
`add_date` varchar(10) comment '新增日期',
`retention_day` int comment '截止当前日期留存天数',
`retention_count` bigint comment '留存数',
`new_mid_count` bigint comment '当日会员新增数',
`retention_ratio` decimal(10,2) comment '留存率',
primary key (dt)
);
三、DataX JSON 配置示例
{
"job": {
"setting": {
"speed": {
"channel": 1
}
},
"content": [{
"reader": {
"name": "hdfsreader",
"parameter": {
"path": "/user/hive/warehouse/ads.db/ads_member_active_count/dt=$do_date/*",
"defaultFS": "hdfs://h121.wzk.icu:9000",
"column": [
{"type": "string", "value": "$do_date"},
{"index": 0, "type": "string"},
{"index": 1, "type": "string"},
{"index": 2, "type": "string"}
],
"fileType": "text",
"encoding": "UTF-8",
"fieldDelimiter": ","
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"writeMode": "replace",
"username": "hive",
"password": "hive@wzk.icu",
"column": ["dt","day_count","week_count","month_count"],
"preSql": [""],
"connection": [{
"jdbcUrl": "jdbc:mysql://h122.wzk.icu:3306/dwads?useUnicode=true&characterEncoding=utf-8",
"table": ["ads_member_active_count"]
}]
}
}
}]
}
}
四、执行命令
python datax.py -p "-Ddo_date=2020-07-21" /opt/wzk/datax/export_member_active_count.json
五、Shell 脚本模板
#!/bin/bash
JSON=/opt/wzk/datax
source /etc/profile
if [ -n "$1" ]; then
do_date=$1
else
do_date=`date -d "-1 day" +%F`
fi
python $DATAX_HOME/bin/datax.py -p "-Ddo_date=$do_date" $JSON/export_member_active_count.json
六、错误速查表
| 症状 | 根因定位 | 修复方法 |
|---|---|---|
| DataX 运行成功但 MySQL 没数据 | HDFS 路径匹配不到分区目录 | 检查 DataX 日志 reader 侧 record 数;验证 HDFS 目录是否存在;确认 -Ddo_date 参数传入 |
| FileNotFoundException | path 写错/分区目录缺失 | hdfs dfs -ls 验证路径;确保 Hive 表已生成对应分区数据 |
| Unknown database/table | MySQL 库表未建 | 先建库建表;保持 jdbcUrl 库名一致 |
| Data truncation 错误 | 列类型/顺序不匹配 | 核对 reader column index 与 writer column 顺序一致 |
| replace 覆盖异常 | 主键设计不合理 | 为多维明细表设计联合主键或改用 insert |
| JSON 解析失败 | JSON 格式不合法 | 用单行字符串写 jdbcUrl;用 jq 校验 JSON |
| Communications link failure | 网络/端口/权限问题 | telnet 测试端口;检查账号密码和授权 |
| datax.py: command not found | DATAX_HOME 未生效 | 确认环境变量;使用绝对路径 |
| 读到数据但 dt 不对 | 参数没传或变量名不一致 | 检查 -Ddo_date 与 JSON 中变量名保持一致 |
七、重要注意事项
- 版本兼容性:DataX 3.x 插件参数可能因发行包略有差异
- 存储格式:hdfsreader 只能读取文本文件,不支持 ORC/Parquet 格式
- Kerberos 场景:需要额外配置认证和 HA 相关参数
- writeMode 选择:replace 依赖主键/唯一键,需合理设计表结构