如何保证由debezium生成,存储在kafka中并发送给spark的主题事件顺序?

时间:2019-05-02 21:48:25

标签: apache-spark apache-kafka cdc debezium

我正在一个变更数据捕获项目中。我有一个mysql数据库。我使用debezium捕获所有更改并将其发送给kafka。然后,我从Spark读取了所有信息,然后使用jdbc将其发送到Apache Phoenix。

我正在使用带有重新路由选项的debezium,该选项将所有表的更改仅发送给一个kafka主题。通过这种配置,我确定我可以按顺序从spark阅读独特的kafka主题。

但是我的问题是:如果我使用不带重新路由选项的debezium,并且每个表的更改都在不同的kafka主题中,那么如何保证我以正确的顺序读取所有主题的事件?

我知道我可以使用Spark例如通过时间戳对其进行排序,但是如果说一个kafka主题由于出现问题而处于脱机状态10分钟,但另一个kafka主题仍在工作,那么我将在Spark中遇到一个排序问题。

我怎么面对这个问题?

1 个答案:

答案 0 :(得分:0)

我在Debezium上使用此配置解决了这个问题

{
"name": "name-connector",
"config": {
    "plugin.name": "pgoutput",
    "connector.class": "io.debezium.connector.postgresql.PostgresConnector",
    "database.hostname": "0.0.0.0",
    "database.port": "5433",
    "database.user": "postgres",
    "database.password": "******",
    "database.dbname" : "database",
    "database.server.name": "database",
    "database.history.kafka.bootstrap.servers": "kafka:9092",
    "database.history.kafka.topic": "schema-changes.database",
    "decimal.handling.mode" : "string",
    "time.precision.mode" : "connect",
    "tombstones.on.delete" : false,
    "transforms":"routerTopic",
    "transforms.routerTopic.type":"io.debezium.transforms.ByLogicalTableRouter",
    "transforms.routerTopic.topic.regex":"database.public.(.*)",
    "transforms.routerTopic.topic.replacement":"database.public",
}
}

使用transforms.routerTopic.topic.regex和transforms.routerTopic.topic.replacement配置主题路由

https://debezium.io/documentation/reference/0.10/configuration/topic-routing.html