Flume之使用Loadbalancing Sink Processor实现sink负载均衡

本文详细介绍了Flume中的LoadbalancingSinkProcessor,一种能够实现在Sink组中进行负载均衡的组件。通过轮询、随机或自定义选择器,确保数据流在多个Sink间均匀分配,同时具备指数退避功能,避免故障Sink导致的数据处理瓶颈。

前言

  • Load balancing Sink Processor,顾名思义,即能够对Sink组中的每个Sink实现负载均衡,默认采用的是轮询round_robin的方式,还可以使用随机方式random,或者用户自己实现AbstractSinkSelector抽象类定义自己的Sink Selector类,并提供FQCN(Full Qualified Class Name)全类名来进行配置,并且Load balancing Sink Processor还提供了指数退避backoff,即当某个Sink挂掉时,将会将其加入到黑名单,一定时间内不再访问此Sink,退避时间呈指数增长并默认最大值为30000ms,可以手动设置

使用示例

1)flume1.properties

# flume1:此配置用于监控某个端口将其追加内容输出到flume2和flume3中
# 并将两个Sink组成一个sink group,并将Sink Processor设置成load_balance类型
# a1:Netcat Source-> Memory Channel-> Load balancing Sink Processor-> Avro Sink

# Agent
a1.sources = r1
a1.channels = c1
a1.sinks = k1 k2

# Sink groups
a1.sinkgroups = g1
# 设置sink group中的sinks
a1.sinkgroups.g1.sinks = k1 k2
# 配置Load balancing Sink Processor(只有sink group才可以使用sink processor)
a1.sinkgroups.g1.processor.type = load_balance
# 设置开启指数避让
a1.sinkgroups.g1.processor.backoff = true
# 设置Processor的selector为轮询round_robin
a1.sinkgroups.g1.processor.selector = round_robin
# 设置最大避让时间(ms)
a1.sinkgroups.g1.processor.maxTimeOut = 10000


# Sources
# 配置a1.sources.r1的各项属性参数,类型/绑定主机ip/端口号
a1.sources.r1.type = netcat
a1.sources.r1.bind = hadoop101
a1.sources.r1.port = 44444

# Channels
# 配置a1.channerls.c1的各项属性参数,缓存方式/最多缓存的Event个数/单次传输的Event个数
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# Sinks
# sinks.k1
a1.sinks.k1.type = avro
a1.sinks.k1.hostname = hadoop102
a1.sinks.k1.port = 4141
# sinks.k2
a1.sinks.k2.type = avro
a1.sinks.k2.hostname = hadoop103
a1.sinks.k2.port = 4141

# Bind
# 注意:source可以绑定多个channel,但是sink/sink group只能绑定单个channel
# r1->c1->g1
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
a1.sinks.k2.channel = c1

2)flume2.properties

# flume2:此配置用于将来自指定Avro端口的数据输出到控制台
# a2:Avro Source->Memory Channel->Logger Sink

# Agent
a2.sources = r1
a2.channels = c1
a2.sinks = k1

# Sources
# a2.sources.r1
a2.sources.r1.type = avro
# 设置监听本地IP
a2.sources.r1.bind = 0.0.0.0
# 设置监听端口号
a2.sources.r1.port = 4141

# Channels
# a2.channels.c1
# 使用内存作为缓存/最多缓存的Event个数/单次传输的Event个数
a2.channels.c1.type = memory
a2.channels.c1.capacity = 1000
a2.channels.c1.transactionCapacity = 100

# Sinks
# 运行时设置参数 -Dflume.root.logger=INFO,console 即输出到控制台实时显示
a2.sinks.k1.type = logger
# 设置Event的Body中写入log的最大字节数(默认值为16)
a2.sinks.k1.maxBytesToLog = 256

# Bind
a2.sources.r1.channels = c1
a2.sinks.k1.channel = c1

3)flume3.properties

# flume3:此配置用于将来自指定Avro端口的数据输出到控制台
# a3:Avro Source->Memory Channel->Logger Sink

