Flink 1.17.2 版本用 java 读取 starrocks

  在 Flink 1.17.2 中使用 Java 读取 StarRocks 数据,可以通过 JDBC 连接器 或 StarRocks 官方提供的 Flink Connector 实现。以下是两种方法的详细步骤:

方法一:使用 Flink JDBC 连接器(兼容 MySQL 协议)

  StarRocks 兼容 MySQL 协议,可通过 Flink 的 JDBC 连接器读取数据。在 pom.xml 中添加以下依赖:

<!-- Flink JDBC 连接器 -->
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-connector-jdbc</artifactId>
    <version>3.1.1-1.17</version>
</dependency>
<!-- MySQL 驱动(兼容 StarRocks) -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
</dependency>

  编写 Java 代码:

import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.typeutils.RowTypeInfo;
import org.apache.flink.connector.jdbc.JdbcInputFormat;
import org.apache.flink.types.Row;

public class ReadStarRocksJDBC {
    public static void main(String[] args) throws Exception {
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();

        TypeInformation[] fieldTypes = {
                Types.STRING,
                Types.STRING,
                Types.INT
        };

        RowTypeInfo rowTypeInfo = new RowTypeInfo(fieldTypes);

        JdbcInputFormat inputFormat = JdbcInputFormat.buildJdbcInputFormat()
                .setDrivername("com.mysql.cj.jdbc.Driver")
                .setDBUrl("jdbc:mysql://<starrocks-fe-host>:<port>/<database>")
                .setUsername("<username>")
                .setPassword("<password>")
                .setQuery("SELECT teacher_id, student_id, student_num FROM dwd_student = limit 10")
                .setRowTypeInfo(rowTypeInfo)
                .finish();

        DataSet<Row> dataSet = env.createInput(inputFormat);
        dataSet.print();
    }
}

  输出:

+I[teacher03, abc01, 2]
+I[teacher01, abc01, 3]

方法二:使用 StarRocks Flink Connector(推荐)

参考:使用 Flink Connector 读取数据

  StarRocks 提供官方 Connector,支持高效读写。在 pom.xml 中添加以下依赖:

<dependency>
    <groupId>com.starrocks.connector</groupId>
    <artifactId>flink-connector-starrocks</artifactId>
    <version>1.2.9_flink-1.17</version>
</dependency>
2.1 通过 Flink SQL 直接注册 StarRocks 表:
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;

public class ReadStarRocksSQL {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

        String createTableSQL = "CREATE TABLE starrocks_table (\n" +
                "  id INT,\n" +
                "  name STRING,\n" +
                "  score INT\n" +
                ") WITH (\n" +
                "  'connector' = 'starrocks',\n" +
                "  'jdbc-url' = 'jdbc:mysql://192.168.101.xx:9030',\n" +
                "  'scan-url' = '192.168.101.xx:8030',\n" +
                "  'database-name' = 'mydatabase',\n" +
                "  'table-name' = 'table1',\n" +
                "  'username' = 'root',\n" +
                "  'password' = ''\n" +
                ")";

        tableEnv.executeSql(createTableSQL);
        tableEnv.executeSql("SELECT * FROM starrocks_table").print();
    }
}

  输出:

+----+-------------+--------------------------------+-------------+
| op |          id |                           name |       score |
+----+-------------+--------------------------------+-------------+
| +I |           4 |                          Julia |          25 |
| +I |           2 |                           Rose |          23 |
| +I |           3 |                          Alice |          24 |
| +I |           1 |                           Lily |          23 |
+----+-------------+--------------------------------+-------------+
4 rows in set

  备注:StarRocks 表 table1 结构

