apache/seatunnel · warning · IOException

Failed to close HBase connection.

Error message

Failed to close HBase connection.

What it means

HbaseSourceReader.close() wraps any exception from hbaseClient.close() into an IOException('Failed to close HBase connection.'). The reader throws this so the framework knows resource cleanup failed when the task is being torn down. It usually indicates an underlying problem shutting down the HBase client/connection (often a wrapped InterruptedException or IOException).

Solutions

  1. Check the cause chain for the real failure (often InterruptedException during cancel — usually benign)
  2. Verify HBase cluster/ZK is reachable so close can complete cleanly
  3. If it only occurs on cancel, it is typically harmless; investigate only if it happens in normal teardown
  4. Upgrade/check client resource management; ensure close is called once
Defensive patterns

Strategy: try-catch

Try / catch

try {
    reader.close();
} catch (IOException e) {
    log.warn("HBase reader close failed: {}", e.getCause(), e); // usually benign during cancel
}

Prevention

When it happens

Trigger: Task cancellation or checkpoint/teardown invoking HbaseSourceReader.close() while hbaseClient.close() (closing the Connection/Table resources) throws — e.g. interrupted thread during job cancel or connection already aborted.

Common situations: Cancelling a running job mid-scan; ZK/session already expired so close() fails; thread interrupt during cleanup.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/a012bd426e1edb45. Report an issue: GitHub.

Appendix: source

Thrown at seatunnel-connectors-v2/connector-hbase/src/main/java/org/apache/seatunnel/connectors/seatunnel/hbase/source/HbaseSourceReader.java:112

                        column ->
                                Preconditions.checkArgument(
                                        column.contains(":") && column.split(":").length == 2,
                                        "Invalid column names, it should be [ColumnFamily:Column] format"));
        this.hbaseClient = hbaseClient;
    }

    @Override
    public void open() throws Exception {
        // do nothing
    }

    @Override
    public void close() throws IOException {
        if (this.hbaseClient != null) {
            try {
                this.hbaseClient.close();
            } catch (Exception e) {
                throw new IOException("Failed to close HBase connection.", e);
            }
            log.info("Current HBase connection is closed.");
        }
    }

    @Override
    public void pollNext(Collector<SeaTunnelRow> output) throws Exception {
        synchronized (output.getCheckpointLock()) {
            final HbaseSourceSplit split = sourceSplits.poll();
            if (Objects.nonNull(split)) {
                // read logic
                try (ResultScanner scanner =
                        hbaseClient.scan(split, hbaseParameters, this.columnNames)) {
                    for (Result result : scanner) {
                        SeaTunnelRow seaTunnelRow =
                                hbaseDeserializationFormat.deserialize(
                                        convertRawRow(result), seaTunnelRowType);
                        output.collect(seaTunnelRow);

View on GitHub (pinned to cf67b549a7)