# Agent
a3.sources = r1
a3.channels = c1
a3.sinks = k1

# Sources
# a3.sources.r1
a3.sources.r1.type = avro
# 设置监听本地IP
a3.sources.r1.bind = 0.0.0.0
# 设置监听端口号
a3.sources.r1.port = 4141

# Channels
# a3.channels.c1
# 使用内存作为缓存/最多缓存的Event个数/单次传输的Event个数
a3.channels.c1.type = memory
a3.channels.c1.capacity = 1000
a3.channels.c1.transactionCapacity = 100

# Sinks
# 运行时设置参数 -Dflume.root.logger=INFO,console 即输出到控制台实时显示
a3.sinks.k1.type = logger
# 设置Event的Body中写入log的最大字节数(默认值为16)
a3.sinks.k1.maxBytesToLog = 256

# Bind
a3.sources.r1.channels = c1
a3.sinks.k1.channel = c1

4)启动命令

Flume Agent a1至a3分别运行在主机hadoop101、hadoop102、hadoop103上

./bin/flume-ng agent -n a1 -c conf -f flume1.properties
./bin/flume-ng agent -n a2 -c conf -f flume2.properties -Dflume.root.logger=INFO,console
./bin/flume-ng agent -n a3 -c conf -f flume3.properties -Dflume.root.logger=INFO,console

5)实现功能

agent a1将指定端口的监听数据采用轮询的方式传输给a2和a3,并分别输出到各自的控制台


End~

Flume实现负载均衡故障恢复的方法如下: ### 负载均衡 Flume负载均衡机制通过多种方式实现,主要集中在Sink选择切换上,底层依赖于Sink ProcessorSelector的逻辑。将多个sink逻辑上分为一个sink组,sink组配合不同的SinkProcessor将数据相对均匀地分发到指定目录或者其他agent实例。Load balancing Sink Processor能够实现load balance功能,例如Agent1作为路由节点,负责将Channel暂存的Event均衡到对应的多个Sink组件上,而每个Sink组件分别连接到一个独立的Agent上。常见的负载均衡策略有Round Robin、Random策略等。 以下是一个使用随机负载均衡策略的配置示例: ```properties # 1:定义组件 a1.sources = r1 a1.channels = c1 a1.sinks = k1 k2 # 2:定义source a1.sources.r1.type = netcat a1.sources.r1.bind = localhost a1.sources.r1.port = 44444 # 3:定义channel a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # 4:定义sink a1.sinkgroups = g1 # 定义sink组g1 # 负载均衡 start a1.sinkgroups.g1.processor.type = load_balance a1.sinkgroups.g1.processor.backoff = true a1.sinkgroups.g1.processor.selector = random # 负载均衡 end a1.sinks.k1.type = avro a1.sinks.k1.hostname = worker214 a1.sinks.k1.port = 4141 a1.sinks.k2.type = avro a1.sinks.k2.hostname = worker215 a1.sinks.k2.port = 4142 # 5:定义关联关系 a1.sources.r1.channels = c1 a1.sinkgroups.g1.sinks = k1 k2 a1.sinks.k1.channel = c1 a1.sinks.k2.channel = c1 ``` ### 故障恢复 故障转移采用主备agent模式,主agent负责数据的采集、传输、落地,备用agent一直处于监听状态,一旦主agent宕机,备用agent启动,进行主agent的工作,直到主agent恢复。 执行配置文件时,分别开启对应配置文件,例如: ```bash [xiaoxq@hadoop105 flume-1.9.0]$ bin/flume-ng agent -n a3 -c conf/ -f jobs/group2/flume-flume-console2.conf -Dflume.root.logger=INFO,console [xiaoxq@hadoop105 flume-1.9.0]$ bin/flume-ng agent -n a2 -c conf/ -f jobs/group2/flume-flume-console1.conf -Dflume.root.logger=INFO,console [xiaoxq@hadoop105 flume-1.9.0]$ bin/flume-ng agent -n a1 -c conf/ -f jobs/group2/flume-netcat-flume.conf -Dflume.root.logger=INFO,console ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值