[英]Flume: Routing events to the proper topic partition with Kafka channel
在Flume中,使用Kafka頻道時,是否有辦法影響事件發送到哪個分區?
對於Kafka接收器 , key
FlumeEvent標頭顯然是用來選擇一個分區的,但是我找不到與Kafka 通道有關的分區的任何文檔。
通道不必擔心分區。 因為通道是編寫它的通道,而通道正在消耗消息,所以無需對消息進行分區。 這是通過flume-kafka-channel創建消息以進行寫入的方式。
new KeyedMessage<String, byte[]>(topic.get(), null,
batchUUID, event)
但是,如果您的主題有多個分區,則缺少密鑰會導致將消息噴灑到可用分區中。
如果您想更多地控制消息在分區中的分布方式,那么您可能需要研究Kafka的Custom Partitioner概念,因此可以創建一個實現org.apache.kafka.clients.producer.Partitioner
接口的類,並設置partitioner。 class屬性,其值等於類的名稱,並確保您的自定義分區程序在類路徑中可用。 這樣,您可以在發布之前獲得對每條消息的控制權,並可以確定消息應轉到哪個分區。 您可以在水槽通道配置中設置屬性kafka.partitioner.class
以便將其拾取
Flume的Kafka通道不支持像KafkaSink那樣將Event標頭映射到現成的分區鍵。
但是,對其進行修改以使其不會太復雜。 由於我不確定是否可以共享代碼,因此我將給出指導:
serializedEvents
類型的byte[]
替換為還可以為每個事件保留一個String
鍵的東西(內部類,甚至是Kafka KeyedMessage<String, byte[]>
) KafkaTransaction.doPut(Event event)
,從標頭中檢索密鑰並將其與序列化消息一起存儲在serializedEvents
KafkaTransaction.doCommit()
,使用與序列化事件一起存儲的密鑰而不是batchUUID
。 注意 ,事務中的事件將不再保證由通道的使用者端的單個KafkaChannel實例處理,因此您必須檢查它是否與用例兼容(關於事務大小等)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.