0%

flume-基本原理

介绍了flume的基本原理和使用

简介

agent.png

Flume是一种分布式可靠且可用的服务,用于有效地收集,聚合和传输大量日志数据,是基于流式的简单灵活的架构。

它具有可靠的可靠性机制和许多故障转移和恢复机制,具有强大的容错性。

它使用简单的可扩展数据模型,允许在线分析应用程序。

流程图

flume.png

六大组件

3大基本组件,3个辅助组件。这些组件都支持用户自定义。

Source

用于数据的收集。将数据捕获后可以先进行自定义处理,然后将数据封装到事件(event) 里(如event的body),最后将事件推入Channel中。

常见的source:

Avro SourceExce SourceSpooling Directory SourceNetCat Source、Syslog Source、Syslog TCP Source、Syslog UDP Source、HTTP Source、HDFS Source 等等。

Channel

用于连接Source和Sink的组件,是数据的缓冲区。它可以将事件暂存到内存中也可以持久化到本地磁盘上, 直到Sink处理完该事件。

常见的channel:

Memory ChannelFile ChannelKafka Channel等等。

Sink

从channel中取出数据,再将数据存入相应的存储文件系统,数据库,或者提交到远程服务器。

常见的sink:

HDFS sinkLogger sinkAvro sinkFile Roll sink、Null sink、HBase sink 等等。

Interceptor

对Source收集的数据,进行分类或者拦截。可以将多个Interceptor连接形成拦截器链。

用法

  • 分类:自定义分类逻辑,将分类属性(k,v类型),加入event的headers中,然后使用MultiplexingChannelSelector选择器 选择放入哪个channel中。

  • 拦截:自定义丢弃逻辑,将不要的event设为null即可。

ChannelSelector

将event放入指定的channel中。

2种ChannelSelector:

  • ReplicatingChannelSelector(默认) :将事件放入所有channel中。(用于复制,也就是备份)

  • MultiplexingChannelSelector :结合Interceptor使用。根据header,将event放到指定的channel中。

sinkgroups中的SinkProcessor

按照指定算法将event分配到sink组的sink中。需要先指定一个sink组,再选择SinkProcessor,它会根据配置的分配方式自动将event分到组里的sink中。注意默认的SinkProcessor中,没有sink组的概念,不需要配置,也就是一对一。

2种SinkProcessor:

  • LoadBalanceSinkProcessor :负载均衡。可选择分配方式:如随机分配、轮询分配等等

  • FailoverSinkProcessor :优先级分配(多用于故障转移)。指定sink的优先级,按优先级分配。

两个Transaction

Put Transaction

它实现 source 将 event 发送至 channel,带有容错机制,可以分为以下阶段:

  • doPut: 将批数据写入临时缓冲区putList
  • doCommit: 检查channel内存队列是否足够合并。
  • doRollback: channel内存队列空间不足,回滚数据

Take Transaction

它实现 sink 将 event 从 channel 中提取出来,带有容错机制,可以分为以下阶段:

  • doTake: 将数据提取到临时缓冲区takeList
  • doCommit: 数据发送成功的前提下,清除临时缓冲区takeList
  • doRollback: 数据发送过程中如果出现异常,rollback将临时缓冲区takeList中的数据归还给channel内存队列。

一些案例

  • 日志复制(备份)

单source,多channel,多sink

使用 ReplicatingChannelSelector,将每个event分到多个channel再传到sink中,实现复制(备份)。

  • 日志分类

单source,多channel,多sink, 配置拦截器

使用 MultiplexingChannelSelector,根据拦截器将每个event,分到指定的channel中再传到sink中,实现分类。

  • 负载均衡

单source,单channel,多sink(组成一个sink组)

使用LoadBalanceSinkProcessor,选择分配方式:如随机分配、轮询分配,将event递给相应sink。

  • 故障转移

单source,单channel,多sink(组成一个sink组)

使用FailoverSinkProcessor,给sink组里的sink指定优先级,只有优先级最高的会接收,当它挂了,次优先级的才会接收。

  • 日志聚合

多source,单channel,单sink

直接将多个源的数据,用一个channel接收。

  • 可以使用第三方框架Ganglia对flume实现监控