【flink】 flink 读取debezium-json数据获取数据操作类型op/rowkind方法

flink 读取debezium-json数据获取数据操作类型op/rowkind方法。
op类型有c(create),u(update),d(delete)
参考官网案例:此处的"op": "u",就是操作类型。

{
  "before": {
    "id": 111,
    "name": "scooter",
    "description": "Big 2-wheel scooter",
    "weight": 5.18
  },
  "after": {
    "id": 111,
    "name": "scooter",
    "description": "Big 2-wheel scooter",
    "weight": 5.15
  },
  "source": {...},
  "op": "u",
  "ts_ms": 1589362330904,
  "transaction": null
}

思路:添加自定义metareader
具体修改方法:去github flink 下载flink源码,选择tags,后按照自己需要的版本下载。
至idea中。修改org.apache.flink.formats.json.debezium.DebeziumJsonDecodingFormat

enum ReadableMetadata枚举类中添加枚举对象:
注意:operation.type可以按需更改,opudf也能按需更改,但不能是op,否则原有的冲突。
添加如下代码:

        OPERATION_TYPE(
                "operation.type",
                DataTypes.STRING().nullable(),
                true,
                DataTypes.FIELD("opudf", DataTypes.STRING()),
                new MetadataConverter() {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public Object convert(GenericRowData row, int pos) {
                        return row.getString(2);
                    }
                })

编译项目:

# install
mvn clean package -DskipTests "-Dmaven.test.skip=true" "-Pfast" -pl flink-formats/flink-json
# maven install 到本地
mvn install:install-file "-DgroupId=org.apache.flink" "-DartifactId=flink-json-udf" "-Dversion=1.13.6" -Dpackaging=jar "-Dfile=D:\projects\flink-release-1.13.6\flink-formats\flink-json\target\flink-json-1.13.6.jar"

# gradle 不能使用 implement(files("libs/flink-json-1.13.6.jar")) 的方式。需要直接加载到仓库。或者user/.m2目录下的临时仓库。
# 如下路径不能直接复制,可供参考,自己找下。
copy D:\projects\flink-release-1.13.6\flink-formats\flink-json\target\flink-json-1.13.6.jar D:\env\Gradle_Repository\caches\modules-2\files-2.1\org.apache.flink\flink-json\1.13.6\cb4daaf018e2
10faa54e76488cbb11e179502728


使用方法:
添加列定义:
opt_type STRING METADATA FROM 'value.operation.type' VIRTUAL,

