Flume是一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。基于流式架构,使用灵活简单,最主要的作用就是读取服务器本地磁盘的数据,将数据写入到HDFS。
Agent是一个JVM进程,它以事件的形式,将数据从数据源传输到目标中。
Source是负责接收数据到Flume Agent的组件。它可以处理各种类型、各种格式的数据,包括avro、thrift、exec、jms、spooling directory、netcat、taildir、sequence generator、syslog、http、legacy。
Sink不断地轮询Channel中的事件,且批量地移除他们,并将这些时间批量写入到存储或者索引系统、或者被发送到另外一个Flument Agent。
Sink组件的目的地包括hdfs、logger、avro、thrift、ipc、file、HBase、solr、自定义Sink等等。
Channel是位于Source和Sink之间的缓冲区(可以理解为消息队列)、因此,Channel允许Source和Sink运作在不同的速率上。Channel是线程安全的,可以同时处理几个Source写入的操作和几个Sink的读取操作。Flume自带两种Channel:Memory Channel 和File Channel。
Memory Channel
Memory Channel是内存中的队列。Memory Channel在不需要关心数据丢失的情景下使用。如果需要关心数据丢失,那么Memory Channel就不应该使用,因为程序崩溃,机器宕机、或者重启都会导致Memory Channel中的数据丢失。
File Channel
File Channel 将所有的事件写入到磁盘。因此在程序关闭或者机器宕机的情况下不会发生数据丢失。
Event是Flume数据传输的基本单元。在Flume中,数据以Event的形式从Source流向Channel,再从Channel中被Sink读取最后写入到目的地。
Event由Header和Body两部分组成。Header用来存放Event的一些属性,为K-V结构,Body用来存放该条数据的内容,为字节数组。
Flume的安装还是相当简单的,基本上“开箱可用”。
官方连接:https://dlcdn.apache.org/flume/1.10.1/apache-flume-1.10.1-bin.tar.gz
[root@k8s-node3 software]# wget https://dlcdn.apache.org/flume/1.10.1/apache-flume-1.10.1-bin.tar.gz --no-check-certificate
[root@k8s-node3 software]# tar -xzvf apache-flume-1.10.1-bin.tar.gz
[root@k8s-node3 software]# cd apache-flume-1.10.1-bin/
[root@k8s-node3 apache-flume-1.10.1-bin]# ls
archive bin CHANGELOG conf DEVNOTES doap_Flume.rdf docs flume.log job lib LICENSE NOTICE README.md RELEASE-NOTES test.conf tools
[root@k8s-node3 apache-flume-1.10.1-bin]# cd conf/
[root@k8s-node3 conf]# ls
flume-conf.properties flume-conf.properties.template flume-env.ps1.template flume-env.sh flume-env.sh.template log4j2.xml
[root@k8s-node3 conf]# cp flume-env.sh.template flume-env.sh
[root@k8s-node3 apache-flume-1.10.1-bin]# cd lib
[root@k8s-node3 lib]# rm guava-11.0.2.jar
在/etc/profile.d/目录下新建flume.sh文件,
[root@k8s-node3 profile.d]# toucd /etc/profile.d/flume.sh
文件内容如下
export FLUME_HOME=/home/software/apache-flume-1.10.1-bin
export PATH=$FLUME_HOME/bin/:$PATH
[root@k8s-node3 profile.d]# source /etc/profile.d/flume.sh
[root@k8s-node3 profile.d]# flume-ng version
Flume 1.10.1
Source code repository: https://git.apache.org/repos/asf/flume.git
Revision: 047516d4bd5574c3e67a5d98ca2cfe025886df7c
Compiled by rgoers on Sat Aug 13 11:16:08 MST 2022
From source with checksum de1cf990338c759d311522e65597e457
使用netcat的source,监听主机上的网络端口,将网络端口上的字符流数据打印到输出台上。
在flume的安装目录下创建目录名为job的目录,并创建一个flume-netcat-logger.conf 文件,文件内容如下
# 定义source、channels、sinks变量名,a1 为agent的名称
a1.sources = r1
a1.channels = c1
a1.sinks = k1
# 定义source,source的类型是netcat,监听本机的端口是44444
a1.sources.r1.type = netcat
a1.sources.r1.bind = 0.0.0.0
a1.sources.r1.port = 44444
# 定义channel,使用memory channel类型
a1.channels.c1.type = memory
a1.channels.c1.Capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 定义sink
a1.sinks.k1.type = logger
# bind channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
Tips:注意在绑定sink与channel时,a1.sinks.k1.channel = c1不要在channel后面添加s,这是很容易出错的点,因为一个sink只能绑定一个channel。
[root@k8s-node3 apache-flume-1.10.1-bin]# flume-ng agent -c conf -f job/flume-netcat-logger.conf -n a1 -Dflume.root.logger=INFO,Console
启动参数说明:
[root@k8s-node3 ~]# nc localhost 44444
hello,world
OK
在flume的agent的运行窗口可以看到
2022-08-30 06:26:52,501 (lifecycleSupervisor-1-1) [INFO - org.apache.flume.source.NetcatSource.start(NetcatSource.java:166)] Created serverSocket:sun.nio.ch.ServerSocketChannelImpl[/0:0:0:0:0:0:0:0:44444]
2022-08-30 06:33:38,519 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: { headers:{} body: 68 65 6C 6C 6F 2C 77 6F 72 6C 64 hello,world }
如果能正常显示netcat发送的数据,那么就说明job的配置是正常的。
如果按照以上步骤或者按照官方文档的步骤操作,很有可能在控制台是看不到netcat发送的消息的,这是因为flume的logger sink默认会将结果打印到文件中。可以打开$FLUME_HOME/flume.log文件查看接收到的数据。
如果需要在控制台输出接收到的数据,则需要更改conf/log4j2.xml文件
找到下面内容,添加Console日志输出
<Root level="INFO">
<AppenderRef ref="LogFile" />
<AppenderRef ref="Console" />
Root>