Flume
Flume 是 Cloudera
提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume 基于流式架构,灵活简单。
-
架构
特点
Flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。
Flume可以采集文件,socket数据包、文件、文件夹、kafka等各种形式源数据,又可以将采集到的数据(下沉sink)输出到HDFS、hbase、hive、kafka等众多外部存储系统中
一般的采集需求,通过对flume的简单配置即可实现
Flume针对特殊场景也具备良好的自定义扩展能力,
因此,flume可以适用于大部分的日常数据采集场景。
组件
1 Agent
Agent 是一个 JVM 进程,它以事件的形式将数据从源头送至目的地。
Agent 主要有 3 个部分组成,Source、Channel、Sink。
2 Source
Source 是负责接收数据到 Flume Agent 的组件。Source 组件可以处理各种类型、各种格式的日志数据,包括 avro、thrift、exec、jms、spooling directory、netcat、sequence、generator、syslog、http、legacy等。
3 Sink
Sink 不断地轮询 Channel 中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个 Flume Agent。
Sink 组件目的地包括 hdfs、logger、avro、thrift、ipc、file、HBase、solr、自定义。
4 Channel
Channel 是位于 Source 和 Sink 之间的缓冲区。因此,Channel 允许 Source 和 Sink 运作在不同的速率上。Channel 是线程安全的,可以同时处理几个 Source 的写入操作和几个Sink 的读取操作。
Flume 自带两种 Channel:Memory Channel 和 File Channel 以及 Kafka Channel。 Memory Channel 是内存中的队列。Memory Channel 在不需要关心数据丢失的情景下适用。如果需要关心数据丢失,那么 Memory Channel 就不应该使用,因为程序死亡、机器宕机或者重启都会导致数据丢失。
File Channel 将所有事件写到磁盘。因此在程序关闭或机器宕机的情况下不会丢失数据。
5 Event
传输单元,Flume 数据传输的基本单元,以 Event 的形式将数据从源头送至目的地。
Event 由和两部分组成,用来存放该的一些属性,为结构,用来存放该条数据,形式为字节数组
-
拓扑结构
复制和多路复用
source获取的数据将通过ChannelSelector的类型来决定要将数据如何传送给channel。
ChannelSelector的种类:
1.Replication 复制,将数据拷贝成多个副本发送给多个channel
2.Multipling 多路复用,将指定类型(可以通过设置header的方式区别数据的类型)的数据发送给指定类型sink对应的channel
故障转移和负债均衡
为了防止sink故障或则压力过大,我们可以设置sinkProcess的类型来优化
SinkProcess的种类:
1.fairover //故障转移,当一个sink故障时,数据会发送到另外的sinkgrops中的sink上,根据优先级选择。
2.loadbalancing //负载均衡,当sinkgroups中的某个或某几个负载过大,会自动分流给sinkgroups中的其他sink
聚合
在实际业务中,我们有时候需要将各个机器发过来的数据根据类型进行汇总,可以通过avro这种类型进行机器间的数据传输。并通过自定义的规则进行分类、聚合(可以通过%获取flume中的参数,获取头信息需要用%{})
-
自定义flume组件
自定义Interceptor
自定义拦截器需要实现Interceptor接口,并重写其方法(根据实际情况重写)。方法如下。
void initialize(); //初始化方法
Event intercept(Event var1); //获取单个事件的方法
List<Event> intercept(List<Event> var1); //获取事件集合的方法
void close(); //关闭方法,一般不写
public interface Builder extends Configurable { Interceptor build();} //静态内部类,用于构造拦截器对象
自定义Source
1.SourceProcess提供了两种机制: PollableSource(轮询拉取)和EventDrivenSource(事件驱动)
2自定义Source需要继承AbstractSource和实现Configurable,也可以选择实现Source的事件机制的接口(如上面的两种)
常用的方法: 一般只实现process即可
public Status process(){} //对数据进行处理的方法,需要将数据封装成Event对象,并放入channel
public long getBackOffSleepIncrement() { } //得到封装失败后睡眠的增长时间
public long getMaxBackOffSleepInterval() { } //得到退避的最大时间
public void configure(Context context) {} //对配置进行操作
自定义Inteceptor
1.SinkProcess提供了两种机制:RoundRobinSinkSelector(轮询选择器)和RandomOrderSinkSelector(随机分配选择器)
2.自定义Sink需要继承AbstractSink,实现Configurable
常用的方法
configure(Context context)//初始化 context(读取配置文件内容)
process()//从 Channel 读取获取数据(event),这个方法将被循环调用。 //需要获取sink绑定的channel中的事务对象,开启事务。
-
flume监控
1.通过ganglia
2.通过flume自带的monitor
3.通过第三方监控平台