Flume agent内部原理

Flume Agent 包含三个组件:Source,Channel,Sink

Source:
Source是从一些其他产生数据的应用中接收数据的活跃组件。有自己产生数据的Source Source 不过这些Source通常用于测试目的。Source可以监听一个或者多个网络端口,用于接收数据或者可以从本地文件系统读取数据。每个Source必须至少连接一个Channel。基于一些标准,一个Source可以写入几个Channel,复制事件到所有或某些Channel。

Channel:

Channel 是被动组件,用来缓冲Agent已经接受但还没写出到另一个agent或者存储系统的数据。Channel 的行为像队列,Source写入他们,Sink从他们读取。
多个Source可以安全的写入到相同的Channel ,并且多个Sink可以从相同的Channel进行读取。
但一个Sink只能从一个Channel 读取。
如果多个Sink从相同的Channel 读取,它可以保证只有一个Sink将会从Channel 读取一个指定特定的事件。

Sink:
连续轮询各自的Channel 来读取和删除事件。
Sink将事件推送到下一阶段,或到最终目的地。
一旦在下一阶段或其目的地中的数据是安全的,Sink 通过事务提交通知Channel ,可以从Channel 中删除这些事件。
Flume agent内部原理_第1张图片
带有一个Source,Channel,Sink的简单Flume Agent。

Flume 本身不限制Agent 中Source、Channel 和Sink的数量。因此Flume Source可以接收事件,并可以通过配置将事件复制到多个目的地。这使得Source通过 Channel处理器、拦截器和Channel 选择器,写入数据到 Channel成为可能。

每个Source Channel处理器。每次Source将数据写入Channel,它是通过委派该任务到其 Channel处理器来完成,然后,Channel处理器将这些事件传到一个或多个Source配置的拦截器中。

拦截器是一段代码,可以基于某些它完成的处理来读取事件和修改或删除事件。基于某些标准,如正则表达式,拦截器可以用来删除事件,为事件添加新报头或移除现有的报头等。每个Source可以配置成使用多个拦截器,按照配置中定义的顺序被调用,将拦截器的结果传递给链的下一个单元。这就是所谓的责任链(Chain–responsibility)的设计模式。一旦拦截器处理完事件,拦截器链返回的事件列表传递到Channel列表,即通过Channel 选择器为每个事件选择的Channel。

Source 可以通过处理器-拦截器-选择器路由写入多个 Channel。 Channel选择器是决定每个事件必须写入到Source 附带的哪个Channel的组件。因此拦截器可以用来插入或删除事件中的数据,这样Channel选择器可以应用一些条件在这些事件上,来决定事件必须写入哪些Channel。 Channel选择器可以对事件应用任意过滤条件,来决定每个事件必须写入哪些Channel ,以及Channel是必需的或可选的。

写入到必需的Channel 失败将会导致 Channel处理器抛出ChannelException,表明Source必须重试该事件(实际上,所有的事件都在那个事务中),而未能写入可选Channel 失败仅仅忽略它。一旦写出事件,处理器会对 Source指示成功状态,可能发送确认(ACK)给发送该事件的系统,并继续接受更多的事件。
Flume agent内部原理_第2张图片
Sink运行器(Sink Runner)运行一个Sink组(Sink Group),Sink组可含有一个或多个Sink。如果组中只存在一个Sink,那么没有组将更有效率。Sink运行器仅仅是一个询问Sink组(或Sink)来处理下一批事件的线程。每个Sink组有一个Sink处理器(s Processor),处理器选择组中的Sink之一去处理下一个事件集合。每个Sink只能从一Channel 获取数据,尽管多个Sink可以从同一个Channel 获取数据。选定的Sink只能从有个Channel获取数据,尽管多个Sink可以从同一个Channel 获取数据。选定的Sink从Channel中接受事件,并将事件写入到下一阶段或最终目的地。Flume agent内部原理_第3张图片

你可能感兴趣的:(flume)