基于查询的JDBC Source连接器Kafka

时间:2019-07-02 14:41:02

标签: jdbc apache-kafka apache-kafka-connect

我有一个传统数据库,该数据库的主键列为字符串(是的,我知道)。我想使用JDBC kafka源连接器

将Postgres数据库中的increment转储到kafka主题中

下面是我重现问题的尝试

create table test(
id varchar(20) primary key,
name varchar(10) 
);

INSERT INTO test(
    id, name)
VALUES ('1ab', 't'),
('2ab', 't'),
('3ab', 't')

我的配置

{"name" : "test_connector",
    "config" : {
        "connector.class": "io.confluent.connect.jdbc.JdbcSourceConnector",
        "connection.url": "jdbc:postgresql://12.34.5.6:5432/",
        "connection.user": "user",
        "connection.password": "password",
        "key.converter": "org.apache.kafka.connect.storage.StringConverter",
        "topic.prefix": "incre_",
        "mode": "incrementing",
        "value.converter": "io.confluent.connect.avro.AvroConverter",
        "query" :"SELECT cast(replace(id, 'ab','') as integer) as id , name from test ORDER BY id ASC",
        "incrementing.column.name":"id",
        "value.converter.schema.registry.url": "http://schema-registry_url.com",
        "key.converter.schema.registry.url": "http://schema-registry_url.com",
        "offset.flush.timeout.ms": 2000,

    }
}

发布配置后,进行HTTP curl时状态为RUNNING。我检查工人日志时也没有错误日志 当我尝试做控制台用户时,kafka主题中也没有数据 我还尝试了其他几种组合,例如添加"table.whitelist": "test"

我尝试的另一件事是关注这两个链接 https://rmoff.net/2018/05/21/kafka-connect-and-oracle-data-types/ https://www.confluent.io/blog/kafka-connect-deep-dive-jdbc-source-connector,但无济于事,甚至是像SELECT * from (SELECT id, name from test where ...)

这样的聪明技巧

2 个答案:

答案 0 :(得分:0)

恐怕您不能在varchar id模式下使用incrementing,因为它不是递增的列/类型。根据{{​​3}},

  

递增列:包含每一行唯一ID的单个列,保证较新的行具有更大的ID,即   AUTOINCREMENT列。请注意,此模式只能检测新行。   无法检测到对现有行的更新,因此此模式应仅   用于不可变数据。一个可能使用此模式的示例   是在数据仓库中流化事实表时,因为这些是   通常只能插入。

答案 1 :(得分:0)

所以几个小时后使用不同的配置。我回到官方document并意识到了

  

使用自定义查询而不是加载表,从而使您可以联接来自多个表的数据。只要查询不包括其自身的筛选,您仍可以将内置模式用于增量查询(在这种情况下,使用时间戳列)。请注意,这将您限制为每个连接器只有一个输出,并且由于没有表名,因此在这种情况下,主题“前缀”实际上是完整的主题名称。

所以关键是"topic.prefix": "incre_test"

按照之前的设置进行操作,正确的配置应为

{"name" : "test_connector",
    "config" : {
        "connector.class": "io.confluent.connect.jdbc.JdbcSourceConnector",
        "connection.url": "jdbc:postgresql://12.34.5.6:5432/",
        "connection.user": "user",
        "connection.password": "password",
        "key.converter": "org.apache.kafka.connect.storage.StringConverter",
        "topic.prefix": "incre_test",
        "mode": "incrementing",
        "value.converter": "io.confluent.connect.avro.AvroConverter",
        "query" :"SELECT cast(replace(id, 'ab','') as integer) as id , name from test ORDER BY id ASC",
        "incrementing.column.name":"id",
        "value.converter.schema.registry.url": "http://schema-registry_url.com",
        "key.converter.schema.registry.url": "http://schema-registry_url.com",
        "offset.flush.timeout.ms": 2000,

    }
}