为kafka

时间:2016-10-24 21:22:10

标签: java apache-kafka

我需要在我们拥有的密钥上编写自己的分区程序。看起来我们可以编写自己的自定义分区程序。

从卡夫卡主要网站上他们说

  

生产者将数据发布到他们选择的主题。制片人是   负责选择分配给哪个分区的记录   在主题内。这可以简单地以循环方式完成   平衡负载或它可以根据一些语义分区来完成   功能(比如基于记录中的某些键)。更多关于使用   在一秒钟内分区!

在我的情况下,给定一个主题,我们将10 partitions,因此我们希望使用此公式来决定数据应该进入哪个分区。

partition = client_id % MOD 10

这里client_id将成为关键,它始终是数值,总是长数据类型。如何为kafka生成器编写我们自己的自定义分区器,它可以告诉我应该为client_id使用哪个分区。

我看到我们必须实现Partitioner类并在partition方法中进行一些更改但我不确定如何使用keyBytes变量来找出分区以上公式为基础。

@Override
public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes,
  Cluster cluster) {
    // TODO Auto-generated method stub
    return 0;
}

我正在运行Kafka 0.10.0.0版本。

2 个答案:

答案 0 :(得分:1)

keyBytes是要分区的序列化密钥。您可以直接使用' key'(使用对象类型)来执行分区。

答案 1 :(得分:0)

如果您指定了密钥(即它不是空的)而不是分区程序,那么Kafka将完全按照您的意图执行。

以下是本书摘录"卡夫卡:权威指南"由O' Reilly Media撰写:

  

如果存在密钥并使用默认分区程序,Kafka将对密钥进行哈希处理(使用自己的哈希算法,因此在升级Java时哈希值不会更改),并使用结果将邮件映射到特定分区