本文只是简单介绍Flume,主要目的是想知道Flume可以做什么,内容主要来源官网
概述
Apache Flume是一个分布式的、可靠的、可用的系统,用于有效地收集、聚合和将大量日志数据从许多不同的源转移到集中的数据存储中。
Apache Flume的使用不仅限于日志数据聚合。由于数据源是可定制的,Flume可以用来传输大量的事件数据,包括但不限于网络流量数据、社交媒体生成的数据、电子邮件消息以及几乎所有可能的数据源。
数据流程模型
Flume事件定义为具有字节有效负载和可选字符串属性集的数据流单元。Flume代理是一个(JVM)进程,它承载组件,事件通过组件从外部源流向下一个目标(hop)。

Flume源使用外部源(如web服务器)交付给它的事件。外部源以目标Flume源可识别的格式向Flume发送事件。
例如,Avro Flume源可用于从Avro clients 或流中的其他由Avro sink发送事件其他Flume agents 中接收Avro events。
当Flume源接收到一个事件时,它将其存储到一个或多个channels中。channel是一个被动存储,它保存事件,直到它 被Flume sink消费为止。
比如 file channel ,它由本地文件系统支持。接收器将事件从通道中移除,并将其放入外部存储库中,如HDFS(通过Flume HDFS sink)或将其转发到流中的下一个Flume agents(下一跳)的Flume源。
给定代理中的 source 和 sink 与 channel 中暂存的事件异步运行。
复杂流
Flume允许用户构建多跳(multi-hop)流,其中的事件在到达最终目的地之前经过多个代理。它还允许扇入和扇出流(fan-in and fan-out flows)、上下文路由(contextual routing)和失败跳转的备份路由(故障转移)。
可靠性
事件在每个agent上的一个通道中暂存,然后将事件交付到流中的下一个代理或终端存储库(如HDFS)。
只有在事件存储在next代理的通道或终端存储库中之后,才会从通道中删除它们。
这就是Flume中的单跳消息传递语义如何提供流的端到端可靠性。
Flume使用事务方法来保证事件的可靠交付。
sources 和sinks 分别封装在事务中,存储/检索由通道提供的事务放置或提供的事件。
这确保了事件集在流中的点与点之间可靠地传递。
对于多跳流,来自上一跳的sink 和来自下一跳的source 都运行它们的事务,以确保数据安全地存储在下一跳的channel 中。
可恢复性
事件在channel中暂存,channel负责管理故障恢复。
Flume支持由本地文件系统支持的持久 file channel 。还有一个 memory channel,它简单地将事件存储在内存队列中,速度更快,但是当代理进程死亡时,仍然留在 memory channel 中的任何事件都无法恢复。
设置
设置agent
- Flume agent 配置存储在本地配置文件中。
- 这是一个遵循Java属性文件格式的文本文件。
- 可以在同一个配置文件中指定一个或多个代理的配置。
- 配置文件包含 agent 中的每个源、接收器和通道的属性,以及它们如何连接在一起形成数据流。
配置单个组件
流中的每个组件(源、接收器或通道)都有一个名称、类型和一组特定于类型和实例化的属性。
例如,Avro source 需要hostname (or IP address)和port 来接收数据。
memory channel 可以有最大队列大小(capacity
)
HDFS sink 需要知道文件系统URI、创建文件的路径、文件旋转的频率(hdfs.rollInterval
)等
组件的所有这些属性都需要在宿主Flume agent的属性文件中设置。
组合组件
为了组成流,代理需要知道要加载哪些单独的组件以及它们是如何连接的。
这可以通过列出代理中的每个源、接收器和通道的名称,然后为每个接收器和源指定连接通道来实现。
例如,agent通过名为file-channel
的文件通道将事件从名为 avroWeb 的Avro源流到HDFS sink hdfs-cluster1
。
配置文件将包含这些组件的名称,并将文件通道作为 avroWeb 源和hdfs-cluster1
接收器的共享通道。
启动agent
代理使用名为Flume -ng 的shell脚本启动。
该脚本位于Flume发行版的bin目录中。
需要在命令行上指定代理名称、配置目录和配置文件
$ bin/flume-ng agent -n $agent_name -c conf -f conf/flume-conf.properties.template
代理将开始运行在给定属性文件中配置的source 和sinks 。
简单例子
监听 localhost 4444 端口,在flume 控制台输出监控结果
创建配置文件
[root@develop-01 flume]# vim flume-telnet-logger.conf
#输入以下内容
# Name the components on this agent
# a1 表示agent名称
a1.sources = r1 # r1 表示 a1 的输入源
a1.sinks = k1 # k1 表示 a1 的输出目的
a1.channels = c1 # c1 表示 a1 的缓冲区
# Describe/configure the source
a1.sources.r1.type = netcat # 表示 a1 的输入源 类型为netcat 端口
a1.sources.r1.bind = localhost # 表示 a1 的输入源监听 ip
a1.sources.r1.port = 44444 # 表示 a1 的输入源监听的端口
# Describe the sink
a1.sinks.k1.type = logger # 表示 a1 的输出目的是控制台 logger 类型
# Use a channel which buffers events in memory
a1.channels.c1.type = memory # 表示 a1 的 channel 类型是 memory
a1.channels.c1.capacity = 1000 # 表示 a1 的 channel 容量 1000 envent
a1.channels.c1.transactionCapacity = 100 # 表示 a1 的 channel 收集了 100 个event 才提交
# Bind the source and sink to the channel
a1.sources.r1.channels = c1 # 表示将 r1, c1连接起来
a1.sinks.k1.channel = c1 # 表示将 k1, c1连接起来
给flume-telnet-logger.conf执行权限
[root@develop-01 flume]# chmod 755 flume-telnet-logger.conf
启动Flume
$ bin/flume-ng agent --conf conf --conf-file example.conf --name a1 -Dflume.root.logger=INFO,console
注意,在完整的部署中,我们通常会包含一个额外的选项:——conf=<conf-dir>。<conf-dir>目录将包含一个shell脚本flume-env.sh,并可能包含一个log4j属性文件。在本例中,我们传递了一个Java选项来强制Flume登录到控制台,并且没有自定义环境脚本。
telnet 44444 端口、发送信息
[root@develop-01 flume-ng]# telnet localhost 44444
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
lillcol
OK
zhetian
OK
20190717
OK
输出结果
19/07/17 16:06:13 INFO source.NetcatSource: Source starting
19/07/17 16:06:13 INFO source.NetcatSource: Created serverSocket:sun.nio.ch.ServerSocketChannelImpl[/127.0.0.1:44444]
19/07/17 16:06:29 INFO sink.LoggerSink: Event: { headers:{} body: 6C 69 6C 6C 63 6F 6C 0D lillcol. }
19/07/17 16:07:40 INFO sink.LoggerSink: Event: { headers:{} body: 7A 68 65 74 69 61 6E 0D zhetian. }
19/07/17 16:08:02 INFO sink.LoggerSink: Event: { headers:{} body: 32 30 31 39 30 37 31 37 0D 20190717. }

后续可能会作为数据采集工具使用,如有机会再更新
网友评论