前言
我们在上一篇帖子详细介绍了如何利用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如何导入数据。