Flume 概述
# Flume 是什么
Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。官网地址 (opens new window)。
Flume 主要包含三个组件:Source、Channel 和 Sink。它的主要流程就是把数据从 Source 收集过来,再将收集到的数据送到指定 Sink。为了保证输送的过程一定成功,在送到 Sink 之前,会先缓存数据到 Channel,确保数据到达 Sink 之后再删除缓存数据。
# Flume 架构
从上图中可以看出,Flume 中最核心的是 Agent,Agent 里又包含了 Source、Channel 和 Sink 三个组件。
- Agent:本质上是一个 JVM 进程,该 JVM 进程控制 Event 数据流从外部日志生产者那里传输到目的地(或者是下一个 Agent)。一个完整的 Agent 中包含了三部分:Source、Channel 和 Sink。
- Source:Source 是负责接收数据到 Flume Agent 的组件。Source 组件可以处理各种类 型、各种格式的日志数据,包括 Avro、Exec、Spooldir、Netcat 等。
- Channel:Channel 是位于 Source 和 Sink 之间的组件。可以理解为 Channel 是 Source 和 Sink 之间的一个缓冲区,当 Source 采集数据的速率大于 Sink 的输出速度时,Channel 可以提供一个临时的落脚点。Channel 是线程安全的,可以同时处理几个 Source 的写入操作和几个 Sink 的读取操作。
- Sink:不断地轮询 Channel 中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个 Flume Agent。Sink 是完全事务性的。在从 Channel 批量删除数据之前,每个 Sink 用 Channel 启动一个事务。批量事件一旦成功写出到存储系统或下一个 Flume Agent,Sink 就利用 Channel 提交事务。事务一旦被提交,该 Channel 从自己的内部缓冲区删除事件。Sink 组件包括 HDFS、Logger、Avro、File、HBase 等。
在整个数据流中最基本的传输单元叫做 Event,Event 包含 Header 和 Body 两部分,Header 用来存储 event 的一些属性(K-V 结构),Body 用于存储传输的数据。
# Flume 内部原理
- 每个 Source 都有自己的 Channel 处理器,每次将 Source 取得的事件写入到 Channel,都要通过 Channel 处理器。然后 Channel 处理器将这些事件,传送到一个或者多个拦截器中和 Channel 选择器中(Channel Selector)。
- 拦截器是简单的插入式组件,设置在 Source 和 Source 写入数据的 Channel 之间,Source 接收到的事件在写入到 Channel 之前,拦截器都可以对事件进行拦截。拦截器也有很多类型,如正则表达式的拦截器,时间戳拦截器,可以为事件添加报头,或者移除现有报头等。某个 Source 可以配置成使用多个拦截器,这些拦截器按照配置的顺序依次被调用,这就是所谓的责任链模式。一旦拦截器处理完事件,将事件返回给 Channel 处理器。Channel 处理器又将时间传递给 Channel 选择器。
- Channel 选择器是决定每个事件写入哪个 Channel 组件中。Channel 选择器有两种类型:Replicating Channel Selector 和 Multiplexing Channel Selector。Replicating 会将 Source 过来的 Events 发往所有 channel,而 Multiplexing 可以配置发往哪些 Channel。默认是 Replicating Channel Selector。
- Channel 的作用在 Source 和 Sink 之间加一层缓冲区,当 Source 生产速度大于 Sink 的消费速度的时候,可以让事件进行短暂停留而不至于让整个链路崩掉。
- 事件经过 Channel 之后会被发送到 Sink 处理器,Sink 处理器会选择其中一个 Sink 去处理该事件,并将其发送到下一个阶段。
# Flume 数据流模型
# 简单模型
# 多路复用模型
# 聚合模型
# 负载均衡模型
上次更新: 2023/11/01, 03:11:44