我有数百万条记录,每个记录都有唯一的标识符。
所有记录均按序列号分类,比如说有1万条记录属于1系列,另外有10k属于2系列,依此类推。
现在我想将所有series-1记录发布到partition-1,将所有series-2发布到partition-2,依此类推。
要实现此目的,我不想使用消息键,还有其他选择吗?
我是kafka的新手,如果问题有误或没有正确的信息,请纠正我吗?
答案 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");