Skip to main content
Version: 1.1

Apache Flink

The GreptimeDB connector for Apache Flink supports:

  • Writing insert-only records through Flink SQL, the Table API, or the DataStream API.
  • Reading a GreptimeDB table as a bounded source through Flink SQL or the Table API.

The connector requires Java 17 and Apache Flink 2.0.x.

Install the connector

Download from Maven Central

For a Maven-based Flink application, add the connector as a dependency:

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

For Flink SQL Client or a Flink cluster, download the shaded JAR from Maven Central:

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

Build from source

Build the connector from source:

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

The build creates a shaded JAR under target/. Load it when starting the Flink SQL Client:

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

Create the destination table in GreptimeDB before writing data:

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

Then create a Flink table that uses the GreptimeDB connector:

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 uses the GreptimeDB gRPC endpoint, whose default port is 4001. The time-index column must be declared as a non-null TIMESTAMP or TIMESTAMP_LTZ column. Columns listed in tags should match the primary key columns of the destination GreptimeDB table.

The commonly used sink options are:

OptionRequiredDefaultDescription
connectorYes-Must be greptimedb.
endpointsYes-Comma-separated GreptimeDB gRPC endpoints.
time-indexYes-Non-null timestamp column used as the GreptimeDB time index.
databaseNopublicDestination database.
tableNoFlink table nameDestination table.
usernameNo-GreptimeDB username. Configure with password.
passwordNo-GreptimeDB password. Configure with username.
tagsNo-Comma-separated columns written as GreptimeDB tags.
batch.max-rowsNo1000Maximum number of rows in each write batch.

The sink provides at-least-once delivery. Failed writes, retries, or recovery can produce duplicate writes. It does not support update, delete, or retract rows, primary-key upserts, automatic table creation, or exactly-once commits.

For DataStream applications, use GreptimeSink and provide a GreptimeRecordSerializer. See the connector README for the Java API example and advanced bulk-write options.

The Table source reads an existing GreptimeDB table through the MySQL protocol. Add MySQL Connector/J to the Flink runtime together with the GreptimeDB connector:

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

Create the source table with a schema that matches the GreptimeDB table:

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;

Use the separate username and password options when authentication is enabled. Do not put credentials or timeout parameters in query.jdbc-url.

The source performs a bounded, single-task scan. It does not support streaming reads, CDC, lookup reads, or schema discovery. The connector does not push projections, filters, or limits down to GreptimeDB; Flink applies these operations after reading the data. For all source options and supported data types, see the connector README.