flume--KafkaChannel的使用

一.为什么使用KafkaChannel?

在使用flume对接Kafka时,我们往往使用TailFileSource–>MemoryChannel–>KafkaSink的这种方式,然后将数据输送到Kafka集群中。如图所示:
flume--KafkaChannel的使用_第1张图片

但是这种方式有弊端:
1.TailFileSource只能监听一个文件
2.MemoryChannel数据会有堆积,内存可能溢出(而FileChannel又比较慢)
3.这种方式经历多个组件,效率变低,出现问题的概率也变大。

新的思路:
使用TailFileSource–>KafkaChannel这种方式,将KafkaChannel作为缓冲,效率变高,而且数据不会丢失。如图所示:
flume--KafkaChannel的使用_第2张图片
这种方法就是使用TailFileSource来读取日志文件,然后将数据输送到KafkaChannel种,然后KafkaChannel直接将数据输送到Kafka集群中,此时不需要Sink,KafkaChannel相当于Kafka的生产者,这样就充分利用了Kafka集群的优点,当数据量很大的时候,也能hold得住。

如果要将数据写入到HDFS或者ES中,要再创建一个flume集群,这个flume中只要有KafkaChannel和HDFSSink就可以了,此时的KafkaChannel相当于Kafka的消费者。但是要注意,为了避免多个flume消费同样的数据,要将多个flume实例放在同一个组内。

下面是flume官网给出的介绍:
flume--KafkaChannel的使用_第3张图片

KafkaChannel的使用

书写flume的配置文件

a0.conf

#bin/flume-ng agent -n a0 -f /home/hadoop/a0.conf -c conf -Dflume.root.logger=INFO,console
#定义agent名, source、channel、sink的名称
a0.sources = r1
a0.channels = c1

#具体定义source
a0.sources.r1.type = cn.baidu.flume.source.TailFileSource
a0.sources.r1.filePath = /Users/zx/Documents/logs/access.txt
a0.sources.r1.posiFile = /Users/zx/Documents/logs/posi.txt
a0.sources.r1.interval = 2000
a0.sources.r1.charset = UTF-8

a0.sources.r1.interceptors = i1
a0.sources.r1.interceptors.i1.type = cn.baidu.flume.interceptor.JsonInterceptor$Builder
a0.sources.r1.interceptors.i1.fields = id,name,money,age
a0.sources.r1.interceptors.i1.separator = ,

a0.channels.c1.type = org.apache.flume.channel.kafka.KafkaChannel
a0.channels.c1.kafka.bootstrap.servers = kafka所在机器的主机名
a0.channels.c1.kafka.topic = usertest
a0.channels.c1.parseAsFlumeEvent = false

a0.sources.r1.channels = c1

你可能感兴趣的:(flume,spark共享单车项目)