StarRocks Flink Connector 数据读取技术详解
概述
StarRocks 自研的 Flink Connector 为 Apache Flink 生态提供了高效的数据读取能力,能够直接从 StarRocks 集群中并行读取数据。本文将深入解析该 Connector 的技术原理、使用方法和最佳实践。
技术架构对比
StarRocks Flink Connector 架构
StarRocks 自研 Connector 采用分布式查询方案:
- 首先从 FE 节点获取查询计划
- 将查询计划分发到各 BE 节点
- 并行从多个 BE 节点读取数据
这种架构优势在于:
- 充分利用 StarRocks 分布式计算能力
- 实现数据读取的并行化
- 显著提高吞吐量
传统 JDBC Connector 架构
传统 JDBC Connector 采用单点串行方案:
- 仅通过 FE 节点单点读取数据
- 无法利用 BE 节点的计算能力
- 数据读取效率较低
环境准备
版本兼容性
| Connector 版本 | 支持的 Flink 版本 | 要求的 StarRocks 版本 | |----------------|------------------|----------------------| | 1.2.10 | 1.15-1.19 | 2.1+ | | 1.2.9 | 1.15-1.18 | 2.1+ | | 1.2.8 | 1.13-1.17 | 2.1+ | | 1.2.7 | 1.11-1.15 | 2.1+ |
部署步骤
- 安装 Java 8 或 11 环境
- 下载对应版本的 Flink 并解压
- 获取匹配的 Flink Connector JAR 包
- 将 JAR 包放入 Flink 的 lib 目录
- 重启 Flink 集群
核心参数详解
通用参数
| 参数名 | 说明 | |-------------------------|----------------------------------------------------------------------| | scan-url | FE 节点的 HTTP 访问地址,格式为 <host>:<http_port>
| | jdbc-url | FE 节点的 JDBC 访问地址,格式为 jdbc:mysql://<host>:<query_port>
| | scan.connect.timeout-ms | 连接超时时间,默认 1000ms | | scan.params.mem-limit-byte | 单个查询内存限制,默认 1GB |
DataStream 专有参数
| 参数名 | 说明 | |---------------|-------------------------------| | scan.columns | 指定查询列,逗号分隔 | | scan.filter | 指定过滤条件 |
数据类型映射
StarRocks 与 Flink 数据类型对应关系:
| StarRocks 类型 | Flink 类型 | 备注 | |---------------|------------|-------------------------------| | BIGINT | BIGINT | | | LARGEINT | STRING | | | DATETIME | TIMESTAMP | | | DECIMAL系列 | DECIMAL | 包括 DECIMAL/DECIMALV2 等 | | JSON | STRING | 1.2.10+ 版本支持 | | ARRAY | ARRAY | 需要 StarRocks 3.1.12+/3.2.5+ |
实战示例
示例数据准备
创建测试表并插入数据:
CREATE TABLE score_board (
id INT PRIMARY KEY,
name VARCHAR(65533),
score INT
) DISTRIBUTED BY HASH(id);
INSERT INTO score_board VALUES
(1, 'Bob', 21), (2, 'Stan', 21), ...;
Flink SQL 方式
- 在 Flink 中创建映射表:
CREATE TABLE flink_test (
id INT,
name STRING,
score INT
) WITH (
'connector' = 'starrocks',
'scan-url' = 'fe_host:8030',
'jdbc-url' = 'jdbc:mysql://fe_host:9030',
'username' = 'root',
'password' = '',
'database-name' = 'test',
'table-name' = 'score_board'
);
- 执行查询:
SELECT id, name FROM flink_test WHERE score > 25;
Flink DataStream 方式
Java 代码示例:
StarRocksSourceOptions options = StarRocksSourceOptions.builder()
.withProperty("scan-url", "fe_host:8030")
.withProperty("jdbc-url", "jdbc:mysql://fe_host:9030")
.withProperty("username", "root")
.withProperty("password", "")
.withProperty("table-name", "score_board")
.withProperty("database-name", "test")
.build();
TableSchema schema = TableSchema.builder()
.field("id", DataTypes.INT())
.field("name", DataTypes.STRING())
.field("score", DataTypes.INT())
.build();
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.addSource(StarRocksSource.source(schema, options))
.setParallelism(5)
.print();
env.execute("StarRocks Source Job");
性能优化建议
- 合理设置并行度:根据 BE 节点数量和数据量调整并行度
- 谓词下推:尽量在查询条件中指定过滤条件
- 列裁剪:只选择需要的列,减少数据传输量
- 内存配置:根据数据规模调整
scan.params.mem-limit-byte
注意事项
- 建表时字段顺序需与 StarRocks 表一致
- 不支持 LIMIT 子句
- 复杂聚合函数支持有限
- 任务失败后需要手动重新创建
监控与调优
可通过 Flink WebUI 监控以下关键指标:
totalScannedRows
:已扫描行数- 各并行子任务的处理速率
- 网络传输量
对于大规模数据读取,建议:
- 增加 BE 节点资源
- 调整 Flink 任务并行度
- 优化查询条件
总结
StarRocks Flink Connector 通过分布式并行读取机制,显著提升了从 StarRocks 读取数据的效率。本文详细介绍了其技术原理、配置方法和使用示例,帮助开发者高效实现 StarRocks 与 Flink 生态的集成。在实际应用中,建议根据数据规模和业务需求合理配置参数,以获得最佳性能。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考