前言

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.confa1.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 = r1a1.channels = c1a1.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 即可。

五、拓展说明(新手可选)

  1. 停止数据生成脚本:
    # 查找脚本进程并杀死
    ps -ef | grep momo_log_generator.sh | grep -v grep | awk '{print $2}' | xargs kill -9
    
  2. 停止 Flume Agent:直接按Ctrl+C关闭控制台即可。
  3. 自定义日志格式:修改momo_log_generator.sh中的echo语句,可添加字段(如消息类型、地区)或修改分隔符(如用|代替,)。
  4. 更换数据目的地:若想采集到 Kafka,只需修改Sink配置(参考 Kafka 相关配置),无需改动 Source 和 Channel。

总结

Flume 安装核心是 “解压 + 配置 JDK 路径”,采集方案的关键是 “Source(数据来源)+ Channel(数据缓存)+ Sink(数据目的地)” 的三段式配置。本次优化用纯 Shell 脚本生成实时数据,新手无需依赖任何外部资源,跟着复制命令就能完成从数据生成到 HDFS 采集的全流程。掌握这个案例后,后续可轻松适配日志文件、目录监控、Kafka 输入输出等实际场景~

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