项目场景:
flume sink端是kafka
用flume做采集,结果数据重复了,有的数据甚至重复了上万次
排查处理
1.查看flume日志
[root@flume-agent ~]cd /var/log/flume-ng
[root@flume-agent flume-ng]tail -40f flume-agent.log
发现以下大量的异常日志:
Caused by: org.apache.flume.ChannelFullException: Space for commit to queue couldn't be acquired. Sinks are likely not keeping up with sources, or the buffer size is too tight
2.报这个错的原因:就是source在拿到数据,往channel里面写的时候,没地方了,中间是个queue,比作池子,流入太快,流出慢,然后,慢慢的,池子就满了,再流就溢出了,这样就引发了flume的事务机制,重试反复发数据。根据报错调整配置:
#a1.channels.c1.capacity=1000
a1.channels.c1.capacity=1000000
3.做以上调整后,发现还是会有一些重复,继续查看日志,仍然有异常:
Caused by: java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.RecordTooLargeException: The message is 1088783 bytes when serialized which is larger than the maximum request size you have configured with the max.request.size configuration.
4.调整max.request.size
#kafka消息生产的大小限制
a1.sinks.k1.kafka.producer.max.request.size=51200000
5.客户那边反馈还是会有重复,没办法了直接上才艺了。追加flume重试次数配置调整和kafka生产者幂等性
#kafka生产消息重试次数设置
a1.sinks.k1.kafka.producer.retries=3
a1.sinks.k1.kafka.producer.retry.backoff.ms=3000
#kafak生产者加幂等性,此时acks必须为all
a1.sinks.k1.kafka.producer.enable.idempotence=true
a1.sinks.k1.kafka.producer.acks = all
到这问题基本就解决了,接下来的更深层次的重复,就不写了。。
总结:
flume重复问题可以从flume日志是否异常,kafka生产者幂等性,flume source,以及最终的etl业务清洗等各方面入手
原创文章转载请注明出处