优化数据流传输之Flume Channel选择器

Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构,灵活简单。

Flume的主要作用是实时读取服务器的数据,写入到HDFS,而其功能的实现主要依赖各个组件之间的相互作用,基本组成如下图:

接下我们来介绍一下Flume的基本组件的作用和Channel Selector的类型以及使用示例。

一、基本组件

1. Agent

Agent是一个JVM进程,它以事件的形式将数据从源头送至目的地。Agent主要有三个部分组成,Source、Channel、Sink。

2. Source

Source是负责接收数据到Flume Agent的组件。Source组件可以处理各种类型、各种格式的日志数据。

3. Sink

Sink不断地轮询Channel中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个Flume Agent。

4. Channel

Channel是位于Source和Sink之间的缓冲区。因此,Channel允许Source和Sink运作在不同的速率上。Channel是线程安全的,可以同时处理几个Source的写入操作和几个Sink的读取操作。

Flume自带两种Channel:Memory Channel和File Channel。

Memory Channel是内存中的队列。Memory Channel在不需要关心数据丢失的情景下适用。如果需要关心数据丢失,那么Memory Channel就不应该使用,因为程序死亡、机器宕机或者重启都会导致数据丢失。

File Channel将所有事件写到磁盘。因此在程序关闭或机器宕机的情况下不会丢失数据。

因为一个Souce可以向多个Channel同时写数据,所以也就产生了以何种方式向多个Channel写的问题(比如自带的复制选择器,会把数据完整地发送到每一个Channel,而多路分发选择器就可以通过配置来按照一定的规则进行分发,听起来很像负载均衡),Channel选择器也就应运而生。

二、Flume Channel Selector类型

1. Replicating Channel Selector(default)

复制通道选择器是一种内置的选择器策略,默认情况下用于将事件从Source(数据源)复制到多个Channel(通道)中。其工作原理如下:

  • 当一个事件到达Flume的Source时,"Replicating Channel Selector"会将该事件复制到配置的所有Channel中。
  • 每个Channel都会独立地处理和传递复制的事件。

"Replicating Channel Selector"的优点是可以将事件同时发送到多个Channel中,以提高可靠性和容错性。如果一个Channel发生故障或不可用,复制的事件仍然可以被其他可用的Channel接收和处理。

Agent为a1,Source为r1的示例:

a1.sources = r1

a1.channels = c1 c2 c3

a1.sources.r1.selector.type = replicating

a1.sources.r1.channels = c1 c2 c3

a1.sources.r1.selector.optional = c3

在上面的配置中,c3是一个可选通道。写入c3的失败会被忽略。因为c1和c2没有被标记为可选的,所以写入这些通道失败将导致事务失败。

2. Multiplexing Channel Selector

多路复用通道选择器是一种内置的选择器策略,用于根据事件的属性将事件从Source(数据源)路由到不同的Channel(通道)中。其工作原理如下:

  • 当一个事件到达Flume的Source时,"Multiplexing Channel Selector"会检查事件的属性,并根据预定义的规则将事件路由到匹配条件的Channel中。
  • 每个Channel都会独立地处理和传递路由的事件。

"Multiplexing Channel Selector"的优点是可以根据事件的属性将事件动态地分发到不同的Channel中,以实现更灵活和精确的事件路由。可以根据事件的源、类型、标签等属性来定义路由规则,从而将不同类型的事件发送到不同的Channel中。需要注意的是,在使用"Multiplexing Channel Selector"时,需要定义选择器的属性和匹配规则。

"Multiplexing Channel Selector"选择器策略适用于需要根据事件属性将事件路由到不同Channel的场景。它提供了更灵活和精确的事件路由功能,可以根据具体需求和场景进行配置和定制。

Agent为a1,Source为r1的示例:

a1.sources = r1

a1.channels = c1 c2 c3 c4

a1.sources.r1.selector.type = multiplexing

#以每个event的header中的state这个属性的值作为选择channel的依据

a1.sources.r1.selector.header = state

#如果state=CZ,则选择c1这个channel

a1.sources.r1.selector.mapping.CZ = c1

#如果state=US,则选择c2 和 c3 这两个channel

a1.sources.r1.selector.mapping.US = c2 c3

#默认使用c4这个channel

a1.sources.r1.selector.default = c4

3. Load Balancing Channel Selector

负载平衡通道选择器提供了在多个通道上进行负载平衡流的能力,这有效地允许在多个线程上处理传入的数据,它维护一个活动通道的索引列表,负载必须分布在这些通道上,实现支持通过round_robin或随机选择机制来分配负载。选择机制默认为round_robin类型,但可以通过配置来覆盖。

Agent为a1,Source为r1的示例:

a1.sources = r1

a1.channels = c1 c2 c3 c4

a1.sources.r1.channels = c1 c2 c3 c4

a1.sources.r1.selector.type = load_balancing

a1.sources.r1.selector.policy = round_robin

4. Customer Channel Selector

自定义通道选择器需要实现org.apache.flume.ChannelSelector接口。在启动Flume Agent时,自定义通道选择器的类及其依赖项必须包含在Agent的类路径中。自定义通道选择器的类型是FQCN。

Agent为a1,Source为r1的示例:

a1.sources = r1

a1.channels = c1

a1.sources.r1.selector.type = org.example.MyChannelSelector

三、总结

本文介绍了Flume的基本组件和Channel Selector,前者让我们对Flume有基本了解,后者对Channel选择器做了详细解释,其类型有四种,其中Replicating Channel Selector (default)、Multiplexing Channel Selector、Load Balancing Channel Selector三种由Flume底层提供,另Custom Channel Selector需要我们自定义实现org.apache.flume.ChannelSelector接口。

Flume Channel Selector常用的两种方式,一种是用来复制(Replication),这也是默认配置,另一种是用来分流(Multiplexing),具体的使用方式选择需要各位程序猿综合实际情况进行测试,选定Selector。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值