Flink sql cdc 读取kafka json格式数据

  • Flink CDC 读取kafka json格式数据
package com.com.cdc
import org.apache.flink.streaming.api.scala._
import org.apache.flink.table.api.{EnvironmentSettings, Table}
import org.apache.flink.table.api.bridge.scala.StreamTableEnvironment
import org.apache.flink.types.Row
object KafkaJson {
  def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    val bsSettings = EnvironmentSettings.newInstance.useBlinkPlanner.inStreamingMode.build
    // 使用blink创建流式table环境变量
    val sTableEnv = StreamTableEnvironment.create(env, bsSettings)
    // 定义DDL
    val kfkSql =
      s"""
         |CREATE TABLE kafka_table (
         | common ROW(uid string),
         | ts BIGINT
         |) WITH (
         | 'connector' = 'kafka',
         | 'topic' = 'test',
         | 'properties.bootstrap.servers' = 'jeff200:9092',
         | 'format' = 'json',
         | 'scan.startup.mode' = 'earliest-offset'
         |)
         |""".stripMargin
    // 创建虚拟流表
    sTableEnv.executeSql(kfkSql)
    val filterSql =
      s"""
         |SELECT uid, ts
         |FROM kafka_table
         |WHERE uid > 0
       """.stripMargin
    // 执行sql查询
    val table: Table = sTableEnv.sqlQuery(filterSql)
    // 追加流返回DataStream[Row]
    val kafkaStream:DataStream[Row] = sTableEnv.toAppendStream(table)
    kafkaStream.print()

    env.execute("kafka cdc")
  }
}
  • 核心依赖
<!-- flink json -->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-json</artifactId>
            <version>${flink.version}</version>
            <scope>${scope}</scope>
        </dependency>
<!-- flink table api -->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-api-scala-bridge_2.11</artifactId>
            <version>${flink.version}</version>
            <scope>${scope}</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-planner-blink_2.11</artifactId>
            <version>${flink.version}</version>
            <scope>${scope}</scope>
        </dependency>
  • kafka test 数据和运行结果
{"ts": 1607003021, "common": {"uid": 1}, "displays": [{"item": 1, "type": "goods"},{"item": 2, "type": "goods"}]}

在这里插入图片描述

### 使用 Flink SQLKafka 消费数据并写入 StarRocks 的实现方法 #### 解决方案概述 为了实现从 Kafka 消费数据并通过 Flink SQL 将其写入 StarRocks,需要配置 Kafka 和 StarRocks 的连接器,并编写相应的 Flink SQL 查询语句。以下是详细的实现过程。 --- #### 1. 配置环境依赖 在 Maven 工程中引入必要的依赖项,包括 Kafka 连接器和 StarRocks 连接器: ```xml <dependencies> <!-- Flink SQL Core --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-sql-client_${scala.binary.version}</artifactId> <version>${flink.version}</version> </dependency> <!-- Kafka Connector --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-kafka_${scala.binary.version}</artifactId> <version>${flink.version}</version> </dependency> <!-- StarRocks JDBC Driver --> <dependency> <groupId>com.starrocks</groupId> <artifactId>starrocks-jdbc</artifactId> <version>${starrocks.jdbc.version}</version> </dependency> <!-- StarRocks Flink Connector (if available) --> <dependency> <groupId>com.starrocks.connector</groupId> <artifactId>flink-starrocks-connector</artifactId> <version>${starrocks.connector.version}</version> </dependency> </dependencies> ``` --- #### 2. 创建 Kafka 表 定义一个用于消费 Kafka 数据的表结构。假设 Kafka 主题名为 `kafka_topic`,消息格式JSON。 ```sql CREATE TABLE kafka_source ( id BIGINT, name STRING, age INT, event_time TIMESTAMP(3), WATERMARK FOR event_time AS event_time - INTERVAL '5' SECOND ) WITH ( 'connector' = 'kafka', 'topic' = 'kafka_topic', 'properties.bootstrap.servers' = 'localhost:9092', 'format' = 'json' ); ``` 此部分说明了如何创建一个基于 Kafka 的源表[^1]。 --- #### 3. 创建 StarRocks 表 定义目标表以存储来自 Kafka数据。假设 StarRocks 表名是 `starrocks_table`。 ```sql CREATE TABLE starrocks_sink ( id BIGINT, name STRING, age INT, PRIMARY KEY(id) NOT ENFORCED ) WITH ( 'connector' = 'starrocks', 'jdbc-url' = 'jdbc:mysql://starrocks_host:9030?load balancing=hash&table_location=prefixed', 'username' = 'root', 'password' = '', 'database-name' = 'test_db', 'table-name' = 'starrocks_table', 'sink.properties.format' = 'parquet', -- 可选参数 'sink.buffer-flush.max-bytes' = '10485760', -- 缓冲区大小,默认1MB 'sink.buffer-flush.interval' = '1s' -- 刷新间隔时间 ); ``` 此处展示了如何设置 StarRocks 作为目标表[^3]。 --- #### 4. 插入数据到 StarRocks 通过 INSERT INTO 语句将 Kafka 中的数据写入 StarRocks。 ```sql INSERT INTO starrocks_sink SELECT id, name, age FROM kafka_source; ``` 该操作实现了从 Kafka 源表向 StarRocks 目标表的数据传输[^4]。 --- #### 示例代码总结 完整的流程如下所示: ```sql -- Step 1: 定义 Kafka Source Table CREATE TABLE kafka_source ( id BIGINT, name STRING, age INT, event_time TIMESTAMP(3), WATERMARK FOR event_time AS event_time - INTERVAL '5' SECOND ) WITH ( 'connector' = 'kafka', 'topic' = 'kafka_topic', 'properties.bootstrap.servers' = 'localhost:9092', 'format' = 'json' ); -- Step 2: 定义 StarRocks Sink Table CREATE TABLE starrocks_sink ( id BIGINT, name STRING, age INT, PRIMARY KEY(id) NOT ENFORCED ) WITH ( 'connector' = 'starrocks', 'jdbc-url' = 'jdbc:mysql://starrocks_host:9030?load balancing=hash&table_location=prefixed', 'username' = 'root', 'password' = '', 'database-name' = 'test_db', 'table-name' = 'starrocks_table', 'sink.properties.format' = 'parquet', 'sink.buffer-flush.max-bytes' = '10485760', 'sink.buffer-flush.interval' = '1s' ); -- Step 3: 执行插入操作 INSERT INTO starrocks_sink SELECT id, name, age FROM kafka_source; ``` --- ### 注意事项 - 确保使用的 Flink 版本与 CDC 版本兼容。 - 如果遇到版本不匹配问题,请自行编译适合的 CDC 版本或调整 Flink 版本。 - 星环科技官方文档提供了更多关于 StarRocks Flink Connector 的详细信息。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值