可以。Flume 是## 目录
- [1. 检查 HDFS](#1. 检查 HDFS)
- [2. 下载安装包](#2. 下载安装包)
- [3. 配置 Java 和 Hadoop 依赖](#3. 配置 Java 和 Hadoop 依赖)
- [4. 配置采集任务](#4. 配置采集任务)
- [5. 分发到两个 worker](#5. 分发到两个 worker)
- [6. 创建目录](#6. 创建目录)
- [7. 启动采集](#7. 启动采集)
- [8. 放入测试文件](#8. 放入测试文件)
- [9. 检查采集结果](#9. 检查采集结果)
- [10. 测试成功后改为后台运行](#10. 测试成功后改为后台运行)
日志采集工具,在哪台机器采集日志,就在哪台运行 Agent。它不通过 YARN 启动。
下面搭建:
text
worker1 本地文件 → Flume → HDFS
worker2 本地文件 → Flume → HDFS
master 不需要运行 Flume ,负责管理已有的 HDFS。选择 Flume 1.11.0 ,先沿用 Java 11;与现有 Hadoop 3.4.3 的组合通过最后的写入测试验证。官方安装包、使用文档
1. 检查 HDFS
在 master 执行:
bash
hdfs dfsadmin -report
确认有两个 Live DataNode。未启动时执行:
bash
start-dfs.sh
本次实验不需要启动 YARN、Kafka、HBase 或 ZooKeeper。
创建输出目录:
bash
hdfs dfs -mkdir -p /user/dyl/flume
2. 下载安装包:在 master 执行
bash
mkdir -p ~/software
cd ~/software
wget -c https://downloads.apache.org/flume/1.11.0/apache-flume-1.11.0-bin.tar.gz
wget https://downloads.apache.org/flume/1.11.0/apache-flume-1.11.0-bin.tar.gz.sha512
检查:
bash
sha512sum apache-flume-1.11.0-bin.tar.gz
cat apache-flume-1.11.0-bin.tar.gz.sha512
校验值一致后,解压到尚未安装其他版本的目录:
bash
mkdir -p /home/dyl/flume
tar -xzf apache-flume-1.11.0-bin.tar.gz \
-C /home/dyl/flume --strip-components=1
3. 配置 Java 和 Hadoop 依赖:在 master 执行
bash
nano /home/dyl/flume/conf/flume-env.sh
填入:
bash
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export JAVA_OPTS="-Xms128m -Xmx256m"
export HADOOP_HOME=/home/dyl/hadoop-3.4.3
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export FLUME_CLASSPATH="$HADOOP_CONF_DIR:$($HADOOP_HOME/bin/hadoop classpath)"
保存:Ctrl+O → 回车 → Ctrl+X。
这里通过类路径引用 Hadoop 客户端依赖,先不要往 Flume 的 lib 中手动复制整套 Hadoop JAR。
4. 配置采集任务:在 master 执行
bash
nano /home/dyl/flume/conf/spool-to-hdfs.conf
填入:
properties
a1.sources = r1
a1.channels = c1
a1.sinks = k1
# 读取本地目录中新放入的完整文件
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /home/dyl/flume-spool
a1.sources.r1.fileSuffix = .COMPLETED
a1.sources.r1.deserializer = LINE
a1.sources.r1.deserializer.maxLineLength = 100000
a1.sources.r1.channels = c1
# 添加采集机器名称,便于区分输出目录
a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type = host
a1.sources.r1.interceptors.i1.hostHeader = host
a1.sources.r1.interceptors.i1.useIP = false
# 使用本地磁盘暂存事件
a1.channels.c1.type = file
a1.channels.c1.checkpointDir = /home/dyl/flume-channel/checkpoint
a1.channels.c1.dataDirs = /home/dyl/flume-channel/data
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 1000
# 写入 HDFS
a1.sinks.k1.type = hdfs
a1.sinks.k1.channel = c1
a1.sinks.k1.hdfs.path = hdfs://master:9000/user/dyl/flume/%{host}/%Y-%m-%d
a1.sinks.k1.hdfs.filePrefix = events
a1.sinks.k1.hdfs.fileType = DataStream
a1.sinks.k1.hdfs.writeFormat = Text
a1.sinks.k1.hdfs.useLocalTimeStamp = true
# 小规模实验:定期关闭文件,便于查看
a1.sinks.k1.hdfs.rollInterval = 30
a1.sinks.k1.hdfs.rollSize = 0
a1.sinks.k1.hdfs.rollCount = 0
a1.sinks.k1.hdfs.idleTimeout = 10
a1.sinks.k1.hdfs.batchSize = 100
这是"完整文件采集",不是持续追加日志的采集方式。正在不断写入的日志文件,后面应改用 Taildir Source。
5. 分发到两个 worker:在 master 执行
bash
scp -r /home/dyl/flume dyl@worker1:/home/dyl/
scp -r /home/dyl/flume dyl@worker2:/home/dyl/
这里只分发程序和配置。两个 worker 将分别保存自己的采集进度和 File Channel 数据。
6. 创建目录:在两个 worker 分别执行
bash
mkdir -p /home/dyl/flume-spool
mkdir -p /home/dyl/flume-channel/checkpoint
mkdir -p /home/dyl/flume-channel/data
mkdir -p /home/dyl/flume/logs
检查 Java 和 HDFS 访问:
bash
/usr/lib/jvm/java-11-openjdk-amd64/bin/java -version
/home/dyl/hadoop-3.4.3/bin/hdfs dfs -ls /user/dyl/flume
第二条命令没有报错即可,目录目前可能是空的。
7. 启动采集:两个 worker 分别执行
先以前台方式运行,方便观察问题:
bash
/home/dyl/flume/bin/flume-ng agent \
--conf /home/dyl/flume/conf \
--conf-file /home/dyl/flume/conf/spool-to-hdfs.conf \
--name a1 \
-Dflume.root.logger=INFO,console
正常情况下它会一直运行,不会自动退出。 不要在同一台机器上重复启动同一套配置。
8. 放入测试文件
另开一个 worker1 连接,执行:
bash
TEST_FILE=$(mktemp /home/dyl/flume-test-XXXXXX)
printf 'worker1: hello flume\nworker1: hello hdfs\n' > "$TEST_FILE"
mv "$TEST_FILE" /home/dyl/flume-spool/
在 worker2 的另一个连接执行:
bash
TEST_FILE=$(mktemp /home/dyl/flume-test-XXXXXX)
printf 'worker2: hello flume\nworker2: hello cluster\n' > "$TEST_FILE"
mv "$TEST_FILE" /home/dyl/flume-spool/
先在外面写完文件,再移动进采集目录,避免 Flume 读到仍在写入的文件。
文件放进去后不要再修改,也不要重复使用同名文件。 这是 Spooldir 的使用要求。官方 Spooldir 说明
9. 检查采集结果
在两个 worker 查看:
bash
ls -la /home/dyl/flume-spool
文件被读取进入 Channel 后,通常会加上 .COMPLETED 后缀;这只说明 Source 读取完成,还需检查 HDFS 写入结果。
等待约 30 秒,在 master 执行:
bash
hdfs dfs -ls -R /user/dyl/flume
读取结果:
bash
hdfs dfs -cat '/user/dyl/flume/*/*/events*'
应看到来自两个 worker 的测试内容。输出目录会按采集机器名称和日期区分。
10. 测试成功后改为后台运行
先在两个 worker 的前台采集窗口按 Ctrl+C,等待退出,再分别执行:
bash
nohup /home/dyl/flume/bin/flume-ng agent \
--conf /home/dyl/flume/conf \
--conf-file /home/dyl/flume/conf/spool-to-hdfs.conf \
--name a1 \
-Dflume.root.logger=INFO,console \
> /home/dyl/flume/logs/agent.out 2>&1 &
echo $! > /home/dyl/flume/logs/agent.pid
查看日志:
bash
tail -n 50 /home/dyl/flume/logs/agent.out
停止本次启动的 Agent:
bash
kill "$(cat /home/dyl/flume/logs/agent.pid)"
以后先启动 HDFS,再启动两个 Flume Agent;停止时先停 Flume,再停 HDFS。 不要删除 File Channel 目录或采集进度来解决报错。