Вставка в Distributed таблицу

201 views
Skip to first unread message

rasmus

unread,
Jul 8, 2016, 9:05:12 AM7/8/16
to ClickHouse
У меня есть два шарда. На каждом из них я создал по локальной таблице и по Distributed таблице, которая смотрит на локальные таблицы.
Тип локальных таблиц - ReplacingMergeTree. При вставке одних и тех же данных в Distributed таблицу, я обнаружил, что некоторые данные начали дублироваться.
Это произошло скорее всего потому, что Distributed таблица выбирала разные шарды для одних и тех же данных.
Можно ли как-то избежать дублирования? Или только самому определять на какой шард вставлять данные, чтобы происходила замена с помощью движка локальных таблиц(ReplacingMergeTree)?
Спасибо.

man...@gmail.com

unread,
Jul 8, 2016, 3:02:41 PM7/8/16
to ClickHouse
В конфигурации кластера для Distributed-таблицы указываются шарды, а для каждого шарда - реплики.

Distributed таблица выбирает, на какой шард писать какие данные, согласно ключу шардирования. 
Например, если вы указали в качестве ключа шардирования rand(), то каждая строка попадёт на случайно выбранный шард. 
А если указали UserID и у вас два шарда с weight = 1, то строки с UserID % 2 == 0, попадут на первый шард, а с UserID % 2 == 1 - на второй.

Для ReplacingMergeTree, вам надо, чтобы данные с одним первичным ключом, писались на один шард. Это значит, что в качестве ключа шардирования, вам надо взять функцию от первичного ключа или части его столбцов. Например, если у вас первичный ключ: (CounterID, EventDate, UserID), то вы можете взять в качестве ключа шардирования, например, UserID или CounterID, или cityHash64(UserID, CounterID) и т. п.

И, конечно, можно и самому писать нужные данные на нужные шарды непосредственно.

rasmus

unread,
Jul 11, 2016, 4:07:26 AM7/11/16
to ClickHouse
Спасибо за разъяснение!
Reply all
Reply to author
Forward
0 new messages