Flume的安装与单点数据采集

基于Flume的单点数据采集

1 安装Flume

1.1 复制Flume的下载镜像

https://flume.apache.org/download.html

复制Flume镜像地址

image-20251010173954665

1.2 新建目录并切换到sortware目录下

sudo mkdir -p /usr/software
cd /usr/software

1.3 下载Flume安装包到此目录

以下代码中所列地址只作为格式说明,不能作为实际下载地址使用,实际地址从官网中复制

wget https://dlcdn.apache.org/flume/1.11.0/apache-flume-1.11.0-bin.tar.gz

用国内镜像吧,国外镜像能把人逼疯

wget https://repo.huaweicloud.com:8443/artifactory/apache-local/flume/1.9.0/apache-flume-1.9.0-bin.tar.gz

1.4 解压 Flume文件

app为提前建好的目录

[root@hadoop01 usr]# mkdir app
 tar -zxvf apache-flume-1.9.0-bin.tar.gz -C /usr/app/

1.5 进入flume的配置目录并命名

cd /usr/app/apache-flume-1.9.0-bin/conf

将conf目录下的“flume-env.sh.template”文件复制并重命名

cp flume-env.sh.template flume-env.sh

打开复制重命名后的“flume-env.sh”文件

vi flume-env.sh

向文件中添加Java的安装位置(以下代码只做格式说明,实际安装位置根据自己安装的Java实际路径填写)

export JAVA_HOME=/opt/programs/jdk1.8.0_202

打开系统的环境配置文件

vi /etc/profile

在文件中追加以下内容

export FLUME_HOME=/usr/app/apache-flume-1.9.0-bin/
export FLUME_CONF_DIR=$FLUME_HOME/conf
export PATH=$PATH:$FLUME_HOME/bin

保存退出后执行以下命令,使更新后的环境变量生效

source /etc/profile

执行以下命令验证Flume是否安装成功

flume-ng version

执行成功会出现版本号例如:

Flume 1.9.0
Source code repository: https://git-wip-us.apache.org/repos/asf/flume.git
Revision: d4fcab4f501d41597bc616921329a4339f73585e
Compiled by fszabo on Mon Dec 17 20:45:25 CET 2018
From source with checksum 35db629a3bda49d23e9b3690c80737f9

2 单机操作Flume

切换到usr下新建一个test目录

mkdir test

在test目录下创建子目录flume-test

cd test
mkdir flume-test

2.1 单点采集数据到本地

进入flume-test目录

cd flume-test

在flume-test目录下创建子目录1,以及子1目录下的两个子目录input和output

mkdir -p 1/input
mkdir 1/output

进入目录1

cd 1

创建新文件file-logger.conf,编写采集方案

vi file-logger.conf
a1.sources = r1
a1.sinks = k1
a1.channels = c1

a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /usr/test/flume-test/1/input

a1.sinks.k1.type = file_roll
a1.sinks.k1.sink.directory = /usr/test/flume-test/1/output

a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
 
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

执行以下命令启动flume,此时进程不会退出

flume-ng agent -c conf/ -f file-logger.conf -n a1 -Dflume.root.logger=INFO,console

成功启动的话会有类似如下标志

2025-10-11 15:00:00,xxx INFO node.Application: Starting new configuration:{ sourceRunners:{r1=...} sinkRunners:{k1=SinkRunner: {...}} channels:{c1=...} }
2025-10-11 15:00:00,xxx INFO instrumentation.MonitoredCounterGroup: Component type: CHANNEL, name: c1 started
2025-10-11 15:00:00,xxx INFO instrumentation.MonitoredCounterGroup: Component type: SOURCE, name: r1 started
2025-10-11 15:00:00,xxx INFO instrumentation.MonitoredCounterGroup: Component type: SINK, name: k1 started

在input目录创建测试目录

echo "Flume test data: Hello Flume!" > /usr/test/flume-test/1/input/test-data.txt

Flume采集会监控到input目录的变化,会出现如下反馈信息:

test-data.txt文件名后天机了一个尾部,采集到的数据会出现在output子目录中

poolingFileEventReader.java:497)] Preparing to move file /usr/test/flume-test/1/input/test-data.txt to /usr/test/flume-test/1/input/test-data.txt.COMPLETED

