Flume 的数据流由事件(Event)贯穿始终。事件是 Flume 的基本数据单位,它携带日志数据(字
节数组形式)并且携带有头信息,这些 Event 由 Agent 外部的 Source 生成,当 Source 捕获事件后
会进行特定的格式化,然后 Source 会把事件推入(单个或多个)Channel 中。你可以把Channel 看
作是一个缓冲区,它将保存事件直到 Sink 处理完该事件。Sink 负责持久化日志或者把事件推向另
一个 Source。
Flume 以 agent 为最小的独立运行单位。
一个 agent 就是一个 JVM。
单 agent 由 Source、Sink 和 Channel 三大组件构成。
如下图所示
组件 | 功能 |
Agent | 使用 JVM 运行 Flume。每台机器运行一个 agent,但是可以在一个 agent 中包含多个 sources 和 sinks。 |
Client | 生产数据,运行在一个独立的线程。 |
Source | 从 Client 收集数据,传递给 Channel。 |
Sink | 从 Channel 收集数据,运行在一个独立线程。 |
Channel | 连接 sources 和 sinks,这个有点像一个队列。 |
Events | 可以是日志记录、avro 对象等。 |
Event
Event 是 Flume 数据传输的基本单元。
Flume 以事件的形式将数据从源头传送到最终的目的地。
Event 由可选的 header 和载有数据的一个 byte array 构成。
载有的数据度 flume 是不透明的。
Header 是容纳了 key-value 字符串对的无序集合,key 在集合内是唯一的。
Header 可以在上下文路由中使用
Client
Client 是一个将原始 log 包装成 events 并且发送他们到一个或多个 agent 的实体目的是从数据源系统中解耦 Flume
在 Flume 的拓扑结构中不是必须的。
Client 实例
flume log4j Appender
可以使用 Client SDK(org.apache.flume.api)定制特定的 Client
Agent
一个 Agent 包含 source,channel,sink 和其他组件。
它利用这些组件将 events 从一个节点传输到另一个节点或最终目的地
agent 是 flume 流的基础部分。
flume 为这些组件提供了配置,声明周期管理,监控支持。
Source
Source 负责接收 event 或通过特殊机制产生 event,并将 events 批量的放到一个或多个Channel
Channel
包含 event 驱动和轮询两种类型。
不同类型的 Source
与系统集成的 Source:Syslog,Netcat,监测目录池
自动生成事件的 Source:Exec
用于 Agent 和 Agent 之间通信的 IPC source:avro,thrift
source 必须至少和一个 channel 关联
Agent 之 Channel
Channel 位于 Source 和 Sink 之间,用于缓存进来的 event
当 sink 成功的将 event 发送到下一个的 channel 或最终目的 event 从 channel 删除不同的 channel 提供的持久化水平也是不一样的
Memory channel:volatile(不稳定的)
File Channel:基于 WAL(预写式日志 Write-Ahead logging)实现
JDBC channel:基于嵌入式 database 实现
channel 支持事务,提供较弱的顺序保证可以和任何数量的 source 和 sink 工作
Agent 之 Sink
Sink 负责将 event 传输到吓一跳或最终目的地,成功后将 event 从 channel 移除不同类型的 sink
存储 event 到最终目的地终端 sink,比如 HDFS,HBase
自动消耗的 sink 比如 null sink
用于 agent 间通信的 IPC:sink:Avro
必须作用于一个确切的 channel
Iterator
作用于 Source,按照预设的顺序在必要地方装饰和过滤 events
Channel Selector
允许 Source 基于预设的标准,从所有 channel 中,选择一个或者多个 channel
Sink Processor
多个 sink 可以构成一个 sink group
sink processor 可以通过组中所有 sink 实现负载均衡
也可以在一个 sink 失败时转移到另一个