文章概述

本文介绍离线数仓 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 参数传入
FileNotFoundExceptionpath 写错/分区目录缺失hdfs dfs -ls 验证路径;确保 Hive 表已生成对应分区数据
Unknown database/tableMySQL 库表未建先建库建表;保持 jdbcUrl 库名一致
Data truncation 错误列类型/顺序不匹配核对 reader column index 与 writer column 顺序一致
replace 覆盖异常主键设计不合理为多维明细表设计联合主键或改用 insert
JSON 解析失败JSON 格式不合法用单行字符串写 jdbcUrl;用 jq 校验 JSON
Communications link failure网络/端口/权限问题telnet 测试端口;检查账号密码和授权
datax.py: command not foundDATAX_HOME 未生效确认环境变量;使用绝对路径
读到数据但 dt 不对参数没传或变量名不一致检查 -Ddo_date 与 JSON 中变量名保持一致

七、重要注意事项

  1. 版本兼容性:DataX 3.x 插件参数可能因发行包略有差异
  2. 存储格式:hdfsreader 只能读取文本文件,不支持 ORC/Parquet 格式
  3. Kerberos 场景:需要额外配置认证和 HA 相关参数
  4. writeMode 选择:replace 依赖主键/唯一键,需合理设计表结构