本文大量内容系转载自以下文章,有删改,并参考其他文档资料加入了一些内容:
Apache Flume
,现为Apache顶级项目。
他是一款分布式的,可靠的,高可用的高效数据采集、聚合系统,可以从不同数据源把数据导入集中式的数据存储。
具体来说,Flume 是一款实时ETL系统,典型的应用场景是作为数据总线,实时的进行日志采集、分发与存储,它是一个微内核,可扩展的架构设计。
可以参考Flume NG 学习笔记(九)Flune Client 开发
它主要用于生产Events
,并将它们发送到一个或多个Agents
,常见的有 log4j Appender
、LoadBalancingRpcClient
、FailoverRpcClient
,它不是部署图中的必须部分。
一个配置文件可以同时配置多个Agent,只有指定agent名称相关的配置才会被加载,配置错误的组件在加载的时候输出一个条告警日志,然后会被忽略,Agent支持配置的动态加载。
Sources
、Channels
、Sinks
,并将events
对象进行透明传输的JVM进程。Event
数据流的基础组件,提供了生命周期管理、配置动态生效、数据流监控等基本功能。它是数据源,从特定渠道接受Events
,将它存储到Channel
中。
它缓存接收到的events直到它们被Sinks节点消费完成,不同的Channel提供不同持久化层级。
它主要从特定的Channel中获取数据,将数据可靠的传输到下一个目的地(外部存储或下一个flume-agent)
Flume Event
被定义为数据传输基本单元,他拥有字节负载及可选的String属性集。具体来说,Event
由 数据 和 header域信息 构成。header域信息的开销对整个数据采集来说是透明的,是由K-V构成的Map信息,主要用于上下文路由。
events
到Agents
。Source
, Interceptors
, Channel Selectors
, Channels
, Sink Processors
, Sinks
等组件。Sink Processor
选择一个Sink从指定的Channel获取 Events
发送到配置的下一跳节点.事务
保证了单节点的消息投递的可靠性;Channel 持久化保证了端到端的可靠性。foo
Agent通过Avro sink
流向下一个bar
Agent的Avro source
Avro
-Agent,他们都通过Avro sink
发送到第二层的一个或一组Avro-Souce
Agent中,汇集数据后最终数据流入HDFS.Avrosink
、LoadBalancingRpcClien
t)常见Source分类如下:
启动一个Avro Server,可与上一级Agent连接
handler
处理转换为Flume Event。unix command
,获取标准输出,如tail -f
source
、sink
以及upstream
与downstream
的依赖关系,是整个Flow可靠性、可用性的关键所在。事务
机制的保证,支持source写失败时重复写以及sink读失败时重复读等。事务对顺序性是一种弱保护的机制。Channel事务的目标是保证消息的At Least Once
消费,事务是Channel强相关的,它保证了Events
一旦committed
到一个channel ,它只有在下游消费者消费并返回了committed
后才会从队列中移除。
Event
, put
and committed
到 Channel 1Event
并发送到Source 2。puts
and commits
到Channel 2。commits
确认已“take“成功,将这个event从channel1中删除。一批数据的操作的事务性
常用channel如下:
存于配置了最大容量的内存队列,速度快,适用于追求高吞吐量且能容忍部分数据丢失的场景。
transactionCapacity
可以配置每个事务中,Channel从Source里获取或Channel传给Sink的events数量。以WAL文件为支持,保证数据的本地持久化,重启数据不丢失。
将Event
追加方式顺序写入File Channel文件末尾,通过maxFileSize
设置该文件大小阈值。当数据文件中的Event
已被读取且该文件已关闭,还接收到了Sink提交过来的已经读取该文件数据完成的事务,则Flume此时会删除该文件。
transactionCapacity
可以配置每个事务中,Channel从Source里获取或Channel传给Sink的events数量。具体写入File-Channel流程如下:
将events
存于单独安装的Kafka集群中,由Kafka保证高可用性。使用于以下场景:
events
提供可靠性和高可用行events
以低延时地、错误容忍地方式发送给下游 source,如 HDFS, HBase, Solr等以嵌入式的Derby数据库进行events
持久化,适用于对可恢复性要求高的场景。
At least once
地消费。具体来说,当Sink写的event成功时,就会向Channel提交一个事务:如果该事务提交成功,则表示该event被处理完成,将删除该event;否则Channel会等待Sink重新消费处理失败的event常见Sink分类如下:
Interceptor
主要用来对流入Source的Event
对象进行修饰和过滤(不return该Event即可,或不return 整个Event List代表丢弃所有Event),当前内置的Interceptors支持添加时间戳、主机、静态标签等header域信息;支持用户自定义的Interceptor。
Flume支持多个Interceptor
组成链式结构,执行顺序按在配置文件的指定顺序执行。执行链中的前一个interceptor return 的 Event会传递到下一个 interceptor。示例如下:
a1.sources = r1
a1.sinks = k1
a1.channels = c1
a1.sources.r1.interceptors = i1 i2
a1.sources.r1.interceptors.i1.type = org.apache.flume.interceptor.HostInterceptor$Builder
a1.sources.r1.interceptors.i1.preserveExisting = false
a1.sources.r1.interceptors.i1.hostHeader = hostname
a1.sources.r1.interceptors.i2.type = org.apache.flume.interceptor.TimestampInterceptor$Builder
a1.sinks.k1.filePrefix = FlumeData.%{CollectorHost}.%Y-%m-%d
a1.sinks.k1.channel = c1
Source在将Event
写入Channel之前会先调用Interceptor
,等全部处理完后,再调用selector
。
selector
允许Source根据Event
header 域的标签信息,从所有的Channels中选出Event
对应的Channel进行发送。
目前内置的Channel Selectors有两类。
将Event以复制的方式应用到所有对应Channel中。
多路复用Selector。可根据Event
header域信息来选择要写入的目标Channel。
agent_foo.sources.avro-AppSrv-source1.selector.type = multiplexing
agent_foo.sources.avro-AppSrv-source1.selector.header = State
agent_foo.sources.avro-AppSrv-source1.selector.mapping.CA = mem-channel-1
agent_foo.sources.avro-AppSrv-source1.selector.mapping.AZ = file-channel-2
agent_foo.sources.avro-AppSrv-source1.selector.mapping.NY = mem-channel-1 file-channel-2
agent_foo.sources.avro-AppSrv-source1.selector.optional.CA = mem-channel-1 file-channel-2
agent_foo.sources.avro-AppSrv-source1.selector.mapping.AZ = file-channel-2
agent_foo.sources.avro-AppSrv-source1.selector.default = mem-channel-1
该例子中,挑选header域为State
的Event。
并根据Value
不同取值放入不同Channel,还设了不匹配任何header时默认Channel为mem-channel-1
。
Selector将首先尝试写入所需的Channel(非Optional),若其中一个Channel无法消费Event,会造成事务失败。 此时,该事务会在所有Channel上重新尝试。 一旦所有必需的Channel消耗了Event,则Selector将尝试写入optional
Channel。 任何optional
Channel消耗该Event的失败都会被忽略而不会重试。
当在非/是optional
Channel中存在重叠的header,则该Channel被认为是required
(必须的)。当Event写入这类Channel中时失败,会导致重试写入到所有配置的required
Channel。
没有匹配到非optional
Channel的header,会将该Event写入默认Channel,还会尝试写入该header配置的optional
Channel。
LoadBalancingRpcClient、FailoverRpcClient ,保证了Client侧的高可用性。
Memory Channel、FileChannel、Kafka Channel的可用性递增,性能递减。
SinkProcessor
主要作用是对多个Sink进行负载均衡和自动Failover。
具体来说,SinkProcessor负责从指定的SinkGroup中调用一个Sink节点,由 Sink Runner负责调度,类似做了一层代理;一个Sink节点只能存在于一个SinkProcessor中,如果没有配置任何SinkGroup,默认是在Default Sink Processor中。目前内置Sink Process有 Load Balancing Sink Processor–RANDOM,ROUND_ROBIN、Failover Sink Processor、Default Sink Processor。
Event
在Agent之间中转时会暂存到channel中,然后才被发送到下一个Agent或其他存储目的地。仅当该Event
已经被成功发送到下一个Agent的channel中或其他存储目的地时,才会从当前Channel中移除该Event
。Event
的可靠传递。Sources和Sinks分别在事务中封装由 Channel提供的事务 中放置或提供的Event
的存储/检索。 这可确保Events
在流中从点到点可靠地传递。At least once
消费、内置的负载均衡和Failover机制At least once
消费
使用的是
Client+Avro Source+ Replicating/ Multiplexing+TimeStampInterceptor+FileChannel/MemChannel+Failover sink Processr/Loadbalance SinkProcess+HdfsSink/ ElasticSink/FileSink/CustomSource。