大数据开发-数据导入流程有关DataX服务器端关于动态传参的示例

前言

我们在上一篇帖子详细介绍了如何利用datax将数据在服务器端从mysql导入linux中,但是对于每日更新的数据我们不可能每日自己手动去导入。这就涉及到了datax的另一个用法:动态传参,自动更新。在大数据开发环境下我们也是默认这样去进行的。

在这里简单介绍下原理:

在 Linux 服务器环境下,实现 DataX 从 MySQL 到 Hive 的动态传参 + 每日自动更新,核心是通过 Shell 脚本动态生成 DataX 任务配置,结合 Crontab 定时调度。以下是全流程操作指南,包含具体目录结构、文件内容、bash 命令及验证步骤。

一、环境配置(可跳过,根据个人配置来即可,这里进当做示例,在上一篇datax帖子也进行了详细的介绍,详情可看上一篇介绍datax导入数据帖子)

假设 Linux 服务器已安装以下组件(未安装的需提前配置):

DataX(解压到 /opt/datax)

MySQL 客户端(mysql-connector-java 驱动已放置)

Hive(HiveServer2 已启动,网络可连通)

Crontab(Linux 自带,用于定时任务)

二、在 Hive 中创建目标表

通过 Hive CLI 或 Beeline 创建分区表 ods_user_dt(与 MySQL 源表结构匹配)。

上一个帖子我们用了beeline这里改成hivecli操作来演试一下命令

# 进入 Hive CLI(本地模式)
hive

# 创建分区表(字段需与 MySQL 源表完全匹配)
hive> CREATE TABLE ods_user_dt (
    id INT,          -- 与 MySQL 的 id(INT)匹配
    name STRING,     -- 与 MySQL 的 name(VARCHAR)匹配
    age INT,         -- 与 MySQL 的 age(INT)匹配
    create_time STRING  -- 与 MySQL 的 create_time(DATETIME)匹配(转成 STRING)
  ) 
  PARTITIONED BY (dt STRING)  -- 按日期分区(字段名必须为 dt)
  ROW FORMAT DELIMITED FIELDS TERMINATED BY ','  -- 字段分隔符(DataX 写入时使用)
  STORED AS TEXTFILE;  -- 存储格式(与 DataX 配置匹配)

# 验证表创建成功
hive> SHOW TABLES LIKE 'ods_user_dt';  -- 应返回 ods_user_dt
hive> DESCRIBE ods_user_dt;  -- 查看字段和分区信息(确认分区字段 dt 存在)

三、创建 DataX 动态模板 JSON

在 DataX 的 job/template/ 目录下创建模板文件 mysql2hive_template.json,使用 ${yesterday} 作为动态日期占位符。

注:动态传参参数为‘’${}‘’表示

# 编写模板文件(关键配置)
cat > /opt/datax/job/template/mysql2hive_template.json << EOF
{
  "job": {
    "setting": { "speed": { "channel": "3" } },  -- 并发数(根据服务器性能调整)
    "content": [{
      "reader": {
        "name": "mysqlreader",
        "parameter": {
          "jdbcUrl": ["jdbc:mysql://mysql-host:3306/source_db?useSSL=false"],  -- MySQL 服务器地址(替换为实际 IP/域名)
          "username": "your_mysql_user",  -- MySQL 用户名(如 root)
          "password": "your_mysql_pass",  -- MySQL 密码(如 123456)
          "table": ["user_info"],  -- MySQL 源表名(替换为实际表名)
          "column": [
            "id", 
            "name", 
            "age", 
            "DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:%s') AS create_time"  -- 时间格式化(与 Hive 的 create_time 字段类型 STRING 匹配)
          ],
          "where": "create_time >= '${yesterday} 00:00:00' AND create_time < '${today} 00:00:00'"  -- 动态时间过滤(仅同步前一天数据)
        }
      },
      "writer": {
        "name": "hivewriter",
        "parameter": {
          "jdbcUrl": "jdbc:hive2://hive-host:10000/default;transportMode=http;httpPath=cliservice",  -- HiveServer2 地址(替换为实际 IP/域名)
          "table": "ods_user_dt",  -- 必须与 Hive 表名完全一致
          "column": ["id", "name", "age", "create_time"],  -- 字段顺序必须与 Hive 表一致
          "partition": "dt=${yesterday}",  -- 动态分区(与 Hive 表的分区字段 dt 匹配)
          "writeMode": "append"  -- 追加写入(避免覆盖历史分区)
        }
      }
    }]
  }
}
EOF

四、编写动态生成脚本(Shell)

在 scripts/ 目录下创建脚本 sync_daily.sh,用于生成动态 JSON 并调用 DataX 执行。

注:同样为动态传参参数为‘’${}‘’表示需要修改为占位符,其余根据自身信息配置你个人的datax的信息。

# 创建脚本目录
sudo mkdir -p /opt/datax/scripts

# 编写脚本(关键:替换占位符、调用 DataX、清理日志)
cat > /opt/datax/scripts/sync_daily.sh << EOF
#!/bin/bash
set -euo pipefail  # 严格模式:错误立即终止,未定义变量报错

