【问题标题】:KSQL - Determining When a Table Is LoadedKSQL - 确定何时加载表
【发布时间】:2019-04-17 15:24:45
【问题描述】:

如何确定 KSQL 何时将我的数据从 Kafka 主题完全加载到我的表中?

目标:选取 2 个 Kafka 主题,加入它们并将结果写入一个新的 Kafka 主题。

示例:

我正在使用 Ksql 的 Rest API 发出以下命令。

CREATE TABLE MyTable (A1 VARCHAR, A2 VARCHAR) WITH (kafka_topic='topicA', key='A1', value_format='json');
CREATE STREAM MyStream (B1 varchar, B2 varchar) WITH (kafka_topic='topicB', value_format='json');
CREATE STREAM MyDestination WITH (Kafka_topic='topicC', PARTITIONS = 1, value_format='json') AS SELECT a.A1 as A1, a.A2 as A2, b.B1 as B1, b.B2 as B2 FROM  MyStream b left join MyTable a on a.A1 = b.B1;

问题:topicC只有topicB的数据,所有连接的值都是空的。

虽然我从 create table 命令收到了 SUCCESS 状态,但似乎数据还没有完全加载到表中。因此,第三条命令的结果只有流中的数据,不包括表中的数据。如果我在执行 join 命令之前人为延迟,那么生成的主题将正确地包含来自两个主题的数据。如何确定我的表何时加载,执行 join 命令是否安全?

【问题讨论】:

    标签: apache-kafka ksqldb


    【解决方案1】:

    这确实是一个很好的问题。此时,KSQL 无法仅在表完全加载后自动执行流表连接。这确实是一个有用的功能。这里讨论了一个更普遍和相关的问题:https://github.com/confluentinc/ksql/issues/1751

    【讨论】:

      【解决方案2】:

      KSQL(以及底层的 Kafka Streams)中的表具有时间维度,即随着时间的推移而演变。对于流表连接,每个流记录都与“正确”的表版本连接(即,表是按时间版本化的)。

      在即将发布的 CP 5.1 版本中,您可以“预加载”表,方法是确保表主题的所有记录时间戳都小于流主题的记录时间戳。这告诉 KSQL,它需要先处理表主题数据,但要相应地提前表时间戳版本,然后才能开始加入。

      更多详情,请查看:https://www.confluent.io/resources/streams-tables-two-sides-same-coin

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-24
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 2020-03-30
        • 2013-06-17
        • 1970-01-01
        • 2012-06-16
        相关资源
        最近更新 更多