Flume简介及基本使用

内容参考: 官方文档

Flume基本架构

image.png
外部数据源以特定格式向 Flume 发送 events (事件),当 source 接收到 events 时,它将其存储到一个或多个 channelchannel 会一直保存 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 SourceThrift SourceKafka SourceJMS Source

Channel

Channel 是源和接收器之间的管道,用于临时存储数据。可以是内存或持久化的文件系统:

  • Memory Channel : 使用内存,优点是速度快,但数据可能会丢失 (如突然宕机);
  • File Channel : 使用持久化的文件系统,优点是能保证数据不丢失,但是速度慢。

内置Memory ChannelJDBC ChannelKafka ChannelFile Channel

Sink

Sink 的主要功能从 Channel 中读取 Event,并将其存入外部存储系统或将其转发到下一个 Source,成功后再从 Channel 中移除 Event。包含HDFS SinkHive SinkHBaseSinksAvro 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的部署类型

单一流程

image.png

multi-agent flow(多代理流程,多个agent顺序连接)

image.png

可以将多个Agent顺序连接起来,将最初的数据源经过收集,存储到最终的存储系统中。这是最简单的情况,一般情况下,应该控制这种顺序连接的Agent 的数量,因为数据流经的路径变长了,如果不考虑failover的话,出现故障将影响整个Flow上的Agent收集服务

Consolidation(流的合并,多个Agent的数据汇聚到同一个Agent )

image.png

这种情况应用的场景比较多,比如要收集Web网站的用户行为日志, Web网站为了可用性使用的负载集群模式,每个节点都产生用户行为日志,可以为每 个节点都配置一个Agent来单独收集日志数据,然后多个Agent将数据最终汇聚到一个用来存储数据存储系统,如HDFS上

Multiplexing the flow(多路复用)

image.png

Flume 支持从一个 Source 向多个 Channel,也就是向多个 Sink 传递事件,这个操作称之为 Fan Out(扇出)。默认情况下 Fan Out 是向所有的 Channel 复制 Event,即所有 Channel 收到的数据都是相同的。同时 Flume 也支持在 Source 上自定义一个复用选择器 (multiplexing selector) 来实现自定义的路由规则。

举个例子,当syslog, java, nginx、 tomcat等混合在一起的日志流开始流入一个agent后,可以在agent中将混杂的日志流分开,然后给每种日志建立一个自己的传输通道

load balance功能

image.png