почему clickhouse медленно записывает пакетные записи?

#clickhouse

Вопрос:

Я использую clickhouse-jdbc для записи данных в распределенную таблицу «все» clickhouse(3 хоста для 3 сегментов 1 реплики).

5000 пакетных фиксаций с использованием PreparedStatement для 1000000 записей стоят 6280 долларов.

 ...
                ps.setString(68, dateTimeStr);
                ps.setDate(69, date);
                
                ps.addBatch();
                System.out.println("i: "   i);
                
                if(i % 5000 == 0 || i == maxRecords) {
                    System.out.println(new java.util.Date());
                    ps.executeBatch();
                    System.out.println(new java.util.Date());
//                  ps.execute();
                    conn.commit();
                    System.out.println("commit: "   new java.util.Date());
                }
...
 

Есть ли лучший способ вставлять сто миллионов записей в день?

Ответ №1:

Да, вставки в распределенный механизм могут быть потенциально медленными из-за целого набора логических операций, необходимых для каждой операции вставки (синхронизация данных с конкретным сегментом и т. Д.).

Вы можете попробовать настроить некоторые настройки, которые описаны по ссылке выше.

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

Комментарии:

1. Да, запись в локальную таблицу напрямую более эффективна. Но мы должны учитывать распределение и баланс данных

2. Распределенная таблица в любом случае будет обрабатывать распределенные чтения, выдавая выбор чтения всем локальным таблицам. Хорошо (вы потенциально можете получить преимущества во время чтения), чтобы данные одного и того же ключа «сегментирования» были как можно ближе друг к другу. Хотя при простом циклическом распределении данных это просто будет означать, что все ваши осколки будут нести «долю», поэтому все они будут выполнять некоторую работу по извлечению ее во время запроса на чтение. Я думаю, что это зависит от данных и от того, как вы видите, что они должны быть структурированы. Это компромисс.