概述
Flume是一个高可用的、高可靠的、分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
Flume是cloudera软件公司2009年捐赠给了
Apache
软件基金会,为hadoop相关组件之一。
架构
Agent主要由:source,channel,sink三个组件组成。
-
Source: 从数据发生器接收数据,并将接收的数据以Flume的event格式传递给一个或者多个通道channel。
-
Channel: 是一种短暂的存储容器,它将从source接收到的event格式的数据缓存起来,直到它们被sink消费掉,它在source和sink间起着桥梁的作用,channel是一个完整的事务,这一点保证了数据在收发的时候的一致性。 并且它可以和任意数量的source和sink链接。
-
sink: 将数据存储到集中存储器比如Hbase或HDFS,它从channel消费数据(events)并将其传递给目标地。目标地可能是另一个sink,也可能是HDFS或HBase等。
对于每一个Agent来说,它就是一共独立的守护进程(JVM),它从客户端接收数据,如下图所示flume的基本模型:
注: Agent在JVM中以进程存在;source,channel,sink以线程方式存在Agent进程中。
Event定义(数据以Event
为单位来传输)
一行文本内容会被反序列化成一个event(序列化是将对象状态转换为可保持或传输的格式的过程,与序列化相对的是反序列化,这两个过程结合起来,可以轻松的存储和传输数据),event默认最大为2048字节(可修改),超过则会切割,剩下的会被放到下一个event中,默认编码是UTF-8。
Event
中有什么?- Header:数据头
- Body:真正传输的数据
Header
不会被sink出去,在封装Event对象的时,可以自定义对每条数据设置key-value键值对;这样做的目的,是为了后续的自定义ChannelSelector拦截器)
public interface Event {
/**
* Returns a map of name-value pairs describing the data stored in the body.
*/
public Map<String, String> getHeaders();
/**
* Set the event headers
* @param headers Map of headers to replace the current headers.
*/
public void setHeaders(Map<String, String> headers);
/**
* Returns the raw byte array of the data contained in this event.
*/
public byte[] getBody();
/**
* Sets the raw byte array of the data contained in this event.
* @param body The data.
*/
public void setBody(byte[] body);
}
Flume数据采集流向过程
单个agent采集数据
上游Agent的Sink作为下游Agent的Source数据源
多个agent采集数据在汇聚到下一个agent:
Flume数据收集全流程
1、
Source
采集数据后走到ChannelProcessor
中。
2、ChannelProcessor发送给拦截器面InterceptorChain
,拦截器面中有多个拦截器Interceptor
,拦截器按照规则依次执行完成后,返回给ChannelProcessor。
3、ChannelProcessor发送到ChannelSelector
中选择Channel策略后发送到对应Channel中。
4、SinkProcessor
按规则Sink到不同的地方去。
Flume中的事务机制
1、doPut:Event先写到缓冲区中(PutList)
2、doCommit:先拿PutList与TakeList做对比以及判断Put是否为空;如果都成立,通过队列的形式移除PutList中数据到TakeList中。如果没有足够的空间完成PutLit→TakeList
则跳转到doRollback方法中回滚。
3、doRollback:清空不满足的PutList(PutList.clear方法)以及清空计数器。
4、dotake:Event先写入到缓冲区(takeList)
5、复用docommit。数据全部OK,Sink出去并且清空缓冲区;如果挂了,退回给Channnel不去消费。
6、doRollback:把失败的数据清除掉。
Source、Channel、Sink 选择
每个组件具体如何配置 flume.apache.org/releases/co…
- Flume Sources
- Avro Source
- Thrift Source
- Exec Source
- JMS Source
- Spooling Directory Source
- Taildir Source
- Twitter 1% firehose Source (experimental)
- Kafka Source
- NetCat TCP Source
- NetCat UDP Source
- Sequence Generator Source
- Syslog Sources
- HTTP Source
- Stress Source
- Legacy Sources
- Custom Source
- Scribe Source
- Flume Channels
- Memory Channel
- JDBC Channel
- Kafka Channel
- File Channel
- Spillable Memory Channel
- Pseudo Transaction Channel
- Custom Channel
- Flume Channel Selectors
- Replicating Channel Selector (default)
- Multiplexing Channel Selector
- Custom Channel Selector
- Flume Sinks
- HDFS Sink
- Hive Sink
- Logger Sink
- Avro Sink
- Thrift Sink
- IRC Sink
- File Roll Sink
- Null Sink
- HBaseSinks
- MorphlineSolrSink
- ElasticSearchSink
- Kite Dataset Sink
- Kafka Sink
- HTTP Sink
- Custom Sink