Flume03:【案例】多Channel多Sink

138 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

需求描述:

我们需要使用 Flume 采集端口为 26001 的 socket 数据,将数据注入 Kafka 的同时,将数据备份到 HDFS 的 /user/test/flumebackup 目录下。

在这里插入图片描述

Flume配置文件:

# Name the components on this agent
agent.sources = s1
agent.sinks = k1 k2
agent.channels = c1 c2

# Describe/configure the source
agent.sources.s1.type = netcat
agent.sources.s1.bind = localhost
agent.sources.s1.port = 26001

# Describe the sink1
agent.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
agent.sinks.k1.kafka.topic = order
agent.sinks.k1.kafka.bootstrap.servers = master:9092

# Describe the sink2
agent.sinks.k2.type = hdfs
agent.sinks.k2.hdfs.path = /user/test/flumebackup/

# channel1
agent.channels.c1.type = memory
agent.channels.c1.capacity = 1000
agent.channels.c1.transactionCapacity = 100

# channel2
agent.channels.c2.type = file
agent.channels.c2.checkpointDir = /opt/apache-flume-1.7.0-bin/flumeCheckpoint
agent.channels.c2.capacity = 1000
agent.channels.c2.transactionCapacity = 100

# Bind the source and sink to the channel
agent.sources.s1.channels = c1 c2
agent.sinks.k1.channel = c1
agent.sinks.k2.channel = c2

先启动Flume

./bin/flume-ng agent  -n agent  -c conf/  -f conf/conf-file2

再启动往26001端口上发送数据的 Socket 客户端

./socket_gen

查看HDFS 和 Kafka 中的数据

# HDFS
$ hdfs dfs -ls /user/test/flumebackup

# Kafka
$ ./bin/kafka-console-consumer.sh --topic order --bootstrap-server master:9092

这里需要注意的是:

1. netcat source 的工作机制:

是启动一个socket服务端,监听一个端口,将端口上收到的数据,转成 event 写入 channel;

2. exec source 的工作机制:

是启动一个用户所指定的 linux shell 命令,采集这个linux shell命令的标准输出,作为收集到的数据,转为event写入channel; 在这里插入图片描述

3. spooldir source 的工作机制:

是监视一个指定的文件夹,如果文件夹下有没采集过的新文件,则将这些新文件中的数据采集,并转成event写入channel;

注意:spooling目录中的文件必须是不可变的,而且是不能重名的!否则,source会loudly fail!

4. taildir source的工作机制

是监视指定目录下的一批文件,只要某个文件中有新写入的行,则会被tail到。

它会记录每一个文件所tail到的位置,记录到一个指定的positionfile保存目录中,格式为json(如果需要的时候,可以人为修改,就可以让source从任意指定的位置开始读取数据)

它对采集完成的文件,不会做任何修改(比如重命名,删除…..)

taildir source会把读到的数据成功写入channel后,再更新记录偏移量。这种机制,能保证数据不会漏采(丢失),但是有可能会产生数据重复!

5. kafka source的工作机制

Kafka source的工作机制:就是用kafka consumer连接kafka,读取数据,然后转换成event,写入channel