2.2 单点采集数据到HDFS

将hadoop中的“shar/hadoop/common/lib”子目录中的guava-27.0-jre.jar文件复制到flume的子目录lib中

cp /opt/programs/hadoop-3.3.6/share/hadoop/common/lib/guava-27.0-jre.jar /usr/app/apache-flume-1.9.0-bin/lib/

将flume子目录lib中的"guava-11.02.jar"文件重命名

mv /usr/app/apache-flume-1.9.0-bin/lib/guava-11.0.2.jar /usr/app/apache-flume-1.9.0-bin/lib/guava-11.0.2.jar.back

在所有节点上启动zookeeper

zkServer.sh start

在主节点上启动HDFS

start-dfs.sh

在主节点上启动YARN

start-yarn.sh

进入flume-test目录

cd /usr/test/flume-test

在flume-test目录下,一次创建好两级子目录2/input

mkdir -p 2/input

进入目录2

cd 2

创建新文件hdfs-logger.conf,编写采集方案

vi hdfs-logger.conf

向文件中写入方案

a1.sources=r1
a1.sinks=k1
a1.channels=c1

a1.sources.r1.type=spooldir
a1.sources.r1.spoolDir = /usr/test/flume-test/2/input

a1.sinks.k1.type=hdfs
a1.sinks.k1.hdfs.path=hdfs://ns/flume/2/data/%Y-%m-%d%H%M
a1.sinks.k1.hdfs.rollInterval=0
a1.sinks.k1.hdfs.rollSize=10240000
a1.sinks.k1.hdfs.rollCount=0
a1.sinks.k1.hdfs.idleTimeout=3
a1.sinks.k1.hdfs.fileType=DataStream
a1.sinks.k1.hdfs.round=true
a1.sinks.k1.hdfs.roundValue=10
a1.sinks.k1.hdfs.roundUnit=minute
a1.sinks.k1.hdfs.useLocalTimeStamp=true

a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100

a1.sources.r1.channels=c1
a1.sinks.k1.channel=c1

启动Flume

flume-ng agent -c conf/ -f hdfs-logger.conf -n a1 -Dflume.root.logger=INFO.console

在集群的另一个节点终端上执行ssh命令登录到主节点上(这里以hadoop02登录hadoop01为例)

ssh hadoop01

进入子目录"1"下的"input"目录

cd /usr/test/flume-test/2/input

在当前目录,采取以下命令的方式为"input"目录动态创建数据素材文件

echo "hello world" > test.log

创建后执行以下命令可以退出ssh登录

exit

Flume采集进程输出采集完成的提示信息例如:

2025-10-11 16:05:28,446 INFO hdfs.BucketWriter: Renaming hdfs://ns/flume/2/data/2025-10-11_1600/FlumeData.1760169922271.tmp to hdfs://ns/flume/2/data/2025-10-11_1600/FlumeData.1760169922271

在浏览器的地址栏中输入HDFS的地址,在页面的菜单栏选择"Utilities"菜单栏列表,选择第一个子菜单选项"Browse the file system",使页面跳转到"Browse Directory"页面

HDFS的地址是根据hadoop目录里面的hdfs-site.xml里面的内容:

```
<property>
        <name>dfs.namenode.http-address.ns.nn1</name>
        <value>hadoop01:50070</value>
</property>
```    

image-20251011195224691

flume -> 2 -> data -> 日期 -> 时间

image-20251011195709233

image-20251011195733110

image-20251011195756491

image-20251011200038516

image-20251011200236092

image-20251011200303726

2.3 采集持续增加的内容,保存到HDFS

进入"flume-test"目录

cd /usr/test/flume-test

在"flume-test"目录下,一次创建好两级子目录"3/input"

mkdir -p 3/input

进入目录"3"

cd 3

将原来目录"2"下的配置采集方案复制到目录"3"中,并重命名

cp ../2/hdfs-logger.conf increase-logger.conf
vi increase-logger.conf

打开"increase-logger.conf"文件(注:以下只列出了被修改处代码)

a1.sources=r1
a1.sinks=k1
a1.channels=c1

a1.sources.r1.type=exec
a1.sources.r1.spoolDir = /usr/test/flume-test/3/input
a1.sources.r1.command = tail -F /usr/test/flume-test/3/input/test.log

