⚠Flume是什么?
Flume 是一种分布式,可靠且可用的服务,用于有效地收集,聚合 和移动大量数据。
Flume 构建在日志流之上一个简单灵活的架构。它具有可靠性 机制和许多故障转移和恢复机制,具有强大的容错性。使用Flume这套架构实现在线分析。Flume支持在日志系统中定制各类`数据发送方`,用于收集数据;同时,Flume 提供对数据进行简单的处理,并且写到各种`数据接收方` (可定制)的能力,当前Flume 有两个版本 0.9X版本的统称为Flume-og, Flume1.X 版本统称为Flume-ng。由于Flume-ng经过重大的重构,与Flume-og有很大的不同,使用时注意区分。本篇文章使用的是 apache-flume-1.9.0-bin.tar.gzFlume的架构
自我理解:
Flume是Cloudera开发的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据。数据源可定制、可扩展,数据存储系统可定制、可扩展。
flume运行的核心是agent。它是一个完整的数据收集工具,含有三个核心组件,分别是source、channel、sink。通过这些组件,event可以从一个地方流向另一个地方。为了保证输送一定成功,在送到目的地之前,会先缓存数据,待数据真正到达目的地后,删除自己缓存的数据。
Flume的安装
准备工作:
①确保机器上安装有JDK 1.8+ 并且配置JAVA_HOME
②下载 Flume的安装包 http://mirror.reverse.net/pub/apache/flume/1.9.0/apache-flume-1.9.0-bin.tar.gz
安装步骤:
[root@CentOSA ~]# tar -zxf apache-flume-1.9.0-bin.tar.gz -C /usr/
[root@CentOSA ~]# cd /usr/apache-flume-1.9.0-bin/
[root@CentOSA apache-flume-1.9.0-bin]# ./bin/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
Agent的配置模板
在Flume中 的三大核心组建为 source,channel,sink;这三个组建组成了一个Agent,而且一个Agent为一个日志采集的最小单位,所以配置Agent中的组件,根据业务需求进行自定义的配置 Agent中的组件,可以控制 数据的源头和输出 等,
# 声明组件信息
<Agent>.sources = <Source1> <Source2>
<Agent>.sinks = <Sink1> <Sink1>
<Agent>.channels = <Channel1> <Channel2>
# 组件配置
<Agent>.sources.<Source>.<someProperty> = <someValue>
<Agent>.channels.<Channel>.<someProperty> = <someValue>
<Agent>.sinks.<Sink>.<someProperty> = <someValue>
# 链接组件
<Agent>.sources.<Source>.channels = <Channel1> <Channel2> ...
<Agent>.sinks.<Sink>.channel = <Channel1>
解释:
<Agent>
、<Source>
、<Sink>
表示组件的名字,系统有哪些可以使用的组件需要查阅文档http://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html
快速入门
注意:
在这个测试案例中需要 yum install -y telnet #必须安装该插件插件
[root@CentOS ~]# yum install -y telnet
在flume conf文件中 编写配置文件
[root@CentOS apache-flume-1.9.0-bin]# vi conf/demo01.properties
# 声明组件信息 agent的名字为a1,3个组建的声明
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# 组件配置 从Socket中接收文数据
a1.sources.r1.type = netcat
a1.sources.r1.bind = CentOS
a1.sources.r1.port = 44444
# 配置Sink组件,将接收数据结果打印在 日志控制台上
a1.sinks.k1.type = logger
#配置Cannel通道,主要是负责数据缓冲
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
启动
[root@CentOS apache-flume-1.9.0-bin]# ./bin/flume-ng agent --conf conf/ --conf-file conf/demo01.properties --name a1 -Dflume.root.logger=INFO,console
测试
[root@CentOSA ~]# telnet CentOSA 44444
Trying 192.168.40.129...
Connected to CentOSA.
Escape character is '^]'.
hello world
OK
ni hao
OK
常用组件
Source 输入源的类型
1.Avro Source
**Avro Source内部启动一个 avro服务器,(avro是一种内部传输协议),用来接收 avro client 的请求,将数据流向 Channel中 **
属性 | 默认值 | 描述 |
---|---|---|
type | *必填 | Source 类型必须为 avro |
bind | *必填 | 绑定的IP |
port | *必填 | 绑定的端口号 |
配置文件:avro.properties
# 声明组件信息
a1.sources = s1
a1.sinks = sk1
a1.channels = c1
# 组件配置
a1.sources.s1.type = avro
a1.sources.s1.bind = CentOS
a1.sources.s1.port = 44444
a1.sinks.sk1.type = logger
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 链接组件
a1.sources.s1.channels = c1
a1.sinks.sk1.channel = c1
启动
[root@CentOS apache-flume-1.9.0-bin]# ./bin/flume-ng agent -c conf/ -n a1 -f conf/avro.properties -Dflume.root.logger=INFO,console
测试
[root@CentOS apache-flume-1.9.0-bin]# ./bin/flume-ng avro-client --host CentOS --port 44444 --filename /root/t_emp.txt
2.Exec Source
Exec Source可以将一个指令的输出结果进行采集
属性 | 默认值 | 描述 |
---|---|---|
channels | 对接的管道 | |
type | *必填 | Source的类型exec |
command | 所要执行的采集的命令 |
配置文件:exec.properties
注:tail -F 文件名 可 监听文件
# 声明组件信息
a1.sources = s1
a1.sinks = sk1
a1.channels = c1
# 组件配置
a1.sources.s1.type = exec
a1.sources.s1.command = tail -F /root/t_emp.txt
a1.sinks.sk1.type = logger
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 链接组件
a1.sources.s1.channels = c1
a1.sinks.sk1.channel = c1
启动
[root@CentOS apache-flume-1.9.0-bin]# ./bin/flume-ng agent -c conf/ -n a1 -f conf/exec.properties -Dflume.root.logger=INFO,console
测试
[root@CentOS apache-flume-1.9.0-bin]# echo test >> /root/t_emp.txt
2020-01-31 08:40:10,016 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: {
headers:{
} body: }
2020-01-31 08:42:16,070 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: {
headers:{
} body: 74 65 73 74 test }
3.Spooling Directory Source
Spooling Directory Source 采集指定文件目录下的新增文件
属性 | 默认值 | 描述 |
---|---|---|
channels | 需要对接的管道 | |
type | * | Source的类型 spooldir |
spoolDir | 所要采集哪个文件夹下的文件目录 | |
fileSuffix | .COMPLETED | 采集的文件后缀 |
fileHeader | false | 不显示消息头 可选值 false|true |
… |
配置文件 spooldir.properties
# 声明组件信息
a1.sources = s1
a1.sinks = sk1
a1.channels = c1
# 组件配置
a1.sources.s1.type = spooldir
a1.sources.s1.spoolDir = /root/spooldir
a1.sources.s1.fileHeader = true
a1.sinks.sk1.type = logger
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 链接组件
a1.sources.s1.channels = c1
a1.sinks.sk1.channel = c1
启动
[root@CentOS apache-flume-1.9.0-bin]# ./bin/flume-ng agent -c conf/ -n a1 -f conf/spooldir.properties -Dflume.root.logger=INFO,console
测试 拷贝一个文件到 所配置文件 /root/spooldir下
[root@CentOS ~]# cp t_emp.txt /root/spooldir/
2020-01-31 08:57:20,135 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: {
headers:{
file=/root/spooldir/t_emp.txt} body: 37 39 30 30 09 4A 41 4D 45 53 09 43 4C 45 52 4B 7900.JAMES.CLERK }
2020-01-31 08:57:20,135 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: {
headers:{
file=/root/spooldir/t_emp.txt} body: 37 39 30 32 09 46 4F 52 44 09 41 4E 41 4C 59 53 7902.FORD.ANALYS }
2020-01-31 08:57:20,135 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: {
headers:{
file=/root/spooldir/t_emp.txt} body: 37 39 33 34 09 4D 49 4C 4C 45 52 09 43 4C 45 52 7934.MILLER.CLER }
2020-01-31 08:57:20,135 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: {
headers:{
file=/root/spooldir/t_emp.txt} body: }
2020-01-31 08:57:20,135 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: {
headers:{
file=/root/spooldir/t_emp.txt} body: 74 65 73 74 test }
4.Taildir Source
Taildir Source 实时监控文本行的追加,对数据进行采集,并且会记录所采集文本数据行的偏移量,不会重复采集数据
它将以JSON格式定期将每个文件的最后读取位置写入给定位置文件。如果Flume由于某种原因停止或停机,它可以从写入现有位置文件中的位置重新开始拖尾
属性 | 默认值 | 描述 |
---|---|---|
channels | 所对接的管道 | |
type | Source的类型 TAILDIR | |
filegroups | 以空格分隔的文件组列表。每个文件组指示一组要尾部的文件 | |
filegroups. | 文件组的绝对路径 | |
positionFile | ~/.flume/taildir_position.json | 在跟下会有一个隐藏文件,来记录数据的便宜量 |
配置文件 taildir.properties
# 声明组件信息
a1.sources = s1
a1.sinks = sk1
a1.channels = c1
# 组件配置
a1.sources.s1.type = TAILDIR
a1.sources.s1.filegroups = g1 g2
a1.sources.s1.filegroups.g1 = /root/taildir/.*\.log$
a1.sources.s1.filegroups.g2 = /root/taildir/.*\.txt$
a1.sinks.sk1.type =