网上能找到很多同一版本的代码示例,如下:
/usr/local/bin/tail -n +$(tail -n1 /home/storm/tmp/n) --max-unchanged-stats=600 -F /home/storm/tmp/id.txt | awk 'ARNGIND==1{i=$0;next}{i++; if($0~/文件已截断/)i=0; print i >> "/home/storm/tmp/n";print $1"---"i}' /home/storm/tmp/n -
可能很多人都没有亲自试验过那段代码是否生效,就直接转发了。实际上那段代码有个命令写错了!对于linux的命令不是很了解的人来讲,无法察觉!!
那个错误的命令就是ARNGIND,实际上应该是ARGIND!!
好不容易一句一句的测试了上面的命令,找到了一个问题,修正后,你以为就好使了吗??
并没有!!
行号并不能写入n这个文件里!
将管道符号|前面的命令单独执行没有问题,将|后面的命令单独执行也没有问题,放到一起执行就有问题了!!
百度后发现tail -f结合awk使用的时候存在一个缓冲区,数据先写入缓冲区内,导致没有实时的写进n文件里。加上fflush()可以解决。
满心欢喜的加上后,再次执行上面的命令,悲剧了,还是没有将行号写到n里面,捣鼓了好久,发现要这么写fflush("")......
再次执行修正后的命令,行号写入了n里面,模拟断点,数据也从断点出开始读取的。
胜利在望了吧...
然后将上面的命令写到flume的配置文件里
a1.sources.r1.type = exec
a1.sources.r1.
command = tail -n +$(tail -n1 /home/hadoop/flume_read/m) -F /home/hadoop/student.txt | awk 'ARGIND==1{i=$0;next}{i++;if($0~/^tail/){i=0}
;print $0;print i
>> "/home/hadoop/flume_read/m";fflush("")}' /home/hadoop/flume_read/m -
启动zookeeper集群,启动kafka集群,创建topic,启动消费进程
然后执行利用上面的配置信息,启动flume开始采集数据,切到消费进程,看是否有数据输出,很遗憾的告诉你没有...
查看flume的启动信息,发现上面配置的command异常退出了....
command里面配置的命令,单独执行没有问题,放到flume里面就有问题了...
最后又经过一番百度查找,得知需要配置shell属性,让command中的命令可以使用shell下的一些语法和特性
完整的配置文件信息如下:
[hadoop@master conf]$ cat flume-2-kafka-continue-v2.conf
a1.sources = r1
a1.sinks = k1
a1.channels = c1
a1.sources.r1.type = exec
a1.sources.r1.
shell = /bin/bash -c
a1.sources.r1.
command = tail -n +$(tail -n1 /home/hadoop/flume_read/m) -F /home/hadoop/student.txt | awk 'ARGIND==1{i=$0;next}{i++;if($0~/^tail/){i=0}
;print $0;print i
>> "/home/hadoop/flume_read/m";fflush("")}' /home/hadoop/flume_read/m -
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.kafka.bootstrap.servers=master:9092,slave01:9092,slave02:9092
a1.sinks.k1.partition.key=0
a1.sinks.k1.partitioner.class=org.apache.flume.plugins.SinglePartition
a1.sinks.k1.serializer.class=kafka.serializer.StringEncoder
a1.sinks.k1.request.required.acks=0
a1.sinks.k1.max.message.size=1000000
a1.sinks.k1.producer.type=sync
a1.sinks.k1.custom.encoding=UTF-8
a1.sinks.k1.kafka.topic=kafka_continue
a1.channels.c1.type = memory
a1.channels.c1.keep-alive = 120
a1.channels.c1.capacity = 500000
a1.channels.c1.transactionCapacity = 600
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1