1. 概览

flume是一个分布式的高可用、高效的数据收集和聚集系统。它支持众多数据源产生的事件数据。

2. 基本组件

2.1 agent

flume的核心组件,是一个完整的数据收集工作单元

2.2 source

agent的内部数据源,支持从其他外部数据源获取event data。支持avro、thrift等多种事件信息。

通过 IPC 或 RPC 的方式从外部数据源获取事件数据(例如Avro和 Thrift 分别有 NettyAvroRpcClient 和 ThriftRpcClient 实现了 RpcClient接口)。

2.3 channel

当前有几个 channel 可供选择,分别是:

  1. Memory Channel:实现高速的吞吐,但是无法保证数据的完整性。
  2. JDBC Channel
  3. File Channel
  4. Psuedo Transaction Channel PS:比较常见的是前三种 channel。

2.3.1 memory channel

可以实现高速的吞吐,但是无法保证数据的完整性

2.3.2 file channel

FileChannel保证数据的完整性与一致性。在具体配置FileChannel时,建议FileChannel设置的目录和程序日志文件保存的目录设成不同的磁盘,以便提高效率。

File Channel 是一个持久化的隧道(channel),它持久化所有的事件,并将其存储到磁盘中。因此,即使 Java 虚拟机当掉,或者操作系统崩溃或重启,再或者事件没有在管道中成功地传递到下一个代理(agent),这一切都不会造成数据丢失。Memory Channel 是一个不稳定的隧道,其原因是由于它在内存中存储所有事件。如果 java 进程死掉,任何存储在内存的事件将会丢失。另外,内存的空间收到 RAM大小的限制,而 File Channel 这方面是它的优势,只要磁盘空间足够,它就可以将所有事件数据存储到磁盘上。

2.4 sink

Sink在设置存储数据时,可以向文件系统、数据库、hadoop存数据,在日志数据较少时,可以将数据存储在文件系中,并且设定一定的时间间隔保存数据。在日志数据较多时,可以将相应的日志数据存储到Hadoop中,便于日后进行相应的数据分析.

3. 数据流

flume支持复杂的数据流设置,即使用多个agent。效果如下:

值得注意的特性如下:

  1. Channel中的数据只有在Sink组件发送成功后才会被删除
  2. 在整个数据的传输过程中流动的是event,event可以理解为是flume中数据传输的基本单位,event表现为一条条的数据,其事务保证是event级别.
  3. flume支持多级flume的agent,支持扇入(fan-in)\扇出(fan-out)

当一个agent处理完毕后可以交给下一个agent也可以交给一个指定的store。agent支持扇入和扇出的特性很重要。

4. 高可用

flume是高可用,但是其本身并没有用到zookeeper做分布式协调。之所以还能做到高可用,我的理解是其agent的设计上是“无状态"的,这也就是意味着某个agent挂了,sink可以选择其他可用的agent来进行处理即可。

当然sink做选择的时候,也能做负载均衡了。

5. 可靠性

事务性质保证可靠:Sink 必须在 Event 被存入 Channel 后,或者,已经被传达到下一站agent里,又或者,已经被存入外部数据目的地之后,才能把 Event 从 Channel 中 remove 掉。

不同的channel实现对应不同要求的可靠性,需要自己做好抉择:

  1. file channel: 可靠性较好,但是速度较慢
  2. memory channel: 可靠性较差,但是速度块

参考资料:

  1. http://flume.apache.org/FlumeUserGuide.html#avro-source
  2. http://www.open-open.com/lib/view/open1423302074576.html