flume中的断点续传

网上能找到很多同一版本的代码示例,如下:

/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





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值