Apache kafka 从博士后到卡夫卡,跟踪变化

Apache kafka 从博士后到卡夫卡,跟踪变化,apache-kafka,apache-kafka-connect,ksqldb,Apache Kafka,Apache Kafka Connect,Ksqldb,接下来是这个问题 主要任务是在KSQL端进行连接。下面的例子将说明这一点。事件消息到达卡夫卡主题。该消息的结构: [ { "name": "from_ts", "type": "bigint" }, { "name": "to_ts", "type": "bigint" }, { "name": "rulenode_id", "type": "int"

接下来是这个问题

主要任务是在KSQL端进行连接。下面的例子将说明这一点。事件消息到达卡夫卡主题。该消息的结构:

[
    {
        "name": "from_ts", 
        "type": "bigint"
    },
    {
        "name": "to_ts", 
        "type": "bigint"
    },
    {
        "name": "rulenode_id",
        "type": "int"
    }
]
还有一个Postgres表
rulenode

id | name | description 
来自这两个源的数据需要通过字段
rulenode\u id=rulenode.id
连接,以便获得单个记录,其中包含字段
“from\u ts”、“to\u ts”、“rulenode\u id”、“rulenode\u name”、“rulenode\u description”

我想通过KSQL实现这一点,但不是像现在这样的后端

现在,来自Postgres表的数据通过JdbcSourceConnector传输到Kafka。但有一个小问题——你们可以猜到Postgres表中的数据可能会改变。当然,这些更改也应该在KSQL流或表中

下面有人问我为什么是KTable而不是Kstream。那么,请访问并查看第一张GIF。当新数据到达时,表的记录正在更新。我认为这样的行为正是我所需要的(在这里,我有Postgres表
rulenode
的主键
id
,而不是名字Alice,Bob)。这就是我选择KTable的原因

JdbcSourceConnect的大容量模式复制所有表。正如您所知,所有行都会到达Kafka表,并返回到以前的Postgres表快照


根据建议,我使用配置创建了一个连接器:

{
  "name": "from-pg",
  "connector.class": "io.confluent.connect.jdbc.JdbcSourceConnector",
  "errors.log.enable": "true",
  "connection.url": "connection.url",
  "connection.user": "postgres",
  "connection.password": "*************",
  "table.whitelist": "rulenode",
  "mode": "bulk",
  "poll.interval.ms": "5000",
  "topic.prefix": "pg."
}
然后创建了一个流:

create stream rulenodes 
    with (kafka_topic='pg.rules_rulenode', value_format='avro', key='id');
现在尝试创建一个表:

create table rulenodes_unique 
    as select * from rulenodes;
但这并不适用于错误:

无效的结果类型。SELECT查询生成一个流。请使用 改为将流创建为SELECT语句

我了解到,在存储聚合信息时使用表。例如,要使用COUNT函数存储聚合:

create table rulenodes_unique 
    as select id, count(*) from rulenodes order by id;

您能告诉我如何处理该错误吗?

不清楚是哪条语句引发了该错误,但如果在表定义中出现错误,则会产生误导

您可以直接从主题创建表。不需要穿过小溪

如果您想使用流,就像文档所说的那样

使用
createtable AS SELECT
语句创建一个包含来自现有表或流的查询结果的表

您可能希望在语句中使用区分大小写的值

CREATE STREAM rulenodes WITH (
    KAFKA_TOPIC ='pg.rules_rulenode', 
    VALUE_FORMAT='AVRO', 
    KEY='id'
);


CREATE TABLE rulenodes_unique AS
    SELECT id, COUNT(*) FROM rulenodes 
    ORDER BY id;

您可以使用ksqlDB在卡夫卡主题的顶部创建一个
——这与您希望如何对数据建模有关。从您的问题可以清楚地看出,您需要将其建模为一个表(因为您希望加入到最新版本的密钥)。因此,您需要这样做:

创建表规则节点
使用(kafka_topic='pg.rules_rulenode',value_format='avro');
现在还有一件事要做,那就是确保主题中的数据键入正确。您不能指定
key='id'
并且它会自动发生-
key
参数只是一个“提示”。您必须确保卡夫卡主题中的消息在键中有
id
字段。有关详细信息,请参阅

您可以通过以下方式执行此操作:

或者,您可以在ksqlDB中执行此操作并更改密钥-因为我们希望处理每个事件,所以我们首先将其建模为流(!),然后在重新设置密钥的主题上声明表:

create stream rulenodes_source 
    with (kafka_topic='pg.rules_rulenode', value_format='avro');

CREATE STREAM RULENODES_REKEY AS SELECT * FROM rulenodes_source PARITION BY id;

CREATE TABLE rulenodes WITH (kafka_topic='RULENODES_REKEY', value_format='avro');

我会选择单一消息转换路线,因为它总体上更整洁、更简单

您可以编辑您的问题来解释为什么要创建一个表而不是从该选择中创建一个流吗?正如错误所说,没有聚合的流的输出实际上是一个流。嗨,Robin。完成。
create stream rulenodes_source 
    with (kafka_topic='pg.rules_rulenode', value_format='avro');

CREATE STREAM RULENODES_REKEY AS SELECT * FROM rulenodes_source PARITION BY id;

CREATE TABLE rulenodes WITH (kafka_topic='RULENODES_REKEY', value_format='avro');