Bharath Reddy
07/17/2026, 2:10 PM@KafkaTopic / @JdbcTable / @HttpEndpoint on a typed static field gives you a handle for seeding data, awaiting outcomes (by count or predicate, no fixed sleeps), and getting the connection info to configure your job — one declaration instead of separate container/topic/consumer-group setup per test.
It's early (v0.0.1, tested against Flink 1.19/1.20, HTTP examples on 2.2) and I'd genuinely like feedback before going further:
- Is this solving a real pain point for people here, or do most of you already have this solved in-house?
- Anything obviously missing for it to be useful (other connectors, other patterns)?
- Any concerns with the approach itself?
Not trying to replace Testcontainers or anyone's existing setup — just curious if this is useful to anyone outside my own projects. Any feedback would be appreciated.rmoff
07/17/2026, 4:26 PMNestor A. A.
07/28/2026, 2:34 AMrmoff
07/30/2026, 9:52 AMjordepstein
07/30/2026, 7:04 PMjordepstein
08/02/2026, 7:42 PMFrancisco Morillo
08/10/2026, 2:41 PMjordepstein
08/15/2026, 6:25 PMrmoff
08/21/2026, 5:22 PMrmoff
09/09/2026, 3:09 PMrmoff
09/11/2026, 12:46 PMsavinovnickita
09/15/2026, 9:04 PMMingliang Liu
09/16/2026, 9:04 PMrajendar t
09/24/2026, 2:59 PMjordepstein
09/29/2026, 1:12 AMrmoff
09/29/2026, 8:38 AMrmoff
09/30/2026, 9:52 AMsap1ens
09/30/2026, 4:36 PMGiannis Polyzos
10/01/2026, 6:36 AMrajendar t
10/08/2026, 1:02 PMAbhilash S.R
10/15/2026, 10:05 PMflink-connector-elasticsearch7:4.0.0-2.0, client 7.10.2.
• New: flink-connector-elasticsearch8:4.0.0-2.0, overriding the Java client to 8.19.22.
.setBulkResponseInspectorFactory(new ElasticsearchFailureHandler(host))
.setBulkFlushBackoffStrategy(FlushBackoffType.EXPONENTIAL, maxRetries, delay)
Our custom inspector classified failed bulk items and decided whether to ignore selected permanent document errors, perform restricted recovery, or fail the task.
With Elasticsearch8AsyncSinkBuilder, I cannot find equivalent failure-handler or bounded-retry options. The released writer appears to requeue all failed bulk items without distinguishing permanent errors from transient ones or limiting attempts. Permanent failures could therefore retry indefinitely; task restarts can also replay the same problematic records.
Is there a supported replacement/extension point for error classification, bounded retries/backoff, and durable DLQ handling, without maintaining a custom sink/writer? Was this intentionally changed with the async-sink architecture, or is it a feature-parity gap?
I found FLINK-35546 and PR #107. Are these the right items to follow?
We want to quarantine individual bad records or run time exceptions from elastic search such as index closed , shrink exceptions safely.Grzegorz Liter
10/16/2026, 7:12 PMZakelly
10/19/2026, 3:03 PMjordepstein
10/19/2026, 11:35 PMB S Mohammed Ashfaq
10/20/2026, 5:46 AMMETA-INF/services.
Maven Shade’s default handling caused some of these files to be lost, which broke name resolution at runtime. The resulting error was quite misleading and took some digging to trace back to the packaging configuration.
The fix was to add ServicesResourceTransformer to the Maven Shade configuration so that the service files are merged correctly.
This isn't specific to Qdrant; it’s something worth watching out for when packaging connectors that depend on gRPC.
I also added schema validation at table-creation time so unsupported types, such as DECIMAL, TIMESTAMP, and nested types, are rejected early with the offending column identified.
2. DuckDB — handling concurrent writes
DuckDB's local database file uses process-level locking, which creates a problem when multiple Flink sink subtasks try to write to the same file.
Rather than allowing the job to get stuck or encounter unpredictable write behavior, the connector validates the sink parallelism and rejects values greater than 1 for local file targets.
For remote targets that support concurrent access, such as MotherDuck, higher parallelism can be supported.
I also made the delivery behavior explicit: regular inserts provide at-least-once semantics, while upserts configured with key-fields use ON CONFLICT to make retries idempotent.
Using the connectors
Both connectors follow the usual Flink SQL workflow: define a table and use INSERT INTO.
For example, with Qdrant:
CREATE TABLE embeddings (
id STRING,
text STRING,
embedding ARRAY<FLOAT>
) WITH (
'connector' = 'qdrant',
'host' = 'localhost',
'collection-name' = 'my_collection',
'vector-field' = 'embedding',
'id-field' = 'id'
);
INSERT INTO embeddings
SELECT id, text, embedding FROM source_stream;
And with DuckDB:
CREATE TABLE sink_table (
id BIGINT,
name STRING,
score DOUBLE
) WITH (
'connector' = 'duckdb',
'database-path' = '/data/my.db',
'table-name' = 't',
'key-fields' = 'id'
);
INSERT INTO sink_table
SELECT id, name, score FROM source_stream;
Current status
Both connectors target Flink 1.20 and are released under the Apache 2.0 license. They currently support the sink side only, and the target table or collection must already exist.
• Qdrant: 13/13 tests passing, including an integration test using a real Qdrant Testcontainer.
• DuckDB: 14/14 tests passing against an actual embedded database file, without requiring Docker.
These are fresh projects, so there's still room to improve them based on real-world usage.
Sharing them here in case anyone is working with Flink and Qdrant or DuckDB, or has run into similar issues with gRPC shading or concurrent writes to local database files.
Feedback, suggestions, and issues are welcome!
GitHub repositories:
• Qdrant: github.com/Ashfaqbs/flink-connector-qdrant
• DuckDB: github.com/Ashfaqbs/flink-connector-duckdbChiara
10/26/2026, 4:00 PMjacson981112
10/26/2026, 4:07 PMhakkiburakalks
10/28/2026, 11:38 PMrmoff
10/30/2026, 10:55 AMAbhilash S.R
10/30/2026, 7:39 PMflink-connector-elasticsearch8:4.0.0-2.0 with Java client 8.19.22 and encountering FLINK-38054: checkpoint recovery fails with a Kryo ClassNotFoundException for IndexOperation, even after Elasticsearch becomes available again.
The fix was merged in PR #159, but is not included in our released connector version. Could you publish a new connector release containing this fix and share the expected timeline? We can help validate a release candidate.