Flume日志收集系统

514 阅读4分钟

概述

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

Flume是cloudera软件公司2009年捐赠给了Apache软件基金会,为hadoop相关组件之一。

架构

Agent主要由:source,channel,sink三个组件组成。

  • Source: 从数据发生器接收数据,并将接收的数据以Flume的event格式传递给一个或者多个通道channel。

  • Channel: 是一种短暂的存储容器,它将从source接收到的event格式的数据缓存起来,直到它们被sink消费掉,它在source和sink间起着桥梁的作用,channel是一个完整的事务,这一点保证了数据在收发的时候的一致性。 并且它可以和任意数量的source和sink链接。

  • sink: 将数据存储到集中存储器比如Hbase或HDFS,它从channel消费数据(events)并将其传递给目标地。目标地可能是另一个sink,也可能是HDFS或HBase等。

对于每一个Agent来说,它就是一共独立的守护进程(JVM),它从客户端接收数据,如下图所示flume的基本模型:

注: Agent在JVM中以进程存在;source,channel,sink以线程方式存在Agent进程中。

Event定义(数据以Event为单位来传输)

一行文本内容会被反序列化成一个event(序列化是将对象状态转换为可保持或传输的格式的过程,与序列化相对的是反序列化,这两个过程结合起来,可以轻松的存储和传输数据),event默认最大为2048字节(可修改),超过则会切割,剩下的会被放到下一个event中,默认编码是UTF-8。

  • Event中有什么?
    • Header:数据头
    • Body:真正传输的数据

Header不会被sink出去,在封装Event对象的时,可以自定义对每条数据设置key-value键值对;这样做的目的,是为了后续的自定义ChannelSelector拦截器)

public interface Event {
 
  /**
   * Returns a map of name-value pairs describing the data stored in the body.
   */
  public Map<String, String> getHeaders();
 
  /**
   * Set the event headers
   * @param headers Map of headers to replace the current headers.
   */
  public void setHeaders(Map<String, String> headers);
 
  /**
   * Returns the raw byte array of the data contained in this event.
   */
  public byte[] getBody();
 
  /**
   * Sets the raw byte array of the data contained in this event.
   * @param body The data.
   */
  public void setBody(byte[] body);
 
}

Flume数据采集流向过程

单个agent采集数据

上游Agent的Sink作为下游Agent的Source数据源

多个agent采集数据在汇聚到下一个agent:

Flume数据收集全流程

1、Source采集数据后走到ChannelProcessor中。

2、ChannelProcessor发送给拦截器面InterceptorChain,拦截器面中有多个拦截器Interceptor,拦截器按照规则依次执行完成后,返回给ChannelProcessor。

3、ChannelProcessor发送到ChannelSelector中选择Channel策略后发送到对应Channel中。

4、SinkProcessor按规则Sink到不同的地方去。

Flume中的事务机制

1、doPut:Event先写到缓冲区中(PutList)

2、doCommit:先拿PutList与TakeList做对比以及判断Put是否为空;如果都成立,通过队列的形式移除PutList中数据到TakeList中。如果没有足够的空间完成PutLit→TakeList则跳转到doRollback方法中回滚。

3、doRollback:清空不满足的PutList(PutList.clear方法)以及清空计数器。

4、dotake:Event先写入到缓冲区(takeList)

5、复用docommit。数据全部OK,Sink出去并且清空缓冲区;如果挂了,退回给Channnel不去消费。

6、doRollback:把失败的数据清除掉。

Source、Channel、Sink 选择

每个组件具体如何配置 flume.apache.org/releases/co…

  • Flume Sources
    • Avro Source
    • Thrift Source
    • Exec Source
    • JMS Source
    • Spooling Directory Source
    • Taildir Source
    • Twitter 1% firehose Source (experimental)
    • Kafka Source
    • NetCat TCP Source
    • NetCat UDP Source
    • Sequence Generator Source
    • Syslog Sources
    • HTTP Source
    • Stress Source
    • Legacy Sources
    • Custom Source
    • Scribe Source
  • Flume Channels
    • Memory Channel
    • JDBC Channel
    • Kafka Channel
    • File Channel
    • Spillable Memory Channel
    • Pseudo Transaction Channel
    • Custom Channel
  • Flume Channel Selectors
    • Replicating Channel Selector (default)
    • Multiplexing Channel Selector
    • Custom Channel Selector
  • Flume Sinks
    • HDFS Sink
    • Hive Sink
    • Logger Sink
    • Avro Sink
    • Thrift Sink
    • IRC Sink
    • File Roll Sink
    • Null Sink
    • HBaseSinks
    • MorphlineSolrSink
    • ElasticSearchSink
    • Kite Dataset Sink
    • Kafka Sink
    • HTTP Sink
    • Custom Sink