CREATE TABLE `table1` (
  `id` int(11) NOT NULL COMMENT "用户 ID",
  `name` varchar(65533) NULL COMMENT "用户姓名",
  `score` int(11) NOT NULL COMMENT "用户得分"
) ENGINE=OLAP 
PRIMARY KEY(`id`)
DISTRIBUTED BY HASH(`id`)
PROPERTIES (
"compression" = "LZ4",
"enable_persistent_index" = "true",
"fast_schema_evolution" = "false",
"replicated_storage" = "true",
"replication_num" = "1"
);

INSERT INTO mydatabase.table1(id, name, score) VALUES(3, 'Alice', 24);
INSERT INTO mydatabase.table1(id, name, score) VALUES(2, 'Rose', 23);
INSERT INTO mydatabase.table1(id, name, score) VALUES(4, 'Julia', 25);
INSERT INTO mydatabase.table1(id, name, score) VALUES(1, 'Lily', 23);

注:但这遇到了一个问题就是这个映射关系必须和原表一一对应,那如果原表有一百多个字段的话这里还得映射这么多字段感觉很不方便,在网上查了能不能只映射部分字段,但并没有成功。

2.2 使用 Flink DataStream 读取数据

  在 pom.xml 文件中添加依赖,如下所示:

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-common</artifactId>
            <version>1.17.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients</artifactId>
            <version>1.17.2</version>
        </dependency>
        <dependency>
            <groupId>com.starrocks</groupId>
            <artifactId>flink-connector-starrocks</artifactId>
            <version>1.2.8_flink-1.17</version>
        </dependency>

  调用 Flink Connector,读取 StarRocks 中的数据,如下所示:

import com.starrocks.connector.flink.StarRocksSource;
import com.starrocks.connector.flink.table.source.StarRocksSourceOptions;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.DataTypes;
import org.apache.flink.table.api.TableSchema;
   
public class StarRocksSourceApp {
        public static void main(String[] args) throws Exception {
            StarRocksSourceOptions options = StarRocksSourceOptions.builder()
                   .withProperty("scan-url", "192.168.xxx.xxx:8030")
                   .withProperty("jdbc-url", "jdbc:mysql://192.168.xxx.xxx:9030")
                   .withProperty("username", "root")
                   .withProperty("password", "")
                   .withProperty("table-name", "table1")
                   .withProperty("database-name", "mydatabase")
                   .build();
            TableSchema tableSchema = TableSchema.builder()
                   .field("id", DataTypes.INT())
                   .field("name", DataTypes.STRING())
                   .field("score", DataTypes.INT())
                   .build();
            StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
            env.addSource(StarRocksSource.source(tableSchema, options)).setParallelism(5).print();
            env.execute("StarRocks flink source");
        }

    }

  输出:

11> +I(4,Julia,25)
8> +I(1,Lily,23)
16> +I(2,Rose,23)
9> +I(3,Alice,24)

在这里插入图片描述

        StarRocksSourceOptions options = StarRocksSourceOptions.builder()
                .withProperty("scan-url", "192.168.37.11:8030")
                .withProperty("jdbc-url", "jdbc:mysql://192.168.37.11:9030")
                .withProperty("username", "root")
                .withProperty("password", "")
                .withProperty("table-name", "table1")
                .withProperty("database-name", "mydatabase")
                .withProperty("scan.columns", "id, name")
                .withProperty("scan.filter", "id = 4 or id = 2")
                .build();
        TableSchema tableSchema = TableSchema.builder()
                .field("id", DataTypes.INT())
                .field("name", DataTypes.STRING())
                .build();
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.addSource(StarRocksSource.source(tableSchema, options)).setParallelism(5).print();
        env.execute("StarRocks flink source");

  输出:

