簡體   English   中英

Flume:使用Kafka頻道將事件路由到適當的主題分區

[英]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標頭映射到現成的分區鍵。

但是,對其進行修改以使其不會太復雜。 由於我不確定是否可以共享代碼,因此我將給出指導:

  1. 為將映射到分區鍵的標頭名稱添加配置鍵
  2. 在內部類KafkaTransaction中,將成員serializedEvents類型的byte[]替換為還可以為每個事件保留一個String鍵的東西(內部類,甚至是Kafka KeyedMessage<String, byte[]>
  3. 在方法KafkaTransaction.doPut(Event event) ,從標頭中檢索密鑰並將其與序列化消息一起存儲在serializedEvents
  4. 在方法KafkaTransaction.doCommit() ,使用與序列化事件一起存儲的密鑰而不是batchUUID

注意 ,事務中的事件將不再保證由通道的使用者端的單個KafkaChannel實例處理,因此您必須檢查它是否與用例兼容(關於事務大小等)。

暫無
暫無

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

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