跳到主要内容
版本:1.1

Apache Flink

GreptimeDB Apache Flink connector 支持:

  • 通过 Flink SQL、Table API 或 DataStream API 写入仅包含 insert 操作的数据。
  • 通过 Flink SQL 或 Table API 将 GreptimeDB 表作为有界数据源读取。

Connector 要求使用 Java 17 和 Apache Flink 2.0.x。

安装 connector

从 Maven Central 下载

对于基于 Maven 的 Flink 应用,将 connector 添加为依赖:

<dependency>
<groupId>io.greptime</groupId>
<artifactId>flink-connector-greptimedb</artifactId>
<version>0.1.0</version>
</dependency>

对于 Flink SQL Client 或 Flink 集群,从 Maven Central 下载 shaded JAR:

mvn dependency:copy \
-Dartifact=io.greptime:flink-connector-greptimedb:0.1.0:jar:shaded \
-DoutputDirectory=/path/to/flink/lib

从源码构建

从源码构建 connector:

git clone https://github.com/GreptimeTeam/flink-connector-greptimedb.git
cd flink-connector-greptimedb
mvn package

构建会在 target/ 目录下生成 shaded JAR。启动 Flink SQL Client 时加载该文件:

./bin/sql-client.sh embedded \
-j /path/to/flink-connector-greptimedb-*-shaded.jar

写入数据前,在 GreptimeDB 中创建目标表:

CREATE TABLE cpu_metrics (
ts TIMESTAMP(3) TIME INDEX,
host STRING,
usage DOUBLE,
PRIMARY KEY (host)
);

然后创建使用 GreptimeDB connector 的 Flink 表:

CREATE TEMPORARY TABLE cpu_metrics_sink (
ts TIMESTAMP(3) NOT NULL,
host STRING,
usage DOUBLE
) WITH (
'connector' = 'greptimedb',
'endpoints' = '127.0.0.1:4001',
'database' = 'public',
'table' = 'cpu_metrics',
'time-index' = 'ts',
'tags' = 'host',
'batch.max-rows' = '1000'
);

INSERT INTO cpu_metrics_sink VALUES
(TIMESTAMP '2024-01-02 03:04:05.000', 'host-a', 0.42);

endpoints 使用 GreptimeDB gRPC endpoint,默认端口为 4001time-index 列必须声明为非空的 TIMESTAMPTIMESTAMP_LTZ 列。 tags 中的列应与 GreptimeDB 目标表的主键列一致。

常用的 sink 配置如下:

配置项必填默认值说明
connector-必须为 greptimedb
endpoints-以逗号分隔的 GreptimeDB gRPC endpoints。
time-index-用作 GreptimeDB time index 的非空 timestamp 列。
databasepublic目标数据库。
tableFlink 表名目标表。
username-GreptimeDB 用户名,必须与 password 同时配置。
password-GreptimeDB 密码,必须与 username 同时配置。
tags-以逗号分隔、写为 GreptimeDB tag 的列。
batch.max-rows1000每个写入 batch 的最大行数。

Sink 提供 at-least-once 交付语义。写入失败、重试或恢复可能产生重复数据。 它不支持 update、delete 或 retract 记录、主键 upsert、自动建表和 exactly-once commit。

在 DataStream 应用中,使用 GreptimeSink 并提供 GreptimeRecordSerializer。 Java API 示例和高级 bulk-write 配置请参阅 connector README

Table source 通过 MySQL 协议读取已有的 GreptimeDB 表。 除 GreptimeDB connector 外,还需要将 MySQL Connector/J 加载到 Flink runtime:

./bin/sql-client.sh embedded \
-j /path/to/flink-connector-greptimedb-*-shaded.jar \
-j /path/to/mysql-connector-j-8.4.0.jar

创建与 GreptimeDB 表 schema 一致的 source 表:

CREATE TEMPORARY TABLE cpu_metrics_source (
ts TIMESTAMP(3),
host STRING,
usage DOUBLE
) WITH (
'connector' = 'greptimedb',
'query.jdbc-url' = 'jdbc:mysql://127.0.0.1:4002/public?useSSL=false',
'database' = 'public',
'table' = 'cpu_metrics',
'query.fetch-size' = '1000'
);

SELECT ts, host, usage FROM cpu_metrics_source;

启用认证时,请使用独立的 usernamepassword 配置。 不要在 query.jdbc-url 中放入凭证或 timeout 参数。

Source 使用单个 task 执行有界扫描。它不支持流式读取、CDC、lookup read 和 schema discovery。Connector 不会将 projection、filter 或 limit 下推到 GreptimeDB;Flink 会在读取数据后执行这些操作。 所有 source 配置项和支持的数据类型请参阅 connector README