深入理解数据完整生命周期,工具配合使用,全流程练习
既然你想深入理解数据完整生命周期,那我来帮你把这些工具串起来,告诉你它们在实际工作中是怎么配合的。
一、工具箱盘点
| 工具 | 角色定位 | 你在银行工作中会用它来... |
|---|---|---|
| MySQL | 业务数据库(源) | 模拟银行交易系统、用户信息表,数据产生的源头 |
| Sqoop | 数据迁移工具 | 每天凌晨把 MySQL 数据批量导入 Hive 数仓 |
| Hadoop (HDFS) | 分布式存储 | 存储海量历史数据,比如过去5年的交易明细 |
| Hive | 数据仓库工具 | 写 SQL 做 ETL 清洗、加工、聚合,产出报表底表 |
| Python | 脚本/分析工具 | 复杂数据清洗、小规模分析、调度脚本辅助 |
| Azkaban | 工作流调度器 | 把每天的 Sqoop 导入 → Hive 加工 → 数据导出 串成一个自动跑的定时任务 |
| Git | 版本控制 | 管理你写的 Hive SQL、Python 脚本、Azkaban 配置文件 |
| Kettle | ETL 工具 | 拖拽式设计数据流程,某些银行用来做可视化 ETL |
二、数据完整生命周期(按现有环境)
下面是一个典型的银行日批处理流程,你可以用现有环境完整模拟:
text
[数据产生] [数据采集] [数据存储]
MySQL -----------------→ Sqoop ----------→ HDFS
(业务表) (每日增量) (原始数据)
↓
[数据加工] [数据服务] [数据应用]
Hive ←─── Azkaban ───→ MySQL/Redis -----→ BI报表
(清洗/聚合) (结果表) (图表展示)
↑ ↑
└──── Python 脚本 ──────────┘
(复杂逻辑补丁)
用你的工具模拟一个"银行账户日终报表"场景:
| 步骤 | 做什么 | 用什么工具 | 说明 |
|---|---|---|---|
| 1. 产生数据 | 模拟一天的交易流水 | MySQL | 写个 Python 脚本往 MySQL 灌 100 万条测试数据 |
| 2. 数据采集 | 把新数据导入 HDFS | Sqoop | sqoop import --incremental append 只拉昨天的增量 |
| 3. 数据建仓 | 创建 Hive 分区表 | Hive | CREATE TABLE trans_daily PARTITIONED BY (dt string) |
| 4. 数据加工 | 写 SQL 计算指标 | Hive | 按账户汇总当日交易金额、笔数、平均余额 |
| 5. 工作流调度 | 把 2→3→4 串起来 | Azkaban | 每天早上 6 点自动跑:Sqoop导入 → Hive建分区 → Hive加工 → 结果导出 |
| 6. 结果回写 | 把汇总表导回 MySQL | Sqoop export | 供报表系统查询 |
| 7. 图表展示 | 做一个简单的仪表板 | Python + 图表库 | 用 matplotlib/pyecharts 画几张折线图、柱状图 |
| 8. 版本管理 | 所有脚本上传 | Git | 创建本地仓库,commit 所有 .sql / .py / .job 文件 |
三、接下来可以做什么项目练手
项目1:电商/银行 ETL 小项目(一两天)
-
在 MySQL 建 3 张表:
用户表、订单表、商品表 -
用 Python 生成 50 万条测试数据
-
写一个 Azkaban 工作流,完成 Sqoop导入 → Hive清洗 → 每日报表产出
-
把结果表导回 MySQL
-
用 Python 画图展示每天 GMV、订单量趋势
项目2:模仿银行"贴源层 → 汇总层 → 应用层"数仓分层
-
ODS层:Sqoop 原样导入 MySQL 表
-
DWD层:Hive SQL 清洗、去重、补全
-
DWS层:按天/账户维度预聚合
-
ADS层:导出到 MySQL,供图表使用
项目3:增量数据同步场景
-
模拟 MySQL 里每天新增 1 万条数据
-
用 Sqoop 增量导入 (
--check-column id --incremental append) -
Hive 按日期分区,每天加工当天分区
四、关于 Kettle
Kettle 在未来工作里的位置:
| 场景 | 会用 Kettle 吗 | 说明 |
|---|---|---|
| 银行传统数据仓库 | ✅ 经常用 | 很多银行项目用 Kettle 做可视化 ETL,因为业务人员也能看懂 |
| 大数据平台(Hadoop 生态) | ⚠️ 部分用 | 有些银行会用 Kettle 的 "Big Data" 插件生成 Hive SQL;但也很多直接写 SQL + Spark |
| 纯大数据开发岗 | ❌ 很少用 | 主流是写 SQL + Spark/Python,调度用 Airflow/DolphinScheduler |
精力可以优先放在 Hive SQL + Sqoop + Azkaban 这条线上
五、根据你的目标,给个学习路线
你现在环境已经搭好,可以直接跳过"入门"阶段,进入"项目实战":
| 阶段 | 目标 | 预计时间 | 用你的环境做什么 |
|---|---|---|---|
| 1. 数据采集 | 掌握 Sqoop | 1-2 天 | 完成 MySQL ↔ HDFS 全量和增量导入导出 |
| 2. 数据仓库 | 掌握 Hive SQL | 3-5 天 | 写复杂 SQL:多表 join、窗口函数、分区表、分桶表 |
| 3. 任务调度 | 掌握 Azkaban | 1-2 天 | 把多个 Hive SQL 串成一个完整的工作流 |
| 4. Python 辅助 | 数据生成/分析 | 1 天 | 写 Python 生成测试数据、用 matplotlib 画图 |
| 5. 端到端项目 | 串起全流程 | 2-3 天 | 完成上面说的"银行日终报表"项目 |
| 6. Git 管理 | 代码版本控制 | 0.5 天 | 把所有脚本上传到 Git 仓库 |
下一步建议
从 Azkaban 调度一个 Sqoop + Hive 的完整工作流 开始做,这样你就能把"采集 → 加工 → 调度"三个环节连起来,理解数据的流向。
Kettle 已经装好了可以连接WSL中的mysql正常使用,Hue还没有装
关于 Hue,根据你的目标和现有的工具链,我的建议是:Hue 暂时不需要装。
原因如下:
-
Hue 的核心功能你已有替代品:
-
查 Hive 数据 → 你可以用
beeline或hive命令行,或者用 Python 写脚本查询 -
浏览 HDFS 文件 →
hdfs dfs -ls命令够用,或者 MobaXterm 左侧文件管理器也能看 -
可视化提交 Hive SQL → 初学者用命令行更能理解底层逻辑
-
-
银行环境很少装 Hue:
-
银行大数据平台出于安全考虑,通常不允许开源的 Web UI 直接连生产环境
-
实际工作中,你大概率是通过 跳板机 + 命令行 操作,而不是 Web 界面
-
习惯了命令行,反而更贴近真实工作场景
-
-
配置 Hue 成本较高:
-
Hue 需要额外安装和配置,依赖较多,可能会耗费半天到一天时间
-
这些时间投入到 Sqoop + Hive + Azkaban 的项目实战上,收益更高
-
-
你已经有足够的工具来理解数据生命周期:
text
MySQL → Sqoop → HDFS → Hive → Azkaban → (结果回MySQL) → Python 图表这条链路已经完整,Hue 只是一个"可视化查看器",不是核心环节。
什么时候需要装 Hue?
| 场景 | 是否需要 Hue |
|---|---|
| 老师明确要求用 Hue 做实验/考试 | ✅ 需要装 |
| 你想体验 Web UI 查 Hive 的感觉 | 🤔 可以装,但非必须 |
| 你想在简历上写"熟悉 Hue" | 🤔 可以装,但面试官更看重 Hive SQL 能力 |
| 你后面要学 Impala、Spark SQL 等 | 🤔 那时再装也行 |
如果决定不装 Hue,接下来做什么?
你现在的手头工具已经很完整,建议按这个顺序推进,把数据生命周期完整走一遍:
| 步骤 | 任务 | 用什么工具 | 预计时间 |
|---|---|---|---|
| 1 | 在 MySQL 中创建几张业务表,灌入测试数据 | MySQL + Python 脚本 | 1 小时 |
| 2 | 用 Sqoop 把 MySQL 表导入 Hive | Sqoop + Hive | 1 小时 |
| 3 | 在 Hive 中写 SQL 做数据清洗和聚合 | Hive SQL | 2-3 小时 |
| 4 | 用 Azkaban 把步骤 2-3 串成自动化工作流 | Azkaban | 2 小时 |
| 5 | 把 Hive 加工结果导回 MySQL | Sqoop export | 30 分钟 |
| 6 | 用 Python 连接 MySQL 读取结果表,画图表 | Python + matplotlib | 1 小时 |
| 7 | 把 1-6 所有脚本(SQL + Python + Azkaban配置)用 Git 管理 | Git | 30 分钟 |
这样一个完整的 ETL + 调度 + 展示项目做下来,你就能清晰地理解数据的整个生命周期。
如果你想装 Hue 体验一下
我可以帮你安排到最后,作为"额外学习"的内容。
等你把上面 7 个步骤完整跑通一遍后,再装 Hue 会更快,因为你已经理解了底层是怎么回事,装 Hue 只是加个壳。
总结:建议先把 Kettle 跟老师的教学节奏走,同时用 Sqoop + Hive + Azkaban 跑通一个完整的项目。
Hue 可以放一放,等你有余力了再装。
设计一个具体的 Azkaban 工作流
Azkaban 工作流设计:银行日终报表自动化
基于你的环境(MySQL → Sqoop → Hive → 结果回 MySQL → 图表),下面设计一个完整的银行日终报表工作流,你可以直接在你的 WSL 环境中运行。
一、业务场景
假设你是一家银行的数仓开发人员,需要每天凌晨自动完成以下任务:
| 步骤 | 任务 | 说明 |
|---|---|---|
| 1 | 从业务库(MySQL)导入昨日交易数据 | 增量导入,只拉昨天的新数据 |
| 2 | 创建 Hive 分区表 | 按日期分区存储原始交易数据 |
| 3 | 数据清洗与加工 | 过滤异常数据、补全缺失字段 |
| 4 | 按账户维度汇总 | 计算每日交易金额、笔数、平均余额 |
| 5 | 将汇总结果导出到 MySQL | 供报表系统(帆软)查询展示 |
二、准备测试数据
2.1 在 MySQL 中创建业务表
登录 MySQL(mysql -u root -p),执行:
sql
-- 创建数据库
CREATE DATABASE IF NOT EXISTS bank;
USE bank;
-- 交易明细表(业务源表)
CREATE TABLE transactions (
id INT PRIMARY KEY AUTO_INCREMENT,
account_no VARCHAR(20) NOT NULL,
trans_amount DECIMAL(15,2),
trans_type VARCHAR(10),
trans_time DATETIME,
create_date DATE
);
-- 账户信息表
CREATE TABLE accounts (
account_no VARCHAR(20) PRIMARY KEY,
customer_name VARCHAR(50),
balance DECIMAL(15,2)
);
-- 日汇总结果表(报表目标表)
CREATE TABLE daily_summary (
id INT PRIMARY KEY AUTO_INCREMENT,
stat_date DATE,
account_no VARCHAR(20),
total_amount DECIMAL(15,2),
trans_count INT,
avg_amount DECIMAL(15,2),
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
2.2 插入测试数据
sql
-- 插入账户数据
INSERT INTO accounts VALUES
('621700001', '张三', 50000),
('621700002', '李四', 80000),
('621700003', '王五', 30000);
-- 插入昨日测试交易数据(假设今天是 2026-05-27)
INSERT INTO transactions (account_no, trans_amount, trans_type, trans_time, create_date) VALUES
('621700001', 5000, '消费', '2026-05-26 10:30:00', '2026-05-26'),
('621700001', 2000, '转账', '2026-05-26 14:20:00', '2026-05-26'),
('621700002', 10000, '消费', '2026-05-26 09:15:00', '2026-05-26'),
('621700003', 3000, '消费', '2026-05-26 16:45:00', '2026-05-26'),
('621700003', 1500, '转账', '2026-05-26 11:00:00', '2026-05-26');
三、创建 Hive 相关表
在 WSL 终端中执行:
bash
# 进入 Hive(如果 Hive 已配置)
hive
或者在 MySQL 中用 beeline 连接(根据你的 Hive 配置选择)。执行以下 HQL:
sql
-- 创建数据库
CREATE DATABASE IF NOT EXISTS bank;
USE bank;
-- 原始交易流水表(按日期分区)
CREATE TABLE IF NOT EXISTS ods_transactions (
id INT,
account_no STRING,
trans_amount DECIMAL(15,2),
trans_type STRING,
trans_time STRING
)
PARTITIONED BY (create_date STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
-- 账户信息表
CREATE TABLE IF NOT EXISTS dim_accounts (
account_no STRING,
customer_name STRING,
balance DECIMAL(15,2)
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
-- 日汇总结果表
CREATE TABLE IF NOT EXISTS dws_daily_summary (
stat_date STRING,
account_no STRING,
total_amount DECIMAL(15,2),
trans_count INT,
avg_amount DECIMAL(15,2)
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
四、准备 Job 文件
创建一个工作目录:
bash
mkdir -p ~/azkaban/bank_etl
cd ~/azkaban/bank_etl
4.1 Job 1:Sqoop 导入交易数据(增量)
创建 1_sqoop_import_transactions.job:
properties
# 1_sqoop_import_transactions.job
type=command
command=/usr/local/sqoop/bin/sqoop import \
--connect jdbc:mysql://localhost:3306/bank \
--username root \
--password 123456 \
--table transactions \
--target-dir /user/hive/warehouse/bank.db/ods_transactions/create_date=${yesterday} \
--fields-terminated-by ',' \
--delete-target-dir \
--append \
--where "create_date = '${yesterday}'" \
-m 1
# 参数说明
# ${yesterday}:昨天日期,由 Azkaban 调度时传入
4.2 Job 2:添加分区(修复 Hive 分区)
创建 2_hive_add_partition.job:
properties
# 2_hive_add_partition.job
type=command
dependencies=1_sqoop_import_transactions
command=/usr/local/hive/bin/hive -e "USE bank; ALTER TABLE ods_transactions ADD IF NOT EXISTS PARTITION (create_date='${yesterday}');"
4.3 Job 3:数据清洗与加工
创建 3_hive_clean_transactions.job:
properties
# 3_hive_clean_transactions.job
type=command
dependencies=2_hive_add_partition
command=/usr/local/hive/bin/hive -e "
USE bank;
-- 清洗:过滤金额为负或为空的异常数据
INSERT OVERWRITE TABLE ods_transactions PARTITION (create_date='${yesterday}')
SELECT id, account_no, trans_amount, trans_type, trans_time
FROM ods_transactions
WHERE create_date='${yesterday}'
AND trans_amount > 0
AND account_no IS NOT NULL;
"
4.4 Job 4:按账户汇总
创建 4_hive_daily_summary.job:
properties
# 4_hive_daily_summary.job
type=command
dependencies=3_hive_clean_transactions
command=/usr/local/hive/bin/hive -e "
USE bank;
INSERT OVERWRITE TABLE dws_daily_summary
SELECT
'${yesterday}' AS stat_date,
account_no,
SUM(trans_amount) AS total_amount,
COUNT(1) AS trans_count,
AVG(trans_amount) AS avg_amount
FROM ods_transactions
WHERE create_date='${yesterday}'
GROUP BY account_no;
"
4.5 Job 5:导出结果到 MySQL
创建 5_sqoop_export_summary.job:
properties
# 5_sqoop_export_summary.job
type=command
dependencies=4_hive_daily_summary
command=/usr/local/sqoop/bin/sqoop export \
--connect jdbc:mysql://localhost:3306/bank \
--username root \
--password 123456 \
--table daily_summary \
--export-dir /user/hive/warehouse/bank.db/dws_daily_summary \
--input-fields-terminated-by ',' \
--update-mode allowinsert \
--update-key stat_date,account_no \
-m 1
4.6 Job 6:Python 验证与告警(可选)
创建 6_python_alert.job:
properties
# 6_python_alert.job
type=command
dependencies=5_sqoop_export_summary
command=python3 /home/mumu/azkaban/bank_etl/send_alert.py --date ${yesterday}
创建对应的 Python 脚本 send_alert.py:
python
#!/usr/bin/env python3
# send_alert.py
import argparse
import pymysql
import sys
def check_summary(date):
conn = pymysql.connect(
host='localhost',
user='root',
password='123456',
database='bank'
)
cursor = conn.cursor()
cursor.execute("SELECT COUNT(*) FROM daily_summary WHERE stat_date=%s", (date,))
count = cursor.fetchone()[0]
conn.close()
if count == 0:
print(f"警告:{date} 没有产生汇总数据!")
sys.exit(1)
else:
print(f"成功:{date} 共处理 {count} 条汇总数据")
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--date')
args = parser.parse_args()
check_summary(args.date)
五、打包并上传到 Azkaban
5.1 打包
bash
cd ~/azkaban/bank_etl
zip -r bank_daily_etl.zip *.job *.py
5.2 上传到 Azkaban
-
浏览器打开
http://localhost:8081 -
登录(azkaban/azkaban)
-
点击 Create Project → 输入项目名
bank_daily_etl -
上传
bank_daily_etl.zip
六、在 Azkaban 中配置调度
6.1 设置参数
在 Azkaban 项目页面:
-
点击 Project → Schedule
-
设置执行时间:例如每天早上 6:00
-
添加Flow Parameters:
| 参数名 | 示例值 | 说明 |
|---|---|---|
yesterday |
2026-05-26 |
前一天的日期 |
💡 动态获取昨天日期:Azkaban 不支持内置日期计算。
建议:
方式一:在第一个 Job 中用 shell 脚本计算
yesterday=$(date -d "yesterday" +%Y-%m-%d)方式二:用 Python 脚本包装整个流程,在外部计算日期后通过 API 提交
6.2 手动执行测试
-
点击 Execute Flow
-
在弹出的窗口中输入
yesterday参数(如2026-05-26) -
点击 Schedule 或 Execute
七、工作流依赖关系图
text
┌─────────────────────────────┐
│ 1_sqoop_import_transactions │
│ (MySQL → HDFS) │
└──────────────┬──────────────┘
│
▼
┌─────────────────────────────┐
│ 2_hive_add_partition │
│ (添加 Hive 分区) │
└──────────────┬──────────────┘
│
▼
┌─────────────────────────────┐
│ 3_hive_clean_transactions │
│ (数据清洗过滤) │
└──────────────┬──────────────┘
│
▼
┌─────────────────────────────┐
│ 4_hive_daily_summary │
│ (按账户汇总,生成结果表) │
└──────────────┬──────────────┘
│
▼
┌─────────────────────────────┐
│ 5_sqoop_export_summary │
│ (HDFS → MySQL) │
└──────────────┬──────────────┘
│
▼
┌─────────────────────────────┐
│ 6_python_alert │
│ (验证数据 & 告警通知) │
└─────────────────────────────┘
八、验证结果
8.1 检查 HDFS
bash
hdfs dfs -ls /user/hive/warehouse/bank.db/ods_transactions/create_date=2026-05-26
hdfs dfs -cat /user/hive/warehouse/bank.db/dws_daily_summary/part-m-00000
8.2 检查 MySQL
bash
mysql -u root -p -e "SELECT * FROM bank.daily_summary;"
8.3 查看 Azkaban 执行日志
在 Azkaban Web UI 中点击执行的 Flow,查看每个 Job 的日志。
九、常见问题
| 问题 | 解决方法 |
|---|---|
| Sqoop 找不到 Hive 路径 | 在 sqoop-env.sh 中设置 HIVE_HOME |
| Hive 命令找不到 | 在 Job 中使用绝对路径 /usr/local/hive/bin/hive |
| 分区添加失败 | 确认 Hive 表是分区表,且分区字段名正确 |
| 日期参数为空 | 在 Flow 参数中传入 yesterday,或用 shell 脚本计算 |
十、下一步扩展
这个工作流跑通后,你可以继续扩展:
| 扩展方向 | 实现方式 |
|---|---|
| 多表关联 | 增加一个 Job 导入账户表,在 Hive 中做 JOIN |
| 数据质量检查 | 增加一个 Job 检查数据量波动 |
| 重跑某天数据 | 用 Flow Parameters 传入指定日期重新执行 |
| 邮件通知 | 在 Python 脚本中增加发送邮件功能 |
| 对接帆软报表 | 直接查询 MySQL 的 daily_summary 表 |
现在可以开始创建这些 Job 文件并上传到 Azkaban 测试了。