flume下载链接:https://flume.apache.org/download.html
官方产品文档:https://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html
参考转译文档:https://flume.liyifeng.org/
1、flume简介
- 概览
Apache Flume 是一个分布式、高可靠、高可用的用来收集、聚合、转移不同来源的大量日志数据到中央数据仓库的工具。
Apache Flume是Apache软件基金会(ASF)的顶级项目。
1.2、架构设计
- 数据流模型
Event是Flume定义的一个数据流传输的最小单元。Agent就是一个Flume的实例,本质是一个JVM进程,该JVM进程控制Event数据流从外部日志生产者那里传输到目的地(或者是下一个Agent)。
一个完整的Agent中包含了必须的三个组件Source、Channel和Sink;
Source是指数据的来源和方式,Channel是一个数据的缓冲池,Sink定义了数据输出的方式和目的地(这三个组件是必须有的,另外还有很多可选的组件interceptor、channel selector、sink processor等);
组件协作流程:
1)外部以Flume Source识别的格式向Flume发送Event;
2)当Source接收Event时,它将其存储到一个或多个channel;
3)sink从channel中移除Event并将其放入外部存储库(如HDFS,通过 Flume的 HDFS Sink 实现)或将其转发到流中下一个Flume Agent(下一跳)的Flume Source。
4)Agent中的source和sink与channel存取Event是异步的。
Attention:
A:Flume的组件source 不光能被动接收Event,也有Source可以主动收集Event;
- 复杂流向
Flume可以设置多级Agent连接的方式传输Event数据。也支持扇入和扇出的部署方式,类似于负载均衡方式或多点同时备份的方式。
2、flume实践
系统要求:
1)Java运行环境 - Java 1.8或更高版本;
下载版本: apache-flume-1.9.0-bin.tar.gz
使用操作系统用户Oracle,安装flume:
[oracle@hz-hostname ~]$
[oracle@hz-hostname ~]$ mkdir -p /software/apache
[oracle@hz-hostname ~]$ tar -zxvf apache-flume-1.9.0-bin.tar.gz
[oracle@hz-hostname ~]$ mv apache-flume-1.9.0-bin flume
- Attention:
1)配置文件中的注释,可以有 单行的注释,但是不能有 配置项后面的 #开头的注释;
可以识别如下配置:
# 配置Agent a1各个组件的名称
a1.sources = r1
无法识别如下配置:
# 配置Agent a1各个组件的名称
a1.sources = r1 #Agent a1 的source有一个,叫做r1
2)无需将 conf 文件夹下 flume-env.sh.template 修改为 flume-env.sh,如果启动失败不是这个原因;
- flume样例实践
1)在 /software/apache/flume/conf
下新建 f_example.conf
文件,内容如下:
# f_example.conf: 一个单节点的 Flume 实例配置
# 配置Agent ag1各个组件的名称
ag1.sources = sr1
ag1.sinks = sk1
ag1.channels = ch1
# 配置Agent ag1的source sr1的属性
ag1.sources.sr1.type = netcat
ag1.sources.sr1.bind = localhost
ag1.sources.sr1.port = 6666
# 配置Agent ag1的sink sk1的属性
ag1.sinks.sk1.type = logger
# 配置Agent ag1的channel ch1的属性,channel是用来缓冲Event数据的
ag1.channels.ch1.type = memory
ag1.channels.ch1.capacity = 1000
ag1.channels.ch1.transactionCapacity = 100
# 把source和sink绑定到channel上
ag1.sources.sr1.channels = ch1
ag1.sinks.sk1.channel = ch1
2)启动 flume-ng
启动路径:/software/apache/flume
启动命令:bin/flume-ng agent --conf conf --conf-file conf/f_example.conf --name ag1 -Dflume.root.logger=INFO,console
出现如下日志,表示成功:
2022-01-19 10:46:17,248 (conf-file-poller-0) [INFO - org.apache.flume.node.Application.startAllComponents(Application.java:196)] Starting Sink sk1
2022-01-19 10:46:17,249 (conf-file-poller-0) [INFO - org.apache.flume.node.Application.startAllComponents(Application.java:207)] Starting Source sr1
2022-01-19 10:46:17,250 (lifecycleSupervisor-1-0) [INFO - org.apache.flume.source.NetcatSource.start(NetcatSource.java:155)] Source starting
2022-01-19 10:46:17,266 (lifecycleSupervisor-1-0) [INFO - org.apache.flume.source.NetcatSource.start(NetcatSource.java:166)] Created serverSocket:sun.nio.ch.ServerSocketChannelImpl[/127.0.0.1:6666]
3)换一个terminal窗口,使用同一用户,执行如下操作
[oracle@hz-hostname ~]$ telnet localhost 6666
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
hello world!
OK
4)启动窗口显示日志:
2022-01-19 10:58:17,427 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: { headers:{} body: 68 65 6C 6C 6F 20 77 6F 72 6C 64 21 0D hello world!. }
- 配置使用变量
bin/flume-ng agent --conf conf --conf-file conf/f_example.conf --name ag1 -Dflume.root.logger=INFO,console -DpropertiesImplementation=org.apache.flume.node.EnvVarResolverProperties
修改 conf/f_example.conf 里的
ag1.sources.sr1.port = 6666
为
ag1.sources.sr1.port = ${AG_SR_PORT}
方式1:
shell 调用前 export AG_SR_PORT=6666
方式2:
在 conf/flume-env.sh 里 添加 export AG_SR_PORT=6666
================================ over ========================================