Flume学习笔记(三)Flume 内部机制
前言
本篇是 Flume 学习笔记的第三篇,主要整理 Flume 的事务机制以及 Event 如何在 Agent 中流转的整个过程。
Flume 事务机制
为了保证数据的不丢失,Flume 框架在 Agent 进程中加入了俩个事物机制,分布为 Source --> Channel 和 Channel --> Sink,示意图如下:
-
Put 事务
上图中 Source 将数据推送至 Channel 的过程即 Put 事务,其分为三个阶段 doPut,doCommit,doRollback
- doPut:将 Source 中一个 batch 的数据放入 putList 缓存
- doCommit:检查 Channel 是否能够容纳 putList 的数据若能够则将数据合并入 Channel
- doRollback:若合并时发现 Channel 空间不够或发生异常则回滚数据防止数据丢失
-
Take 事务
上图中 Sink 从 Channel 中拉取数据的过程即 Take 事务,其同样分文三个阶段 doTake,doCommit,doRollback
- doTake:从 Channel 中拉取数据并放入 takeList 缓存
- doCommit:将 takeList 中的数据发往目的地,若发送成功则清空 takeList
- doRollback:发生异常执行回滚将 takeList 中的数据归还 Channel 防止数据丢失
通过 Agent 内部的事务机制,Flume 能够保证正常运行情况下数据不会丢失,但是其并不能保证数据的不重复,例如在 Sink 写入 HDFS 的过程中 HDFS 没有正常的响应那么可能导致 Sink 再次发送相同的数据导致数据重复写入。
Flume Agent 内部原理
在学习笔记第一篇中有讲过 Agent 内部包含三个组件 Source,Channel,Sink 而数据就是从 Source 到 Channel 再到 Sink,但这中间还有不少细节,本节就来剖析一下中间的细节,首先还是先来一张流程图,然后逐个讲解。
- Source 接受数据并将其包装成一个 Event 对象
- Source 将 Event 发送给 Channel Processor
- Channel Processor 将 Event 发往拦截器链,之所以叫拦截器链是因为其可以串联多个拦截器。还记得 Event 是由 Header 和 Body 组成的吗,Body 中记录了数据而 Header 的值是有拦截器写入的,拦截器可以过滤不需要的 Event 也可以在 Event 的 Header 中写入信息以供后续 Channel Selector 使用
- Channel Selector 接收经过拦截器链的 Event 数据并根据配置的 Channel Selector 类型来将 Event 发往 Channel,Channel Selector 有俩种类型:Replication 和 Multiplexing
- Replication Channel Selector:直接将数据复制并发往与 Source 对接的所有 Channel
- Multiplexing Channel Selector:会根据 Event 中的 Header 和 配置文件中所指定的将特定的 Event 发往特定的 Channel,可以实现将同一个 Source 接收的数据进行分类处理
- 将当前事件的去往的 Channel 发送给 Channel Processor
- Channel Processor 将 Event 推送至相应的 Channel
- 根据相应的 Sink Processor 的类型执行相应的 take 操作
- Default Sink Processor:此为默认的类型,在此模式下一个 Channel 只能对接一个 Sink(防止数据重复)
- LoadBalancing Sink Porcessor:在此类型下可以将多个 Sink 配置为一组,Channel 将数据以 轮询 的方式发送给组内所有 Sink
- Failober Sink Processor:同样需要将多个 Sink 配置为一组,但与 LoadBalancing 不同的是 Channel 只会将数据发送给一个 Sink 而当其故障后才会将数据转而发送给组内的另一个 Sink,可以在组内配置 Sink 的优先级这样就可以指定改发往那个 Sink。
总结
- Flume 的 Agent 内部有完善的事务机制,通过 put 和 take 事务 Flume 能够保证在正常运行情况下数据不丢失
- Flume 可以通过 Interceptor 和 Channel Selector 来对同一个 Source 接收的数据进行分类处理
erceptor 和 Channel Selector 来对同一个 Source 接收的数据进行分类处理 - 负载均衡与故障转移的 Sink Processor 都需要配置 Sink group 来使得 Channel 将数据按组的方式来发送