繁体   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