【问题标题】:Kafka Streams - How to better control partitioning of internally created state store topic?Kafka Streams - 如何更好地控制内部创建的状态存储主题的分区?
【发布时间】:2018-04-24 14:57:10
【问题描述】:

Kafka Streams 中的状态存储是在内部创建的。 状态存储按键分区,但不允许提供除以外的分区(据我所知)。

问题

如何控制一个state-store内部创建的topic的partition数量?状态存储主题如何推断默认使用的分区数量和分区,以及如何覆盖?

如果您想通过传入键值记录的键以外的键对状态存储进行分区并进行共同分区,该如何解决?在这种情况下,我想用比我的常规键更具体的东西进行分区。例如。我有一个

case class RegularKey(fieldA: String)

我想按

分区
case class SpecificKey(fieldA: String, fieldB: String)

对于我传入的源主题,我在分区数上使用了 HashPartitioner。

【问题讨论】:

    标签: apache-kafka partitioning apache-kafka-streams


    【解决方案1】:

    changelog主题分区的数量取决于输入主题分区的数量,你不能改变它,因为状态是基于这个数字共享的(即,一个分片分区)。

    如果你想通过某个属性对 changelog 主题进行分区,则必须将其设置为 key。在您的情况下,您必须将 SpecificKey 设置为消息键。不允许更改分区,因为它会“破坏”Kafka Streams 导致不正确的结果。

    【讨论】:

    • 对不起,我在这里有点困惑:“如果你想通过某个属性进行分区,你必须将它设置为key。” > 您的意思是,将其设置为 StateStore 的键,还是两者兼而有之? “在您的情况下,您必须将 SpecificKey 设置为消息密钥。” > “消息密钥”还是“状态存储记录密钥”?所以,如果我在输入主题中使用 RegularKey,在状态存储中使用 SpecificKey,状态存储更改日志是否仍会由 RegularKey 分区?那会容错吗?或者我必须在输入主题和状态存储中使用相同的键?
    • 您必须拥有相同的密钥。但是,您可以设置一个新密钥,并通过中间重新分区主题管道数据以获得您想要的内容。如果您使用 DSL,重新分区将在后台自动发生。如果使用 Processor API,则需要手动操作。
    • 好的,商店和主题中的键相同。但是,我认为能够提供 StateStorePartitioner 以提供与输入主题相同的键以具有不同的键会很好。 StateStore 上的 Partitionkey 和 datakey 不必相等,尽管 StateStore partitionkey 需要等于输入主题的 partitionkey。如果我使用 SpecificKey 作为 StateStore 记录键(我正在这样做),我想底层的变更日志主题将 1)具有相同数量的输入主题分区和 2)使用 HashPartitioner 会将 SpecificKey 键发送到任何导致非搭配。是这样吗?
    • 重读此文,我想我可能无法解释自己。对话的重点是对 StateStore 主题的“重新分区”,这是不希望的。我实际上想要做的是使用与原始主题相同的分区,即“不重新分区”StateStore 主题,但仍然可以使用“SpecificKey”而不是“RegularKey”作为 StateStore 中的键。 API 支持它,但如果我理解正确,它会以不同的方式重新分区数据“破坏”我的应用程序。这是正确的吗?
    • 事实上,Kafka 不会重新散列您的密钥以将您的新记录记录到更改日志主题。它重用整个任务的分区号。因此,如果您从带有分区 X 的某个主题中读取并使用转换器或处理器将(并因此获取)您的记录放入/从存储中,它将将此记录放入您任务的初始分区。并期望在同一分区的读取操作期间找到它 - 您的任务的分区。
    猜你喜欢
    • 2017-12-18
    • 2019-03-15
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 2023-03-23
    相关资源
    最近更新 更多