概述
本文介绍基于广告业务离线数仓,使用 Flume 将日志导入 HDFS,再通过 Hive 脚本完成 ODS、DWD 分层处理。
整体架构
广告业务整体架构图如图所示,包含数据采集、传输、存储与处理的完整链路。
Flume Agent 配置
Flume 是一个分布式、可靠且可扩展的系统,用于收集、聚合和传输大量日志数据。
Agent 核心组件
每个 Flume Agent 由三部分组成:
- Source:用于接收数据
- Channel:用于在 Source 和 Sink 之间暂时存储数据
- Sink:用于将数据传送到外部存储系统(如 HDFS)
启动命令
flume-ng agent --conf-file /opt/wzk/flume-conf/flume-log2hdfs3.conf -name a1 -Dflume.root.logger=INFO,console
注意:原命令中存在 -Dflume.roog.logger 拼写错误,应为 -Dflume.root.logger。
扩展性与容错性
Flume Agent 支持分布式部署,可通过多个 Agent 在不同节点之间传递数据。容错机制依靠 Channel 和 Sink 的队列机制,事件可被持久化直到成功传送。
数据准备与加载
准备数据
准备 event 数据文件,上传到指定目录,Flume 会根据配置进行解析。
观察结果
执行后可在 HDFS 中查看生成的数据文件。
脚本调用顺序
广告业务中的脚本执行顺序:
ods_load_event_log.shdwd_load_event_log.shdwd_load_ad_log.shads_load_ad_show.shads_load_ad_show_rate.shads_load_ad_show_page.shads_load_ad_show_page_window.sh
ODS 层加载
执行 ODS 层加载脚本:
sh /opt/wzk/hive/ods_load_event_log.sh 2020-07-21
在 Hive 中验证数据:
hive
use ods;
select * from ods_log_event limit 5;
可按日期批量执行加载更多数据。
DWD 层加载
event_log 加载
sh /opt/wzk/hive/dwd_load_event_log.sh 2020-07-21
验证数据:
hive
use dwd;
select * from dwd_event_log limit 5;
ad_log 加载
sh /opt/wzk/hive/dwd_load_ad_log.sh 2020-07-21
验证数据量:
select count(*) from dwd_ad;
故障排查表
| 症状 | 根因 | 定位 | 修复 |
|---|---|---|---|
| Flume 启动后无数据进入 HDFS | Source 未监听到文件、目录或格式不匹配 | 先看 Flume 控制台日志,再检查 Source 监听路径与文件是否落地 | 核对采集目录、文件权限、文件名规则,确认 Source 配置与输入数据一致 |
| Flume 命令执行直接报错 | 启动参数拼写错误 | 检查启动命令中的参数名 | 修正 -Dflume.root.logger 参数 |
| HDFS 没有生成目标文件 | Sink 配置错误或 HDFS 路径无权限 | 查看 Flume Sink 日志、检查 HDFS 目标目录 | 校验 HDFS URI、目录权限、Sink 路径模板与 NameNode 可达性 |
| Hive 查询 ODS 表为空 | ODS 装载脚本未成功执行,或分区未写入 | 执行 show partitions,检查脚本日志 | 确认脚本日期参数、源路径、Hive 库表名,必要时重跑指定日期 |
| Hive 查询 DWD 表为空 | ODS 无数据、ETL SQL 过滤过严或字段解析失败 | 先查 ODS 分区,再查 DWD 装载日志 | 先保证 ODS 有数据,再检查 DWD SQL 的 where 条件、字段切分逻辑 |
select count(*) from dwd_ad; 数量异常少 | 上游 ad_log 未完整导入,或日期未全部执行 | 对照脚本执行日期列表与 HDFS 原始数据量 | 补跑缺失日期,核对 ad_log 脚本与目标分区是否全部落表 |
| 同一天重复跑脚本后数据重复 | 装载逻辑非覆盖写入,使用了追加模式 | 检查 Hive SQL 是 insert overwrite 还是 insert into | 分区场景优先使用覆盖写入,或在重跑前先清理目标分区 |
| Flume 能跑但性能差、延迟高 | Channel 容量过小或磁盘 IO/网络瓶颈 | 看 Channel 堆积、Sink flush 情况、机器资源 | 调整 batch size、channel capacity、transactionCapacity,必要时改为 file channel |
| 日志文件上传了但 Flume 不再采集 | Taildir/Exec/Spooldir 不同 Source 行为差异导致 | 确认具体 Source 类型及是否支持重复消费 | 明确 Source 类型,按类型处理文件落地、重命名和历史文件导入方式 |
| SQL 执行报分区相关错误 | 分区字段、日期参数或动态分区设置不正确 | 检查建表语句、脚本传参、Hive 参数 | 校验分区字段名与日期格式,补充 Hive 动态分区相关设置 |
总结
本文覆盖了 Flume Agent 的 Source、Channel、Sink 基本结构,日志文件上传、Flume 启动命令、HDFS 落盘验证,以及核心脚本的调用顺序。适合用于理解 Hadoop 生态下 Flume、HDFS、Hive 的协同工作方式。