简单理解Flume之Channel和Sink

Channel

Memory Channel

1,Memory Channel将数据临时存储的到内存队列

2,属性

属性

默认值解释
capacity100

队列容量,默认情况队列中最多临时存储100条数据,实际过程这个值一般被调节成30W~50W

transacCapacity100Put List向Channel发送的数据条数,实际中一般会调节成3000~5000

File Channel

1,File Channel将数据临时存储在磁盘文件,因此File Channel读写效率较低,但是可靠

a1.sources = s1
a1.channels = c1
a1.sinks = k1

a1.sources.s1.type = netcat
a1.sources.s1.bind = 0.0.0.0
a1.sources.s1.port = 6666

# 配置File Channel
a1.channels.c1.type = file
# 数据临时存储路径
a1.channels.c1.dataDirs = /opt/flume_data/data
# 检查点临时存储路径
a1.channels.c1.checkpointDir = /opt/flume_data/checkpoint

a1.sinks.k1.type = logger

a1.sources.s1.channels = c1
a1.sinks.k1.channel = c1

Sink

Logger Sink

1,Logger Sink:将Flume收集到的数据打印到控制台(console)或者文件(logfile)中

2,打印的时候为了防止过多数据将屏幕沾满,所以限制body部分只打印16个字节的数据,多出来的部分被舍弃

3,实际开发中,较少使用这个Sink

HDFS Sink

1,将数据收集到HDFS上

  

a1.sources = s1
a1.channels = c1
a1.sinks = k1

a1.sources.s1.type = netcat
a1.sources.s1.bind = 0.0.0.0
a1.sources.s1.port = 6666

a1.channels.c1.type = memory

# 配置HDFS Sink
a1.sinks.k1.type = hdfs
# 文件/数据在HDFS上的存储路径
a1.sinks.k1.hdfs.path = hdfs://hadoop01:8020/flume
# 文件滚动间隔时间
a1.sinks.k1.hdfs.rollInterval = 3600
# 文件滚动大小
a1.sinks.k1.hdfs.rollSize = 134217728
# 文件滚动条数
a1.sinks.k1.hdfs.rollCount = 1000000
# 文件类型
a1.sinks.k1.hdfs.fileType = DataStream

# 将Source和Channel绑定
a1.sources.s1.channels = c1
# 将Sink和Channel绑定
a1.sinks.k1.channel = c1

File Roll Sink

1,将Flume收集到的数据存储到本地磁盘

a1.sources = s1
a1.channels = c1
a1.sinks = k1

a1.sources.s1.type = netcat
a1.sources.s1.bind = 0.0.0.0
a1.sources.s1.port = 6666

a1.channels.c1.type = memory

# 配置File Roll Sink
a1.sinks.k1.type = file_roll
# 文件/数据在磁盘上的存储位置
a1.sinks.k1.sink.directory = /opt/flume_data
# 文件滚动间隔时间
a1.sinks.k1.sink.rollInterval = 3600

a1.sources.s1.channels = c1
a1.sinks.k1.channel = c1

Custom Sink

1,自定义Sink:当Flume提供的Sink不能满足业务需求的时候,此时就需要自定义Sink

2,自定义Sink和自定义Source的过程类似,需要定义一个类继承AbstractSink,实现SinkConfigurable接口

3,自定义Sink的时候需要注意事务问题

其他组件

Channel Selector

1,Channel Selector是Source的子组件之一,决定了数据的发送方式,即Source要把数据发送给哪个Channel

2,ChannelSelector提供了三种模式

  1. replicating:复制模式。当节点收到数据之后,会将这个数据复制之后分发给每一个节点,此时接收节点收到的数据是相同的

  2. multiplexing:路由模式。当节点收到数据之后,会根据这个数据的headers中的指定字段的值,来决定将数据发送给哪一个节点,此时接收节点的数据是不相同的

  3. load balancing:负载均衡模式。当节点收到数据之后,会及那个数据分发到某一个节点上,尽量保证接收节点之间的数据量是大致相等的。目前有两种负载均衡模式:round_robin(轮询),random(随机)。到目前为止,Flume提供的load balancing不好用

