有什么方法可以在不使用Message键的情况下将消息发布到kafka中的特定分区?

时间:2019-11-21 07:15:06

标签: apache-kafka

我有数百万条记录,每个记录都有唯一的标识符。

所有记录均按序列号分类,比如说有1万条记录属于1系列,另外有10k属于2系列,依此类推。

现在我想将所有series-1记录发布到partition-1,将所有series-2发布到partition-2,依此类推。

要实现此目的,我不想使用消息键,还有其他选择吗?

我是kafka的新手,如果问题有误或没有正确的信息,请纠正我吗?

2 个答案:

答案 0 :(得分:1)

您可以使用以下方法在特定分区上发布消息

简单的卡夫卡制作人

N x 3 x 3

在分区上发布消息的基本示例

np.cov

自定义分区程序

您还可以将自定义分区用于生产者或流分区

https://kafka.apache.org/documentation.html

自定义流分区程序(如果您使用的是Kafka Stream)

如果您正在使用Kafka Stream。它还提供了在Kafka Stream周围启用自定义分区程序的方法 https://kafka.apache.org/23/javadoc/org/apache/kafka/streams/processor/StreamPartitioner.html

答案 1 :(得分:0)

最好为生产者应用程序创建一个Custom Partitioner类。

对于通过Producer应用程序发布的每条记录,将使用消息key&value调用给定的自定义分区程序的partition()方法。在那里,您可以编写逻辑来解析该字段,以确定应该将消息写入的分区号。

  • 创建类似于下面的自定义分区程序类,

    public class CustomPartitioner extends DefaultPartitioner {
      @Override
      public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
    
        Integer partitionNumber = null;
    
        if (valueBytes != null) {
            String valueStr = new String(valueBytes);
    
            /* code to extract the partition number from value*/
            /*assign partitionNumber decided based on the value*/
        }
        return partitionNumber;
      }
    }
    
  • 在您的Producer类中分配分区程序并开始发布消息

    props.put("partitioner.class", "com.example.CustomPartitioner");