a1.sinks.k1.type=hdfs
a1.sinks.k1.hdfs.path = hdfs://ns/flume/3/data/%Y-%m-%d_%H%M
a1.sinks.k1.hdfs.rollInterval=600
a1.sinks.k1.hdfs.rollSize=0
a1.sinks.k1.hdfs.rollCount=10000
a1.sinks.k1.hdfs.filePrefix=transaction_log
a1.sinks.k1.hdfs.idleTimeout=3
a1.sinks.k1.hdfs.fileType=DataStream
a1.sinks.k1.hdfs.round=true
a1.sinks.k1.hdfs.roundValue=10
a1.sinks.k1.hdfs.roundUnit=minute
a1.sinks.k1.hdfs.useLocalTimeStamp=true

a1.channels.c1.type=file
a1.channels.c1.checkpointDir=/usr/test/flume-test/3/dataCheckpointDir
a1.channels.c1.dataDirs=/usr/test/flume-test/3/data
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100

a1.sources.r1.channels=c1
a1.sinks.k1.channel=c1

启动Flume

flume-ng agent -c conf/ -f increase-logger.conf -n a1 -Dflume.root.logger=INFO,console

开启另一个主节点终端,进入"3"目录的子目录"input",创建"test.log"文件

cd /usr/test/flume-test/3/input
vi test.log

向"test.log"文件中写入新的内容,写入后关闭。进入HDFS页面检测结果。

2.4 对持续增加内容的第二种采集方式

进入"flume-test"目录

cd /usr/test/flume-test

在"flume-test"目录下,一次创建好两级子目录"4/input"

mkdir -p 4/input

进入目录"4"

cd 4

将原来目录"2"下的配置采集方案复制到目录"4"中,并重命名

cp ../2/hdfs-logger.conf tail-logger.conf

打开"tail-logger.conf"文件

vi tail-logger.conf

在文件中修改以下内容(注:以下只列出了被修改处代码)

a1.sources=r1
a1.sinks=k1
a1.channels=c1

a1.sources.r1.type=TAILDIR
#a1.sources.r1.spoolDir = /usr/test/flume-test/4/input
a1.sources.r1.positionFile=/usr/test/flume-test/4/record/taildir_position.json
a1.sources.r1.filegroups=f1 f2
a1.sources.r1.filegroups.f1=/usr/test/flume-test/4/input/test.txt
a1.sources.r1.filegroups.f2=/usr/test/flume-test/4/input/.*log.*

a1.sinks.k1.type=hdfs
a1.sinks.k1.hdfs.path = hdfs://ns/flume/2/data/%Y-%m-%d_%H%M
a1.sinks.k1.hdfs.rollInterval=0
a1.sinks.k1.hdfs.rollSize=10240000
a1.sinks.k1.hdfs.rollCount=0
a1.sinks.k1.hdfs.idleTimeout=3
a1.sinks.k1.hdfs.fileType=DataStream
a1.sinks.k1.hdfs.round=true
a1.sinks.k1.hdfs.roundValue=10
a1.sinks.k1.hdfs.roundUnit=minute
a1.sinks.k1.hdfs.useLocalTimeStamp=true

#a1.channels.c1.type=memory
#a1.channels.c1.capacity=1000
#a1.channels.c1.transactionCapacity=100
a1.channels.c1.type=file
a1.channels.c1.checkpointDir=/usr/test/flume-test/4/dataCheckpointDir
a1.channels.c1.dataDirs=/usr/test/flume-test/4/data

a1.sources.r1.channels=c1
a1.sinks.k1.channel=c1

启动Flume

flume-ng agent -c conf/ -f tail-logger.conf -n a1 -Dflume.root.logger=INFO,console

另开启一个主节点终端进入"4"目录的子目录"input",创建"test.log"文件。并将"test.log"文件多次打开、关闭、并在打开后添加不同的新内容

cd /usr/test/flume-test/4/input
vi test.log

在"input"目录下,再创建一个"test.txt"文件

vi test.txt

像"test.log"文件操作一样,也多次打开、关闭"test.txt"文件并在打开后添加不同的新内容,最后登录HDFS页面检测结果。

posted @ 2025-10-12 15:30  酱焖热带鱼  阅读(31)  评论(0)    收藏  举报