我正在一个变更数据捕获项目中。我有一个mysql数据库。我使用debezium捕获所有更改并将其发送给kafka。然后,我从Spark读取了所有信息,然后使用jdbc将其发送到Apache Phoenix。
我正在使用带有重新路由选项的debezium,该选项将所有表的更改仅发送给一个kafka主题。通过这种配置,我确定我可以按顺序从spark阅读独特的kafka主题。
但是我的问题是:如果我使用不带重新路由选项的debezium,并且每个表的更改都在不同的kafka主题中,那么如何保证我以正确的顺序读取所有主题的事件?
我知道我可以使用Spark例如通过时间戳对其进行排序,但是如果说一个kafka主题由于出现问题而处于脱机状态10分钟,但另一个kafka主题仍在工作,那么我将在Spark中遇到一个排序问题。
我怎么面对这个问题?
答案 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