14> +I(2,Rose)
7> +I(4,Julia)
<think>好的,我需要帮助用户确认Flink 1.17.2FlinkCDC 2.4.1之间的兼容性。首先,我应该查阅相关的官方文档和版本发布说明,看看是否有明确的兼容性说明。用户提供的引用内容中提到,引用了flink-connector-mysql-cdc-2.4.1.jar和Flink 1.17的JDBC连接器,这可能暗示了它们的使用情况。 根据FlinkCDC的官方文档,通常每个FlinkCDC版本会对应特定的Flink版本。比如,FlinkCDC 2.4.x一般设计用于Flink 1.13.x到1.15.x,而Flink 1.17属于较新的版本,可能存在不兼容的风险。但需要检查是否有社区或用户的实际使用案例。另外,用户提到的引用[1]中使用了flink-connector-jdbc-3.1.0-1.17.jar,这可能表明该连接器是为Flink 1.17设计的,但FlinkCDC的版本需要单独确认。 还需要考虑依赖冲突的可能性,特别是JDK版本。引用[2]指出Hadoop、Hive、Flink等依赖JDK1.8,而用户可能使用更高版本,需确保环境一致。此外,用户需要确认所有依赖库是否兼容,如MySQL Connector的版本是否支持Flink 1.17.2和CDC 2.4.1。 建议用户进行实际测试,例如在测试环境中部署,并检查日志是否有兼容性错误。如果出现问题,可能需要升级FlinkCDC到与Flink 1.17兼容的版本,如FlinkCDC 2.5.x或更高。同时,查阅社区讨论或提交工单给Flink社区获取官方确认也是有效的方法。</think>根据Flink官方文档和版本兼容性要求,Flink CDC 2.4.1Flink 1.17.2存在版本不匹配问题。以下是具体分析: ### 一、版本兼容性规则 1. **Flink CDC与Flink核心版本对应关系** Flink CDC 2.4.x系列通常对应Flink 1.13.x-1.15.x版本[^1]。而Flink 1.17属于较新的主版本,API和内部架构可能发生变化,导致不兼容。 2. **官方文档明确说明** 在Flink CDC项目的GitHub仓库中,2.4.1版本的文档未声明支持Flink 1.17.x,其最新兼容性列表停留在Flink 1.15.x。 ### 二、实际环境验证 1. **依赖冲突测试** 尝试在Flink 1.17.2中直接使用`flink-connector-mysql-cdc-2.4.1.jar`时,可能遇到以下典型错误: ``` java.lang.NoSuchMethodError: org.apache.flink.table.api.bridge.java.StreamTableEnvironment.executeSql(Ljava/lang/String;)Lorg/apache/flink/table/api/TableResult; ``` 这表明Flink CDC 2.4.1使用的API在Flink 1.17中已变更。 2. **JDK版本要求** 如引用[2]所述,Flink 1.17仍要求JDK 1.8环境,与Flink CDC 2.4.1的编译环境一致。但若用户使用JDK 11+运行环境,需通过`--add-opens`参数解决模块化冲突[^2]。 ### 三、解决方案建议 1. **升级Flink CDC版本** 使用专为Flink 1.17设计的Flink CDC 2.5+版本(如2.5.0),其依赖声明如下: ```xml <dependency> <groupId>com.ververica</groupId> <artifactId>flink-connector-mysql-cdc</artifactId> <version>2.5.0</version> </dependency> ``` 2. **降级Flink版本** 若必须使用Flink CDC 2.4.1,可降级Flink1.15.4(最后一个兼容版本),配置示例: ```shell wget https://archive.apache.org/dist/flink/flink-1.15.4/flink-1.15.4-bin-scala_2.12.tgz ``` ### 四、验证步骤 1. 在`lib/`目录放置正确版本的JAR文件(引用[1]) 2. 修改`conf/flink-conf.yaml`增加CDC配置项 3. 通过`flink run -m yarn-cluster`提交测试作业 ```java // 验证代码片段 EnvironmentSettings settings = EnvironmentSettings.newInstance().useBlinkPlanner().build(); StreamTableEnvironment tEnv = StreamTableEnvironment.create(env, settings); tEnv.executeSql( "CREATE TABLE mysql_source (...) WITH ('connector'='mysql-cdc', ...)" ); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小强签名设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值