大数据-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 foundODS 表尚未创建先建库建表(含 dt 分区字段),再执行 add partition
每日跑完 HDFS 出现大量小文件channel>1 或多次 append 叠加小表固定 channel=1;大表控制并行与切分;必要时落地后做合并
增量表重复/漏数”导出前一天数据”口径依赖时间字段增量用闭开区间(>=start and <end);引入延迟窗口