# 获取前一天和今日的日期(格式:YYYY-MM-DD)
yesterday=\$(date -d 'yesterday' +%Y-%m-%d)
today=\$(date +%Y-%m-%d)

# 定义路径变量(根据实际环境修改)
template_path="/opt/datax/job/template/mysql2hive_template.json"  # 模板路径
generated_dir="/opt/datax/job/generated"                         # 动态 JSON 输出目录
output_path="\${generated_dir}/mysql2hive_\${yesterday}.json"     # 动态 JSON 路径
datax_bin="/opt/datax/bin/datax.py"                               # DataX 执行脚本路径
log_dir="/opt/datax/log/datax"                                    # DataX 日志目录
cron_log="/opt/datax/log/cron/cron.log"                           # 定时任务日志路径

# 创建必要目录(若不存在)
mkdir -p "\${generated_dir}"
mkdir -p "\${log_dir}"
mkdir -p "\$(dirname "\${cron_log}")"

# 输出时间到定时任务日志
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始执行 ${yesterday} 数据同步任务..." >> "\${cron_log}"

# 步骤 1:生成动态 JSON(替换模板中的占位符)
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 生成动态 JSON 到 \${output_path}" >> "\${cron_log}"
sed -e "s/\${yesterday}/\${yesterday}/g" -e "s/\${today}/\${today}/g" "\${template_path}" > "\${output_path}"

# 步骤 2:运行 DataX 任务(日志输出到按日期命名的文件)
datax_log="\${log_dir}/datax_\${yesterday}.log"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 执行 DataX 任务,日志路径:\${datax_log}" >> "\${cron_log}"
"${datax_bin}" "\${output_path}" > "\${datax_log}" 2>&1

# 步骤 3:清理 7 天前的临时文件(避免磁盘占满)
find "\${generated_dir}" -name "mysql2hive_*.json" -mtime +7 -delete >> "\${cron_log}" 2>&1
find "\${log_dir}" -name "datax_*.log" -mtime +30 -delete >> "\${cron_log}" 2>&1

# 输出完成时间到定时任务日志
echo "[$(date '+%Y-%m-%d %H:%M:%S')] ${yesterday} 数据同步任务完成" >> "\${cron_log}"
EOF

# 赋予脚本执行权限
chmod +x /opt/datax/scripts/sync_daily.sh

五、手动测试脚本(验证动态传参)

手动执行脚本,验证动态 JSON 生成、DataX 任务运行是否正常。

# 手动运行脚本(模拟定时任务)
/opt/datax/scripts/sync_daily.sh

# 验证 1:检查动态 JSON 是否生成(路径:/opt/datax/job/generated/mysql2hive_2024-07-10.json)
cat /opt/datax/job/generated/mysql2hive_2024-07-10.json | grep -E "where|partition"

# 预期输出(日期已替换):
# "where": "create_time >= '2024-07-10 00:00:00' AND create_time < '2024-07-11 00:00:00'"
# "partition": "dt=2024-07-10"

# 验证 2:检查 DataX 任务日志(路径:/opt/datax/log/datax/datax_2024-07-10.log)
tail -n 20 /opt/datax/log/datax/datax_2024-07-10.log

# 预期输出(成功):
# [INFO] Total 1000 records read, 1000 records written  # 读取与写入记录数一致

六、配置 Crontab 定时任务(每日自动更新) 

通过 Crontab 设置每天凌晨 2 点自动执行脚本。

这里说一下,我们工作中都会设置在凌晨更新,如果报错的话会设置一个重新导入机制,或者邮件机制,一般设置3次导入不进就会暂停,需要我们第二天检查导入不进原因和进行手动导入。后续会专门开个帖子介绍这一部分。

# 编辑当前用户的 Crontab 任务
crontab -e

# 添加以下内容(每天 2:00 执行脚本,日志输出到 cron.log)
0 2 * * * /opt/datax/scripts/sync_daily.sh >> /opt/datax/log/cron/cron.log 2>&1

# 验证 Crontab 任务是否添加成功
crontab -l

# 示例输出:
# 0 2 * * * /opt/datax/scripts/sync_daily.sh >> /opt/datax/log/cron/cron.log 2>&1

七、验证自动更新(Hive 数据检查)

定时任务执行后,验证 Hive 分区表是否按日期新增数据。

# 使用 Beeline 连接 Hive(替换为实际 HiveServer2 地址)
beeline -u "jdbc:hive2://hive-host:10000/default;transportMode=http;httpPath=cliservice" -n hive-user -p hive-pass

# 验证 1:查看 Hive 分区(应包含 dt=2024-07-10)
hive> SHOW PARTITIONS ods_user_dt;

# 预期输出:
# dt=2024-07-10

# 验证 2:查询分区数据(前 10 条)
hive> SELECT * FROM ods_user_dt WHERE dt='2024-07-10' LIMIT 10;

# 预期输出(与 MySQL 源表前一天数据一致):
# 1       Alice   25      2024-07-10 12:00:00
# 2       Bob     30      2024-07-10 12:05:00

 这就是datax导入动态参数+自动更新流程,如果你有疑问?或者哪个有错误欢迎指出。

下一篇预告更新大数据组件sqoop如何导入数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佩可official

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值