Flume 简介及基本使用#
内容参考: 官方文档
Flume 基本架构#
外部数据源以特定格式向 Flume 发送 events (事件)
,当 source
接收到 events
时,它将其存储到一个或多个 channel
,channel
会一直保存 events
直到它被 sink
所消费。sink
的主要功能从 channel
中读取 events
,并将其存入外部存储系统或转发到下一个 source
,成功后再从 channel
中移除 events
基本概念#
- Event
- Source
- Channel
- Sink
- Agent
Event#
Event 是 Flume NG 数据传输的基本单元。类似于 JMS 和消息系统中的消息。一个 Event 由标题和正文组成:前者是键 / 值映射,后者是任意字节数组。
Agent#
是一个独立的 (JVM) 进程,包含 Source、 Channel、 Sink 等组件
Source#
数据收集组件,从外部数据源收集数据,并存储到 Channel 中。
内置了几十种类型,如 Avro Source
,Thrift Source
,Kafka Source
,JMS Source
;
Channel#
Channel 是源和接收器之间的管道,用于临时存储数据。可以是内存或持久化的文件系统:
- Memory Channel : 使用内存,优点是速度快,但数据可能会丢失 (如突然宕机);
- File Channel : 使用持久化的文件系统,优点是能保证数据不丢失,但是速度慢。
内置Memory Channel
,JDBC Channel
,Kafka Channel
,File Channel
等
Sink#
Sink 的主要功能从 Channel 中读取 Event,并将其存入外部存储系统或将其转发到下一个 Source,成功后再从 Channel 中移除 Event。包含HDFS Sink
,Hive Sink
,HBaseSinks
,Avro Sink
等
Flume 事务#
数据在传输到下个节点时 (一般是批量数据),假设接收节点出现异常,比方网络异常。则回滚这一批数据,因此有可能导致数据重发(是重发不是重复)。
同个节点内,Source 写入数据到 Channel, 数据在一个批次内的数据出现异常,则不写入到 Channel,已接收到的部分数据直接抛弃,靠上一个节点重发数据
source -> channel: put 事务
channel -> sink: take 事务
put 事务步骤:
doput
: 先将批数据写入临时缓冲区 putlist 里面docommit
:去检查 channel 里面有没有空位置,如果有就传入数据,如果没有那么 dorollback 就把数据回滚到 putlist 里面。
take 事务步骤:
dotake
:将数据读取到临时缓冲区 takelist,并将数据传到 hdfs 上。docommit
: 去判断数据发送是否成功,若成功那么清除临时缓冲区 takelist
若不成功(比如 hdfs 系统服务器崩溃等)那么 dorollback 将数据回滚到 channel 里面
参考链接: flume 事务解析
Flume 的可靠性#
当节点出现故障时,日志能够被传送到其他节点上而不会丢失。Flume 提供了三种级别的可靠性保障,从强到弱依次分别为:
end-to-end
: 收到数据 agent 首先将 event 写到磁盘上,当数据传送成功后,再删除;如果数据发送失败,可以重新发送Store on failure
: 这也是 scribe 采用的策略,当数据接收方 crash 时,将数据写到本地,待恢复后,继续发送Besteffort
: 数据发送到接收方后,不会进行确认
Flume 的部署类型#
单一流程#
multi-agent flow(多代理流程,多个 agent 顺序连接)#
可以将多个 Agent 顺序连接起来,将最初的数据源经过收集,存储到最终的存储系统中。这是最简单的情况,一般情况下,应该控制这种顺序连接的 Agent 的数量,因为数据流经的路径变长了,如果不考虑 failover 的话,出现故障将影响整个 Flow 上的 Agent 收集服务
Consolidation(流的合并,多个 Agent 的数据汇聚到同一个 Agent )#
这种情况应用的场景比较多,比如要收集 Web 网站的用户行为日志, Web 网站为了可用性使用的负载集群模式,每个节点都产生用户行为日志,可以为每 个节点都配置一个 Agent 来单独收集日志数据,然后多个 Agent 将数据最终汇聚到一个用来存储数据存储系统,如 HDFS 上
Multiplexing the flow(多路复用)#
Flume 支持从一个 Source 向多个 Channel,也就是向多个 Sink 传递事件,这个操作称之为 Fan Out (扇出)。默认情况下 Fan Out 是向所有的 Channel 复制 Event,即所有 Channel 收到的数据都是相同的。同时 Flume 也支持在 Source 上自定义一个复用选择器 (multiplexing selector) 来实现自定义的路由规则。
举个例子,当 syslog, java, nginx、 tomcat 等混合在一起的日志流开始流入一个 agent 后,可以在 agent 中将混杂的日志流分开,然后给每种日志建立一个自己的传输通道