概述

本文介绍基于广告业务离线数仓,使用 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 中查看生成的数据文件。

脚本调用顺序

广告业务中的脚本执行顺序:

  1. ods_load_event_log.sh
  2. dwd_load_event_log.sh
  3. dwd_load_ad_log.sh
  4. ads_load_ad_show.sh
  5. ads_load_ad_show_rate.sh
  6. ads_load_ad_show_page.sh
  7. ads_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 启动后无数据进入 HDFSSource 未监听到文件、目录或格式不匹配先看 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 的协同工作方式。