[英]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.