5.7.1 Flume 基本原理
Flume是一个高可用、高可靠,分布式的海量日志采集、聚合和传输的系统。Flume 支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进 行简单处理,并写到各种数据接受方(可定制)的能力。其中Flume-NG是Flume的一 个分支,其目的是要明显简单,体积更小,更容易部署,其最基本的架构如下图所 示:
图5-24 Flume-NG 架构
Flume-NG由一个个Agent来组成,而每个Agent由Source、Channel、Sink三个模块组 成,其中Source负责接收数据,Channel负责数据的传输,Sink则负责数据向下一端的 发送。
表5-6 模块说明
名称 说明
Source Source负责接收数据或通过特殊机制产生数据,并将数据批量放到 一个或多个Channel。Source的类型有数据驱动和轮询两种。
典型的Source类型如下:
● 和系统集成的Sources:Syslog、Netcat。
● 自动生成事件的Sources:Exec、SEQ。
● 用于Agent和Agent之间通信的IPC Sources:Avro。
Source必须至少和一个Channel关联。
Channel Channel位于Source和Sink之间,用于缓存来自Source的数据,当 Sink成功将数据发送到下一跳的Channel或最终目的地时,数据从 Channel移除。
Channel提供的持久化水平与Channel的类型相关,有以下三类:
● Memory Channel:非持久化。
● File Channel:基于WAL(预写式日志Write-Ahead Logging)的 持久化实现。
● JDBC Channel:基于嵌入Database的持久化实现。
Channel支持事务,可提供较弱的顺序保证,可以和任何数量的 Source和Sink工作。
Sink Sink负责将数据传输到下一跳或最终目的,成功完成后将数据从 Channel移除。
典型的Sink类型如下:
● 存储数据到最终目的终端Sink,比如:HDFS、HBase。
● 自动消耗的Sink,比如:Null Sink。
● 用于Agent间通信的IPC sink:Avro。
Sink必须作用于一个确切的Channel。
Flume也可以配置成多个Source、Channel、Sink,如图5-25所示:
图5-25 Flume 结构图
Flume的可靠性基于Agent间事务的交换,下一个Agent down掉,Channel可以持久化 数据,Agent恢复后再传输。Flume的可用性则基于内建的Load Balancing和Failover 机制。Channel及Agent都可以配多个实体,实体之间可以使用负载分担等策略。每个 Agent为一个JVM进程,同一台服务器可以有多个Agent。收集节点(Agent1,2,3)
负责处理日志,汇聚节点(Agent4)负责写入HDFS,每个收集节点的Agent可以选择 多个汇聚节点,这样可以实现负载均衡。
图5-26 Flume 级联结构图
Flume的架构和详细原理介绍,请参见:https://flume.apache.org/releases/
1.9.0.html。
Flume 原理
Agent之间的可靠性
Agent之间数据交换流程如图5-27所示。
图5-27 Agent 数据传输流程
1. Flume采用基于Transactions的方式保证数据传输的可靠性,当数据从一个Agent 流向另外一个Agent时,两个Transactions已经开始生效。发送Agent的Sink首先 从Channel取出一条消息,并且将该消息发送给另外一个Agent。如果接受消息的 Agent成功地接受并处理消息,那么发送Agent将会提交Transactions,标识一次 数据传输成功可靠地完成。
2. 当接收Agent接受到发送Agent发送的消息时,开始一个新的Transactions,当该 数据被成功处理(写入Channel中),那么接收Agent提交该Transactions,并向 发送Agent发送成功响应。
3. 如果在某次提交(commit)之前,数据传输出现了失败,将会再次开始上一次 Transactions,并将上次发送失败的数据重新传输。因为commit操作已经将 Transactions写入了磁盘,那么在进程故障退出并恢复业务之后,仍然可以继续上 次的Transactions。
5.7.2 Flume 与其他组件的关系
Flume 与 HDFS 的关系
当用户配置HDFS作为Flume的Sink时,HDFS就作为Flume的最终数据存储系统,
Flume将传输的数据全部按照配置写入HDFS中。
具体操作场景请参见典型场景:从本地采集静态日志保存到HDFS和典型场景:从本地 采集动态日志保存到HDFS。
Flume 与 HBase 的关系
当用户配置HBase作为Flume的Sink时,HBase就作为Flume的最终数据存储系统,
Flume将传输的数据全部按照配置写入HBase中。具体操作场景请参见典型场景:从本 地采集静态日志保存到HBase。
5.7.3 Flume 开源增强特性
Flume 开源增强特性
● 提升传输速度。可以配置将指定的行数作为一个Event,而不仅是一行,提高了代 码的执行效率以及减少写入磁盘的次数。
● 传输超大二进制文件。Flume根据当前内存情况,自动调整传输超大二进制文件 的内存占用情况,不会导致Out of Memory(OOM)的出现。
● 支持定制传输前后准备工作。Flume支持定制脚本,指定在传输前或者传输后执 行指定的脚本,用于执行准备工作。
● 管理客户端告警。Flume通过MonitorServer接收Flume客户端告警,并上报 Manager告警管理中心。