如何将分区拆分为子分区?独特的哈希函数生成器?

时间:2018-11-28 07:55:20

标签: hash apache-kafka partitioning kafka-consumer-api

我有一个带有N分区的Kafka主题。记录键是一个cookie。记录以公式hash(key) % N跨分区分布。

我想以并行方式处理记录表格分区。假设每个分区都分配了M个工作线程来进行处理。附加要求是同一Cookie由单个工作线程处理(以保持事件顺序)。

我不知道用于对记录进行分区的hash函数。如果我使用my_hash(key) % Mmy_hash == hash(特别是在gcd(N, M) > 1时),则计算N = M可能无法正常工作。

由于我对所有记录都知道partitionId,所以我最初的想法是计算my_hash(key + "." + partitionId) % M,但是我想知道这种存储是否足够好hash(key) == h1(key + "." + (h2(key) % N)) == my_hash(key + "." + partitionId)很有可能。

我认为我应该生成一个唯一的哈希函数。你知道这样的发电机吗?

编辑

示例:

Partition1: (cookie1, ...), (cookie1, ...), (cookie3, ...)
Partition2: (cookie2, ...), (cookie2, ...), (cookie4, ...)

我希望有2个线程(N = M)处理每个分区。我不知道hash函数,因此可能会选择my_hash == hash

然后我会得到:

Partition1_Subpartition1: (cookie1, ...), (cookie1, ...), (cookie3, ...)
Partition1_Subpartition2: <always_empty>
Partition2_Subpartition1: <always_empty>
Partition2_Subpartition2: (cookie2, ...), (cookie2, ...), (cookie4, ...)

可能会更好地进行拆分,例如:

Partition1_Subpartition1: (cookie3, ...)
Partition1_Subpartition2: (cookie1, ...), (cookie1, ...)
Partition2_Subpartition1: (cookie4, ...)
Partition2_Subpartition2: (cookie2, ...), (cookie2, ...)

1 个答案:

答案 0 :(得分:0)

Kafka使用者需要在其自己的单独线程中运行。不可能(或建议)在多个使用者之间共享线程。因此,如果您有M个线程,则意味着您有M个使用者。现在,让我们满足您的要求:

  

我想与M个线程并行阅读主题,以便所有   具有相同Cookie的记录由单个线程读取。

此陈述本身对我来说有点模糊。因为默认的哈希函数可确保相同的cookie始终位于同一分区,所以无论如何您的要求都会得到满足。

  

我希望每个分区有2个线程(N = M)。

您是说要每个分区由两个使用者线程处理吗?除非他们属于不同的消费群体,否则这是不可能的,我认为这不是您想要的。

现在,您是否要基于某个功能(例如时间戳或其他功能)将特定的密钥(cookie)重定向到不同的分区,并且如果您知道,它可以转到集合中的任何分区( p1,p2,... pn),那么您想让一个使用者使用所有这n个分区吗?那么,如果所有出现的相同cookie都位于同一分区,那么与这种情况相比,您将获得什么呢?因为最后是使用它的相同的Kafka使用者线程。并且,沿着同一条思路,我认为如果您的Kafka使用者线程将处理作业委托给线程池(您可能正在谈论),那么使用相同分区中的相同密钥还是一组不同的密钥也不重要分区,线程池的大小将决定要实现的并行度。