Kafka Connect JDBC连接器查询+初始轮询时具有大型数据集的增量模式扼流圈

时间:2019-03-29 17:11:37

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

我正在使用JDBC连接器将数据从MySQL移动到Kafka。我感兴趣的数据来自3个表的选择连接,因此我为连接器配置了mode:incrementingquery

{
    "name": "stats",
    "config": {
        "connector.class": "io.confluent.connect.jdbc.JdbcSourceConnector",
        "key.converter": "io.confluent.connect.avro.AvroConverter",
        "key.converter.schema.registry.url": "http://schema-registry.kafka-broker:8081",
        "value.converter": "io.confluent.connect.avro.AvroConverter",
        "value.converter.schema.registry.url": "http://schema-registry.kafka-broker:8081",
        "connection.url": "jdbc:mysql://DB_HOST:3306/SCHEMA?user=USER&password=PASSWORD&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false",
        "mode": "incrementing",
        "validate.non.null": "false",
        "topic.prefix": "t",
        "incrementing.column.name": "s.id",
        "transforms": "createKey,extractString",
        "transforms.createKey.type": "org.apache.kafka.connect.transforms.ValueToKey",
        "transforms.createKey.fields": "uuid",
        "transforms.extractString.type": "org.apache.kafka.connect.transforms.ExtractField$Key",
        "transforms.extractString.field": "uuid",
        "quote.sql.identifiers":"never",
        "query": "select s.id, concat(database(), '_', s.id) as uuid, c.email, s.type as type, s.created_at as log_date, a.type as a_type from stats s join concact c on c.id = s.recipient_id join address a on a.id = s.address_id",
        "errors.tolerance": "all",
        "errors.log.enable": "true",
        "errors.log.include.messages": "true",
        "batch.max.rows": "100",
        "poll.interval.ms": "60000"
    }
}

检查连接器状态时,我正在运行:

curl http://conncet:8083/connectors/stats/status

{
    "name": "stats",
    "connector": {
        "state": "RUNNING",
        "worker_id": "connect-3:38083"
    },
    "tasks": [
        {
            "id": 0,
            "state": "RUNNING",
            "worker_id": "connect-1:18083"
        }
    ],
    "type": "source"
}

但是一个小时后,我仍然看不到创建的主题。我已经在MySQL中检查了哪些查询正在使用show full processlist;运行,并且我看到了两个类似的查询:

select s.id, concat(database(), '_', s.id) as uuid, c.email, s.type as type, s.created_at as log_date, a.type as a_type from stats s join concact c on c.id = s.recipient_id join address a on a.id = s.address_id WHERE s.id > -1 ORDER BY s.id ASC

因此,基本上该查询与我在连接器配置中的query中提供的查询以及WHERE s.id > -1 ORDER BY s.id ASC相同,因为此联接中的查询产生的结果集为21密耳行,MySQL正在发送数据需很长时间。当我再次使用show full processlist;检查时,我现在看到这样的4个查询,然后是8个,然后是16个,依此类推。

问题是:

  1. 为什么在添加s.id > -1 ORDER BY s.id ASC时,Kafka connect试图一次获取 ALL 行。
  2. 是否可以将连接器配置为不执行此操作,而是获取较小的数量?
  3. "batch.max.rows": "100"仅在初始轮询后控制批次大小吗?

更新

issue有一个开放主题。我认为这个问题可以解决。

2 个答案:

答案 0 :(得分:1)

query.suffix已在5.5中添加。我用它添加了一个limit语句,并且效果很好,它只是将限制附加到查询的末尾。

请参阅issue

答案 1 :(得分:0)

带有incrementing mode并传递了query的JDBC Source Connector, 使用以下where子句执行该查询:WHERE incrementingColumnName > lastIncrementedValue ORDER BY incrementingColumnName ASC。 (如果您使用增量模式并进行查询,则无法在其中传递where子句)。

第一次轮询lastIncrementedValue为-1,因此它尝试查询所有记录。提取每个记录后,lastIncrementedValue增加,因此下一次查询将仅轮询新数据。 batch.max.rows指的是SourceTask::poll(...)将返回多少个记录到Kafka Connect框架。 这是将立即发送到Kafka的批处理的最大大小。

我认为,当您从单个表中获取数据时,它的工作速度更快,因为查询的执行速度更快(不太复杂)。 如果使用其他SQL工具执行这些查询,则会执行类似的操作。