一、Flume简单介绍
ApacheFlume是一个分布式、可信任和弹性的系统,用于高效收集、汇聚和移动大规模日志信息从多种不同的数据源到一个集中的数据存储中心。
Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写道各种数据接收方(可定制)的能力。
Flume采用ad-hoc方案,明显优点如下:
- 可靠的、可伸缩、可管理、可定制、高性能
- 声明式配置,可以动态更新配置
- 提供上下文路由功能
- 支持负载均衡和故障转移
- 功能丰富
- 完全的可扩展
二、Flume常用的日志采集结构
Flume在目前的使用过程中,有两种日志采集结构是比较常用,一种是多代理(agent)模式,一种是多渠道模式。
(1) 日志收集的流程(多代理模式):
一个常见的场景就是在日志收集汇总,大量的日志在客户单产生,然后发送到几个代理并最终存储到数据仓储。例如下图中,大量的web服务器产生的数据被收集并通过多个代理跳转最后存储到HDFS集群中。这种场景可以通过flume实现。通过配置大量的一线代理和Avro Sink,然后一线代理的sink都指向一个avro source。该源位于二线代理中,二线代理合并接收到的事件,通过channel传到sink,再到达最终目的地。
(2) 日志收集的流程(多渠道模式)
Flume支持将事件流复用传输到多个目的地,其实现方式通过定义一个flow multiplexer来复制或选择一个或多个通道来传输事件,如下图所示:
三、Flume的核心概念介绍
(1) 核心概念Event
Event是Flume数据传输的基本单元,Flume以事件的形式将数据从源头传送到最终的目的地。Event由可选的headers和载有数据的一个btye array构成。
- 载有的数据对Flume是不透明的;
- Headers是容纳了key-value字符串对的无序集合,key在集合内是唯一的;
- Headers可以在上下文路由中使用扩展。
(2) 核心概念Client
Client是一个将原始log包装成events并且发送它们到一个或多个agent的实体。例如:Flumelog4j Appender;还可以使用Client SDK(org.apache.flume.api)定制Client
- 目的是充数据源系统中解耦Flume;
- 在flume的拓扑结构中不是必须的。
(3) 核心概念Agent
一个agent包含Sources,Channels,Sinks和其他组件,它利用这些组件将events从一个节点传输到另一个节点或最终目的地。
- agent是Flume流的基础部分;
- Flume为这些组件提供了配置、生命周期管理、监控支持
(4) 核心概念Source
Source负责接收events或通过特殊机制产生的events,并将events批量的放到一个或多个Channels,有event驱动和轮询两种类型的Source。
- 不同类型的Source:
① 和众所周知的系统集成的Sources:Syslog、Netcat
② 自动生成事件的Sources:Exec,SEQ
③ 用于Agent和Agent之间通信的IPC Sources:Avro
- Sources必须至少和一个Channel关联
(5) 核心概念Channel
Channel位于Source和Sink之间,用于缓存进来的events,当Sink成功的将events发送到下一跳channel或最终目的时,events从channel移除。
- 不同的Channels提供的持久化水平也是不一样的
① Memory Channel:volatile
② File Channel:基于WAL(预写式日志Write-Ahead Logging)实现
③ JDBC Channel:基于嵌入Database实现
- Channels支持事务
- 提供较弱的顺序保证
- 可以和任何数量的Source和Sink工作
(6) 核心概念Sink
Sink负责将events传输到下一跳或最终目的,成功完成后将events从channel移除。
- 不同类型的Sinks;
① 存储events到最终目的地终端Sink,比如:HDFS,Hbase
② 自动消耗的Sinks。比如:Null Sink
③ 用于Agent间通信的IPC Sink:Avro
- 必须作用于一个确切的channel
(7) 核心概念Interceptor
用于Source的一组Interceptor,按照预设的顺序在必要的地方修饰和过滤events。
- 内建的Interceptors允许增加event的headers,比如:时间戳、主机名、静态标记等等。
- 定制的Interceptors可以通过内省eventpayload(读取原始日志),在必要的地方创建一个特定的headers。
(8) 核心概念Channel Selector
Channel Selector允许Source基于预设的标准,从所有channel中,选择一个或多个channel。
- 复制Replicating:event被复制到相关的channel
- 复用Multiplexing:基于header,event被路由到特定的channel
(9) 核心概念SinkProcessor
多个Sink可以构成一个SinkGroup,一个Sink Processor负责从一个指定的Sink Group中激活一个Sink。Sink Processor可以通过组中所有Sink实现负载均衡,也可以在一个Sink失败时转移到另一个。
- Flume通过Sink Processor实现负载均衡(LoadBalancing)和故障转移(failover)
- 内建的Sink Processors:
① Load Balancing Sink Processr –使用RANDOM, ROUND_ROBIN或定制的选择算法
② Failover Sink Processor
③ Default Sink Processor(单Sink)
- 所有的Sink都是采取轮询(polling)的方式从Channel上获取events。这个动作是通过Sink Runner激活的
- Sink Processor充当Sink的一个代理
总结
参考:http://blog.youkuaiyun.com/xiaochawan/article/details/8986489