簡體   English   中英

Flume + Kafka + HDFS:拆分消息

[英]Flume + Kafka + HDFS: Split messages

我有以下flume代理配置來讀取來自kafka源的消息並將它們寫回HDFS接收器

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

tier1.sources.source1.type = org.apache.flume.source.kafka.KafkaSource
tier1.sources.source1.zookeeperConnect = 192.168.0.100:2181
tier1.sources.source1.topic = test
tier1.sources.source1.groupId = flume
tier1.sources.source1.channels = channel1
tier1.sources.source1.interceptors = i1
tier1.sources.source1.interceptors.i1.type = timestamp
tier1.sources.source1.kafka.consumer.timeout.ms = 100

tier1.channels.channel1.type = org.apache.flume.channel.kafka.KafkaChannel
tier1.channels.channel1.brokerList = 192.168.0.100:9092

tier1.channels.channel1.topic = test
tier1.channels.channel1.zookeeperConnect = 192.168.0.100:2181/kafka
tier1.channels.channel1.parseAsFlumeEvent = false

tier1.sinks.sink1.channel = channel1
tier1.sinks.sink1.type = hdfs
tier1.sinks.sink1.hdfs.writeFormat = Text
tier1.sinks.sink1.hdfs.fileType = DataStream
tier1.sinks.sink1.hdfs.filePrefix = test-kafka
tier1.sinks.sink1.hdfs.fileSufix = .avro
tier1.sinks.sink1.hdfs.useLocalTimeStamp = true
tier1.sinks.sink1.hdfs.path = /tmp/kafka/%y-%m-%d
tier1.sinks.sink1.hdfs.rollCount=0
tier1.sinks.sink1.hdfs.rollSize=0

如果每個輪詢周期只有一個kafka消息到達,則kafka消息內容是正確序列化為文件的avro數據。

當兩個kafka消息到達同一批次時,它們被分組在同一個HDFS文件上,因為avro消息包含schema + data,結果文件包含schema + data + schema + data,導致它成為無效的.avro文件。

如何拆分avro事件以將不同的kafka消息拆分為將其中的每一個寫入不同的文件

謝謝

一種方法:假設您將源kafka傳入數據稱為“SourceTopic”。 您可以在此“SourceTopic”中注冊自定義接收器。

<FlumeNodeRole>.sinks.<your-sink>.type =net.my.package.CustomSink

在CustomSink中,您可以編寫一種方法來區分傳入的消息,將其拆分並重新發送到不同的“DestinationTopic”。 這個'DestinationTopic'現在可以作為文件序列化的新水槽來源。

請參閱下面的管道水槽鏈接: https//flume.apache.org/FlumeUserGuide.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM