Flume使用案例

最近研究flume遇到一些问题,如下逐一进行解释:
使用场景如下
Flume+kafka
具体操作:
模拟实时数据生产-脚本方式

for data_line in `seq 1 1000`;do
	new_line=我是$data_line号,你好我是`expr $data_line + 10`的弟弟
	echo $new_line
	echo $new_line >> /home/hadoop/flume_data/data_$data_line.txt
	sleep 0.2
done

在刚开始的时候我同时写入6个文件
data_1-6.txt
但是启动flume后,执行脚本,flume报错

 java.lang.IllegalStateException: File name has been re-used with different files. Spooling assumptions violated for /home/hadoop/flume_data.txt.COMPLETED
            at org.apache.flume.client.avro.ReliableSpoolingFileEventReader.rollCurrentFile(ReliableSpoolingFileEventReader.java:378)
            at org.apache.flume.client.avro.ReliableSpoolingFileEventReader.retireCurrentFile(ReliableSpoolingFileEventReader.java:330)
            at org.apache.flume.client.avro.ReliableSpoolingFileEventReader.readEvents(ReliableSpoolingFileEventReader.java:259)
            at org.apache.flume.source.SpoolDirectorySource$SpoolDirectoryRunnable.run(SpoolDirectorySource.java:228)
            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
            at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
            at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
            at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
            at java.lang.Thread.run(Thread.java:745)

配置文件如下:

Flume使用案例_第1张图片

上述报错内容意思是,在flume监控目录下存在相同名称的内容。经过百度,询问朋友最后得出结论:
我是用的spoolDirSource,被监控目录是空的,我通过脚本写入flume_data这个目录下6个文件data1-6.txt文件,在脚本内第一个循环时,flume是没有问题的,但是Flume的spoolDir这个source只是会监控flume_data文件夹下通过IO流方式写入文件的内容的文件,从而判断该文件是否内容发生了变化或者新增一个文件的时候会检测到,当程序进入第二次循环的时候,又将数据写入data1-6.txt这些文件中,flume_data目录下文件名称没有被更改,Flume认定该目录下没有文件变化,所以是不会检测到的,因此报错。
所以我将代码改成,循环多少次写入多少个文件,这样Flume就会检测到flume_data下有新文件的产生,则不会报错

那接下来我是用exec的source实时监控一个文件内容。代码如下
for data_line in `seq 1 1000`;do
	new_line=我是$data_line号,你好我是`expr $data_line + 10`的弟弟
	echo $new_line
	echo $new_line >> /home/hadoop/flume_data.txt
	sleep 0.2
done

配置文件如下

#Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
 
#Describe/configue the source
a1.sources.r1.type = exec
a1.sources.r1.channels = c1
a1.sources.r1.command = tail -F /home/hadoop/flume_data.txt
#a1.sources.r1.fileHeader = true
a1.sources.r1.shell = /bin/bash -c

这样flume会实时检测文件内容 并且发送到kafka的consumer

接下来我来介绍kafka的配置
首先我们创建topic

/usr/local/kafka/bin/kafka-topics.sh --create --replication-factor 2 --partitions 2 --topic kafka_spooldir_test--zookeeper hadoop01:2181,hadoop02:2181,hadoop03:2181

flume的kafka sink的配置如下

#Describe the sink
#设置kafkaSink 注意大小写
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
#设置kafka的主题topic
a1.sinks.k1.topic = kafka_spooldir_test
#设置消费者字符集
a1.sinks.k1.custom.encoding = UTF-8
#设置kafka 的 broker地址以及端口号
a1.sinks.k1.kafka.bootstrap.servers = hadoop01:9092,hadoop02:9092,hadoop03:9092
a1.sinks.k1.kafka.brokerList = hadoop01:9092,hadoop02:9092,hadoop03:9092
#设置kafka序列化方式
a1.sinks.k1.serializer.class = kafka.serializer.StringEncoder
a1.sinks.k1.requiredAcks = 1
a1.sinks.k1.batchSize = 20

ok,这样我们flume+kafka就配置完成了
切记 切记 切记!!!!我被自己深深的坑了一把,配置文件中的kafka的topic和我启动kafka的consumer的topic不一致,导致flume采集到数据,但是consumer并没有消费到数据。

你可能感兴趣的:(学习笔记)