大数据-242 离线数仓 - DataX 实战:MySQL 全量/增量导入 HDFS + Hive 分区
TL;DR
- 场景:电商离线数仓 ODS 层,MySQL 7 张表每日抽取到 HDFS 并按 dt 分区给 Hive 加载。
- 结论:小表全量 + 大表按可分辨新增字段做增量;DataX channel=1 控小文件;HDFS 先建分区目录再跑作业。
- 产出:可复用 DataX JSON 模板(mysqlreader→hdfswriter)+ 每日调度脚本骨架 + 分区加载命令。
数据导入
MySQL导出:全量导出、增量导出(导出前一天的数据)
业务数据保存在MySQL中,每日凌晨上一天的表数据:
- 表数据量少,采用全量方式导出MySQL
- 表数据量多,而且根据字段能区分出每天新增数据,采用增量的方式导出MySQL
7张表分类:
- 3张增量表:订单表 wzk_trade_orders、订单产品表 wzk_order_produce、产品信息表 wzk_product_info
- 4张全量表:产品分类表 wzk_product_category、商家店铺表 wzk_shops、商家地域组织表 wzk_shop_admin_org、支付方式表 wzk_payments
全量数据导入
MySQL => HDFS => Hive:每日加载全量数据,形成新的分区,MySQL Reader => HDFS Writer
产品分类表配置示例
{
"job": {
"setting": {
"speed": {
"channel": 1
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "hive",
"password": "hive@wzk.icu",
"column": [
"catId",
"parentId",
"catName",
"isShow",
"sortNum",
"isDel",
"createTime",
"level"
],
"connection": [
{
"table": [
"wzk_product_category"
],
"jdbcUrl": [
"jdbc:mysql://h122.wzk.icu:3306/ebiz"
]
}
]
}
},
"writer": {
"name": "hdfswriter",
"parameter": {
"defaultFS": "hdfs://h121.wzk.icu:9000",
"fileType": "text",
"path": "/user/data/trade.db/product_category/dt=$do_date",
"fileName": "product_category_$do_date",
"column": [
{"name": "catId", "type": "INT"},
{"name": "parentId", "type": "INT"},
{"name": "catName", "type": "STRING"},
{"name": "isShow", "type": "TINYINT"},
{"name": "sortNum", "type": "INT"},
{"name": "isDel", "type": "TINYINT"},
{"name": "createTime", "type": "STRING"},
{"name": "level", "type": "TINYINT"}
],
"writeMode": "append",
"fieldDelimiter": ","
}
}
}
]
}
}
数据加载脚本
do_date='2020-07-01'
# 创建目录
hdfs dfs -mkdir -p /user/data/trade.db/product_category/dt=$do_date
# 数据迁移
python $DATAX_HOME/bin/datax.py -p "-Ddo_date=$do_date" /opt/wzk/datax/product_category.json
# 加载数据
hive -e "alter table ods.ods_trade_product_category add partition(dt='$do_date')"
错误速查
| 症状 | 根因定位 | 修复 |
|---|---|---|
| DataX 写入失败:HDFS No such file or directory | 分区目录未提前创建 | 运行前统一创建目录;把”mkdir + datax + add partition”封装成同一个日调脚本 |
| Hive add partition 报错:table not found | ODS 表尚未创建 | 先建库建表(含 dt 分区字段),再执行 add partition |
| 每日跑完 HDFS 出现大量小文件 | channel>1 或多次 append 叠加 | 小表固定 channel=1;大表控制并行与切分;必要时落地后做合并 |
| 增量表重复/漏数 | ”导出前一天数据”口径依赖时间字段 | 增量用闭开区间(>=start and <end);引入延迟窗口 |