首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Kafka进行数据建模?主题和分区

使用Kafka进行数据建模?主题和分区
EN

Stack Overflow用户
提问于 2013-06-20 12:55:55
回答 4查看 55K关注 0票数 179

在使用新服务(例如非RDBMS数据存储或消息队列)时,我首先考虑的事情之一是:“我应该如何构造我的数据?”

我已经阅读并观看了一些介绍性材料。特别是,以Kafka: a Distributed Messaging System for Log Processing为例,它写道:

  • “主题是用于存储消息的容器,最小并行单位是主题的分区。这意味着...属于主题的特定分区的所有消息都将由使用者组中的使用者使用。”

了解了这一点,什么是一个很好的例子来说明如何使用主题和分区?什么时候应该成为一个主题?什么时候应该是分区?

例如,假设我的(Clojure)数据如下所示:

{:user-id 101 :viewed "/page1.html" :at #inst "2013-04-12T23:20:50.22Z"}
{:user-id 102 :viewed "/page2.html" :at #inst "2013-04-12T23:20:55.50Z"}

主题应该基于user-idviewedat?那么分区呢?

我该如何决定?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-06-20 21:57:03

在为Kafka构建数据结构时,这真的取决于数据的使用方式。

在我看来,主题是一组相似类型的消息,将被相同类型的消费者消费,所以在上面的例子中,我只有一个主题,如果你决定通过Kafka推送一些其他类型的数据,你可以稍后添加一个新的主题。

主题在ZooKeeper中注册,这意味着如果尝试添加太多主题,您可能会遇到问题,例如,如果您有一百万用户,并决定为每个用户创建一个主题。

另一方面,分区是并行化消息消耗的一种方式。 broker集群中的分区总数需要至少与消费者组中的消费者数量相同,才能理解分区功能。消费者组中的消费者会根据分区将处理主题的负担分摊给自己,从而使一个消费者只关注被分配到的分区本身中的消息。

分区可以使用生产者端的分区键显式设置,如果没有提供,将为每条消息选择一个随机分区。

票数 146
EN

Stack Overflow用户

发布于 2015-02-25 01:11:39

一旦您知道如何对事件流进行分区,主题名称就很容易了,所以让我们先回答这个问题。

@Ludd是正确的-您选择的分区结构在很大程度上取决于您希望如何处理事件流。理想情况下,您需要一个分区键,这意味着您的事件处理是partition-local.

例如:

  1. 如果你关心用户在站点上的平均时间,那么你应该按:user-id分区。这样,与单个用户的站点活动相关的所有事件都将在同一分区中可用。这意味着像Apache Samza这样的流处理引擎可以通过查看单个分区中的事件来计算给定用户的平均现场时间。这避免了必须执行任何类型的昂贵的partition-global处理
  2. 如果你关心你的网站上最受欢迎的页面,你应该按:viewed页面分区。同样,通过查看单个分区

中的事件,Samza将能够对给定页面的视图进行计数

通常,我们试图避免依赖全局状态(例如将计数保存在DynamoDB或Cassandra等远程数据库中),而是能够使用分区本地状态工作。这是因为local state is a fundamental primitive in stream processing

如果您需要上述两种用例,那么Kafka的常见模式是首先使用:user-id进行分区,然后使用:viewed进行re-partition,为下一阶段的处理做好准备。

在主题名称上-这里一个明显的名称是eventsuser-events。更具体地说,你可以使用events-by-user-id和/或events-by-viewed

票数 65
EN

Stack Overflow用户

发布于 2018-03-05 16:07:21

这与问题并不完全相关,但是如果你已经决定了基于主题的记录的逻辑分离,并且想要优化Kafka中的主题/分区计数,this博客帖子可能会派上用场。

主要内容概括如下:

  • 一般来说,Kafka集群中的分区越多,吞吐量就越高。让单个生产分区上可实现的最大吞吐量为p,消耗为c。假设您的目标吞吐量是t。然后,您至少需要有max(t/pt/c)分区。

  • 目前,在Kafka中,每个代理打开每个日志段的索引和数据文件的文件句柄。因此,分区越多,在底层操作系统中配置打开文件句柄限制的要求就越高。例如,在我们的生产系统中,我们曾经看到一个错误too many files are open,而我们有大约3600个主题分区。

  • 当代理不干净地关闭时(例如kill -9),观察到的不可用可能与分区数成正比。

  • Kafka中的端到端延迟由生产者发布消息到消费者读取消息的时间来定义。根据经验,如果您关心延迟,最好将每个代理的分区数量限制为100 x b x r,其中b是Kafka集群中的代理数量,r是复制因子。
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17205561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档