在Flume中,当使用Kafka频道时,有没有办法影响发送事件的分区?
使用Kafka sink ,key
FlumeEvent标头显然用于选择分区,但我找不到任何有关Kafka 频道分区的文档。
答案 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那样将事件标题映射到开箱即用的分区键。
但是,修改它并不是太复杂。由于我不确定我可以分享代码,我只是给出指示:
byte[]
的类型中的serializedEvents
替换为每个事件(内部类,甚至内部类)都可以包含String
键的内容一个卡夫卡KeyedMessage<String, byte[]>
)KafkaTransaction.doPut(Event event)
中的serializedEvents
与序列化消息一起存储KafkaTransaction.doCommit()
中,使用存储在序列化事件中的密钥而不是batchUUID
。注意,交易中的事件将不再保证由渠道的消费者端的单个KafkaChannel实例处理,因此您必须检查它是否与您的用例(关于交易规模等)。