基于现有的大数据开发实验环境,深入理解数据完整生命周期,工具配合使用,全流程练习

深入理解数据完整生命周期,工具配合使用,全流程练习


既然你想深入理解数据完整生命周期,那我来帮你把这些工具串起来,告诉你它们在实际工作中是怎么配合的。


一、工具箱盘点

工具 角色定位 你在银行工作中会用它来...
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 暂时不需要装


原因如下:

  1. Hue 的核心功能你已有替代品

    • 查 Hive 数据 → 你可以用 beelinehive 命令行,或者用 Python 写脚本查询

    • 浏览 HDFS 文件 → hdfs dfs -ls 命令够用,或者 MobaXterm 左侧文件管理器也能看

    • 可视化提交 Hive SQL → 初学者用命令行更能理解底层逻辑

  2. 银行环境很少装 Hue

    • 银行大数据平台出于安全考虑,通常不允许开源的 Web UI 直接连生产环境

    • 实际工作中,你大概率是通过 跳板机 + 命令行 操作,而不是 Web 界面

    • 习惯了命令行,反而更贴近真实工作场景

  3. 配置 Hue 成本较高

    • Hue 需要额外安装和配置,依赖较多,可能会耗费半天到一天时间

    • 这些时间投入到 Sqoop + Hive + Azkaban 的项目实战上,收益更高

  4. 你已经有足够的工具来理解数据生命周期

    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

  1. 浏览器打开 http://localhost:8081

  2. 登录(azkaban/azkaban)

  3. 点击 Create Project → 输入项目名 bank_daily_etl

  4. 上传 bank_daily_etl.zip


六、在 Azkaban 中配置调度

6.1 设置参数

在 Azkaban 项目页面:

  1. 点击 ProjectSchedule

  2. 设置执行时间:例如每天早上 6:00

  3. 添加Flow Parameters

参数名 示例值 说明
yesterday 2026-05-26 前一天的日期

💡 动态获取昨天日期:Azkaban 不支持内置日期计算。


建议:

  • 方式一:在第一个 Job 中用 shell 脚本计算 yesterday=$(date -d "yesterday" +%Y-%m-%d)

  • 方式二:用 Python 脚本包装整个流程,在外部计算日期后通过 API 提交

6.2 手动执行测试

  1. 点击 Execute Flow

  2. 在弹出的窗口中输入 yesterday 参数(如 2026-05-26

  3. 点击 ScheduleExecute


七、工作流依赖关系图

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 测试了。

相关推荐
Hefei GlobefishAI1 小时前
无人零售智能柜适合哪些场景?
大数据·零售
yjcode7891 小时前
探索游戏充值新纪元:友价源码技术革新之旅
大数据·人工智能·游戏·游戏交易
snow@li2 小时前
AI:理解 大数据、算法、算力、电力、生成式AI、token 之间的关系
大数据·人工智能·算法
oort1232 小时前
VLStream:全开源决策式AI视频平台,赋能企业构建自主可控、降本增效的智能视觉应用介绍
大数据·开发语言·人工智能·开源·音视频·数据库架构
TDengine (老段)2 小时前
TDengine 压缩编码机制 — 双层压缩架构与类型特化算法
大数据·数据库·物联网·算法·时序数据库·tdengine·涛思数据
标书畅畅行4 小时前
钛投标标书查重系统技术架构与功能实现解析
大数据·人工智能
2401_872418785 小时前
什么是多范式编程语言?——以 C++ 为例深入理解编程范式
java·大数据·c++
Volunteer Technology6 小时前
Flink的 Side Output侧输出和 ProcessFunction
大数据·flink
roman_日积跬步-终至千里6 小时前
【SDD】高风险场景下的 SDD 最佳实践:分层风控+分级落地,约束AI编程边界
大数据·人工智能·ai编程