3,在扇出结构中,如果不指定,默认使用是replicating模式

4,multiplexing模式

a1.sources = s1
a1.channels = c1 c2
a1.sinks = k1 k2

a1.sources.s1.type = http
a1.sources.s1.port = 8090
# 配置Selector
a1.sources.s1.selector.type = multiplexing
# 要监听的字段名
a1.sources.s1.selector.header = kind
# 字段值,根据字段值不同发送到不同的节点上
a1.sources.s1.selector.mapping.music = c1
a1.sources.s1.selector.mapping.video = c2
a1.sources.s1.selector.default = c2

a1.channels.c1.type = memory
a1.channels.c2.type = memory

a1.sinks.k1.type = avro
a1.sinks.k1.hostname = hadoop02
a1.sinks.k1.port = 8090

a1.sinks.k2.type = avro
a1.sinks.k2.hostname = hadoop03
a1.sinks.k2.port = 8090

a1.sources.s1.channels = c1 c2
a1.sinks.k1.channel = c1
a1.sinks.k2.channel = c2

Sink Processor

1,Sink Processor本质上是一个Sink Group(Sink 组),会将一个或多个Sink绑定到一个组,看作是一个整体

2,Sink Processor提供了三种模式

  1. default:默认模式,默认一个Sink就是一个组,有几个Sink就是几个Sink组

  2. failover:崩溃恢复模式。要求将多个Sink绑定到一个组中,给这个组中的每一个Sink需要指定一个优先级,当高优先级的Sink宕机,才会将数据发送给低优先级的Sink

  3. load_balancing:负载均衡模式。要求将多个Sink绑定到一个组中,实现数据的均衡,提供了两种方式:round_robinrandom。目前Flume提供的原生的load_balancing模式不好用!!!

3,failover模式

a1.sources = s1
a1.channels = c1 c2
a1.sinks = k1 k2

# 给SinkGroup起名
a1.sinkgroups = g1
# 给这个SinkGroup绑定Sink
a1.sinkgroups.g1.sinks = k1 k2
# 指定SinkGroup的类型
a1.sinkgroups.g1.processor.type = failover
# 给每一个Sink指定优先级
a1.sinkgroups.g1.processor.priority.k1 = 5
a1.sinkgroups.g1.processor.priority.k2 = 2
# 指定等待时间
a1.sinkgroups.g1.processor.maxpenalty = 100000

a1.sources.s1.type = netcat
a1.sources.s1.bind = 0.0.0.0
a1.sources.s1.port = 8090

a1.channels.c1.type = memory
a1.channels.c2.type = memory

a1.sinks.k1.type = avro
a1.sinks.k1.hostname = hadoop02
a1.sinks.k1.port = 8090

a1.sinks.k2.type = avro
a1.sinks.k2.hostname = hadoop03
a1.sinks.k2.port = 8090

a1.sources.s1.channels = c1 c2
a1.sinks.k1.channel = c1
a1.sinks.k2.channel = c2

Interceptors

1,Interceptors本身已是Source的组件之一,可以对数据进行修改,并且每一个Source上可以添加多个Interceptor,构成拦截器链

2,Timestamp Interceptor:时间戳拦截器,在Event的headers中添加一个timestamp字段,用于标记数据被收集的时间

a1.sources = s1
a1.channels = c1
a1.sinks = k1

a1.sources.s1.type = netcat
a1.sources.s1.bind = 0.0.0.0
a1.sources.s1.port = 6666
# 给Interceptor起名
a1.sources.s1.interceptors = i1
# 配置Timestamp Interceptor
a1.sources.s1.interceptors.i1.type = timestamp

a1.channels.c1.type = memory

a1.sinks.k1.type = logger

a1.sources.s1.channels = c1
a1.sinks.k1.channel = c1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值