一.Flume简介
1.Flume是什么?
Apache Flume是一个分布式的,可靠性的,可用的数据收集系统,它可以有效地收集,聚合和移动大量的日志数据,这些数据可以从许多不同的来源转移到一个集中的数据存储中。
Apache Flume不仅仅限于日志数据集合。由于数据源是可定制的,所有Flume可用于传输大量事件数据,包括但不限于网络流量数据,社交媒体生成的数据,电子邮件消息以及几乎所有可能的数据源。
2.Flume特点
(1)可靠性
Flume的核心是把**数据从数据源收集过来,再送到目的地。**为了保证输送一定成功,在送到目的地之前,会先缓存数据,待数据达真正到达目的地,删除自己缓存的数据。
Flume使用事务性的方式保证传送Event整个过程的可靠性。
(2)可恢复性
Events在通道中执行,由该通道管理从失败中恢复。
Flume支持由本地文件系统支持的持久文件通道。还有一个内存通道,它只是简单地将事件存储在内存队列中,速度更快,但当代理进程死亡时,仍然留存内存通道中的任何时间都无法恢复
3.Flume架构
Flume 架构包括三部分:Client、Agent、Event。
(1)Event
Flume事件(Event)被定义为数据流的一个单元,是数据传输的基本单元。
它具有字节有效载荷和一组可选的字符串属性,通常对应一行数据。Event是数据流的数据对象,而Flume数据流(Data Flow)描述了数据从产生,传输,处理并最终写入目标的一条路径。
(2)Agent
Flume代理(Agent)是一个JVM进程,它承载组件(Source,Channel,Sink等等),事件通过组件从外部源流向下一个目标。
(3)Client
客户端,数据产生的地方,如 Web 服务器。
二.Flume原理
1.主要组件
Agent 是一个 JVM 进程,它以事件 Event 的形式将数据从源头送至目的,是Flume 数据传输的基本单元。
Agent主要组成:Source、Channel、Sink
详细组件:Source、SourceRunner、Interceptor、Channel、ChannelSelector、
ChannelProcessor、Sink,SinkRunner、SinkProcessor、SinkSelector
(1)Source
Source是负责接收数据到Flume Agent的组件,用来获取Event并写入Channel
(2)SourceRunner
负责启动Source,一个SourceRunner包含一个Source对象
(3)Interceptor
拦截器,Source接收的事件Event,在写入Channel之前,拦截器都可以进行转换或者删除这些事件。每个拦截器只处理同一个Source接收到的事件。可以自定义拦截器
(4)Channel
**Channel 是位于 Source 和 Sink 之间的缓冲区。**中转Event的一个临时存储,保存有Source组件传递过来的Event,可以认为是一个队列。Channel允许Source和Sink运作在不同速率上,Channel是线程安全的,可以同时处理几个Source的写入操作和几个Sink的读取操作。
(5)ChannelSelector
为Source选择下游的Channel。有两种选择方式,复制和多路复用。所谓复制就是把Source中传递过来的Event复制给所有对应的下游的Channel。多路复用是可以把Source传递过来的Event按照不同的属性传递到不同的下游Channel中去。
(6)ChannelProcessor
通过ChannelSelector获取到Channels后,如何发送Event到Channel。一个Source对象包含一个ChannelProcessor对象,一个ChannelProcessor对象包含多个Interceptor对象和一个ChannelSelector对象
(7)Sink
从Channel中读取并移除Event,将Event传递到Flow Pipeline中的下一个Agent或者其他存储系统,Sink不断地轮询Channel中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统,或者被发送到另外一个Flume Agent。
Sink是完全事务性的。从Channel批量删除数据之前,每个sink用Channel启动一个事务。批量事件一旦成功写出到存储系统或者下一个Flume Agent,Sink就利用Channel提交事务。事务一旦被提交,该Channel从自己的内部缓冲区删除事件。
(8)SinkRunner
负责启动Sink。在Agent启动时,会同时启动Channel,SourceRunner,SinkRunner。
(9)SinkProcessor
Flume提供FailoverSinkProcessor和LoadBalancingSinkProcessor,一个是失效备援,一个是负载均衡,那么SinkProcessor不同子类的存在就是为了实现不同的分配操作和策略,而sink的start()通常是启动线程去执行消费操作。
(10)SinkSelector
LoadBalancingSinkProcessor 包含 SinkSelector,会根据 SinkSelector
在 SinkGroup(逻辑上的一组 Sink)中选择 Sink 并启动。
三.工作流程
1.Source—>Channel
数据由Source写入Channel,主动模式。
(1)SourceRunner启动Source,Source接收Event;
(2)Source调用ChannelProcessor;
(3)ChannelProcessor调用Interceptor进行过滤Event操作;
(4)ChannelProcessor调用ChannelSelector对象根据配置的策略选择Event对应的Channel;
(5)Source将Event发送到对应的Channel中。
2.Channel—>Sink
数据由Sink主动从Channel拉取
(1)SinkRunner启动SinkProcessor(DefaultSinkProcessor,FailoverSinkProcessor,LoadBalancingSinkProcessor 3 种)
(2)如果是DefaultSinkProcessor的话,直接启动单个Sink;
(3)FailoverSinkProcessor,LoadBalancingSinkProcessor 对应的是SinkGroup;
(4)FailoverSinkProcessor 从 SinkGroup 中选择出 Sink 并启动;
(5)LoadBalancingSinkProcessor 包含 SinkSelector,会根据 SinkSelector 在SinkGroup 中选择 Sink 并启动;
(6)Sink从Channel中消费Event信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vdPkjvhI-1612338388519)(C:\Users\86188\Desktop\截图\0123\9.jpg)]
四.核心常用组件
https://flume.liyifeng.org/#id27
1.Source
(1)Exec Source
在启动时运行一个给定的Unix命令,并期望该进程不断地在标准输出上产生数据。
Exec Source必选属性配置
属性 | 默认值 | 描述 |
---|---|---|
channels | - | 指定 Channels,多个 Channel 以空格分隔 |
type | - | 组件类型名必须是“exec” |
command | - | 指定Shell命令,如:tail -F /var/log/secure |
a1.sources = r1
a1.channels = c1
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /var/log/secure
a1.sources.r1.channels = c1
(2)Spooling Directory Source
该Source将监视指定目录的新文件,一旦有新文件产生立即解析它们。将给定的文件完全读入Channel后,默认情况下可以通过重命名该文件来表示完成,或者可以删除该文件,或者使用trackerDir跟踪已处理的文件。
属性 | 默认值 | 描述 |
---|---|---|
channels | - | 指定 Channels,多个 Channel 以空格分隔 |
type | - | 组件类型名必须是“spooldir” |