主要内容:

  • 简介
  • 优势
  • 组成
  • 事务性
  • Flume Agent内部原理
  • Flume配置文件配置流程

简介

Apache Flume是一个分布式、高可用、高可靠的系统,可以有效地从许多不同的源收集、聚合和移动海量日志数据到集中式数据存储。

Flume可用于传输大量事件数据:

  • 日志数据
  • 网络流量数据
  • 社交媒体数据
  • 电子邮件消息
  • ……

优势

  • 支持将数据存储到任何集中存储器中,比如HDFS,Hive,HBase;
  • 当传入数据的速率超过可以将数据写入目标的速率时,flume充当数据生产者和集中存储之间的中介,并在它们之间提供稳定的数据流;
  • channel是基于事务,保证了数据在传送和接收时的一致性;
  • 可靠的,容错性高的,可扩展的,易管理的,并且可定制的;
  • 支持各种接入数据的类型以及接出数据类型;
  • 支持多路径流量,多管道接入流量,多管道接出流量,上下文路由等;
  • 支持水平扩展。

组成

  • agent:agent是一个JVM进程,它以事件的形式将数据从源头送至目的地。由三个部分组成:
    • source
    • channel
    • sink
  • event数据传输的基本单元,带有一个可选的消息头。如果是文本文件,通常是一行记录;event从source,流向channel,再到sink;
  • source:负责接收数据到agent的组件,支持处理各种类型、各种格式的日志数据;
  • channel:主要提供一个队列的功能,是位于source和sink之间的缓冲区。自带两种channel:
    • Memory Channel:基于内存缓存,在不需要关心数据丢失的情境下适用;
    • File Channel:Flume的持久化channel。在程序关闭或机器宕机的情况下不会丢失数据。
  • sink:sink不断地轮询channel中的事件且批量地移除它们。并将这些事件批量写入到存储或索引系统、或者被发送到另一个flume agent。

Flume事务


Flume的事务性主要体现在两个方面:

  • put事务:从source到channel的事件传输过程叫Put事务。通过doPut将批数据先写入临时缓冲区putList;再通过doCommit将批数据提交给channel。一旦事务中的所有事件全部传递到channel且提交成功,那么source就将其标记为完成。如果因为某种原因事件传递失败,那么事务将会回滚。
  • take事务:从channel拉取事件数据到sink的过程叫take事务。通过doTake先将数据取到临时缓冲区takeList;再通过doCommit将事件数据发送到sink。如果数据全部发送数据成功,则清除临时缓冲区takeList。如果数据发送过程中出现异常,rollback将临时缓冲区takeList中的数据归还给channel内存序列。

Flume Agent内部原理


Flume agent内部工作流程:

  1. Source采集数据;
  2. 在Source内部,由EventBuilder.withBody(body)将数据封装成event对象,由source.getChannelProcessor().processEvent(event)将交给Channel处理器;
  3. Channel 处理器将event传给Interceptor拦截器链,进行简单的数据清洗过滤,然后将其返回给Channel 处理器;
  4. Channel 处理器再将过滤之后的event传给Channel选择器,Channel选择器决定每个event写入哪个Channel,以及哪些Channel时必需的或可选的。Channel选择器分两种:
    • Replicating Channel Selector:默认,将source过来的event发往所有的channel(相当于复制多份);
    • Multiplexing Channel Selector:可以配置source发过来的event具体发往哪些Channel。其工作原理就是根据event的header中的key-value来判断该event该发往哪一个Channel。而event中的header是拦截器过滤好event之后给event加的具体的header,即key-value。所以,一般都是拦截器和Multiplexing Channel Selector 结合起来使用。
  5. Channel选择器返回event的channel列表;
  6. 根据Channel选择器的选择结果,将event写入相应的channel;
  7. Sink 处理器选择其中一个sink去获取channel中的event,并将获取的event写入下一个阶段。通过配置Sink groups,可以实现sink的负载均衡和故障转移。其中:Sink processor有三种:
    • DefaultSinkProcessor:默认的,内部无任何逻辑,只是单纯的调用sink;
    • LoadBalancingSinkProcessor:负载均衡;
    • FaioverSinkProcessor:容灾恢复。

Flume配置文件配置流程

Flume配置文件是具有键值对的Java属性文件,配置分为5步:

  • Name the components of the current agent.
  • Describe/Configure the source.
  • Describe/Configure the sink.
  • Describe/Configure the channel.
  • Bind the source and the sink to the channel.

Flume支持多种Source、Channel和Sink:

Source

  • Avro Source
  • Thrift Source
  • Exec Source
  • JMS Source
  • Spooling Directory Source
  • Twitter 1% firehose Source
  • Kafka Source
  • NetCat Source
  • Sequence Generator Source
  • Syslog Sources
  • Syslog TCP Source
  • Multiport Syslog TCP Source
  • Syslog UDP Source
  • HTTP Source
  • Stress Source
  • Legacy Sources
  • Thrift Legacy Source
  • Custom Source
  • Scribe Source

Channel

  • Memory Channel
  • JDBC Channel
  • Kafka Channel
  • File Channel
  • Spillable Memory Channel
  • Pseudo Transaction Channel

Sink

  • HDFS Sink
  • Hive Sink
  • Logger Sink
  • Avro Sink
  • Thrift Sink
  • IRC Sink
  • File Roll Sink
  • Null Sink
  • HBaseSink
  • AsyncHBaseSink
  • MorphlineSolrSink
  • ElasticSearchSink
  • Kite Dataset Sink
  • Kafka Sink