我有一个带有N
分区的Kafka主题。记录键是一个cookie。记录以公式hash(key) % N
跨分区分布。
我想以并行方式处理记录表格分区。假设每个分区都分配了M
个工作线程来进行处理。附加要求是同一Cookie由单个工作线程处理(以保持事件顺序)。
我不知道用于对记录进行分区的hash
函数。如果我使用my_hash(key) % M
和my_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, ...)
答案 0 :(得分:0)
Kafka使用者需要在其自己的单独线程中运行。不可能(或建议)在多个使用者之间共享线程。因此,如果您有M
个线程,则意味着您有M
个使用者。现在,让我们满足您的要求:
我想与M个线程并行阅读主题,以便所有 具有相同Cookie的记录由单个线程读取。
此陈述本身对我来说有点模糊。因为默认的哈希函数可确保相同的cookie始终位于同一分区,所以无论如何您的要求都会得到满足。
我希望每个分区有2个线程(N = M)。
您是说要每个分区由两个使用者线程处理吗?除非他们属于不同的消费群体,否则这是不可能的,我认为这不是您想要的。
现在,您是否要基于某个功能(例如时间戳或其他功能)将特定的密钥(cookie)重定向到不同的分区,并且如果您知道,它可以转到集合中的任何分区( p1,p2,... pn),那么您想让一个使用者使用所有这n个分区吗?那么,如果所有出现的相同cookie都位于同一分区,那么与这种情况相比,您将获得什么呢?因为最后是使用它的相同的Kafka使用者线程。并且,沿着同一条思路,我认为如果您的Kafka使用者线程将处理作业委托给线程池(您可能正在谈论),那么使用相同分区中的相同密钥还是一组不同的密钥也不重要分区,线程池的大小将决定要实现的并行度。