Java-client для ClickHouse отправляет не все батчи

Рейтинг: -1Ответов: 1Опубликовано: 24.07.2023

Так отправляются 1000 объектов батчами по 50:

 void executeBatch(final List<V> batch) throws ClickHouseException {
        if (!batch.isEmpty()) {
            try (ClickHouseClient client = ClickHouseClient.newInstance(ClickHouseProtocol.HTTP)) {
                ClickHouseRequest.Mutation insertRequest = client.read(cluster).write().table(tableName)
                    .format(ClickHouseFormat.RowBinary);
                ClickHouseConfig config = insertRequest.getConfig();

                try (final ClickHousePipedOutputStream stream = ClickHouseDataStreamFactory.getInstance()
                    .createPipedOutputStream(config, (Runnable) () -> log.info("After stream"))) {
                    insertRequest.data(stream.getInputStream())
                        .execute()
                        .thenAccept(response ->
                            LOGGER.info("Batch: {}, Written rows: {}", batch.size(),
                                response.getSummary().getWrittenRows()));

                    for (final V event : batch) {
                        BinaryStreamUtils.writeString(stream, event.get("id").getAsString());
                        BinaryStreamUtils.writeNonNull(stream);
                        BinaryStreamUtils.writeString(stream, event.get("name").getAsString());
                    }
                    log.info("Batch_created");
                }
            } catch (final IOException e) {
                throw ClickHouseException.of(e, cluster.getTemplate());
            }
        }
    }

В логах есть сообщения про успешный инсерт, но их не 20, а каждый раз меньше:

Batch: 50, Written rows: 50

Есть все 20 сообщений после создания батча:

Batch_created

И все 20 про окончание стрима:

After stream

Никаких ошибок в логах нет. Но нет всех 20 сообщений об инсерте, их количество всегда разное, и в целевой таблице тоже не все строки.

В таблице system.errors появляются записи:

  • Cannot parse input: expected '\r\n' at end of stream.
  • Unexpected end of file while reading chunk header of HTTP chunked data
  • Too many parts (300). Merges are processing significantly slower than inserts
  • Directory /var/lib/clickhouse/store/1ae/1ae1dd8f-736f-4a7d9f15608a194c56af/tmp_merge_202307_178_275_1/ already exists

При перезапусках в целевой таблице всегда нет всех 1000 строк.

Вопрос- есть ли в коде ошибка, и почему ClickHouse не принимает все батчи?

Ответы

▲ 1Принят

Никогда не работал с ClickHouse, но подозреваю что у вас клиент или стрим закрывается прежде чем асинхронная операция выполняется.
Поменяйте свой код в соответствии с примером в документации