Flume 配置kafkaSource  ->  kafkaSink 出现循环发送消息到kafkaSource topic的问题

Flume 配置kafkaSource  ->  kafkaSink 出现循环发送消息到kafkaSource topic的问题

 

1.具体描述:

如果在一个Flume Agent中同时使用Kafka Source和Kafka Sink来处理events,便会遇到Kafka Topic覆盖问题,具体表现为,Kafka Source可以正常从指定的Topic中读取数据,但在Kafka Sink中配置的目标Topic不起作用,数据仍然会被写入到Source中指定的Topic中。

 

 

例:在Agent中的Kafka Source配置Topic为:

kafkaSourceKafkaSink.sources.r21.kafka.topics = test305_DBUS_result

在Kafka Sink配置Topic为:

kafkaSourceKafkaSink.sinks.k21.kafka.topic = togg37_DBUS_result

你会发现,最后数据又被写入到sourceTopic中,而sinkTopic没有任何数据写入。

当消息写入sourceTopic中后, flume又会认为是有新消息进入了source端,所以继续传送消息出去,结果又写回了source端,一直不断写。

如果未发现这个问题,让flume一直运行下去,那么很可能消息越来越多,最后撑爆机器的磁盘。

 

 

2.排查过程:

去flume官网拜读了一下文档:kafkaSink的参数说明

 

重点在图中红圈中:

该参数代表kafka中sink端的topic。如果配置了此参数,则消息将发布到该主题。如果event标题包含“topic”字段,则事件将发布到该主题,并覆盖此处配置的主题。支持任意标头替换,例如。 %{header}被名为“ header”的事件标题的值替换。 (如果使用替换,建议将Kafka代理的“ auto.create.topics.enable”属性设置为true。)

       光靠这个地方不足以造成这次的问题。但是如果kafkasource那边就偏偏把topic字段给你传过来了,这边kafkaSink你设置的topic名称就真的就被覆盖成 kakfaSource的topic了。

kafkaSource参数说明:

 

主要看标出来的两个参数:

setTopicHeader设置为true时,将检索到的消息的topic存储到由topicHeader属性定义的标头中。

topicHeader: 如果将setTopicHeader属性设置为true,则定义标题的名称,该标题用于存储接收消息的主题的名称。如果与Kafka Sink topicHeader属性结合使用,则应格外小心,以免将消息循环发送回同一主题。

解释:文档已经说的很明白了,kafkaSource的setTopicHeader属性默认为true,会将Source端的kafkaTopic通过event Header传送出去,并覆盖掉kafkaSink端的topic,这就导致了不管你有没有设置kafkaSink端的topic,都会被覆盖掉。

 

解决办法就在kafkaSource的参数说明里面:

在flume的kafkaSource里面加入topicHeader这个属性,并将它的值设置为你的sink端topicName,这样传到kafkaSink端的event Header里面包含的就不再是你source端监控的topic了。就不会导致循环发送消息到source端的topic了。

 

 

 

3.解决办法:

在配置文件中加入一个属性:

kafkaSourceKafkaSink.sources.r21.topicHeader = $sinkTopic

 

 

配置文件全文:

kafkaSourceKafkaSink.sources = r21

kafkaSourceKafkaSink.sinks = k21

kafkaSourceKafkaSink.channels = c21

kafkaSourceKafkaSink.sources.r21.type = org.apache.flume.source.kafka.KafkaSource

kafkaSourceKafkaSink.sources.r21.batchSize = 5000

kafkaSourceKafkaSink.sources.r21.batchDurationMillis = 2000

kafkaSourceKafkaSink.sources.r21.kafka.bootstrap.servers = 10.10.10.206:9092,10.10.10.205:9092,10.10.10.207:9092

kafkaSourceKafkaSink.sources.r21.kafka.topics = test305_DBUS_result

kafkaSourceKafkaSink.sources.r21.channels = c21

kafkaSourceKafkaSink.sources.r21.topicHeader = togg37_DBUS_result

kafkaSourceKafkaSink.channels.c21.type = memory

kafkaSourceKafkaSink.channels.c21.capacity = 10000

kafkaSourceKafkaSink.channels.c21.transactionCapacity = 10000

kafkaSourceKafkaSink.channels.c21.byteCapacityBufferPercentage = 20

kafkaSourceKafkaSink.channels.c21.byteCapacity = 800000

kafkaSourceKafkaSink.sinks.k21.type = org.apache.flume.sink.kafka.KafkaSink

kafkaSourceKafkaSink.sinks.k21.kafka.topic = togg37_DBUS_result

kafkaSourceKafkaSink.sinks.k21.kafka.bootstrap.servers = 10.10.10.206:9092,10.10.10.205:9092,10.10.10.207:9092

kafkaSourceKafkaSink.sinks.k21.kafka.flumeBatchSize = 20

kafkaSourceKafkaSink.sinks.k21.kafka.producer.acks = 1

kafkaSourceKafkaSink.sinks.k21.kafka.producer.linger.ms = 1

kafkaSourceKafkaSink.sinks.k21.channel = c21

 

 

4.测试验证

往kafkaSource topic中写入消息

 

在kafkaSink topic中观察到消息传过来:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值