Flume:使用Kafka频道将事件路由到正确的主题分区

时间:2016-02-02 15:10:34

标签: apache-kafka flume flume-ng

在Flume中,当使用Kafka频道时,有没有办法影响发送事件的分区?

使用Kafka sink key FlumeEvent标头显然用于选择分区,但我找不到任何有关Kafka 频道分区的文档。

2 个答案:

答案 0 :(得分:1)

频道不必担心分区。因为通道是写入它的通道而通道正在消耗消息,所以不需要对消息进行分区。这就是flume-kafka-channel为写作创建消息的方式。

new KeyedMessage<String, byte[]>(topic.get(), null,
              batchUUID, event)

但是如果您的主题有多个分区,那么缺少密钥会导致消息被喷射到可用分区中。

如果您想要更好地控制消息在分区中的分布方式,那么您可能需要查看Kafka的自定义分区程序概念,这样您就可以创建一个实现org.apache.kafka.clients.producer.Partitioner接口的类,并设置分区程序.class属性,其值等于类的名称,并确保您的自定义分区程序在类路径中可用。这样,您可以在发布之前控制每条消息,并且您可以决定消息应该转到哪个分区。您可以在水槽通道配置中设置属性kafka.partitioner.class,以便将其拾取

答案 1 :(得分:0)

Flume的Kafka频道不支持像KafkaSink那样将事件标题映射到开箱即用的分区键。

但是,修改它并不是太复杂。由于我不确定我可以分享代码,我只是给出指示:

  1. 为将映射到分区键的标题名称添加配置密钥
  2. 在内部类KafkaTransaction中,用成员byte[]的类型中的serializedEvents替换为每个事件(内部类,甚至内部类)都可以包含String键的内容一个卡夫卡KeyedMessage<String, byte[]>
  3. 方法KafkaTransaction.doPut(Event event)中的
  4. ,从标题中检索密钥并将serializedEvents与序列化消息一起存储
  5. 在方法KafkaTransaction.doCommit()中,使用存储在序列化事件中的密钥而不是batchUUID
  6. 注意,交易中的事件将不再保证由渠道的消费者端的单个KafkaChannel实例处理,因此您必须检查它是否与您的用例(关于交易规模等)。