Flume TAILDIR源到Kafka接收器-静态拦截器问题

时间:2019-02-13 13:44:40

标签: apache-kafka interceptor flume

我要尝试的情况如下:

1- Flume TAILDIR从日志文件中读取源并将静态拦截器附加到消息的开头。拦截器由主机名和主机IP组成,原因是我收到的每条日志消息都需要它。

2- Flume Kafka Producer Sink,它从文件中获取这些消息并将其放入Kafka主题中。

Flume配置如下:

tier1.sources=source1
tier1.channels=channel1
tier1.sinks =sink1

tier1.sources.source1.interceptors=i1


tier1.sources.source1.interceptors.i1.type=static
tier1.sources.source1.interceptors.i1.key=HostData
tier1.sources.source1.interceptors.i1.value=###HostName###000.00.0.000###


tier1.sources.source1.type=TAILDIR
tier1.sources.source1.positionFile=/usr/software/flumData/flumeStressAndKafkaFailureTestPos.json
tier1.sources.source1.filegroups=f1
tier1.sources.source1.filegroups.f1=/usr/software/flumData/flumeStressAndKafkaFailureTest.txt
tier1.sources.source1.channels=channel1

tier1.channels.channel1.type=file
tier1.channels.channel1.checkpointDir = /usr/software/flumData/checkpoint
tier1.channels.channel1.dataDirs = /usr/software/flumData/data



tier1.sinks.sink1.channel=channel1
tier1.sinks.sink1.type=org.apache.flume.sink.kafka.KafkaSink
tier1.sinks.sink1.kafka.bootstrap.servers=<Removed For Confidentiality >
tier1.sinks.sink1.kafka.topic=FlumeTokafkaTest
tier1.sinks.sink1.kafka.flumeBatchSize=20
tier1.sinks.sink1.kafka.producer.acks=0
tier1.sinks.sink1.useFlumeEventFormat=true
tier1.sinks.sink1.kafka.producer.linger.ms=1
tier1.sinks.sink1.kafka.producer.client.id=HOSTNAME
tier1.sinks.sink1.kafka.producer.compression.type = snappy

所以现在我正在测试,我运行了一个Console Kafka Consumer,开始写源文件,并且确实收到了带有标题的消息。

示例:

我在源文件中写入“ test”,然后按Enter,然后保存文件

Flume检测到文件更改,然后将新行发送给Kafka生产者。

我的消费者收到以下一行:

###HostName###000.00.0.000###test

现在的问题是,有时拦截器无法按预期工作。就像Flume发送2条消息,其中一条包含拦截器,另一条包含消息内容。

示例:

我在源文件中写上“ hi you”,然后按Enter,然后保存文件

Flume检测到文件更改,然后将新行发送给Kafka生产者。

我的消费者得到以下2行:

###HostName###000.00.0.000###
hi you

终端将滚动到新的消息内容。

这种情况总是在我在文本文件中键入“ hi you”时发生的,并且由于我是从日志文件中读取的,所以这种情况发生时是无法预测的。

非常感谢您的帮助和支持^^

谢谢

1 个答案:

答案 0 :(得分:0)

所以问题出在卡夫卡消费者公司。它接收到来自水槽的完整消息

Interceptor + some garbage characters + message

,如果其中一个垃圾字符是\ n(在Linux系统中为LF),则它将假定其2条消息,而不是1条消息。

我在Streamsets中使用Kafka Consumer元素,因此更改消息定界符很简单。我成功了,它现在可以正常工作了。

如果您要以字符串形式处理完整消息,并想在其上应用正则表达式或将其写入文件,则最好用空字符串替换\ r和\ n。

完整的演练说明可在此处找到:

https://community.cloudera.com/t5/Data-Ingestion-Integration/Flume-TAILDIR-Source-to-Kafka-Sink-Static-Interceptor-Issue/m-p/86388#M3508