ReplacingMergeTree не добавляет новые записи

405 views
Skip to first unread message

Александр Лукиных

unread,
Sep 28, 2017, 10:50:07 AM9/28/17
to ClickHouse

Я создал таблицу

CREATE MATERIALIZED VIEW public.users_first_payment
ENGINE = ReplacingMergeTree(date, (email, project_id), 8192, version) 
POPULATE AS 
SELECT 
    email,
    project_id,
    date_visit,
    toDate(now()) as date,
    toUInt32(toDateTime('2037-01-01 00:00:00') - toDateTime(now())) as version
FROM public.events ... <SOME_SELECT_QUERY>

Она отлично заполнилась на уже имеющихся данных в целевой таблице, но когда приходят новые данные, то они не добавляются в public.users_first_payment, хотя произвольное выполнение селекта в public.events для заполнения public.users_first_payment возвращает мне эти данные, которые должны были добавиться.

Через ваш докер образ все работает без проблем, но на моем сервере нет. Есть ли какие нибудь настройки, которые необходимо установить.

P.S таблица public.users_first_payment селектит из public.events, на которую смотри Distributed таблица и все это лежит на одном сервере, запись осуществляю на второй сервер, где развернута такая же пара public.events и Distributed таблица. Конфиги реплики корректны и нормально обмениваются данными.

Николай Кочетов

unread,
Sep 28, 2017, 3:37:19 PM9/28/17
to ClickHouse
Здравствуйте!

Distributed таблица смотрит на Replicated* или на обычную MergeTree таблицу? Включена ли опция internal_replication?
Если так, то, вероятно, что при вставке в одну из реплик вствака в другую физически не происходит, а вместо этого реплика сама скачивает нужные куски.

Провел у себя небольшой тест для MergeTree таблиц, и все заработало без дополнительных настроек.

Сделал следующее:

1. Создал локальные таблицы на двух репликах и distributed над ними:
CREATE TABLE default.tab ( date Date DEFAULT CAST(now() AS Date),  value UInt64) ENGINE = MergeTree(date, (date, value), 8192)
CREATE TABLE default.distr ( date Date DEFAULT CAST(now() AS Date),  value UInt64) ENGINE = Distributed(test_cluster, \'default\', \'tab\')

(на каждой реплике)

2. Создал Mat.View на первой реплике:
CREATE MATERIALIZED VIEW default.test_mv ( date Date,  value UInt64) ENGINE = MergeTree(date, (date, value), 8192) AS SELECT date, value FROM default.tab  WHERE (value % 2) = 0

3. Вставил значение в distributed таблицу на 2-й:
INSERT INTO distr SELECT
    today(),
    number
FROM system.numbers
LIMIT 100


4. Читаю из Mat.View на первой:
SELECT count()
FROM test_mv

┌─count()─┐
│      50 │
└─────────┘

Если таблицы не Replicated, то можете попробовать сделать то же самое.
Еще вариант - в вашем Mat.View может быть фильтрация, которая отфильтровала все.

четверг, 28 сентября 2017 г., 17:50:07 UTC+3 пользователь Александр Лукиных написал:

Александр Лукиных

unread,
Sep 29, 2017, 2:49:08 AM9/29/17
to ClickHouse
Спасибо за ответ! Я посмотрел настройки, internal_replication в false стоит.
Distributed таблица смотрит на обычную MergeTree.

Ваш пример действительно хорошо работает, но если я начинаю использовать движок ReplacingMergeTree, то такое уже не работает, у меня в одном случае работает обработка новых данных, если MATERIALIZED VIEW находится на том же сервере, на который идет вставка данных.

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

Николай Кочетов

unread,
Sep 29, 2017, 8:28:27 AM9/29/17
to ClickHouse
Провел аналогичный тест для ReplacingMergeTree. Кажется, что тоже все работает.
Какая версия у ClickHouse?

Тест такой:
1. на всех обеих репликах
CREATE TABLE repl_tab (date Date, val UInt64, ver UInt64) ENGINE = ReplacingMergeTree(date, (date, val), 8192, ver)
CREATE TABLE repl_distr ( date Date,  val UInt64, ver UInt64) ENGINE = Distributed(test_cluster, 'default', 'repl_tab')

2. на 1-й реплике:
create materialized view repl_mv engine = MergeTree(date, (date, val), 8192) as select * from repl_tab where val % 2 = 0
3. на 2-й реплике:
insert into repl_distr select today(), number, toUInt64(2) from system.numbers limit 10
4. на 1-й реплике:
SELECT * FROM repl_mv
┌───────date─┬─val─┬─ver─┐
│ 2017-09-29 │   0 │   2 │
│ 2017-09-29 │   2 │   2 │
│ 2017-09-29 │   4 │   2 │
│ 2017-09-29 │   6 │   2 │
│ 2017-09-29 │   8 │   2 │
└────────────┴─────┴─────┘



пятница, 29 сентября 2017 г., 9:49:08 UTC+3 пользователь Александр Лукиных написал:

Александр Лукиных

unread,
Sep 29, 2017, 8:48:52 AM9/29/17
to ClickHouse
Движки не так расставлены
repl_tab должна быть типом MergeTree
repl_distr - Distributed
а repl_mv типом ReplacingMergeTree

Николай Кочетов

unread,
Sep 29, 2017, 9:36:26 AM9/29/17
to ClickHouse
Прошу прощения, все перепутал.

Создал (в условиях 1-го теста) MV на 1-й реплике:

create materialized view mv2 engine = ReplacingMergeTree(date, (date, value), 8192, ver) as select *, value % 3 as ver from tab where value % 2 = 0

и вставил со 2-й в distr:

insert into distr select today(), number from system.numbers limit 10

и данные все еще появляются:

SELECT * FROM mv2

┌───────date─┬─value─┬─ver─┐
│ 2017-09-29 │     0 │   0 │
│ 2017-09-29 │     2 │   2 │
│ 2017-09-29 │     4 │   1 │
│ 2017-09-29 │     6 │   0 │
│ 2017-09-29 │     8 │   2 │
└────────────┴───────┴─────┘

Надеюсь, в этот раз ничего не напутал :)

пятница, 29 сентября 2017 г., 15:48:52 UTC+3 пользователь Александр Лукиных написал:

Александр Лукиных

unread,
Oct 2, 2017, 6:35:12 AM10/2/17
to ClickHouse
Видимо все таки дело в версии, на 1.1.54245 не работает, а на 1.1.54289 работает. Попробуем обновиться.
Reply all
Reply to author
Forward
0 new messages