博客 13:Flume1.9.0 安装 + 数据采集案例(Shell 脚本模拟实时日志,新手零依赖上手)
Flume 是大数据日志采集工具,能实时采集分散的日志数据并传输到 Hadoop、Kafka 等存储组件。之前的案例依赖第三方 jar 包,新手可能找不到资源,这次优化为纯 Shell 脚本生成实时数据,零依赖、零门槛,跟着复制命令就能成功搭建采集流程~Flume 安装核心是 “解压 + 配置 JDK 路径”,采集方案的关键是 “Source(数据来源)+ Channel(数据缓存)+ Sink(
前言
Flume 是大数据日志采集工具,能实时采集分散的日志数据并传输到 Hadoop、Kafka 等存储组件。之前的案例依赖第三方 jar 包,新手可能找不到资源,这次优化为纯 Shell 脚本生成实时数据,零依赖、零门槛,跟着复制命令就能成功搭建采集流程~
一、准备工作
- 已搭建好 node1 虚拟机(作为数据采集节点)
- JDK1.8 已安装配置(参考博客 5)
- Flume 安装包(apache-flume-1.9.0-bin.tar.gz,下载地址:http://flume.apache.org/download.html)
- 无需额外 jar 包 / 数据文件,纯 Shell 脚本生成模拟数据
二、详细安装步骤
1. 上传并解压 Flume 安装包(仅 node1 操作)
上传安装包到 node1 的/export/software目录:
cd /export/software
rz # 上传apache-flume-1.9.0-bin.tar.gz
解压到安装目录并创建软连接:
tar -zxf apache-flume-1.9.0-bin.tar.gz -C /export/server/
cd /export/server/
ln -s apache-flume-1.9.0-bin/ flume # 软连接方便操作
2. 修改 Flume 配置文件(仅 node1 操作)
进入配置目录:cd /export/server/flume/conf复制并修改环境变量配置文件:
cp flume-env.sh.template flume-env.sh
vim flume-env.sh
添加 JDK 路径(替换为自己的 JDK 实际路径):
export JAVA_HOME=/export/server/jdk1.8.0_241/
3. 验证 Flume 安装成功
# 查看Flume版本,输出版本信息即成功
flume-ng version
三、数据采集综合案例(Shell 模拟实时聊天日志)
1. 准备数据生成脚本(仅 node1 操作)
不用依赖任何 jar 包,用 Shell 脚本模拟实时聊天日志生成,格式规范、可自定义。
(1)创建数据目录
# 创建初始化目录和日志输出目录
mkdir -p /export/data/momo_init
mkdir -p /export/data/momo_data
cd /export/data/momo_init
(2)创建实时数据生成脚本
# 新建Shell脚本
vim momo_log_generator.sh
复制粘贴以下内容(新手直接全选复制即可,无需修改):
#!/bin/bash
# 聊天日志生成脚本:模拟实时聊天数据,每秒输出1条
# 日志格式:用户ID,好友ID,消息内容,发送时间,设备类型,操作系统
# 定义可选数据(可自行扩展)
USER_IDS=("U001" "U002" "U003" "U004" "U005" "U006" "U007" "U008" "U009" "U010")
FRIEND_IDS=("F001" "F002" "F003" "F004" "F005" "F006" "F007" "F008" "F009" "F010")
MESSAGES=("在吗?" "今天去吃火锅呀~" "大数据课程作业写完了吗?" "晚上一起打游戏!" "明天上午9点开会" "这个Flume教程太好用了!" "周末去爬山怎么样?" "收到请回复" "麻烦发我一下资料" "加油,你一定可以的")
DEVICES=("iPhone" "Android" "iPad" "MacBook" "WindowsPC")
SYSTEMS=("iOS16" "Android13" "iPadOS17" "macOS Ventura" "Windows11")
# 日志输出路径(和Flume监控路径一致)
LOG_FILE="/export/data/momo_data/MOMO_DATA.dat"
# 循环生成数据(每秒1条,无限循环)
while true; do
# 随机选取数据
RAND_USER=${USER_IDS[$RANDOM % ${#USER_IDS[@]}]}
RAND_FRIEND=${FRIEND_IDS[$RANDOM % ${#FRIEND_IDS[@]}]}
RAND_MSG=${MESSAGES[$RANDOM % ${#MESSAGES[@]}]}
RAND_DEVICE=${DEVICES[$RANDOM % ${#DEVICES[@]}]}
RAND_SYS=${SYSTEMS[$RANDOM % ${#SYSTEMS[@]}]}
# 获取当前时间(格式:YYYY-MM-DD HH:MM:SS)
SEND_TIME=$(date "+%Y-%m-%d %H:%M:%S")
# 拼接日志并写入文件(追加模式)
echo "${RAND_USER},${RAND_FRIEND},${RAND_MSG},${SEND_TIME},${RAND_DEVICE},${RAND_SYS}" >> ${LOG_FILE}
# 暂停1秒
sleep 1
done
(3)赋予脚本执行权限
chmod +x momo_log_generator.sh
(4)启动数据生成脚本
# 后台运行脚本,日志持续生成(关闭终端不影响)
nohup ./momo_log_generator.sh > /dev/null 2>&1 &
(5)验证数据生成
新开一个终端,实时查看生成的日志:
# 实时监控日志文件,每秒会新增1条数据
tail -f /export/data/momo_data/MOMO_DATA.dat
成功标志:终端不断输出类似以下格式的日志:
U003,F007,这个Flume教程太好用了!,2025-11-23 15:30:22,Android,Android13
U008,F002,晚上一起打游戏!,2025-11-23 15:30:23,iPhone,iOS16
U001,F009,明天上午9点开会,2025-11-23 15:30:24,WindowsPC,Windows11
按Ctrl+C可退出监控。
2. 配置 Flume 采集方案(仅 node1 操作)
实现目标:实时监控/export/data/momo_data/MOMO_DATA.dat文件,将新增日志采集到 HDFS。
(1)创建 Flume 采集配置文件
cd /export/server/flume/conf
vim momo-log-collect.conf
添加以下配置(新手直接复制粘贴):
# 定义Agent名称(a1)、Source(数据来源)、Channel(数据缓存)、Sink(数据目的地)
a1.sources = r1
a1.channels = c1
a1.sinks = k1
# 1. 配置Source:监控文件实时变化(exec类型调用tail -F命令)
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /export/data/momo_data/MOMO_DATA.dat # 监控目标文件
a1.sources.r1.channels = c1 # 绑定到通道c1
a1.sources.r1.restart = true # 命令执行失败时自动重启
a1.sources.r1.restartThrottle = 1000 # 重启间隔(毫秒)
# 2. 配置Channel:内存通道(实时性高,适合小到中等数据量)
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000 # 通道最大缓存1000条数据(防止数据溢出)
a1.channels.c1.transactionCapacity = 100 # 每次事务处理100条数据(提高效率)
a1.channels.c1.byteCapacityBufferPercentage = 20 # 预留20%内存缓冲
# 3. 配置Sink:输出到HDFS(按日期分区存储)
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://node1.itcast.cn:8020/flume/momo/logs/%Y%m%d/ # HDFS存储路径(自动按日期创建目录)
a1.sinks.k1.hdfs.filePrefix = momo-log- # 生成文件的前缀
a1.sinks.k1.hdfs.fileSuffix = .log # 生成文件的后缀
a1.sinks.k1.hdfs.rollInterval = 30 # 30秒滚动生成一个新文件(优先按时间滚动)
a1.sinks.k1.hdfs.rollSize = 134217728 # 128MB滚动(达到大小也会生成新文件)
a1.sinks.k1.hdfs.rollCount = 0 # 不按数据条数滚动(0表示禁用)
a1.sinks.k1.hdfs.fileType = DataStream # 流式写入(不生成SequenceFile)
a1.sinks.k1.hdfs.writeFormat = Text # 文本格式存储
a1.sinks.k1.hdfs.batchSize = 100 # 每次写入HDFS的批量大小
a1.sinks.k1.hdfs.round = true # 启用时间 rounding
a1.sinks.k1.hdfs.roundValue = 1 # 按1个单位 rounding
a1.sinks.k1.hdfs.roundUnit = minute # rounding单位(分钟)
a1.sinks.k1.channel = c1 # 绑定到通道c1
(2)启动 Flume Agent(仅 node1 操作)
启动前必须确保 Hadoop HDFS 已启动:
# 启动HDFS(若已启动可跳过)
start-dfs.sh
启动 Flume 采集进程:
cd /export/server/flume
# 启动Agent,日志输出到控制台(方便新手查看采集状态)
flume-ng agent -n a1 -c conf/ -f conf/momo-log-collect.conf -Dflume.root.logger=INFO,console
参数说明(新手了解即可):
-n a1:指定 Agent 名称为 a1(必须和配置文件中定义的一致)-c conf/:指定 Flume 配置文件所在目录-f conf/momo-log-collect.conf:指定本次采集的方案配置文件-Dflume.root.logger=INFO,console:将采集日志输出到控制台,方便排查问题
3. 验证数据采集成功(新手必做)
(1)查看 Flume 控制台日志
启动后,控制台会不断输出类似以下内容,说明数据正在被采集:
2025-11-23 15:35:46,789 INFO [SinkRunner-PollingRunner-DefaultSinkProcessor] (org.apache.flume.sink.hdfs.HDFSEventSink.process:455) - Event accepted by HDFS Sink
2025-11-23 15:35:47,801 INFO [SinkRunner-PollingRunner-DefaultSinkProcessor] (org.apache.flume.sink.hdfs.HDFSEventSink.process:455) - Event accepted by HDFS Sink
(2)查看 HDFS 上的采集文件
新开一个终端,执行以下命令(无需修改,直接复制):
# 查看当天日期的采集目录(自动按YYYYMMDD创建)
hdfs dfs -ls /flume/momo/logs/$(date +%Y%m%d)/
成功标志:能看到类似momo-log-.1765432198765.log的文件(文件名含时间戳)。
(3)查看采集到的数据内容
# 查看最新生成的日志文件(替换为实际文件名前缀,按Tab键可自动补全)
hdfs dfs -cat /flume/momo/logs/$(date +%Y%m%d)/momo-log-.1*.log
能看到和MOMO_DATA.dat中一致的聊天日志,说明采集成功!
四、新手常见问题 & 解决方案
1. 启动 Flume 报错 “JAVA_HOME not set”
- 原因:
flume-env.sh中 JDK 路径配置错误或未生效 - 解决:
# 重新编辑配置文件 vim /export/server/flume/conf/flume-env.sh # 确认JAVA_HOME是实际安装路径(可通过echo $JAVA_HOME查看) export JAVA_HOME=/export/server/jdk1.8.0_241/ # 重新生效环境变量 source /etc/profile
2. 控制台无 “Event accepted” 日志,采集不到数据
- 原因 1:监控的文件路径错误解决:检查
momo-log-collect.conf中a1.sources.r1.command的路径是否为/export/data/momo_data/MOMO_DATA.dat - 原因 2:数据生成脚本未运行解决:重新启动脚本:
cd /export/data/momo_init nohup ./momo_log_generator.sh > /dev/null 2>&1 & - 原因 3:Source/Channel/Sink 名称不一致解决:确保配置文件中
a1.sources = r1、a1.channels = c1、a1.sinks = k1的名称和后续配置一致(比如不能写成 r2、c2)
3. HDFS 写入失败(报错 “Permission denied”)
- 原因:Flume 运行用户无 HDFS 写入权限
- 解决:
# 给HDFS目录授权(hadoop用户为例,根据实际用户修改) hdfs dfs -chmod 777 /flume
4. Shell 脚本无法执行(报错 “Permission denied”)
- 原因:未赋予脚本执行权限
- 解决:
cd /export/data/momo_init chmod +x momo_log_generator.sh
5. 日志文件滚动异常(长时间只生成 1 个文件)
- 原因:
rollInterval配置过大或rollSize未达到阈值 - 解决:修改
momo-log-collect.conf中的滚动配置,比如将rollInterval=10(10 秒滚动一次),重启 Flume 即可。
五、拓展说明(新手可选)
- 停止数据生成脚本:
# 查找脚本进程并杀死 ps -ef | grep momo_log_generator.sh | grep -v grep | awk '{print $2}' | xargs kill -9 - 停止 Flume Agent:直接按
Ctrl+C关闭控制台即可。 - 自定义日志格式:修改
momo_log_generator.sh中的echo语句,可添加字段(如消息类型、地区)或修改分隔符(如用|代替,)。 - 更换数据目的地:若想采集到 Kafka,只需修改
Sink配置(参考 Kafka 相关配置),无需改动 Source 和 Channel。
总结
Flume 安装核心是 “解压 + 配置 JDK 路径”,采集方案的关键是 “Source(数据来源)+ Channel(数据缓存)+ Sink(数据目的地)” 的三段式配置。本次优化用纯 Shell 脚本生成实时数据,新手无需依赖任何外部资源,跟着复制命令就能完成从数据生成到 HDFS 采集的全流程。掌握这个案例后,后续可轻松适配日志文件、目录监控、Kafka 输入输出等实际场景~
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)