本文已参与「新人创作礼」活动,一起开启掘金创作之路。
需求描述:
我们需要使用 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