flume原理

1.Flume

是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力;

2.Flume设计目标:

---》可靠性:当节点出现故障时,日志能够被传送到其他节点上而不会丢失。Flume提供了三种级别的可靠性保障,从强到弱依次分别为:end-to-end(Exactly once),Store on failure(当数据接收方crash时,将数据写到本地,待恢复后,继续发送),Best effort(数据发送到接收方后,不会进行确认)
---》可扩展性:Flume采用了三层架构,分别为Source,Channel和Sink,每一层均可以水平扩展
---》可管理性:所有Source, Channel和 Sink 由 Agent 统一管理,这使得系统便于维护

flume原理_第1张图片
Paste_Image.png

3.各组件职责:

--》Source 组件:负责日志流入,比如从文件、网络、Kafka 等数据源流入数据,数据流入的方式有两种:轮训拉取和事件驱动;
--》Channel 组件:负责数据聚合/暂存,比如暂存到内存、本地文件、数据库、Kafka 等,日志数据不会在管道停留很长时间,很快会被 Sink 消费掉;
--》Sink 组件:负责数据转移存储,比如从 Channel 拿到日志后直接存储到 HDFS、HBase、Kafka、ElasticSearch 等。
一个Agent会同时存在这三个组件,Source和Sink都是异步执行的,相互之间不会影响

flume原理_第2张图片
Paste_Image.png

4.整体结构,可以灵活配置

Source 上的数据可以复制到不同的通道上。每一个 Channel 也可以连接不同数量的 Sink。这样连接不同配置的 Agent 就可以组成一个复杂的数据收集网络。

flume原理_第3张图片
Paste_Image.png
flume原理_第4张图片
Paste_Image.png

(1)Flume Source组件

Source 组件负责接收输入数据,并将数据写入管道 (Channel)。Flume的Source支持:
Avro
Exec
HTTP
Spooling Directory
Kafka
Syslog
……
其中Spooling支持监视一个目录或者文件,解析其中新生成的事件

(2)Flume 过滤器(拦截器):

在 App(应用程序日志)和 Source 之间的,对 App 日志进行拦截处理的。官方已有的拦截器有(可以链式添加多个):
--》Timestamp Interceptor: 在 event 的 header 中添加一个 key 为 timestamp , value为当前的时间戳;
--》Host Interceptor: 在 event 的 header 中添加一个 key 为 host , value 为当前机器的 hostname 或者 ip;
--》Static Interceptor:可以在 event 的 header 中添加自定义的 key 和 value;
--》Regex Filtering Interceptor: 通过正则来清洗或包含匹配的 events;
--》Regex Extractor Interceptor: 通过正则表达式来在 header 中添加指定的key , value则为正则匹配的部分

(3)Flume Channel组件

Channel组件存储,缓存从 Source 到 Sink 的中间数据。可使用不同的配置来做Channel,例如:
内存
文件
JDBC
Kafka
……
其中使用内存性能高但不持久,有可能丢数据。使用文件更可靠,但性能不如内存

Flume Channel 选择器:

数据通过不同的 Channel 路由到不同的 Sink 中。官方已有的 Channel 选择器有:
--》Replicating Channel Selector (default): 将 Source过来的 events 发往所有Channel;
--》Multiplexing Channel Selector: 可以选择将数据发往哪些 Channel;

(4)Flume Sink组件

Sink 组件负责从管道中读出数据并发给下一个 Agent 或者最终的目的地。Sink 支持的不同目的地种类包括:
HDFS
HBASE
Avro
ElasticSearch
File
Logger
其它的 Flume Agent

Flume 序列化器:

在 Sink 和目标存储之间自定义数据序列化方式。官方已有的序列化器有:
--》Body Text Serializer: 忽略 event header,只将 event value 写到输出流;
--》Avro Event Serializer: 数据以 Avro 序列化,然后写到输出流;

Flume Sink 处理器:

在多个 Sink 之间选择下一个用来发送数据的 Sink 。官方已有的 Sink 处理器有:
--》Failover Sink Processor: 每次都从活动池选择优先级最高的 Sink 发送数据,当发送失败时放入冷却池直到超过冷冻期,一旦重新发送成功就重新进入活动池;
--》Load balancing Sink Processor : 每次都按照配置的方案从多个 Sink 中选择一个 Sink 发送数据。目前官方提供两种策略: round_robin, random ;


你可能感兴趣的:(flume原理)