Java-client для ClickHouse отправляет не все батчи
Так отправляются 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 не принимает все батчи?
Источник: Stack Overflow на русском