目录
一、前言
任何一个生产系统在运行过程中都会产生大量的日志,日志往往隐藏了很多有价值的信息。在没有分析方法之前,这些日志存储一段时间后就会被清理。随着技术的发展和分析能力的提高,日志的价值被重新重视起来。在分析这些这些日志之前,需要将分散在各个生产系统中的日志收集起来。本篇介绍广泛应用的Flume日志收集系统。
二、简介
2.1 概述
Flume是一款高性能、高可用的分布式日志收集系统。它有效地组装、聚集大量的日志数据并立即传输至一个集中的位置。同Flume相似的日志收集系统还有 Facebook Scribe、Apache Chuwka。
文档地址:http://flume.apache.org/documentation.html
2.2 发展历程
Flume初始的发行版本目前被统称为 Flume OG,属于Cloudera。但随着Flume功能的扩展,Flume OG代码工程臃肿、核心组件设计不合理、核心配置不标准等缺点逐渐暴露出来,尤其是在 Flume OG 的最后一个发行版本 0.94.0中,日志传输现象尤为严重。为了解决这些问题,2011年10月22日,Cloudera完成了Flume-728,对Flume进行了里程碑式的改动:重构核心组件、核心配置及代码架构,重构后的版本统称为Flume NG;改动的另一原因是将Flume纳入Apache旗下,Cloudera Flume更名为 Apache Flume。
2.3 基本思想及特点
基本思想:Flume采用了插拔式软件架构,所有组件均是可插拔的,用户可以根据自己的需要定制每个组件。Flume本质上是一个中间件,它屏蔽了流式数据源和后端中心化存储系统之间的异构性,使得整个数据流非常容易扩展和演化。
特点:
- 良好的扩展性:Flume架构是完全分布式的,没有任何中心化组件,这使得它非常容易扩展。
- 高度定制化:各个组件(比如Source、Channel和Sink等)是可插拔的,用户很容易根据需求进行定制。
- 良好的可靠性:Flume内置了事务支持,能够保证发送的每条数据能够被下一跳收到而不会丢失。(事务体现在Sink必须在Event被存入Channel后,或者已经被成功传递给下一个Agent后,才能把Event从Channel中删掉)
- 声明化动态配置:Flume提供了一套声明式配置语言,用户可根据需要动态配置一个基于Flume的数据流拓扑结构。
- 语意路由:可根据用户的配置,将流式数据路由到不同的组件或存储系统中,这使得搭建一个支持异构的数据流变的非常容易。
三、Flume NG 基本架构
3.1 基本架构
Flume的数据流是通过一系列称为Agent的组件构成的,如下图所示,一个Agent可以从客户端或前一个Agent接收数据,经过过滤(可选)、路由等操作后,传递给下一个或多个Agent(完全分布式),直到抵达指定的目标系统。用户可根据需要拼接任意多个Agent构成一个数据流水线。
Flume将数据流水线中传递的数据称为“Event”,每个Event由头部和字节数组(数据内容)两部分构成,其中头部由一系列key/value对构成,可用于数据路由,字节数组封装了实际要传递的数据内容,通常使用Avro,Thrift、Protobuf等对象序列化而成。
Flume中Event可由专门的客户端程序产生,这些客户端程序将要发送的数据封装成Event对象,并调用Flume提供的SDK发送给Agent。
3.2 Agent 内部组件
1、Source
Flume数据流中接收Event的组件,通常从Client程序或上一个Agent接收数据并写入一个或多个Channel。为了方便用户使用,Flume提供了很多Source实现,主要包括:
Avro Source、Thrift Source、Exec Source、Spooling Directory Source、Kafka Source、Syslog Source、HTTP Source。
2、Channel
Channel是一个缓存区,它暂存Source写入的Event,直到被Sink发送出去。目前Flume主要提供了以下几种Channel实现:
Memory Channel、File Channel、JDBC Channel、Kafka Channel
3、Sink
负责从Channel中读取数据,并发送给下一个Agent(的Source)或目标系统。Flume主要提供以下几种Sink实现:
HDFS Sink、HBase Sink、Avro/Thrift Sink、MorphlineSolrSink/ElasticSeratchSink、Kafka Sink
3.3 高级组件
1、Interceptor
允许用户修改或丢弃传输过程中的Event。Interceptor是一个实现了org.apache.flume.interceptor.Interceptor接口的类。用户可配置多个Interceptor,形成一个Interceptor链,这样,前一个Interceptor返回的Event将被传递给下一个Interceptor,而传递过程中,任何一个Interceptor均可修改或者丢弃当前的Event。Flume自带了很多Interceptor实例,常用的有:
Timestamp Interceptor、Host Interceptor、UUID Interceptor、Regex Filtering Interceptor、Regex Extractor Interceptor
2、Channel Selector
允许Flume Sou