🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
<mark>**Agent**</mark>:是一个 JVM 进程,它以事件 Event 的形式将数据从源头送至目的,<ins>是Flume 数据传输的基本单元</ins>。 Agent 主要有 3 个部分组成,Source、Channel、Sink,掌握这3个即可。 <br/> <mark>**Source:**</mark> <ins>Source 是负责接收数据到 Flume Agent 的组件</ins>。用来获取 Event 并写入 Channel。 <mark>SourceRunner:</mark>负责启动 Source,一个 SourceRunner包含一个 Source对象。 <mark>Interceptor:</mark>即为拦截器,是简单的插件式组件,设置在 Source 和 Channel 之间。 <br/> <mark>**Channel:**</mark> <ins>Channel 是位于 Source 和 Sink 之间的缓冲区。</ins>Channel 是线程安全的,可以同时处理几个 Source 的写入操作和几个 Sink 的读取操作。 <mark>ChannelSelector:</mark> 作用是为 Source 选择下游的 Channel。有两种选择方式,<ins>复制和多路复用。</ins> <mark>ChannelProcessor:</mark>通过 ChannelSelector 获取到 Channels 后,如何发送 Event 到Channel。 :-: ![](https://img.kancloud.cn/42/4f/424f9abe9c4314e9a49b34df1efbac04_1149x307.png) ChannelProcessor作用 一个 Source 对象包含一个 ChannelProcessor 对象,一个 ChannelProcessor对象包含多个 Interceptor 对象和一个 ChannelSelector 对象。 :-: ![](https://img.kancloud.cn/97/9c/979c5ce8c50b3ee4de6e53bf37a0bd63_1117x436.png) Source->Channel相关组件 <br/> <mark>**Sink:** </mark>从 Channel 中读取并移除 Event,将 Event 传递到 Flow Pipeline 中的下一个 Agent 或者其他存储系统。<ins>Sink 不断地轮询 Channel 中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个 Flume Agent。</ins> <br/> <ins>Sink 是完全事务性的</ins>。在从 Channel 批量删除数据之前,每个 Sink 用Channel 启动一个事务。批量事件一旦成功写出到存储系统或下一个Flume Agent,Sink 就利用 Channel 提交事务。事务一旦被提交,该 Channel从自己的内部缓冲区删除事件。 <mark>SinkRunner:</mark>负责启动 Sink。在 Agent 启动时,会同时启动 Channel,SourceRunner。 <mark>SinkProcessor:</mark>Flume 提供 FailoverSinkProcessor 和 LoadBalancingSinkProcessor,顾名思义,一个是失效备援,一个是负载均衡,那么 SinkProcessor 不同子类的存在就是为了实现不同的分配操作和策略,而 sink 的 `start()`通常是启动线程去执行消费操作。还有一个就是默认的DefaultSinkProcessor,即为单个Sink。 <mark>SinkSelector:</mark>LoadBalancingSinkProcessor 包含 SinkSelector,会根据 SinkSelector在 SinkGroup(逻辑上的一组 Sink)中选择 Sink 并启动。从源码中可看出,其为LoadBalancingSinkProcessor 的内部接口。