create table test.some_debezium
(
    event_time      TIMESTAMP(3) METADATA FROM 'value.source.timestamp' VIRTUAL,
    origin_database STRING METADATA FROM 'value.source.database' VIRTUAL,
    origin_table    STRING METADATA FROM 'value.source.table' VIRTUAL,
    opt_type        STRING METADATA FROM 'value.operation.type' VIRTUAL,
    id            BIGINT,
    name          STRING,

) WITH(
    'connector'='kafka',
    'topic'='your_topic',
    'properties.bootstrap.servers'='host1:6667,host2:6667,host3:6667',
    'properties.group.id'='your_group_id',
    'properties.security.protocol'='SASL_PLAINTEXT',
    'properties.sasl.kerberos.service.name'='kafka',
    'format'='debezium-json',
    'debezium-json.timestamp-format.standard'='ISO-8601',
    'debezium-json.schema-include'='true',
    'debezium-json.ignore-parse-errors'='true'
);
这段代码是 **Flink SQL** 中定义的一个 **Kafka 连接器表(Kafka Sink Table)**,用于将数据写入 Kafka 主题。以下是逐部分解析和注释: --- ### **1. 表结构定义** ```sql CREATE TABLE kafka_sink ( id INT, -- 整数类型的字段,表示唯一标识 name STRING, -- 字符串类型的字段,表示名称 create_time TIMESTAMP(3), -- 时间戳字段,精度为毫秒(3位小数) PRIMARY KEY (id) NOT ENFORCED -- 声明主键为id,但Flink不强制检查唯一性(NOT ENFORCED) ) ``` **注释**: - 定义了一个逻辑表 `kafka_sink`,包含 3 个字段:`id`、`name`、`create_time`。 - `PRIMARY KEY (id) NOT ENFORCED`: - 声明 `id` 是主键,但 Flink **不会验证唯一性**(Kafka 本身无主键约束)。 - 通常用于下游系统(如数据库 Sink)识别更新/删除操作(需配合 CDC 格式)。 --- ### **2. Kafka 连接器配置** ```sql WITH ( 'connector' = 'kafka', -- 使用 Kafka 连接器 'topic' = 'cdc-events', -- 目标 Kafka 主题名称 'properties.bootstrap.servers' = 'kafka-broker:9092', -- Kafka 集群地址 'properties.group.id' = 'flink-cdc-group', -- 消费者组ID(仅当表用作Source时生效) 'format' = 'debezium-json', -- 数据格式为 Debezium JSON(CDC变更事件格式) 'scan.startup.mode' = 'earliest-offset' -- 从最早偏移量开始消费(仅当表用作Source时生效) ) ``` **注释**: - **关键配置项**: - `connector`: 指定连接器类型为 Kafka。 - `topic`: 数据写入的 Kafka 主题(这里是 `cdc-events`)。 - `properties.bootstrap.servers`: Kafka 集群地址(`kafka-broker:9092` 是示例,需替换为实际地址)。 - `format`: 使用 `debezium-json` 格式,表示数据是 **Debezium 捕获的 CDC 事件**(包含 `before`/`after` 变更数据操作类型 `op` 等字段)。 - `scan.startup.mode`: 虽然此处是 Sink 表,但该参数实际仅对 **Source 表** 生效(可能是配置冗余或笔误)。 - **潜在问题**: - 如果此表仅用于 **写入数据到 Kafka**(即 Sink),`group.id` 和 `scan.startup.mode` 是无效的(Source 表才需要这些配置)。 - 若需同时支持 **读写 Kafka**,需拆分为两个表(一个 Source 表 + 一个 Sink 表)。 --- ### **3. 实际用途** #### **(1) 作为 Sink 表(写入 Kafka)** ```sql -- 将其他表的数据写入 Kafka INSERT INTO kafka_sink SELECT id, name, create_time FROM source_table; ``` **输出数据示例**(Debezium JSON 格式): ```json { "before": null, "after": {"id": 1, "name": "Alice", "create_time": "2023-01-01T12:00:00"}, "op": "c", -- 操作类型:c=创建, u=更新, d=删除 "ts_ms": 1672531200000 } ``` #### **(2) 作为 Source 表(读取 Kafka)** 如果此表用于读取 Kafka 数据(需修正配置): ```sql CREATE TABLE kafka_source ( -- 字段需与 Debezium JSON 结构匹配 id INT, name STRING, create_time TIMESTAMP(3), -- 额外元数据字段 op STRING, -- 操作类型 ts_ms BIGINT -- 事件时间戳 ) WITH ( 'connector' = 'kafka', 'topic' = 'cdc-events', 'properties.bootstrap.servers' = 'kafka-broker:9092', 'format' = 'debezium-json', 'scan.startup.mode' = 'earliest-offset' ); ``` --- ### **4. 常见问题与修正** #### **(1) 配置冗余** - **问题**:`group.id` 和 `scan.startup.mode` 在 Sink 表中无效。 - **修正**:若仅作为 Sink,删除这两行: ```sql WITH ( 'connector' = 'kafka', 'topic' = 'cdc-events', 'properties.bootstrap.servers' = 'kafka-broker:9092', 'format' = 'debezium-json' -- 移除无关配置 ) ``` #### **(2) 主键声明** - `PRIMARY KEY (id) NOT ENFORCED` 对 Kafka 无实际作用,但可用于: - 提示下游系统(如 JDBC Sink)处理更新/删除操作- 如果 Kafka 数据无需主键逻辑,可省略此声明。 --- ### **5. 完整示例(CDC 数据写入 Kafka)** ```sql -- 定义源表(如MySQL CDC) CREATE TABLE mysql_source ( id INT, name STRING, create_time TIMESTAMP(3), PRIMARY KEY (id) NOT ENFORCED ) WITH ( 'connector' = 'mysql-cdc', 'hostname' = 'mysql-host', 'port' = '3306', 'username' = 'user', 'password' = 'pass', 'database-name' = 'test_db', 'table-name' = 'users' ); -- 定义Kafka Sink表(写入CDC事件) CREATE TABLE kafka_sink ( id INT, name STRING, create_time TIMESTAMP(3), PRIMARY KEY (id) NOT ENFORCED ) WITH ( 'connector' = 'kafka', 'topic' = 'cdc-events', 'properties.bootstrap.servers' = 'kafka-broker:9092', 'format' = 'debezium-json' ); -- 将MySQL变更数据写入Kafka INSERT INTO kafka_sink SELECT * FROM mysql_source; ``` --- ### **总结** - **作用**:此表用于将 Flink 处理后的数据以 **Debezium CDC JSON 格式** 写入 Kafka 主题 `cdc-events`。 - **关键点**: - `format = 'debezium-json'` 表明数据是变更事件(含操作类型)。 - 主键声明对 Kafka 无强制约束,但可用于下游处理逻辑。 - 需确保 `properties.bootstrap.servers` 指向正确的 Kafka 集群地址。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值