- 01 March 2020 (23 messages)
-
Если у вас были данные на одном сервере
Вы добавили второй
Прописати remote_servers и сделали distributed таблицу вы убьете перформанс
Нужно данные между серверами распределить
Почитайте в доке
distributed тпблица фактически это правило разбиения при записи с очередью недолитых партоа если шард недоступен
А при чтении. Вообще стучится на все шарды и старается если можно аггрегировать на них
Но часто запросы так пишут что данные для аггрегироаания приходится ташить на один хост -
Подскажите, пожалуйста, в логах вижу Index IX_EndDateTime has dropped 2 granules. Это хорошо или плохо? Индекс помог или нет в этом случае?
-
он помог и отбросил 2 куска с ненужными данными, но тут нужно понимать что (как я понимаю это дополнительный индекс) его использование тоже не бесплатно
-
Да это skipping index, если dropped 0 granules это значит не помог?
-
д
-
они оч специальные и дадут прирост производительности в достаточно редких случаях
-
спасибо, буду смотреть
-
есть возможность отключить использование skipping index'ов для конкретного запроса, чтобы потестить с ними и без?
-
вы например построили индекс по полю X , можно написать where identity(X) = ... , или where X+0 = ....
-
Понял, спасибо!
-
Joined.
-
-
-
а перенести это на момент select к базе не получится?
-
-
Никак. Ещё не сделали.
-
Спасибо
-
нет, просто делать агрегацию уже во время запросов к базе данных
-
Раз в день считать и складывать он результат в отдельную таблицу
-
SELECT max(date), argMax(value, date) - argMin(value,date) WHERE date > '' GROUP BY id
-
sumIf(col, date=today()) - sumIf... Group by id
-
Joined.
-
Joined.
- 02 March 2020 (145 messages)
-
-
Joined.
-
Ребята, всем привет ;-)
-
-
Всем привет, при запросе через http, сервер вырубается. В логах прописаны такие строки
2020.03.02 13:41:47.048545 [ 2873 ] {e206d2c2-2a88-45e9-b30d-6ec2e93aa8d6} <Error> executeQuery: Code: 60, e.displayText() = DB::Exception: Table KPI.firstkpi doesn't exist. (version 19.13.2.19) (from [::ffff:172.28.171.181]:49873) (in query: Select * from KPI.firstkpi FORMAT CSVWithNames ), Stack trace:
0. clickhouse-server(StackTrace::StackTrace()+0x30) [0x6f28600]
1. clickhouse-server(DB::Exception::Exception(std::string const&, int)+0x1f) [0x316365f]
2. clickhouse-server(DB::Context::getTableImpl(std::string const&, std::string const&, DB::Exception*) const+0x39b) [0x5d4d09b]
3. clickhouse-server(DB::Context::getTable(std::string const&, std::string const&) const+0x5f) [0x5d4d42f]
4. clickhouse-server(DB::InterpreterSelectQuery::InterpreterSelectQuery(std::shared_ptr<DB::IAST> const&, DB::Context const&, std::shared_ptr<DB::IBlockInputStream> const&, std::shared_ptr<DB::IStorage> const&, DB::SelectQueryOptions const&, std::vector<std::string, std::allocator<std::string> > const&)+0x11e9) [0x5daca59]
5. clickhouse-server(DB::InterpreterSelectQuery::InterpreterSelectQuery(std::shared_ptr<DB::IAST> const&, DB::Context const&, DB::SelectQueryOptions const&, std::vector<std::string, std::allocator<std::string> > const&)+0x3b) [0x5dacebb]
6. clickhouse-server(DB::InterpreterSelectWithUnionQuery::InterpreterSelectWithUnionQuery(std::shared_ptr<DB::IAST> const&, DB::Context const&, DB::SelectQueryOptions const&, std::vector<std::string, std::allocator<std::string> > const&)+0x758) [0x5dc84a8]
7. clickhouse-server(DB::InterpreterFactory::get(std::shared_ptr<DB::IAST>&, DB::Context&, DB::QueryProcessingStage::Enum)+0x120) [0x5d92b00]
8. clickhouse-server() [0x5ebbd81]
9. clickhouse-server(DB::executeQuery(DB::ReadBuffer&, DB::WriteBuffer&, bool, DB::Context&, std::function<void (std::string const&)>, std::function<void (std::string const&)>)+0x1ef) [0x5ebe71f]
10. clickhouse-server(DB::HTTPHandler::processQuery(Poco::Net::HTTPServerRequest&, HTMLForm&, Poco::Net::HTTPServerResponse&, DB::HTTPHandler::Output&)+0x16dc) [0x31b19fc]
11. clickhouse-server(DB::HTTPHandler::handleRequest(Poco::Net::HTTPServerRequest&, Poco::Net::HTTPServerResponse&)+0x443) [0x31b4bb3]
12. clickhouse-server(Poco::Net::HTTPServerConnection::run()+0x2af) [0x6a76f2f]
13. clickhouse-server(Poco::Net::TCPServerConnection::start()+0xf) [0x6a6dc7f]
14. clickhouse-server(Poco::Net::TCPServerDispatcher::run()+0x166) [0x6a6e046]
15. clickhouse-server(Poco::PooledThread::run()+0x77) [0x70fd527]
16. clickhouse-server(Poco::ThreadImpl::runnableEntry(void*)+0x38) [0x70f96e8]
17. clickhouse-server() [0x76cb73f]
18. /lib64/libpthread.so.0(+0x7dd5) [0x7f524afa7dd5]
19. /lib64/libc.so.6(clone+0x6d) [0x7f524a9ceead] -
-
Table KPI.firstkpi doesn't exist
а таблица существует? -
-
и прям сервер умирает?
-
-
-
-
-
а через cli зайти?
-
-
command line interface
-
-
-
-
а может ли он не отвечать из-за того что было много единовременных запросов? просто тестили одну систему и, как мне кажется, человек накликал кнопку, потому что этот лог выводился 4 раза подряд
-
-
^[^x]
-
-
asyncio + REST
-
-
-
-
Привет, есть кто может хелпануть по куберу?
-
подскажите, какие функции есть в кх по работе с регулярками, нужна функция по поиску значений в колонке в соответствии с регуляркой
-
Joined.
-
Joined.
-
подскажите пожалуйста еще как обрабатывать null, привычная функция is null, is not null не работает
-
Подскажите пожалуйста, почему может такое происходить? Я явно указываю базу, а клиент пытается подключиться к "default".
-
-
-
Могу ошибаться, а разве нужно писать --database при указании базы?
-
благодарю, а как написать в case when value = null then 1
-
case when value isNull then 1 так не работает
-
when isNull(value) then
-
А с какой версии КХ появился CREATE DICTIONARY?
-
Пытаюсь импортнуть данные в таблицу, используя команду "zcat ./cl_crm_access.tsv.gz | clickhouse-client --host ****.mdb.yandexcloud.net --user dude --database test --port 9440 --password=123123123123 --multiquery --query="INSERT INTO test.crm_access FORMAT TabSeparated"", на что мне отвечает "Code: 32. DB::Exception: Attempt to read after eof". Это баг какой или что?
-
-
Если мультиквери ключик, то запрос надо точкой с запятой закончить.
-
Добрый день, каким запросом можно получить кол-во строк в таблице в разбивке по номеру шарда без выгрузки целых колонок куда-либо? Может кто сталкивался с этим?
-
Коллеги, нет ли какого-то параметра, чтобы ClickHouse не генерил текстовую ошибку, а просто завершал запрос?
Потоково выгружаем логи в файл и, если возникает какая-то ошибка в середине выгрузки, то эта ошибка попадает в итоговый файлик. -
А, остался с прошлого раза. Но я его убрал и ничего не поменялось.
-
Поставил точку с запятой, тоже не помогло.(
-
-
Этот TSV clickhouse же и выплюнул. Посмотреть возможности нет, он в сжатом виде весит в 6гб. Сжимал пайпом через gzip.
-
А экспортировал через clickhouse-client --query="SELECT * FROM crm_access FORMAT TabSeparated;" --password=*** | gzip > cl_crm_access.tsv.gz
-
-
А, да. С форматами native, csv тож самое.
-
странный вопрос. как стринг выглядит?
-
Joined.
-
19.17
-
Баг. Какая версия кх?
-
Буквы латинского алфавита) Я нашел решение только через миграция в другую таблицу и обратно
-
19.14
-
И что типа каждая буква это элемент массива?
Типа 'abc' -> ['a','b','c'] ? -
Нет, строчка без разделителей. Я пробовал modify column Array(String), но тогда в итоге получаются пустые массивы. Не нашел другой функции, которая могла бы просто перегнать String в Array (String)
-
[ colname ]
-
А кх не падает? select uptime()
-
Modify column Array([columname])?
-
Просто [ colname ] -- превратит строку в массив с одним элементом
-
Работают , скорее всего вам нужен join_use_nulls=1
и лучше обойтись без join, покажите пример что на входе и что надо заполнить, что получить на выходе -
Не падает. Он вообще managed в яндексе. И мощности выбраны нормальные.
-
Так, я нашёл причину. Стучался без ssl.
-
Спасибо всем принявшим участие.)
-
в кафке:
| received_at | mc_id | weight |
| 2020-03-02 00:00:01 | 1 | 100 |
в словаре есть другие mc:
| id | name | connection_type |
| 1 | AAA | active |
| 2 | BBB | active |
| 3 | CCC | active |
в итоге должно быть:
| received_at | mc_id | weight |
| 2020-03-02 00:00:00 | 1 | 100 |
| 2020-03-02 00:00:00 | 2 | 0 |
| 2020-03-02 00:00:00 | 3 | 0 |
мой запрос вот такой:
CREATE MATERIALIZED VIEW count_successes_mv`ON CLUSTER staging TO `.count_successes_distributed` (
`received_at` DateTime,
`mc_id` UInt16,
`value` UInt32
) AS
SELECT
toStartOfInterval(received_at, toIntervalSecond(10)) AS received_at,
toUInt16(multiIf(mc_id=id,mc_id,id)) AS mc_id,
toUInt32(multiIf(mc_id=id,count(),0)) AS value
FROM `.all_messages_kafka`
CROSS JOIN mc_ids
WHERE
resp = 0 AND connection_type='active'
GROUP BY
received_at,
mc_id,
id
но он не работает -
Каким должен быть expression?
Alter table TABLENAME modify column COLUMNNAME expression -
Joined.
-
Круто! спасибо
-
Привет! Как в clickhouse можно указать сортировку данных в партиции по убыванию (DESC) и можно ли вообще ?
Есть таблица:
CREATE TABLE IF NOT EXISTS news.news_2
(
id UUID,
entityId String,
entityType String,
userId String,
createTime Int64,
) ENGINE = MergeTree
PARTITION BY userId
ORDER BY createTime DESC;
Я имею ввиду строку ORDER BY createTime DESC; -
Задача которую хочется решить - чтобы данные были отсортированы по createTime по убыванию времени и запрос SELECT * FROM news_2 WHERE userId = '...' отдавал данные как можно быстрее.
-
Тоесть запрос всегда будет выбирать данные по userId
-
проблема такого подхода в том что в кафку кладем mc_id 1,2,3 , случайно они попадают в 3 разных блока, и MV вставляет 9 строк, если случайно попадают в 1 блок, MV вставляет 3 строки
FROM .all_messages_kafka x
CROSS JOIN mc_ids y on x.mc_id = y.mc_id -
но все равно нельзя написать регулярку не выбирай только колонку X, если есть другие колонки XX, X1, если их полностью не перечислять
-
можно ORDER BY (-createTime) -- но это бессмысленно
-
select desc и так неплохо работает по ORDER BY createTime, но медленее конечно
-
а что SELECT * FROM news_2 WHERE userId = '...' order by createTime desc не использует индекс?
-
Индекс добавлю. Просто хотелось решить задачу без дополнительных действий. Например cassandra/scylla/dynamo умеют сразу класть данные в партицию в нужном порядке, думал в клике из коробки есть нечто подобное.
-
a нет, alter modify такое не умеет, только если сначала alter update и потом alter modify
-
нет, и насколько я понимаю никогда не будет, вы проверьте сначала с таблицей ORDER BY createTime и так более менее работает
-
@den_crane спасибо, потесчу
-
Подскажите как пробросить variable в запросе через javascript
делаю следующее:
const test = "2020-03-01 00:00:00";
const query = `
SELECT
...
WHERE
EventTime >= toDateTime(${test})
`;
и, получаю ошибку:
DB::Exception: Syntax error: failed at position 270 (line 13, col 44): 00:00:00)\ -
toDateTime('${test}')
-
Joined.
-
Спасибо, так работает..
-
То есть только миграция в другую таблицу может помочь?
-
Так задача была получить колонки , не начинающиеся на Х
-
????
create table M (A String, B Int64) Engine=MergeTree order by B;
insert into M values ('s', 1) ('xxx',2);
alter table M update A = toString([A]) where 1;
подождать 8 минут, пока дропнутся неактивные (или detach table M; / attach table M;)
alter table M modify column A Array(String); -
хотя нет, фигня какая-то
-
Joined.
-
Говорит cannot parse [
-
и вообще неправльно работает по крайней мере 19.17.9.60, похоже alter table modify сломался, все работало в 19.14
-
Судя по всему, все же можно:
select columns('[^database]') from system.merges;
select columns('[^databas]') from system.merges; -
alter table update block_array = cast([column] as Array(String)) where 1; если кому-то еще понадобится)
-
create table T(cat String, catcat String, cacat String, catca String, dog String) Engine=Memory;
как выбрать все колонки не cat и не dog ? ('catcat', 'cacat', 'catca') -
Joined.
-
всем привет!
есть задача перелить таблицу
выполняю через INSERT INTO SELECT FROM
и очередной раз процесс завершается с такой ошибкой
↗ Progress: 415.67 million rows, 254.44 GB (196.53 thousand rows/s., 120.30 MB/s.) █████████████████████████████████████████▎ 35Received exception from server (version 19.17.6):
Code: 246. DB::Exception: Received from localhost:9000. DB::Exception: Received from clickhouse-node4.intra:9000. DB::Exception: Bad size of marks file '/var/lib/clickhouse/data/stats/antifraud_statistics_shows_goods_1574781952/20191223_3076_3078_1/resolution_width.mrk': 0, must be: 16.
0 rows in set. Elapsed: 2116.742 sec. Processed 415.67 million rows, 254.44 GB (196.37 thousand rows/s., 120.20 MB/s.) -
сталкивались ли кто то с подобным?
-
Добрый вечер, прошу помощи с созданием таблицы для однонодового сетапа. Количество созданных партиций ( папок в директории базы: 216216 ) и загрузка диска под 98% в iostat / iotop clickhouse-server подсказывает мне что что-то я делаю не так.
Назначение таблицы:
хранение отсортированных по времени (time_stamp UInt64) цен для инструментов (UInt64)
Количество записей и её использование:
несколько миллиардов за год для 200т инструментов
Запросы к таблице будут поинструментно в рамках одного дня или для поточных данных
Организация дискового пространства таблицы:
YYYYMMDD + INSTRUMENT_ID
Создал таблицу следующим образом:
CREATE TABLE test.onetick_bbo ( time_stamp UInt64, RECEIVE_TIME UInt64, BID_SIZE Float64, BID_PRICE Float64, ASK_PRICE Float64, ASK_SIZE Float64, source_venue String, TRADING_PHASE String, VENUE_TRADING_STATUS String, TRADING_STATUS String, SRC_DB String, INSTRUMENT_ID UInt64, SYMBOL_NAME String, NODE_NAME String ) ENGINE = MergeTree() PARTITION BY (toYYYYMM(toDate(time_stamp), INSTRUMENT_ID) ORDER BY (time_stamp, INSTRUMENT_ID) SETTINGS index_granularity = 8192
При попытке записать 400 миллионов записей система отваливается по timeout 900 port, но успевает записать 6316417 записей
> time clickhouse-client --query "INSERT INTO test.onetick_bbo FORMAT CSV" --max_partitions_per_insert_block=800 --max_insert_block_size=1000000 < /opt/tbricks/tmp/onetick_data/get_bbo.output.without_head
Дальнейшая работа с базой осложняется, тем что запрос на любые 5 записей выполняется очень долго - причина высокая загрузка дисков
21018 be/4 clickhou 2.23 M/s 0.00 B/s 0.00 % 78.32 % clickhouse-server --daemon --pid-file=/var/run/clickhouse-server/clickhouse-server.pid --config-file=/etc/clickhouse-server/config.xml [QueryPipelineEx]
К базе в этот момент запросов нет
Обновление:
загрузка диска в фоновом режиме прекратилась, предположу база закончила служебные операции, но столкнулся с другой проблемой, которая подсказывает мне что я неправильно создал таблицу:
time clickhouse-client --query "SELECT * FROM test.onetick_bbo ORDER BY time_stamp ASC LIMIT 10;"
Received exception from server (version 20.3.1):
Code: 241. DB::Exception: Received from localhost:9000. DB::Exception: Memory limit (for query) exceeded: would use 9.32 GiB (attempt to allocate chunk of 4211606 bytes), maximum: 9.31 GiB: (while reading column time_stamp): (while reading from part /opt/clickhouse/data/test/onetick_bbo/206911-210946795_46260_46260_0/ from mark 0 with max_rows_to_read = 8192): While executing MergeTree. -
Joined.
-
попробуйте optimize table antifraud_statistics_shows_goods_1574781952 partition 20191223
-
sudo dmesg |tail -100
там точно не oom-killer убивает КХ ? -
ну так очевидно что с таким кол-вом партов!!! и партиций никуда не поедем.
ENGINE = MergeTree() PARTITION BY toYYYYMM(time_stamp) ORDER BY (INSTRUMENT_ID, time_stamp) -
спасибо, пробую
-
Joined.
-
Joined.
-
ага спасибо!
пробую -
Привет всем!
Пробую LowCardinality(String). Есть требование - быстро получать список уникальных значений колонки (для полноценной замены словарей). Делаю запрос с group by - получается долго. Где-то 0.7сек на млрд строк (и время растёт пропорционально числу строк), т.е. очевидно, что запрос не использует словарь а пробегает по колонке... Зачем? Как быстро получить список значений?
Вот тест:
CREATE TABLE LowCardinalityTest (a LowCardinality(String)) ENGINE = MergeTree() ORDER BY tuple() SETTINGS index_granularity = 8192
INSERT INTO LowCardinalityTest SELECT toString(number % 10) FROM system.numbers LIMIT 1000000000
SELECT a FROM LowCardinalityTest GROUP BY a
...
10 rows in set. Elapsed: 0.640 sec. Processed 1.00 billion rows, 1.00 GB (1.56 billion rows/s., 1.57 GB/s.) -
словарь не общий на всю таблицу
-
Ну так мёржить можно быстро. Просто мне нужно знать, что нет возможности получать это по словарю (или почанковым словарям) и что-то делается по колонкам. Тогда LC нам не подойдёт.
-
c 19.17
https://clickhouse.tech/docs/en/changelog/#clickhouse-release-v19-17-4-11-2019-11-22 -
да, в каждом парте .dict файл
читаем только словарь
SELECT a FROM LowCardinalityTest GROUP BY a
Elapsed: 0.302 sec. Processed 1.00 billion rows
читаем словарь, unbox значения,
SELECT distinct(a) FROM LowCardinalityTest
Elapsed: 2.822 sec. Processed 1.00 billion rows -
Да не похоже на только словарь. 0.3сек! У меня 0.6-0.7 вот. Если сделать 5млрд, то будет 1.5сек. На диске вижу 7 партов, словари - по 2 файла в каждом. Повторный запрос не ускоряет - т.е. файловый кеш работает, если на холодную делать у меня в более чем 5 раз ещё замедлялось. Откуда 0.3-0.7 сек для чтения мелкого словаря 7 раз из памяти?
-
-
вот такой у нас словарь, не доделано
-
в кликхаусе нет DELETE и UPDATE
-
-
Мне всё-таки кажется, что там нет оптимизации для конкретно запроса типа "SELECT a FROM LowCardinalityTest GROUP BY a", есть общие оптимизации для GROUP BY по LC-колонкам, и только они и используется, всё равно по столбцу пробегаем. Хотелось бы от того, кто с кодом знаком явное подтверждение получить: пробегаем по колонке или только словарь зачитываем. Там 0.3 сек ну никак не сделаешь, если только sleep не ставить.
Вообще, можно специальный какой-нибудь синтаксис придумать для получения уникального списка или договориться, что это заклинание вида "SELECT a FROM LowCardinalityTest GROUP BY a" и сделать для него ещё более специфичную оптимизацию.
Ладно, если никто не напишет по коду, пойду завтра issue в github писать. -
этот вопрос поднимался, там почти не сделано оптимизаций, ускорили только group by одна_low_cardinality_колонка, поэтому даже distinct в разы медленее. Все в курсе, видимо когда-нибудь доделают, колонка не читается, долго делается групбай 1млрд. значений из словаря
-
Спасибо!
-
В словаре тут 10 значений, в том и дело. 1 млрд записей. И похоже что время работы на 1млрд а не на 10 значений x7 партов.
-
Посмотрите видео Кочетова
-
-
Да
-
-
Сколько угодно, ограничено только размер background пула, но зачем вам нужно запускать их параллельно?
-
Нужно выполнить очень неудобный запрос на дедупликацию. Для того чтобы найти дубликаты, нужно много памяти. На всю таблицу сразу, видимо не хватает памяти. Запускаю по партициям. И судя по всему, из-за параллельности оно снова не вмещается в память.
-
-
иными словами, хочется наоборот, почти запретить им запускаться параллельно
-
не знаю как быть с двумя условиями, но убрать все колонки начинающиеся на cat можно так columns('[^cat]')
а вообще эта штука странно себя ведет
в твоем примере columns('[^cat]') - убирает все начинающиеся на cat
а в моем примере
select columns('[^database]') from system.merges; -- убирает колонку database
когда select columns('[^data]') from system.merges; -- не убирает колонку database (а в примере с cat убирает)
Регулярки==магия -
Спасибо.
Вобщем, я так понял, что с тех пор сделали только общую оптимизацию для group by, получение уникальных значений так и не оптимизировано - всё равно там проход по всему столбцу. Быстрее distinct только потому что в distinct раскрывается значение в String, а так всё равно линейная сложность по кол-ву записей.
Это печально, сразу большой минус по сравнению с enum+dict, в частности для grafana не получается использовать LC - дашборды будут долго открываться (там как раз по таким колонкам нужно получать списки уникальных значений - для комбобоксов и наборов кривых на графиках). -
Joined.
-
спасибо огромное за совет
после оптимайза всё влетело -
Вечер добрый, может кто подскажет как сгрупировать и обьеденить массивы (желательно оставить только уникальные значения) и получить один массив на выходе?
SELECT arrayConcat(groupUniqArray(ar))
FROM (
SELECT 1 as id, arrayJoin(array(array(1,2), array(3,4), array(5,6))) as ar
)
GROUP BY id -
arrayDistinct(flatten(arr))
-
@unamedrus спасибо, так же добрался до arrayFlatten но не работало, flatten работает, версия старая, спасибо еще раз
-
groupUniqArrayArray
SELECT arrayConcat(groupUniqArrayArray(ar))
FROM (
SELECT 1 as id, arrayJoin(array(array(1,2), array(3,4), array(5,6))) as ar
)
GROUP BY id
┌─arrayConcat(groupUniqArrayArray(ar))─┐
│ [6,4,5,2,1,3] │
└──────────────────────────────────────┘ -
@den_crane интересно, спасибо, как я понимаю такое даже в исходниках не найти?
-
не найти, это комбинаторы, там можно и еще что-нибудь присобачить groupUniqArrayArrayArrayIf
-
select groupUniqArrayArrayArray([[[1],[2]],[[3]]])
а можно как нить развернуть трехуровневый массив, через комбинаторы?
у меня тупо в лоб не вышло -
select groupUniqArrayArrayArrayArray([[[1],[2]],[[3]]])
-
одного Array не хватило, поня спасибо
- 03 March 2020 (201 messages)
-
видимо да: Killed process 63835 (clickhouse-odbc) total-vm:2212452kB, anon-rss:62596kB, file-rss:1012kB, shmem-rss:0kB , а можете подсказать, что делать в такой ситуации
-
Joined.
-
А сколько памяти у сервера? Сколько своп?
-
-
-
мониторинг есть? Сколько КХ жрет ? И есть ли тенденции на графиках?
-
-
ну график памяти сколько КХ rss (res) есть? Растет или все время 354, а потом хоп и 700.
И вообще как он 354 гб жрет? Постянно идет поток запросов? И они столько занимают? -
а почему 19.13.2.19 ?
-
последняя ведь 19.13.7.57 в 19.13 ветке?
-
систему недавно вывели на прод, поэтому я пока боялся обновлять (знаю что это глупо)😅 , планировал обновить в ближайшее время
-
это не глупо, это нормально как раз. Сначала на стейдже обкатайте 19.13.7.57 и потом на нее обновляйтесь
-
ну график памяти сколько КХ rss (res) есть? Растет или все время 354, а потом хоп и 700.
И вообще как он 354 гб жрет? Постянно идет поток запросов? И они столько занимают? -
графика расхода памяти нет, знаю что в пике он может задействовать все на 100%
-
-
понятно что может, вопрос куда
-
-
-
-
извините, немного не понял вопрос
-
запросы ad-hoc или одинаковые/однородные? может один из запросов имеет много промежуточных данных (потоков много). Пробовали уменьшать лимит потоков?
-
ну DELETE вообще не замена drop partition , даже близко
-
А понимаю
Мне порой нужно строчки из таблиц удалять -
CollapsingMT не вариант?
-
берите LTS 19.14...последнюю
-
Спасибо
-
-
я и сейчас ее советую и даже сам использую на проде, супер стейбл, наверное есть инстансы с годовым аптаймом
-
-
ну а сколько постоянных параллельных запросов ? 10? 100? 1000? куда 354 ГБ уходит?
-
параллельных запросов около 50
-
немного отхожу от темы, но хочу спросить, разве количество параллельных запросов может превышать 100?
-
да, это просто параметр, защитный лимит, можно сколько угодно поставить, нужен ребут
-
select elapsed, formatReadableSize(peak_memory_usage) from system.processes where is_initial_query
-
-
-
я результат запроса хотел увидеть
-
3.7135909 1.87 GiB
1.7821608 1.87 GiB
0.2606541 0.00 B
0.001115937 0.00 B
13.587054 2.27 GiB
12.065541 2.27 GiB
8.055254 2.26 GiB
2.3233924 285.79 MiB
2.072868 1.87 GiB
2.0726457 1.87 GiB
0.6653091 32.35 MiB
0.500187 419.12 MiB
0.43889683 177.87 MiB
0.30426043 73.32 MiB
11.446262 603.57 MiB
11.19572 2.28 GiB
11.19549 2.27 GiB
9.788144 366.21 MiB
6.0558844 2.26 GiB
5.8842487 177.31 MiB
5.6492915 459.29 MiB
0.92088 177.03 MiB
0.44633946 374.98 MiB
20.718945 575.39 MiB
16.815044 378.43 MiB
6.903057 443.29 MiB
6.4000196 2.27 GiB
2.7216785 41.17 MiB
2.4461057 124.87 MiB -
а КХ сколько ест?
-
ps -eo pmem,comm,min_flt,rss,vsz --sort -rss |grep clickhouse-server
-
-
1.5 clickhouse-serv 1047620439 12667828 404281616
0.1 clickhouse-odbc 815766 1449428 1950308 -
12 667 828 -- 12 ГБ, далеко до 700
-
То есть это не правильная команда?
-
Просто через нее мне и выводило 354 гб
-
vsz -- это виртуальная память, адресное пространство, максимум 2^64
-
там может быть любое число, вот например сейчас я вижу кассандру у которой java кушает 2,5TB vsz/ 18 GB res а памяти 32 ГБ у сервера
-
понял, спасибо за ответ, однако, получается, что дело не в оом киллере?
-
что значит не в ООМ-килере
>Killed process 63835 (clickhouse-odbc)
вам графики нужны, чтобы понять что вообще происходит.
а что кстати с cat /proc/sys/vm/overcommit_memory ? -
-
-
-
я в основном заббикс, привык, 17 лет пользуюсь
-
-
Можно мониторить просто сервер?
-
заббикс умеет поддерживать вообще все, хоть кофеварки со стиралками.
-
в забиксе есть траперы, через них и скрипты можно что угодно мониторить
-
кх память в агенте прямо мониторится, для любого процесса
-
если вопрос, использовать в качестве базы для самого заббикса, то ch не подойдет, а если про мониторинг базы ch, то без проблем
-
-
Joined.
-
попробуйте glaber потестить
-
Коллеги добрый день, подскажите, не могу понять делаю запрос "optimaze table test1.test" получаю Found shard without any specified connection. Среда: 2 сервера клика 3 зукипера. На 2 клике запрос выполняется успешно
-
Joined.
-
Привет, а в FORMAT CSV нельзя использовать строки с символом ' ?
Получаю DB::Exception: Expected end of line (речь о словарях, если это имеет значение). -
Можно. Попробуйте либо \’ либо ‘’
-
Да, я ступил и не обернул строки в кавычки. Это помогло.
-
https://github.com/Altinity/clickhouse-zabbix-template
Вот этим шаблоном пользуюсьGitHub - Altinity/clickhouse-zabbix-template: Zabbix template for ClickHouseZabbix template for ClickHouse. Contribute to Altinity/clickhouse-zabbix-template development by creating an account on GitHub.
-
Масяня. Эпизод 53. День сурком
У меня одно время была параноидальная фиксация на фильме "День Сурка". На мне он сработал так, что я решил "а какого хрена вообще фильмы всякие разные смотреть? Мучиться выбирать? Все они одинаковые по большому счету. Буду смотреть один и тот же". В результате я посмотрел "День Сурка" примерно 235 раз. На разных языках, в разной озвучке в разных копиях и на разных устройствах. До сих пор знаю его ВЕСЬ наизусть во всех деталях. Я не смотрел "фильмы", я смотрел "фильм". Прошло примерно через года полтора.. :))) Хотя, должен признаться, что несмотря на параноидальность идеи, логический смысл в этом есть. Большинство фильмов стереотипны и их не запоминаешь, жаль только затраченного времени жизни. Если же смотришь все время один и тот же фильм- то начинаешь его внутренне интерпретировать и самостоятельно в голове выстраивать и находить все новые и новые сюжеты и нюансы.. Главное, чтоб фильм непротивный был, а "ДС" явно не противный. Мульт вовсе не по мотивам, а скорее паралелльно. В перенесении на реальную жизнь…
-
спасибо
-
Подскажите, можно ли настроить SETTINGS передаваемые через remote? Мы обновили CH на одном из кластеров. На втором (не нашем )- не обновили. И теперь при запросе remote из нового кластера в старый пишет "DB::Exception: Unknown setting any_join_distinct_right_table_keys. (version 19.17.6.36 (official build))"
-
Добрый день. Задача привести дату и время к началу определённого часового интервала. Следующий запрос выдаёт странное:
WITH toDateTime('2016-07-09 10:31:12') AS dt
SELECT
dt,
toStartOfInterval(dt, toIntervalHour(1)) AS hours1,
toStartOfInterval(dt, toIntervalHour(2)) AS hours2,
toStartOfInterval(dt, toIntervalHour(3)) AS hours3,
toStartOfInterval(dt, toIntervalHour(4)) AS hours4,
toStartOfInterval(dt, toIntervalHour(6)) AS hours6,
toStartOfInterval(dt, toIntervalHour(12)) AS hours12
┌──────────────────dt─┬──────────────hours1─┬──────────────hours2─┬──────────────hours3─┬──────────────hours4─┬──────────────hours6─┬─────────────hours12─┐
│ 2016-07-09 10:31:12 │ 2016-07-09 10:00:00 │ 2016-07-09 09:00:00 │ 2016-07-09 09:00:00 │ 2016-07-09 07:00:00 │ 2016-07-09 09:00:00 │ 2016-07-09 03:00:00 │
└─────────────────────┴─────────────────────┴─────────────────────┴─────────────────────┴─────────────────────┴─────────────────────┴─────────────────────┘
Ожидаю в hours2 "10:00:00", hours4 "08:00:00", hours6 "06:00:00", hours12 "00:00:00". Что не так? -
скинь ссылку человеку glaber.io
Можно ;)
вы там с человеком определитесь
можно мониторить через zabbix состояние clickhouse
можно данные для zabbix хранить в clickhouse (но это не официальный fork) -
-
в utc норм
WITH toDateTime('2016-07-09 10:31:12', 'UTC') AS dt -
у меня сервер в Europe/Moscow, сейчас попробую
-
Joined.
-
в UTC арифметика работает, а в Europe/Moscow нет. это баг?
-
Joined.
-
Привет! Подскажите, если необходимо сделать отказоустойчивость ClickHouse между нескольких ЦОД, на какие механизмы/реализации посмотреть? Distributed?
-
replicated + distributed, вроде иного не дано
-
так понимаю реплицируются только таблицы и нужен будет зукипер, дистрибьютед тогда не нужен?
-
Реплицируются таблицы на движке Replicated.
distributed это про шардирование. -
т.е. выделенного мастера нет, данные реплицируются на все сервера которые указаны в зукипере?
-
Мастера нет, репликацию я бы назвал направленной. Т.е. не на все, а как настроите
-
-
понял, спасибо!
-
Вот тут много полезной инфы https://clickhouse.tech/docs/ru/operations/table_engines/replication/
-
спасибо!
-
данный способ корректный. или есть лучше?
.toISOString().slice(0,10) -
-
-
Amplifying ClickHouse Capacity with Multi-Volume Storage (Part 2)
This article is a continuation of the series describing multi-volume storage, which greatly increases ClickHouse server capacity using tiered storage. In the previous article we introduced why tiered storage is important, described multi-volume organization in ClickHouse, and worked through a concrete example of setting up disk definitions.
-
🙏
-
Всем привет!
Мы в Beresnev Games, независимый разработчик игр из Чехии, ищем Data Engineer на текущие и будущие проекты:
- Построение новых и оптимизация существующих ETL-процессов. Проверка сбора, консистентности, обработки и агрегации данных;
- Развивать инфраструктуру для решения задач продуктовой аналитики на базе OLAP Clickhouse;
- Разработка и поддержка серверной части игр: лидерборды, турниры, спешл офферы и др;
- Разработка систем детекции аномалий в данных;
- Поддержка аналитиков в развертывании систем предсказания метрик (ML).
Более подробная информация по вакансии по ссылке: https://beresnev.games/vacancies/list/data-engineer/
Свои CV можете направлять сразу мне либо же на hr@beresnev.games
Всем продуктивного дня. -
-
всем привет) поправьте, если не прав плиз. у меня сложилось такое понимание, что для вот таких запросов:
SELECT * FROM audit_logs WHERE user_id = ... ORDER BY created_at LIMIT 100 OFFSET 10000;
clickhouse не подходит и будет скорее всего даже медленнее реляционной базы, в которой стоят нужные индексы. так ли это? -
Всем привет
Подскажите пжл, kafka engine умеет работать с json-в-json? -
нет, надо просто правильно настроить сортировку у таблицы
-
т.е. не по created_at, а по user_id? а он тогда не будет сортировать по created_at в памяти на каждый запрос?
-
по user_id и created_at
-
-
всем привет
можно как то "по человечески" записать эти union all
.........
from (
select count(),
dictGet('xxx', 'yyy', cod) as id
from table1
group by id) s
any left join (
select
0 id, 'name_0' name
union all
select
1, 'name_1'
union all
select
2, 'name_2'
union all
select
3, 'name_3' ) z on z.id = s.id -
WITH [1, 2, 3, 4] AS v
SELECT
arrayJoin(v) AS number,
concat('name_', toString(number)) AS name
┌─number─┬─name───┐
│ 1 │ name_1 │
│ 2 │ name_2 │
│ 3 │ name_3 │
│ 4 │ name_4 │
└────────┴────────┘ -
-
-
спасибо) а что если в запросе есть еще какое-нибудь WHERE event_type = ..., то он же просканит все записи для указанного user_id? или по event_type можно поддерживать какой-то индекс, чтобы читать выборочно?
-
если часто бывают такие запросы, то можно в сортировку добавить
-
просто сортировку можно только одну сделать, а параметры в запросах могут быть разные. а не для этого случаем materialized views используют?
-
-
окей, понял, спасибо еще раз)
-
-
спасибо, сам дошел
-
Здравствуйте всем. Подскажите, есть ли функция которая сможет правильно вывести результат запроса SELECT '50.17' > '50.5'? Можно конечно версию разделить на части и все привести к числовому типу. Но хотелось бы знать, есть ли какие-нибудь встроенные функции для подобного рода решения задачи
-
cast to FLoat? зачем делить?
-
или у вас больше одной точки будет в версиях?
-
Нет
-
😢спасибо
-
А планируется когда нибудь добавить какие нибудь endOf? toEndOfDay например
-
это сделать можно сделать через toStartOfDay, так что думаю если не написать что такая фича нужна в гитхабе, никто не сделает
-
-
-
any_join_distinct_right_table_key в каком файле надо прописывать ?
-
В версии больше одной точки
-
ну это понятно, что это можно сделать через toStartOfDay(toDate('2020-03-03') + 1) - 1 as endOfDay, хотелось бы конечно так не делать)
-
Привет!
Есть запрос с подзапросом. В подзапросе считается bookings и total_price.
В вернеуровневом запросе делается:
SELECT if(bookings != 0, total_price / bookings, total_price) as average_price ...
И я ловлю DB::Exception: Division by zero -
если хочешь, что бы появилась фича, то пиши ишью, она в сущности достаточно простая)
-
это не оттуда
SELECT 1/0
дает Inf а не division by zero -
Оттуда. Если я уберу из верхнеуровневого селекта конкретно эту строку, то все работает как надо.
-
Вроде как кликхаус всегда выполняет все ветки ветвлений
-
В смысле? Это значило бы, что if бесполезен
-
-
-
-
будет только 1 партиция
-
-
Спасибо!
-
Ну т.е. это ок и в данном случае я не могу воспользоваться таким ifом?
-
имхо, ты можешь его просто перенести
total_price / if(bookings ! = 0, bookings, 1) -
ну или в nullIf обернуть
-
нет
-
-
Подскажите. Тестирую bloom индексы . Делаю запрос в tabix/clickhouse-client к таблице , к которой их нет. На выходе стандартная статистика - сколько стро прочиталось/какой объем. Делаю запрос к таблице с индексами - ничего. Вопрос, действительно ли ничего 😁, или ещё не завезли корректное отображение ? Данные в таблицах идентичны , за исключением индексов . В запросе в качестве предиката используется поле, указанное в bloom индексе.
-
До такого не додумался, спасибо!
-
Попробовал. Работает и для odbc
-
а вот такой вопрос - как замена kdb+ кликхаус вообще годится или лучше не
-
Кому как. Плюсы kdb+ — скорость, расширяемость через UDFs. Минусы — язык запросов, цена. Кликхаус — быстрый, бесплатный и SQL. С UDF только плохо.
-
а не подскажете, есть ли где бенчмарки посмотреть - даже если biased
-
https://clickhouse.tech/benchmark_hardware.html
https://clickhouse.tech/benchmark.html -
я имел ввиду сравнение с kdb+ :)
-
How to Analyze Billions of Records per Second on a Single Desktop PC
Introduction This article gives an overview of LocustDB [1], a new and extremely fast open-source analytics database built in Rust. Part 1 gives some background on analytical query systems and my g…
-
Спасибо!
-
Есть сравнение с MemSQL и DolphinDB, которые примерно на уровне kdb+: https://medium.com/prooftrading/selecting-a-database-for-an-algorithmic-trading-system-2d25f9648d02Selecting a Database for an Algorithmic Trading System
One of the key components of nearly any software system is the database used to persist, retrieve, and analyze data. In this technical…
-
Ага спасибо большое Саша
-
подскажите плз, отправляю данные скриптом через requests.post для date,datetime 1583162310,1583162310(одинаковые значения). в таблице при этом datetime определяется корректно 2020-03-02 18:18:30 , а date 1995-01-28. Если query скопировать вручную и вставить, то date определяется корректно
-
date -- это кол-во дней после 1970, а вы кол-во сек. фигачите
-
-
дада, это починили недавно
-
проблема поди у вас в клиентском драйывере, он просто приводит к UInt16
-
SELECT toUInt16(1583162310)
┌─toUInt16(1583162310)─┐
│ 9158 │
└──────────────────────┘
SELECT toDate(9158)
┌─toDate(9158)─┐
│ 1995-01-28 │
└──────────────┘ -
Всем привет! Как написать запрос, чтобы возвращались все столбцы, где значения NotNULL, на примере,
Select * from table Where all fields != null
? -
ifNull пробовали?
Пардон, не так понял ) -
если допустим
1 null 3
null 1 2
то что должно вернуть -
только 3 столбец?
-
а нет кстати
insert into F format TSV 1583162310
insert into F values(1583162310)
SELECT *
FROM F
┌──────────A─┐
│ 0000-00-00 │
└────────────┘
┌──────────A─┐
│ 2020-03-02 │
└────────────┘ -
должен строки и в каждой строке только те колонки где значения not null
-
никак, кол-во колонок в SQL базах известно до выполнения запроса
-
можно сделать так что бы возвращал все колонки, но там где null возвращал либо 0 либо пустую строку
-
-
Наверно проще делать select * from а потом уже на клиенте фильтровать там где null. Спасибо
-
привет! нужен совет: нужно создать процесс переноса данных из mysql в КХ. Если просто: есть тяжелый SQL запрос в mysql 5.7, хочу его результаты залить в КХ. Там штук 6 джойнов таблиц (около 30 млн строк).
текущий вариант: mysql -> csv -> КХ кажется не самым оптимальным.
погуглил, есть какие-то решения, но не очень красивые. Есть опция загрузить сырые таблицы в КХ, затем их уже джойнить в КХ. Но кажется, что будет работать дольше -
https://www.altinity.com/blog/2018/6/30/realtime-mysql-clickhouse-replication-in-practice
может это поможетRealtime replication from MySQL to ClickHouse in practiceJuly 2, 2018Vladislav Klimenko from Altinity and Valery Panov from Ivinco presented a talk at HighLoad Siberia 2018 conference recently. They described the real problem that Ivinco faced and how it has been solved with migration of analytics from MySQL into ClickHouse using MySQL to ClickHouse replication. A few months ago we introduced clickhouse-mysql tool in our blog, and Ivinco was the first company we know that tried it and used it in production.
-
-
-
-
>mysql -> csv -> КХ кажется не самым оптимальным.
это самый оптимальный со многих точек зрения путь -
и по перфомансу the best
-
-
и отлаживать и программировать легче всего
-
-
Нужно конвертить в timestamp в постгресе, либо делать toDate в клике
-
А для словарей есть похожий хак?
В PG Date, в словаре тоже хочется Date -
Приводите в постгресе поле в стринг/timestamp, а в словаре обозначайте тип данных date
-
Сработало, спасибо!
-
Пожалуйста. У нас мы для словарей из ПГ делаем вью для Клика, чтобы не менять саму таблицу
-
добрый вечер, столкнулись с такой проблемой
есть несколько таблиц, которые постоянно дописываются свежими данными из PG
мы хотели бы создать materialized view (MQT) сджойнив несколько таблиц. как мы поняли, рефреш MQT происходит автоматически, и это может приводить к тому, что свежие данные, залитые в 1 таблицу, не могут сджойнится с тем, что еще не записалось во вторую таблицу.
надеюсь понятно описал о_О
отсюда возникает вопрос, есть ли какой-то параметр, который позволяет назначить время для рефреша MQT или как-то разрешить порядок обработки джойна, что-то вроде - если есть все сопоставимые данные - джойнить и выводить, иначе ждать? -
ну и да, джойн 2 таблиц с примерно 30-50кк записей выглядит вот так XD
-
-
похоже на джойн таблиц у которых ключ шардирования разный
-
все на 1 физической машине без шардов и нод
-
грустно, кажется, что вам все таки нужен внешний скрипт для решения задачи
-
-
mat view это просто триггер на вставку, по факту на каждую вставку у вас делается join
-
боюсь, других mat view в кликхаусе у меня для вас нет)
но вообще все зависит от того, какой вам нужно join таблиц сделать -
возможно получится обойтись малой кровью
-
-
summing же?
replacing заменит одной из двух
summing сложит -
-
это вполне возможно будет дико тупить, если в каждом триггере прописать join
-
-
- 04 March 2020 (302 messages)
-
Доброго времени суток. Есть кто использует CH с Golang?
Как замапить в go nested структуры из CH (используя db struct tag)?
Пример. Есть таблица:
create table users
(
id Int32,
name String,
items Nested(
color Int32,
weight Int32
)
)
И есть структуры:
package main
type itemType struct {
Color int32 `db:"items.color"` // ???
Weight int32 `db:"items.weight"` // ???
}
type user struct {
Id int32 `db:"id"`
Name string `db:"name"`
Items []itemType `db:"items"` // ???
}
Или надо как-то велосипедить?
Ну или хотя бы вычитать значение items.color и items.weight их КХ в массивы (сам потом склею) -
Joined.
-
-
-
вернее по другому записать
-
Попробуйте groupArray(10)(...). 10 это максимальное количество элементов
-
окей, спасибо)
-
а можно groupArray реализовать по другому?
-
На C++ можно всё. Что не так с groupArray?
-
Эта операция отжирает много оперативной памяти и кликхаус падает с ошибокй. Я выяснил что количество элементов достигает 20 поэтому менять это число нельзя
-
-
Что за драйвер используется?
-
mailru
-
-
Поставьте 5. Или используйте groupArrayUniq
-
А что за ошибку выводит если как у вас в примере?
-
Или может вам подойдёт topK. Пока нет деталей что и как делаете - гадать можно долго
-
Без ошибок, возвращает пустую структуру. Как только из выборки убираю поле из нестеда, все работает.
Запросы строю через dbr -
type itemType struct {
Color int32 `db:"color"` // ???
Weight int32 `db:"weight"` // ???
}
Может так надо просто дергать? -
Тоже не помогло. В дороге вычитал, что есть еще prefix в тегах. Доберусь до компа попробую
-
мы хотели сделать стронг джойн нескольких таблиц с argMax() значениями, но, как я понимаю, это на данный момент не реализуемо.
-
Joined.
-
а что это за инструмент?
-
Функция в кликхаус
-
-
Всем привет! Такая ситуация: делаю
select date, id, sum(val) from my_table where id = 22 and date '2020-02-29'
получаю val=100. Затем следует:
insert into my_table (date, id, val) values ('2020-02-29', 22, 20)
КХ пишет ok, 1 rows in set. Делаю повторно select (выше) - результат val не меняется. Коллеги говорят, что тоже с таким сталкивались. С чем может быть связано? Как починить? -
-
Вы не поверите, это описано в доке https://clickhouse.tech/docs/ru/query_language/agg_functions/reference/#topk-n-column
-
Окей, я наверно ваше предыдущее сообщение неправильно понял.
-
Show create my_table покажите?
-
-
Да, пару минут. Нагуглил тут такое:
Если база в ответ на INSERT мне ответила 200 OK, я спокойно переворачиваюсь на другой бок и сплю дальше. Если ClickHouse ответил мне 200 OK, хоть убейте, а сна нет. В общем случае я понятия не имею, сохранятся ли мои данные. Обычно сохраняются, но могут же и не.
Это рядовая ситуация для КХ? -
да и кстати group by date,id
-
интересная идея
-
-
это какая такая база позволяет вам спать спокойно?
-
-
-
Да, конечно, я перестарался сокращая запрос
-
-
костя, у вас все волосы повыпадали с нее.. бегите )
-
-
-
CREATE TABLE sumstat (`date` Date, `cli_id` String, `id` Int64, `val` Int32) ENGINE = ReplicatedSummingMergeTree('/clickhouse_perftest/tables/{shard}/sumstat', '{replica}', date, (date, cli_id, id), 8192)
Изначальный insert
insert into sumstat (date, cli_id, id, val) values ('2020-02-29', '14', 21137640, 5454286)
Изначальный select
select date, cli_id, id, sum(val) from sumstat where cli_id='14' and date between '2020-02-01' and '2020-02-29' and id=21137640 group by date, cli_id, id order by date, id -
-
не ну так не честно Ваня, это ж SummingMergeTree
-
BackingProcTool, MerginAggregatd, ExterLtd потребляют по 49 гб каждый
-
вы в обычную пишите и спите спокойно
-
-
)) Я не гоню на КХ, Хочу разобраться. Когда лыжи не едут на ровном месте начинаешь сходить с ума
-
-
Товарищи, нужна помощь!
Всем привет, MV будет в фоне производить SELECT ? или сразу при вставке?
вопрсо к тому как много MV вы используете в своих проектах -
-
При вставке данных в таблицу они сохраняются как есть. Периодически ClickHouse выполняет слияние вставленных кусков данных и именно в этот момент производится суммирование и замена многих строк с одинаковым первичным ключом на одну для каждого результирующего куска данных.
ClickHouse может слить куски данных таким образом, что не все строки с одинаковым первичным ключом окажутся в одном финальном куске, т.е. суммирование будет не полным. Поэтому, при выборке данных (SELECT) необходимо использовать агрегатную функцию sum() и секцию GROUP BY как описано в примере выше. -
ключевое слово периодически :)
-
щас не помню но вроде как там слияние говорили каждые 8 минут происходит...
-
там же в доках и написано что надо использовать в дополнение к обычному mergetree чтобы лучше спать ))
-
надо понимать что это периодически, может также означать никогда
-
-
Это же нормально работает? и что вставляете потом? Если вставите то же, то оно не вставится
insert into sumstat (date, cli_id, id, val) values ('2020-02-29', '14', 21137640, 5454286)
insert into sumstat (date, cli_id, id, val) values ('2020-02-29', '14', 21137640, 5454286)
insert into sumstat (date, cli_id, id, val) values ('2020-02-29', '14', 21137640, 5454286)
insert into sumstat (date, cli_id, id, val) values ('2020-02-29', '14', 21137640, 5454286)
у вас вставится только первая. Остальные напишет ОК/200. но не вставятся строки
Кликхаус сохранаяет у себя хеш последних 100 вставленных блоков, и если вставить то же самое ничего не прозайдет -
Агааа, т.е. если изменить val хотя бы на 1, то это должно сработать, логика такая?
-
да, но есть флаг который эту проверку не делает
-
SELECT *
FROM system.settings
WHERE name = 'insert_deduplicate'
┌─name───────────────┬─value─┬─changed─┬─description───────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ insert_deduplicate │ 1 │ 0 │ For INSERT queries in the replicated table, specifies that deduplication of insertings blocks should be preformed │
└────────────────────┴───────┴─────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ -
Попробуйте так
clickhouse-client --insert_deduplicate=0
ну или если вставляете через http передайте в аргумент -
Сработало! Благодарю
-
Но это не рекомендуется, из-за того что нету транзакций, типо минимальная защита от дублирования данных, чтобы для Replicated не вставить на двух нодах одно и то же
-
Вам надо хайку писать Костя...
поставил постргя
сон мой не потревожить
а главное сколько потратить можно теперь
ладно, сегодня туман... -
кстати если бы у вас не было Replicated, всё было бы ок
-
-
На ус мотаю
-
-
вы главное в японии на китайском не говорите :)
-
а что будет?
-
можно попробывать поизвращатся с summingmergetree или aggregatingmergetree
-
недолюбливают друг друга )) чутьчуть
-
-
-
сразу при вставке
-
спасибо
-
-
ага я сразу еще вас с китайцем перепутал, долго удивлялся что не он...
-
-
-
так много это сколько?
посмотри чем занимается он -
128 гб
-
это помимо словарей и кэша засечек?
-
-
-
Да. на запрос system.processes не выдает запросов
-
словарей нет, а что такое кэш засечек?
-
-
Я только что его сбросил через SYSTEM DROP MARK CACHE
-
-
-
-
SYSTEM DROP MARK CACHE а эта команда не сбрасывает кэш?
-
Проверьте через free -h действительно ли память занята.
Ну и помимо processes там есть ещё:
select * from system.merges -
-
SELECT
database
table,
count() AS cnt_parts,
sum( rows ) AS rows_,
sum( data_compressed_bytes ) AS data_compressed_bytes_,
sum( data_uncompressed_bytes ) AS data_uncompressed_bytes_,
toUInt64( data_compressed_bytes_ / data_uncompressed_bytes_ * 10000 ) / 100 AS compress_perc,
sum( marks ) AS marks_,
sum( marks_bytes ) AS marks_bytes_,
sum( primary_key_bytes_in_memory_allocated ) AS primary_key_bytes_in_memory_allocated_
FROM system.parts
WHERE active = 1
GROUP BY database, table
ORDER BY database, table DESC; -
-
primary_key_bytes_in_memory_allocated_ - этот постоянно в памяти
marks_bytes_ - этот по ситуации подгружается -
если просуммировать эти два столбца - получается 127 Gb ?
-
проверил system.merges выдает нулевой результат, а память действительно забита
-
сейчас проверю, спасибо
-
вывод free -h?
-
если сумма будет примерно похожа - сделайте SYSTEM DROP MARK CACHE и посмотрите, бедут ли эффект? если нет, значит это не кэш засечек, а что то ещё
-
-
вот тут ещё советовали:
https://t.me/clickhouse_ru/90371Denny Crane (I don't work at Yandex (never did)) in ClickHouse не тормозитпопробуйте SYSTEM DROP MARK CACHE; echo 1 > /proc/sys/vm/drop_caches может это только в озу
-
там выходит всего 2,5 гб
-
значит см. ссылочку последнюю... это кэш ОС хулиганит
-
да это в любой линукс системе такое будет... выдыхайте все у вас хорошо с памятью
-
вернее у вас не знаю, а у сервера - точно ))
-
а почему? просто раньше такого не было
-
добрый день! подскажите, столкнулись со странным спецэффектом при подключении таблицы к кафке через MV. Сетап достаточно простой (как в доке):
CREATE TABLE events {
...
} ENGINE = MergeTree()
CREATE TABLE events_queue AS events ENGINE = Kafka('kafka-1:9092,kafka-2:9092', 'Topic001', 'Group001', 'JSONEachRow');
CREATE MATERIALIZED VIEW events_consumer TO events AS SELECT * FROM events_queue;
При паблише в кафку события поялявются в таблице events, но периодически таблица самоочищается. Например, пишем в кафку 10k событий (по одному) раз в 15 сек и паралельно делаем SELECT count(*) FROM events и наблюдаем цифры типа 0, 0, 10000, 10000, 20000, 0, 10000
Ощущение, что упускаем что-то очень банальное :) -
Ну вы пользовались сервером запускали там кликхаус и проч - память бралась, поскольку она пока не нужна и свободной много то ОС очищать ее не торопится
-
а почему тогда при выполнении небольшого запроса ОС потребляет еще больше оперативы, а не использует из 127 гб забитых?
-
Ну это не кеши системы тогда.
Проверяйте параметры КХ. Возможно баг -
потому что пока есть еще свободная память
-
смысл ее туда сюда гонять
-
-
начнет помирать от OOM тогда можно смотреть - но все линукс системы которые я видел всегда ютилизируют всю память независимо от нагрузки
-
Привет, подскажите должна ли работать функция optimaze при запросе к реплицируемой таблице на 2 серверах, у нас работает только на 1 серваке, на втором ошибка 'found shard without any specified connection' и это для таблицы с 1 строкой😱😱😱😱
-
по крайней мере то что показывается через free
-
*optimaze никто не сталкивался?
-
select * from system.replication_queue
select * from system.mutations -
select * from system.mutations выдал 2 запроса
-
Ну и изучайте
select * from system.metrics
select * from system.asynchronous_metrics -
спасибо, тяжело однако быть разработчиком
-
похоже Al был прав, я перезагрузил clickhouse и все ок
-
Возможно это что-то с мутациями, т.к. у меня free выглядит вот так на машинах
total used free shared buff/cache available
Mem: 377G 4.4G 35G 9.8M 337G 370G
Swap: 0B 0B 0B -
-
merge?
-
Всем привет! Наверное, имеется ввиду OPTIMIZE TABLE?
Мы тоже столкнулись с похожей проблемой: 1 шард, 2 реплики Кликхауса. Таблица с движком ReplicatedMergeTree. На одном сервере OPTIMIZE TABLE работает, на втором выдаёт ошибку 'found shard without any specified connection'
Кто-нибудь ещё сталкивался с такой проблемой? -
Да все верно, я совсем недавно изучаю клик и данная ошибка не логична, пока решения не нашёл.
-
Joined.
-
Joined.
-
Подскажите, пожалуйста, Ничего страшного что Clickhouse подцепился только 1 ноде zookeer?
-
-
Дедупликация реплицированной таблицы
-
Спасибо, разобрались
-
кх нода подключается только к одной зк ноде одновременно
-
-
-
-
Типа в mergetree таблице исчезают запси?
В логе кх надо смотреть -
groupArrayArray
-
только что заметил, моя вина: их удалял кх по ттл (тестировал с плохими данными)
-
А версия кх? Если плавно растет то утечка.
Но вообще если постоянно долбить запросами то jemalloc кеширует и не возвращает память назад чтобы не тратить время на аллокацию -
после перезагрузки кх все стабилизировалось, вероятно кэш ОС
-
Да вам бред пишут вы верите.
RES это не кеш ос -- это памчть которую захавал кх.
Кеш ос не очищается при рестарте приложения. -
это что-то новое. А репликация работает нормально? Версия кх?
-
Хмм понял, спасибо за пояснение
-
где вы работаете? всегда интересно было
-
Дома.
-
а на кого?
-
ну в два клика находится мой линкедин профиль. Не хочу писать в чатике.
-
так если вы под псевдонимом вымышленного персонажа
-
зачем вообще работать :)
-
Denny Crane (I don't work at Yandex (never did)) in ClickHouse не тормозит
зачем, я сказочно богат
-
Ребят, а кто может подсказать по дискам/вольюмам? Есть такой расклад по хранилищу
select * from system.disks -
Эта папка находится на SSD
-
При этом, в файле config.xml раздела, отвечающего за диски и вольюмы нет вообще
-
Вопрос в следующем - будет ли корректно задать таким образом, чтобы можно было перекидывать данные на более медленный HDD?
<storage_configuration>
<disks>
<disk_ssd>
<path>/srv/clickhouse/</path>
</disk_ssd>
<disk_hdd>
<path>/data/clickhouse/</path>
</disk_hdd>
</disks>
</storage_configuration> -
И нужно ли как-то отдельно описывать default?
-
-
если есть дата, можно по дате разбить на несколько запросов
-
Joined.
-
-
раз не хватает памяти, у вас скорее всего select не отрабатывает (у вас же запрос падает?)
попробуйте с трейсом включенным, какое использование памяти -
-
Добрый день, подскажите пожалуйста (не могу найти в документации), на одной из конференций говорили что очень скоро появится кеширование запросов из коробки, не появилось еще?
-
select * from system.settings s where name like '%before_external%';
что говорит -
https://clickhouse.tech/docs/ru/extended_roadmap/
написано что ПР уже есть если вы про результаты запросов -
Можно чуть поподробнее я всего-лишь джавист который вынужден работать с CH
-
@unamedrus Al @Shazo_Rus @den_crane
чекните, плз -
Joined.
-
default это то диск, который отвечает переменной path в конфиге
-
У альтинити в блоге статья про это https://www.altinity.com/blog/2019/11/29/amplifying-clickhouse-capacity-with-multi-volume-storage-part-2Amplifying ClickHouse Capacity with Multi-Volume Storage (Part 2)
This article is a continuation of the series describing multi-volume storage, which greatly increases ClickHouse server capacity using tiered storage. In the previous article we introduced why tiered storage is important, described multi-volume organization in ClickHouse, and worked through a concrete example of setting up disk definitions.
-
т.е., видимо, это
-
нужно еще будет создать policies в которой можно указать необходимые ограничения
-
д
-
Меня тут как раз раздел default и смущает...
-
-
Есть опасения, что впишу пути на несуществующие папки, перезапущу КХ, файлов он по тем путям не найдёт, перепишет какие-нибудь конфиги, что я потом вообще ничего обратно не соберу
-
а вам зачем? Это странная фича, у вас бывают запросы которые повторяются один в один?
кстати, в mysql выпилили как вредную -
Joined.
-
Всем привет. Я столкнулся со странной проблемой - у меня копир при копировании таблицы как я ни кручу-верчу переносит только 2 недели (данных в копируемой таблице - месяц), никто такое не встречал?
-
хм, запустите запрос в базу и пришлите результат
-
бывают запросы один в один которые выполняются по 20 секунд (группировка по большой строке на 500кк данных)
-
У меня бывает: Select lc_col from T group by lc_col :)
-
согласен, иногда в dashboardах такое бывает, можно каким нибудь keyword сделать типа (cache). обычно в оракле по sqlid есть result cache
-
-
NGINX Content Caching
Cache both static and dynamic content from your proxied web and application servers, to speed delivery to clients and reduce the load on the servers.
-
кэш-то любой можно прикрутить да, просто ищу самый простой вариант решения
-
можно, но это довольно тривиальная и базовая фича для БД
-
еще рассматриваю вариант с мат вью и AggregatingMergeTree, но не уверен что это хорошая идея
-
There are only two hard things in Computer Science: cache invalidation and naming things.
-
это да
-
я не понял как там (в PR) будет с инвалидацией, особенно в свете distributed, тупо через 10 минут, может
-
Ronny:
I just added a index idx_some_id some_id type bloom_filter(0.1) granularity 8192
But doing queries with prewhere some_id=123 still seems to do full column scan -
А если policy не задать, а указать только диски - не заведётся?
-
есть неплохой кеш из коробки в chproxy
-
Т.е., по идее, должно быть достаточно такого простого конфига
<storage_configuration>
<disks>
<disk_hdd>
<path>/data/clickhouse/</path>
</disk_hdd>
</disks>
</storage_configuration>
А дефолтный будет подразумеваться из общих настроек -
1) skip indexes work VERY rare
2) granularity should be 1 to 5, 8192 -- complete BS -
при создании таблицы, ты указываешь storage_policy, про указывать отдельные диски я не видел
-
I read the default value was 8192..
-
Seems that when setting granulatity to 1, I managed to skip like 1% of the data...
-
So not really working
-
EN chat
-
Тэкс... с таким конфигом не прокатило...
Я вот только не понял, в system.disks диски после рестарта КХ должны появиться или после того, как на них что-то будет записано? -
как проверить-то, блин...
-
после рестарта
-
цитатки подъехали ))) и тем не менее наворачивают кеши на всех уровнях мама не горюй )
-
and off-by-1 errors :3
-
Вопрос:
я правильно понимаю, что для того, чтобы получить следующую структуру:
[
{
"id": "japan",
"color": "hsl(79, 70%, 50%)",
"data": [
{
"x": "plane",
"y": 233
},
{
"x": "helicopter",
"y": 135
},
{
"x": "boat",
"y": 131
}
]
}
]
нужно получить плоский результат вида:
"id": "japan", "color": "hsl(79, 70%, 50%)", "x": "plane", "y": 233
"id": "japan", "color": "hsl(79, 70%, 50%)", "x": "helicopter", "y": 135
"id": "japan", "color": "hsl(79, 70%, 50%)", "x": "boat", "y": 131
и после этого делать сортировку на каком-либо языке программирования?
Я пытаюсь построить график через nivo.rocks на javascript и собственно плоскую структуру уже получил.
есть ли иной способ - через SQL? -
Расскажите плз чем закончилось
-
Пока ничем. Ищем решение
-
-
о чем вы вообще ? nested это сахар для команды CREATE TABLE only, это два обычных массива на самом деле
items.color Array(Int32),
items.weight Array(Int32) -
Ну вот испытываю трудности с чтением таких полей в golang
-
ClickHouse/clickhouse-go
Golang driver for ClickHouse. Contribute to ClickHouse/clickhouse-go development by creating an account on GitHub.
-
после более пристального тестирования кафки с кх появилось два вопроса, быть может кто-то сталкивался:
1) если уронить брокер, к которому подключен кх, он даже не пытается подключится к другому. справедливости ради, как только брокер возвращается - данные исправно попадают в кх, но неясно, почему он даже не пытается подключится к другим, которые ему переданы?
2) после восстановления подключения к брокеру вставки доезжают, но иногда появляются дубликаты (единицы на десятки тысяч) даже с 1 консьюмером. помнится, раньше была такая беда - это все отголоски или же подобного быть не должно? -
а тьфу это запись, короче func Array(v interface{}) interface{}
-
вообще дубликатов в кафке тяжело избежать в КХ без транзакций.
сделали poll из кафка
сделали insert в заполлленого в КХ
делаем commit в кафка, упс брокера нет, оффсет не подвинулся
подключаемся назад к боркеру, ребаланс тыры пыры, снова читаем оффсет который уже читали, потому что он не подвинулся -
ясно, это в принципе похоже на наблюдаемые эффекты. Быть может знаете что-то по поводу неподключения к другим брокерам?
-
в логе КХ что? он пытается вообще?
-
Да
-
Постукивается пару раз в мертвый и все
-
В другие даже не пытается похоже
-
а как задан у таблицы kafka_broker_list = 'host:port',
-
Да, три пару хост-порт через запятую
-
В последнем тесте он выбрал вторую пару, что интересно
-
То есть вариант «не распарсил дальше первого» отпадает
-
заводите тикет, может вообще никогда не тестили этот сценарий
-
Принято, спасибо!
-
Нашел, что в MSSQL для формирования nested json имеются функции:
FOR JSON AUTO / PATH
В документации к clickhouse такого не упоминается, я правильно понимаю, что этих функций в clickhouse нет? -
в КХ такого нет, добавляли темплейты, теперь можно даже html выплюнуть , но я не уверен что можно то что вы хотите
-
Получается, никакая nested структура на выходе не возможна?
Я это к тому, что сконвертировать что-то подготовленое в json проще, нежели парсить построчно. -
К сожалению, вложенные объекты в json не поддерживаются
-
-
У меня есть идея, как это реализовать, но руки пока не дошли. Может кто-то сделает раньше меня - https://github.com/ClickHouse/ClickHouse/issues/7787JSON serialization/deserialization for named tuples · Issue #7787 · ClickHouse/ClickHouse
Use case Allow JSON-objects inside of JSON-bases formats. Describe the solution you'd like Currently, names are lost when named tuple serialized to JSON. SELECT CAST((1, 'Test&#...
-
Joined.
-
вопрос на great-fucking-design-advice. как у КХ с East-West траффиком? Плюс варианта Б с использованием большего числа ядер ясен. есть другие вопросы:
1. если сделать дистинкт с высоким кардиналити в варианте А на втором шарде по первому региону - сначала данные сначала придут на хост на котором запущен запрос или придет только итоговый state аггрегации?
2. есть ли компрессия данных пересылаемых между хостами?
3. есть ли подводные камни, что при некоторых запросах КХ будет слать прямо сырые данные со всех шардов в один? -
Option B
-
придет только итоговый state аггрегации
-
2 есть компрессия
-
-
ну запрос локально обрабатывается в регионе, если ума хватит настроить load_balancing
-
репликация тоже работает на 150мс
-
-
Данные где генерятся? в самих регионах?
-
-
-
просто А проще "траблшутить"
-
-
-
-
Сложности будут конечно с зукипером, летенси у вставляющих высокая будет высокая
-
С другой стороны option B, с зукипером тоже самое.
Возможно я бы лил через какой-то стриминг и вставлят в КХ в одном регионе, где зукипер -
да, из-за того что вставка одновременно во все шарды?
-
-
из-за того что зукипер будет в одном регионе и далеко от остальных 3
-
физически все в одном регионе, простите, вместо слова регион имелось ввиду регионданных, грубо говоря данные запрашиваемые "вместе"
-
-
ну блин, естественно что если сложить все данные пользователя А только в shard 1 (шардировать по ключу а не rand), то и компрессия выше и быстрые запросы можно делать с distributed_group_by_no_merge
-
-
некоторые запросы с distributed_group_by_no_merge (distinct uniq) начнут вычисляться прямо на шардах и ускорятся в N раз
-
-
-
ну если шард уже посчитал все, то не нужно сами поля/значения передавать на инициатор, надо просто сложить результаты
-
"Do not merge aggregation states from different servers for distributed query processing - in case it is for certain that there are different keys on different shards."
-
-
? откуда дубликаты?
одинаковые строки на шардах
мы шардировали по user_id
select uniq(user_id), ......
group by .....
distributed_group_by_no_merge с шардов будут переданы значения uniq, но не сами user_id -
select user_id, sum(quality)
group by user_id
при дубликатах (условно случайно), при включенном параметре distributed_group_by_no_merge -
ну пользователь А живет только в первом шарде
1шард посчитал sum 20
инициатор
выдаст A, 20
если прилетит А с шарда 2 , то будет 2 строчки с А -
-
-
Скажите, пожалуйста, есть id заказа, у него 3 типа цены, нужно для каждого заказа выводить только самую высокую цену, argMax не подходит для этой цели, как можно решить эту задачу в кх?
-
вообще это работает. Но в моем специфическом кейсе почему-то инсерт разбивался на сотни инсертов (при 7 шардах и версии CH 1.394), мне нужно было не очень, поэтому я забил и не разбирался.
-
/help
-
в смысле надо еще что-то кроме цены выводить иначе это просто max
select заказ, max(price)
group by заказ
и можно
select заказ, argMax( tuple(*) , price)
group by заказ -
Дело в том,что argmax возратит Макс цену из всего набора цен а не конкретного заказа, то есть тут нужно окно +argMax возвращает первый аргумент то есть не Макс цену а id заказа с максимальной ценой
-
>возратит Макс цену из всего набора цен а не конкретного заказа
нет
все будет работать как вы хотите
select заказ, argMax( tuple(*) , price)
group by заказ -
-
Не работал с кортежами, вы написали select заказ, argMax(tuple (*), price) group by заказ, tuple так и указывать с *?
-
Или что в его загонять
-
как хотите, можете нужные поля перечислить, можете *
на самом деле разница небольшая если сделать без tuple
select заказ,
max(price)
argMax( col1 , price),
argMax( col2 , price),
.....
argMax( coln , price),
group by заказ -
А если у меня таких цен 500 тысяч , посл запрос подойдёт ?
-
да
-
интересно стало, а есть ли какая-нибудь вероятность того, что значения в последнем варианте попадут из разных строк при одинаковой цене ввиду отдельных вызовов функции? или всегда в обработке порядок строк между колонок одинаковый?
———-
Calculates the 'arg' value for a maximum 'val' value. If there are several different values of 'arg' for maximum values of 'val', the first of these values encountered is output. -
нет такой вероятности
-
вот и смущает что дофигища инсертов превратятся в ещё большее количество
-
спасибо🙂
-
yandex/ClickHouse tagged: v20.1.5.26-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v20.1.5.26-stable
Release notes:
v20.1.5.26-stable -
Свежачок подвезли
-
-
-
-
Там же, где метадата таблиц. По дефолту /var/lib/clickhouse/metadata/db_name/dict_name.sql
-
Joined.
-
Ага, нашлась родимая. Спасибо!
-
Не мог считать значения Array(X) потому что либа не может обработать Array(Nullable(X))
Если убрать в труктуре Nullable, читает отлично - 05 March 2020 (286 messages)
-
Joined.
-
Коллеги, подскажите пожалуйста, есть ли возможность писать данные в ClickHouse по UDP?
-
Посмотрите на kittyhouse, там есть udp
-
KittenHouse)
-
Так точно, спасибо
-
Спасибо, посмотрю 👀
-
ребята, привет. можете помочь - есть очень много битых данных, которые надо восстановить. Соответственно надо сделать много Alter table name update .... Вчера пробовала сделать это на тестовом сервере, в результате clickhouse-server упал и подниматься не хотел - постоянно была ошибка Can't receive Netlink response: error -2 - все заработало после того, как я почистила директорию `/var/lib/clickhouse/data/default/.../mutation_***.txt`никто не знает после достижения какого количества mutation_***.txt сервер падает? (но в итоге данные поменялись успешно)
-
с чем может быть связано?
обновил колонку через alter table ... update column = 123 where ...
в system.mutations в колонке is_done лежит 1 для это мутации. но по факту измеений нет -
добрый день., небольшой нубский вопрос по оптимальности хранения метрик в кликхаус: как лучше хранить метрики, каждую в виде отдельной таблицы с названием метрики и двумя колонками: (clock, value) или все метрики в одной таблице (clock, metricid, value)? Количество метрик динамическое от 1000 до 5000+ за один батч инсерт, количество значений в каждой метрике от 86400 до 604000, но в рамках одного инсерта у всех метрик одинаковое количество строк
-
5000 таблиц ничем хорошим не кончатся
-
я бы лил в 1 таблицу, но ввел еще 1 поле, по которому можно было бы партиционировать таблицу
-
Добрый день коллеги! Есть небольшая проблемка при загрузке файла csv в базу.Файл 300 колонок размер файла 1.5 гигабайта. При попытке загрузить на сервер падает ошибка что не хватает памяти, если убрать ограничение по памяти то потребляет 15 гигабайт памяти. Можно как то ограничить у запроса объем памяти на загрузку файла до 10 гигабайт?
Если грузить файл таким же объемом но скажем 15 колонок такого потребления памяти нет и потребляем всего 3 гигабайта.
ClickHouse exception, code: 241, host: localhost, port: 8123; Code: 241, e.displayText() = DB::Exception: Memory limit (for query) exceeded: would use 9.33 GiB (attempt to allocate chunk of 16777280 bytes), maximum: 9.31 GiB (version 19.15.2.2 (official build)) -
toDate(clock) - может быть ключом партиционирования. Какие запросы предполагается делать к этим данным?
-
Разбейте файл на части и грузите по частям
-
только выборка определенных метрик по диапазону clock, для отрисовки в графане
-
а другого способа нет?
-
Увеличте лимит памяти для КХ. Или создайте таблицу в движком File и попробуйте сделать INSERT INTO ... SELECT из неё
-
-
в таблицу и так льется через INSERT INTO.
Примерно как тут https://clickhouse.tech/docs/ru/interfaces/cli/#cli_usage -
Joined.
-
Может вам поможет поиграться с настройкой input_format_parallel_parsing. Включить/выключить
-
Господа, насколько сложны операции апдейта для кликхауса при достаточно высокой cardinality и 300кк+ записей, раз в 10-15 сек объемом 10-20к записей?
-
я бы сказал практически нереальны, если только не использовать Replacing
-
У вас сервер ляжет минут через 20. Не делайте так, такой профиль КХ не вывозит
-
Храните изменяемые данные например в монге. Апдейте там же. А в КХ переливайте раз в час или день. Например храните в Replacing и после заливки дублей с обновлениями - делайте OPTIMIZE TABLE для изменненых партиций
-
-
Спасибо, попробую
-
как вы думаете почему стоит такая цифра?
-
-
а почему оно стандартно?
-
Стандартное, если не знаете что это - пишете как есть
-
-
-
ага ) вот и ответ
-
не умеет в быстрые апдейты
-
-
не получится так потому что у приложения нет доступа к файловой системе сервера БД
-
загрузить файл на прямую нельзя никак
-
такой опции нет в версии 19.15 к сожалению
-
вообще в современных версиях кликхауса необязательно указывать
-
Эту настройку стоит менять, если вы уверены, что вам это нужно) Плюс с версии 19.14 оно ещё дополнительно ограничивается в 10мб на гранулу.
-
Joined.
-
-
Создал image clickhouse с базой данных, но без пароля
как сконфигурировать docker-compose так, чтобы в контейнере(clickhouse)
можно было обратиться к клиенту
clickhouse-client --user=root --password=r00t
А мы можем зайти clickhouse-client
смотрели такую и другие ссылки, все равно не до конца понятно
https://stackoverflow.com/questions/52198099/creating-db-and-tables-in-a-dockerized-clickhouse-instance-from-docker-compose-f
version: '3'
services:
clickhousedb:
image: clickhouse_with_upload_data
container_name: clickhouse_db
ports:
- "8124:8125"
- "9000:9000"
environment:
# CLICKHOUSE_DATABASE: 'boxplatv2'
# CLICKHOUSE_USER: 'root'
# CLICKHOUSE_PASSWORD: 'r00t'
# CLICKHOUSE_ROOT_USER: 'root'
# CLICKHOUSE_ROOT_PASSWORD: 'r00t'
restart: always
grafana:
image: grafana/grafana:latest
container_name: grafana_clickhouse
ports:
- "3007:3000"
- "25:25"
env_file:
- 'env.grafana'creating db and tables in a dockerized Clickhouse instance from docker-compose fileMy requirement is to create DB and Tables in Clickhouse when I'm bringing it up using docker-compose. If it is mysql, I do it as below : mysql_1: image: mysql:5.7.16 environment:
-
Всем привет. Скажите, при создании таблицы
CREATE TABLE table() ENGINE = MergeTree() PARTITION BY toYYYYMMDD(msgtime) ORDER BY (msgtime, device_ip) SAMPLE BY device_ip SETTINGS index_granularity = 4096
У нас стоит ORDER BY msgtime, тоесть по времени в секундах. Насколько знаю, то кликхаусу требуется некоторое время в фоне, чтобы раскидать строки в порядок и сделать слияние.
Вопрос Сколько времени времени на это уходит?
P.s. Суть такая, что нам надо почти моментально после вставки данных делать по ним запрос -
кликхаус сначала пишет в tmp парты, а потом их сливает.
почти моментально это сколько? -
Парты пишутся в tmp, пока не закончен запрос. Как только запрос закончен - они перемещаются к основному датасету. Если под "сливанием" подразумевается процедура перемещения, то "сразу после окончания вставки". Если подразумевается процедура merge, то это не детерминировано, т.к. зависит от множества факторов и ряда настрек.
-
имеется в виду перемещения, да
вопрос идет ли SELECT и по tmp партам в том числе?
допустим buffer table engine позволяет учитывать в запросе те данные что находятся в буфере, емнип -
Всем привет!Подскажите, плиз, с помощью какой функции можно преобразовать тип TimeStamp в намерик формат? Читаю документацию и не нахожу
-
Если речь идет за тип DateTime, то toUnixTimestamp или toUInt32
-
Joined.
-
-
всем привет! Я использую truncate чтобы очистить таблицу TRUNCATE TABLE IF EXISTS reporting.selenium_reports у меня ругается Expected identifier что не так?
-
можете ошибку с клиента показать?
-
-
[ERROR] PreparedStatementCallback; uncategorized SQLException for SQL [TRUNCATE TABLE IF EXISTS ?]; SQL state [null]; error code [62]; ClickHouse exception, code: 62, host: localhost, port: 8123; Code: 62, e.displayText() = DB::Exception: Syntax error: failed at position 26: 'reporting.ci_selenium_reports'. Expected identifier (version 19.15.7.30 (official build))
; nested exception is ru.yandex.clickhouse.except.ClickHouseException: ClickHouse exception, code: 62, host: localhost, port: 8123; Code: 62, e.displayText() = DB::Exception: Syntax error: failed at position 26: 'reporting.ci_selenium_reports'. Expected identifier (version 19.15.7.30 (official build)) -
-
кажется я поняла, у меня наверное '' подставляются
-
спасибо
-
Insert льет в tmp именно для того чтобы эти данные не были видны в select. Это фантомные строки. Инсерт в этот момент еще не закончен успешно и может упасть с ошибкой и отмениться полностью. Как только инсерт закончится успешно, причем не целиком (part успешно сформирован -- инсерт не атомарен -- парт атомарен), tmp будет переименован и появится в списке активных партов -- станет доступен селектам.
-
-
-
sample by device_ip -- айпиадреса не занимают все пространство числа, например не используется 0.*.*.*
логично семплировать по хешфункции иначе результаты будут косые. -
Htop умеет столбики diskread diskwrite там тоже 0?
-
Подскажите, пожалуйста. Пробую DDL (CREATE DICTIONARY db.name ...) для создания словарей в 20.1. Всё работает, но словарь почему-то показывается в show tables :/. И запросы из него можно делать. Это фича или баг? Раньше ведь нельзя было так, и движок Dictionary для такой задачи до сих пор есть.
-
Это фича, просто автоматически создается табличное отображение для таких словарей.
-
А в CH уже появились secondary index?
-
вроде в доке смотрю что то такое есть
-
Инверсных индексов нет и не ожидается
-
Зачем?? Мусор в show tables. Да и это не engine dictionary даже, когда просишь у него show create table - показывает "CREATE DICTIONARY ...".
Т.е. даже не убрать его оттуда. -
пнтн, спасибо
-
ну автор так сделал, яндексу так удобнее.
создавайте в другой базе -
мусор в show databases :)
ну я понял, спасибо. Неожиданно прост. -
Joined.
-
create table data(
id String,
date_time DateTime,
user_id UUID
-- ...
) engine = ReplacingMergeTree()
order by id;
Хочу сделать агрегацию данных из этой таблицы по дням. Попробовал так:
create materialized view agg_data_day
engine = AggregatingMergeTree()
order by(date, user_id) as
select
toDate(date_time) as date,
user_id as user_id,
sumState(1) as total
from data
group by date_time, user_id;
В таблицу data данные вставляются блоками. После повторной вставки добавленного ранее блока происходит дедупликация в data, но в agg_data_date данные агрегируются повторно.
Как настроить agg_data_day чтобы данные не агрегировались повторно? Или может есть другой способ построить такую агрегацию? -
Joined.
-
MV = insert trigger
-
понятно. как тогда по другому победить дубликаты?
-
Д.б. group by date
Кол-во строк в aggregating за день и будет тем числом?
Строки схлопнунтся в агррегейтин когда-нибудь. Сам sumstate не нужен -
-
group by date - согласен
да, число строк за день по user_id — то что нужно. т.е. агрегационная функция не нужна? -
раз в день полностью перестраивать agg_data_day? старые записи в таблице data зачищаются, нужно хранить сагрегацированное.
-
почему полностью? за прошедший день только.
-
есть вероятность того, что завтра заедут данные за позавчера
-
-
сейчас проверил — вставил повторно блок в data, увидел дубликаты в agg_data_day. сделал optimize table agg_data_day дубликаты пропали, но сумма в поле total конечно же увеличилась.
не могу сообразить, что мне подойдёт вместо sumState(1) as total? -
Joined.
-
Подскажите, кто сталкивался, при запуске с 1воркером clickhouse-copier, генерятся тысячи одноименных процессов clickhouse-copier --config=... [AsyncBlockInput], которые поедают весь сервак. В чем может быть дело?
-
Joined.
-
можно поиграться "uniq(Id)" - вам же он нужен? по идее повторно вставленный Id не будет считаться
-
-
-
-
если на сервере ток кликхаус то я пользовался iotop -t 10 емнип
-
-
Тут еще такая вещь - смотрю внутри докер контейнера. Снаружи вроде как показывает норм стату
-
аа, возможно тут особенности докера
-
Есть такой расклад по полисям
select * from system.storage_policies -
в агрегированной таблице не важен id. важно количество записей в день для user_id. если поставить uniq(id) то в итоге в agg_data_day будет столько же записей что и в data, только полей будет меньше. придётся потом опять агрегировать в запросе :)
-
Создаю таблицу из примера
CREATE TABLE example_table
(
d Date,
s String
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(d)
ORDER BY d
TTL d + INTERVAL 1 MONTH DELETE,
d + INTERVAL 2 WEEK TO DISK 'hdd_disk' -
В ответ пишет такое
DB::Exception: No such disk `hdd_disk` for given storage policy. (version 20.1.4.14 (official build))
Что я делаю не так? -
Конфиг по хранилищам такой
<yandex>
<storage_configuration>
<disks>
<default>
<keep_free_space_bytes>1073741824</keep_free_space_bytes>
</default>
<hdd_disk>
<path>/data/clickhouse/</path>
<keep_free_space_bytes>1073741824</keep_free_space_bytes>
</hdd_disk>
</disks>
<policies>
<hdd_policy>
<volumes>
<hdd_volume>
<disk>hdd_disk</disk>
</hdd_volume>
</volumes>
</hdd_policy>
</policies>
</storage_configuration>
</yandex> -
да, но в запросе можно сканировать меньше данных... в общем делайте раз в день переподсчёт )
-
спасибо
-
-
Добрый день, коллеги! Столкнулись с проблемой следующего характера.
Имеется 2 таблицы, одна содержит ~31 миллион записей:
create table CH_NP
(
np_id Int64,
partition_date Date,
port_req_id Nullable(FixedString(50)),
user_id Int32,
process_id Int32,
process_type FixedString(50),
donor_operator_id Nullable(Int32),
donor_service_provider_id Nullable(Int32),
donor_id FixedString(20),
recipient_operator_id Nullable(Int32),
recipient_service_provider_id Nullable(Int32),
recipient_id Nullable(FixedString(20)),
due_date Nullable(DateTime),
submit_date Nullable(DateTime),
new_route Nullable(FixedString(50)),
connection_type Nullable(FixedString(50)),
sub_is_company Nullable(UInt8),
sub_name Nullable(FixedString(200)),
sub_id Nullable(FixedString(50)),
request_date DateTime,
port_date Nullable(DateTime),
status Int32,
status_code_id Nullable(Int32),
last_message_code FixedString(50),
last_message_originator_id Int32,
last_message_date DateTime,
last_message_is_gui Nullable(UInt8),
number_count Int32,
number Nullable(Int64),
region_id Nullable(Int16)
)
engine = ReplacingMergeTree() PARTITION BY partition_date;
Вторая -- < 1к:
create table CH__organization
(
id Int32,
partition_date Date,
org_parent_id Nullable(Int32),
name FixedString(200),
org_code Nullable(FixedString(50)),
email Nullable(FixedString(100)),
country FixedString(100),
city Nullable(FixedString(50)),
street Nullable(FixedString(100)),
phone Nullable(FixedString(20)),
fax Nullable(FixedString(20)),
ip Nullable(FixedString(200)),
is_end_point_enabled UInt8,
end_point_url Nullable(FixedString(500)),
end_point_username Nullable(FixedString(20)),
end_point_password Nullable(FixedString(20)),
is_deleted UInt8,
type Nullable(Int32),
end_point_concurrency_limit Nullable(Int16),
code Nullable(FixedString(50)),
mnc Nullable(FixedString(3)),
legal_name Nullable(FixedString(200)),
contract_number Nullable(FixedString(100))
)
engine = ReplacingMergeTree() PARTITION BY partition_date;
Делаем вот такой запрос:
SELECT org.name as donor_operator_name, two.recipient_operator_name, two.count, two.dt as date, org.org_code as donor_operator_code, two.recipient_operator_code, two.status
FROM
(SELECT one.recipient_operator_id, one.donor_operator_id, one.count, org.org_code as recipient_operator_code, org.name as recipient_operator_name, one.dt, one.status
FROM
(SELECT recipient_operator_id, donor_operator_id, sum(number_count) as count, toDate(port_date) as dt, status
FROM default.CH_NP
WHERE status in (0, 1, 2, 3) and port_date >= '2012-01-01 00:00:00' and port_date < '2100-01-01 00:00:00'
GROUP BY recipient_operator_id, donor_operator_id, status, dt) as one
JOIN default.CH__organization as org
ON one.recipient_operator_id=org.id
) as two JOIN default.CH__organization as org
ON two.donor_operator_id=org.id
Который застывает на
2020.03.05 09:54:07.132316 [ 45 ] {} <Trace> Aggregator: Merging aggregated data
до отвала по таймауту.
Используется этот драйвер (последней актуальной версии 1.0.3):
https://github.com/mymarilyn/clickhouse-driver
И сервер 19.9.2.4 (official build)
На машине имеется 32 гб памяти + подкачка, кликхаус может забирать всю.
Подскажите, пожалуйста, почему такое может быть и куда вообще копать?GitHub - mymarilyn/clickhouse-driver: ClickHouse Python Driver with native interface supportClickHouse Python Driver with native interface support - GitHub - mymarilyn/clickhouse-driver: ClickHouse Python Driver with native interface support
-
-
попробуйте через clickhouse-client s Format Null, может он просто медленно работает
-
-
-
s format null - это что?
-
чтобы результат не возвращался по сети/в консоль итд, нам он не нужен же
-
может у вас память кончается и все начинает тормозить, хотя на этих объемах сложно этого добиться, но можете копнуть туда
-
Это странно, но и такое было при работе с этим запросом
-
Когда контейнер с кликом падал потому что он хотел сожрать 43 Гб,а есть только 32 (в логах видно)
-
Да, логи такие были:
2020.03.05 09:49:17.855723 [ 9 ] {} <Debug> default.CH_NP: Removing part from filesystem 20200305_686954_686954_0
2020.03.05 09:49:19.970091 [ 48 ] {} <Debug> MemoryTracker: Current memory usage: 7.87 GiB.
2020.03.05 09:49:23.682695 [ 48 ] {} <Debug> MemoryTracker: Current memory usage: 8.88 GiB.
2020.03.05 09:49:23.690777 [ 48 ] {} <Debug> MemoryTracker: Current memory usage: 12.88 GiB.
2020.03.05 09:49:31.433436 [ 48 ] {} <Debug> MemoryTracker: Current memory usage: 20.92 GiB.
2020.03.05 09:49:31.496883 [ 48 ] {} <Debug> MemoryTracker: Current memory usage: 22.92 GiB.
2020.03.05 09:49:37.767663 [ 48 ] {} <Debug> MemoryTracker: Current memory usage: 23.17 GiB.
2020.03.05 09:49:38.638787 [ 48 ] {} <Debug> MemoryTracker: Current memory usage: 27.67 GiB.
2020.03.05 09:49:42.374790 [ 48 ] {} <Debug> MemoryTracker: Current memory usage: 43.22 GiB.
2020.03.05 09:49:43.959367 [ 42 ] {db54bf5c-53d8-4a04-b894-1cce77a22102} <Error> executeQuery: Code: 173, e.displayText() = DB::ErrnoException: Allocator: Cannot mmap 16.00 GiB., errno: 12, strerror: Cannot allocate memory (version 19.9.2.4 (official build)) (from 172.16.241.1:57376) (in query: запрос -
Ребят, я вас ещё побеспокою
@unamedrus Al @Shazo_Rus @den_crane -
кмк, ты сначала применяешь storage_policy а потом из нее выбираешь необходимые диски
-
но тогда тебе кмк, придется в сторадж полиси указать оба диска, один быстрый второй медленный
-
какой результат?
select * from system.settings where name like '%threads%'; -
в CREATE TABLE?
-
+
-
и сколько дистинкт recipient_operator_id,donor_operator_id
-
-
-
бывает они падают при max_mem == 0. Ставлю 8 или 16гб - падают всегда
-
-
-
лады
-
-
-
-
-
так, это я намотаю на ус изучить
-
-
так, память выставили в 24гб. Попробуем остальные рекомендации и отпишемся.
-
>так, память увеличили
а что так можно было? ))) -
это была приятная оговорка, к сожалению )
-
кажись 509к строк
ща вот это еще выставлю max_bytes_before_external_group_by=7GB -
Всем привет, а кто-нибудь коннектил клик к табло серверному? Кто как это делал?
-
т.е. недоступна эта информация в текущем энве, естественно в докере по умолчанию это недоступно, гуглить docker CAP_NET_ADMIN
недоступно потому эта фича позволяет из контейнера менять сеть на хосте -
-
509к - это очень мало на самом деле, думаю если уберете ненужные подзапросы, все будет хорошо
-
Выставлял. Не помогает
-
звучит оптимистично) Спасибо )
-
продолжится
-
Спасибо
-
-
-
--max_insert_block_size=100000 --min_insert_block_size_rows=100000 --max_compress_block_size=268435456 --min_compress_block_size=268435456
-
от рута htop запущен?
-
-
а КХ при старте пишет
Application: It looks like the process has no CAP_NET_ADMIN capability, 'taskstats' performance statistics will be disabled.
погуглил, нет это не из-за этого. Должна быть статистика по диску по процессам, это не связано с cap_net_admin -
Товарищи, необходима помощь!
Вот по поводу движка таблиц Join
Данные таблиц Join всегда находятся в RAM. При вставке строк в таблицу ClickHouse записывает блоки данных в каталог на диске, чтобы их можно было восстановить при перезапуске сервера.
я не совсем понял, данные на hdd у меня будут хранится а при запуске сервера помещатсья в RAM или же они всегда в рам и удаляются при перезапуске или чем то еще -
при запросе все правые таблицы считаются в память
-
-
я про движок
-
а сорри, не пробовали но тут написано так:
https://clickhouse.tech/docs/ru/operations/table_engines/join/
Хранение данных¶
Данные таблиц Join всегда находятся в RAM. При вставке строк в таблицу ClickHouse записывает блоки данных в каталог на диске, чтобы их можно было восстановить при перезапуске сервера.
При аварийном перезапуске сервера блок данных на диске может быть потерян или повреждён. В последнем случае, может потребоваться вручную удалить файл с повреждёнными данными. -
-
-
ну это я читал как раз таки :) вообщем то это я и хотел узнать, но пока что решил заюзать Log вроде как меньше проблем с ним
-
-
Если кому интересно, решение оказалось таким
CREATE TABLE example_table
(
d Date,
s String
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(d)
ORDER BY d
TTL d + INTERVAL 1 MONTH DELETE,
d + INTERVAL 2 WEEK TO DISK 'hdd_disk'
SETTINGS
index_granularity = 8192,
storage_policy = 'hdd_policy' -
-
ClickHouse Meetup Athens Live! https://www.youtube.com/watch?v=1UIl7FpNo2M
-
None
-
Max query size кто-нибудь знает дефолт?
-
Да. Версия кх?
-
256кб
-
19.7.3
-
detach table MVName;
rename table `.inner.MVName` to `.inner.MVNameNEW`;
правим на диске и переименовываем /var/lib/clickhouse/metadata/database/MVName.sql
attach table MVNameNEW -
блин, точняк!
спасибо
буду завтра пробовать -
-
ну 5 знаков в decimal после запятой
и округление до 4?
float-ы округляются банковским, децималы нет -
DESCRIBE TABLE
(
SELECT
0.00745 AS f64,
toDecimal64(f64, 5) AS dec,
round(f64, 4) AS a,
round(dec, 4) AS b
)
─name─┬─type───────────┬
f64 │ Float64 │
dec │ Decimal(18, 5) │
a │ Float64 │
b │ Decimal(18, 5) │
──────┴────────────────┴
тип децимал сохраняется после round -
-
можно вроде только комбинацией if + floor/ceil
-
шохарактерно, в отличие от клиэйта, отмодифаить таблицу с указанным полиси не получается (((
ALTER TABLE test.v2_sessions_and_goals
MODIFY
TTL simple_date + INTERVAL 4 MONTH TO DISK 'hdd_disk'
SETTINGS
index_granularity = 8192,
storage_policy = 'hdd_policy'
Пишет такую же ошибку
DB::Exception: No such disk `hdd_disk` for given storage policy. (version 20.1.4.14 (official build)) -
-
специфичная вещь, сомневаюсь что есть подобное, но несложно сделать самому
-
-
-
к сожаелению не собирается clickhouse_fdw ни на реальнм сервере, ни в докере на разных версиях PostgreSQL
Пробовал
https://github.com/adjust/clickhouse_fdw
https://github.com/Percona-Lab/clickhousedb_fdw
Заранее спасибо, если у кого-нибудь все же есть докер или ссылка на проверенную сборкуGitHub - adjust/clickhouse_fdw: ClickHouse FDW for PostgreSQLClickHouse FDW for PostgreSQL. Contribute to adjust/clickhouse_fdw development by creating an account on GitHub.
-
а что за ошибка?
-
-
там их штуки 3-4 разных
-
и какой из них билдится? )))
-
-
-
-
вроде этот даже
-
libcurl and uuid libraries should be installed in the system.
-
-
-
в твоем случае, это примерный аналог чтения из файла емнип? с помощью file()
-
-
-
-
его еще не допилили
-
если мне не изменяет память)
-
это вроде реализация для тейбл фанкшн
-
да, я перепутал с DiskS3
-
если их не установить, то др. ошибка выдается - поэтому, да, установлены
удаленная ссылка на докер - это просто докер с Постгрес,
а хотелось бы Постгрес с clickhouse_fdw ))) -
-
-
если не трудно, плз, в докер )))
-
select * from s3('http://host/bucket/test.csv', 'access_key_id', 'secret_access_key', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32')
-
я вроде так и делаю, но DB::Exception: The specified key does not exist. хотя файл точно есть (я его схему через pyspark по тому же пути только что получал)
-
фаайл?
-
попробуй через админку минио запросы смотреть
-
кажеться вот тут собака зарыта
-
-
но нет
-
там так можно?
-
я ничего не понял, но glob-ы пытались запилить в КХ (в s3)
-
./mc admin trace -v -a minio | grep -n20 "{имя юзера кто обращается к minio, или бакет или еще что засвечивается в запросах}"
наше все) -
-
для минио возможно еще нужно регион указывать
-
я изначально указывал не на конкрентый файл, а на папку с DataSet(много файлов)
-
>DB::Exception: The specified key does not exist.
это ошибка minio, access_key_id неверный? -
с s3() нужно указывать конкретный файл, это аналог file и url engine
-
а так?
s3('http://host/bucket/*.csv -
* -- glob-ы пытались сделать
-
Added globs/wildcards for s3 by excitoon · Pull Request #8851 · ClickHouse/ClickHouse
I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): New Feature Changelog entry (a user-readable short description of the cha...
-
-
круто
-
точно верный, сейчас проверил
-
я уже погуглил, да это про объект запрашиваемый
-
я был почти на 99% уверен что про это но решил перепроверить
-
я думаю в проследнем стейбле, который вышел вчера работает
select * from s3('http://host/bucket/*', 'access_key_id', 'secret_access_key', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32') -
yandex/ClickHouse tagged: v20.1.6.30-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v20.1.6.30-stable
Release notes:
v20.1.6.30-stable -
Здравствуйте. Есть планы по превращению lowcardinality из типа в какую-то более неявную абстракцию ?
-
чтобы пользователь не задумывался о хранении, а CH за него делал это эффективно
-
-
А в roadmap это где-то есть?
-
всеравно нужно кодеки/шифрование порядок сортировки продумывать
-
О, нашел. Прям что доктор прописал https://clickhouse.tech/docs/ru/extended_roadmap/#2-4-perevod-lowcardinality-iz-datatype-v-column-dobavlenie-columnsparse
-
-
так а не везде оно подходит.
Я вот сделаю country_code String и буду там RU / US хранить и автоматический LowCardinality уронит перфоманс в два раза -
для остальных типов вообще всегда плохо
-
Вот пусть CH и разберется, где нужно, а где не нужно
-
это где то на уровне идеального планировщика запросов)
-
Я думаю чуть проще. Тут эвристику можно придумать
-
ну это надо вообще все переделывать
-
прям так плохо будет?
-
Денис написал про определенный кейс, когда ему кажется, что перфоманс просядет. Можно взять просто оптимизацию места для хранения как задачу для lowcardinality
-
прямо в парте определять там LC или нет, но это не сработает, потому что в памяти оно должно быть все LC
-
Да. Я про место на диске
-
оптимальность по месту строго говоря не равно оптимальность по производительности
-
короче без данных, при create table угадать незльзя
-
-
когда данные есть, уже поздно
-
Строго говоря да. Поэтому и существует lowcardinality и существует Enum
-
Хочешь производительность - пиши enum
-
ну вообще собирались вводить фишку, что для разных партов могут быть разные настройки сжатия
-
LC не для экономии места на диске, и это не codec, поэтому не ждите
-
это-то не сложно
-
codec и сейчас поменять можно
-
LC совсем другое
-
-
да ладно, по-моему это можно кодеком назвать
-
тогда нельзя сделать оптимизацию select group by LC
-
назвать != как это реализовано, пока это реализовано в другом месте
-
она сейчас есть?
-
можешь развернуть мысль? Почему нельзя такую оптимизацию сделать?
-
да, и в общем в памяти LC хранится в LC
-
а кодеки разжимаются в памяти
-
кмк, они бы не стали добавлять такую вещь в роадмап если бы это означало что они потеряют часть функционала
-
ну я сомневаюсь что LC станет автоматическим в этом году
-
да и вообще все это чушь. Где Window functions ?
-
ненужно.
-
дальше хотелось бы, чтобы вставлять в lc можно было бы не строки, а эти самые числа из таблицы lc.
-
половина вопросов и проблем про window functions
-
-
а еще, задавать таблицу lc при create_table, как с енумами
-
работать не будет и все, скажет тип не тот у колонки
-
чуда не случится понятно,
для дистрибьютет таблиц указание кодеков же не несет никакого смысла? -
не несет, более того если сделать в таблице String а в дистрибьютид LC(String) будет кх крашится (крашился)
-
-
если дистрибьютед таблицы не позволяют? никаких изменений по сравнению с базовыми. то вообще было бы круто что бы ненужно было указывать все столбцы и прописывать все enum
-
-
но большинство более сложных вроде успешно решаются через массивы, а менее сложные через уже готовые функции
-
подскажите, почему в данном случае у prewhere количество записей меньше получается?
:) select count(1) from distributed_transactions FINAL PREWHERE (record_datetime >= '2020-03-04 00:00:00') AND (record_datetime <= '2020-03-04 23:59:59')
SELECT count(1)
FROM distributed_transactions
FINAL
PREWHERE (record_datetime >= '2020-03-04 00:00:00') AND (record_datetime <= '2020-03-04 23:59:59')
┌─count(1)─┐
│ 15010398 │
└──────────┘
1 rows in set. Elapsed: 3.632 sec. Processed 16.69 million rows, 550.82 MB (4.60 million rows/s., 151.67 MB/s.)
:) select count(1) from distributed_transactions WHERE (record_datetime >= '2020-03-04 00:00:00') AND (record_datetime <= '2020-03-04 23:59:59')
SELECT count(1)
FROM distributed_transactions
WHERE (record_datetime >= '2020-03-04 00:00:00') AND (record_datetime <= '2020-03-04 23:59:59')
┌─count(1)─┐
│ 16691571 │
└──────────┘
1 rows in set. Elapsed: 0.038 sec. Processed 16.69 million rows, 66.77 MB (438.20 million rows/s., 1.75 GB/s.) -
Потому что у WHERE не используется FINAL?
-
-
- 06 March 2020 (218 messages)
-
да это я читал, интересно, что он там мержит
-
-
строки в replacing, summing,aggregating mergetable
-
допустим в первом случае дубликаты
-
Скажите, как работает кафка с CH, можно ли использовать эту связку с ENGINE = Kafka на проде?
-
Почему бы не использовать стандартный формат Graphite(5 колонок) и, скажем
https://github.com/lomik/carbon-clickhouse
https://github.com/lomik/graphite-clickhouse
мы так сохраняем почти 1М метрик в секундуGitHub - lomik/carbon-clickhouse: Graphite metrics receiver with ClickHouse as storageGraphite metrics receiver with ClickHouse as storage - GitHub - lomik/carbon-clickhouse: Graphite metrics receiver with ClickHouse as storage
-
Всем привет!
Подскажите, пожалуйста, как можно из одной таблицы с интервалами найти наличие пересечение с интервалами в другой?
Пример. Для id из первой таблицы определить наличие пересечения start и end таблиц 1 и 2.
Table 1:
┌──────────────id─┬──────start─┬────────end─┐
│ 171849015679912 │ 1583236777 │ 1583237443 │
│ 1740802532668 │ 1583236857 │ 1583237475 │
│ 51408793288363 │ 1583237001 │ 1583237319 │
└─────────────────┴────────────┴────────────┘
Table 2:
┌──────start─┬────────end─┐
│ 1583236777 │ 1583237443 │
│ 1583236857 │ 1583237475 │
│ 1583237001 │ 1583237319 │
└────────────┴────────────┘
Сейчас я пытаюсь делать несколько ASOF JOIN для определения границ, а далее проверяю эти границы на пересечение. Такой подход съедает всю оперативку.
Пытался делать группировку и объединение по дате и через функцию arrayExists искать первое пересечение, но тот же результат.
Нашел недокументированную функцию maxIntersections(leftColumn, rightColumn), она решает похожую задачу, но не могу понять, как её применить к текущей задачи и стоит ли её использовать, если её нет в документации.
Как вы подходите к задаче поиска пересечений в time series таблицах? -
Привет!
А что значит вот такая ошибка:
Query 'd1dcbe90-b99c-40a6-a861-06dad3016975' is killed in pending state
Как понять, что стало причиной перевода query в pending state? -
Есть планы на cross join без сжирания памяти (стримить результат мелкими блоками). Можно будет на нем :)
-
Хорошо, буду ждать) Но пока что-то все равно надо придумать)
-
Может быть кто-то сталктвался с подобным? (Apache SuperSet + sqlalchemy-clickhouse)
-
ClickHouse – визуально быстрый и наглядный анализ данных в Tabix. Игорь Стрыхарь
Предлагаю ознакомиться с расшифровкой доклада 2017 года Игорь Стрыхарь «ClickHouse – визуально быстрый и наглядный анализ данных в Tabix». Веб-интерфейс для ClickHouse в проекте Tabix. Основные...
-
Всем привет!
Правильно ли я понимаю что
optimize table name deduplicate только свернет дубли по всем колонкам, не только по ПК? -
Речь про merge tree
-
Точнее collapsing merge tree
-
Вот непонятно будет ли оно схлопывать записи с 1 и - 1
-
Joined.
-
Этому докладу вроде как уже пара лет, нет?
-
да, там в начале это и написано
-
-
Можно например в одну таблицу всё слить (Union)
-
Ну насколько мне известно - оно есть в планах, так что ждать можно (правда пока совсем не понятно когда, ибо приоритеты и т.п.)
-
Поясни. Если хранить это как строки - будет 2 байта строки, плюс один байт с размером строки (хранится отдельно).
Итого для миллиона строк будет записаны две колонки - одна с данными строе (2 миллиона байт) и одна с длинами строк (1 млн байт).
В случае LC - это будет 1 млн байт данных (зажмет в UInt8) плюс типа 10 байт словаря. Почему это может быть хуже? -
-
-
-
Рябята, подскажите плиз как решить следующую проблему.
Суть - в таблице содержаться идентификаторы пользователя и его действия.
Мне нужно выбрать для отчетов только самые последние данные по юзеру.
Собираюсь использовать ReplacingMergeTree, но этот движок подходит только для уменьшения места на дисках и не гарантирует отсутствие дубликатов.
Нужно в запросе делать выборку только последних данных по юзеру, но при попытке сделать следующий запрос получаю ошибку
"SELECT
UserID as Usr,
SUM(PageViews) as Views,
SUM(Duration) as Duration
FROM hist_test.UAct AS tst
WHERE LastUpdate = (SELECT MAX(LastUpdate) FROM hist_test.UAct WHERE UserID = tst.UserID)
GROUP BY Usr"
"Received exception from server (version 20.1.4):
Code: 47. DB::Exception: Received from localhost:9000. DB::Exception: Missing columns: 'tst.UserID' while processing query: 'SELECT MAX(LastUpdate) FROM hist_test.UAct WHERE UserID = tst.UserID', required columns: 'UserID' 'tst.UserID' 'LastUpdate', source columns: 'LastUpdate' 'Duration' 'PageViews' 'UserID'."
Такое ощущение, что из секции WHERE не видны алиасы внешние
Тестовая таблица:
"CREATE TABLE hist_test.UAct (
UserID UInt64,
PageViews UInt8,
Duration UInt8,
LastUpdate DateTime )
ENGINE = MergeTree()
ORDER BY UserID;"
Также вопрос в эффективности использования подзапроса в секции WHERE на больших таблицах (около миллиарда записей), возможно можно более эффективно сделать? -
select userId, argMax(PageViews, LastUpdate) as lastPageViews from hist_test.UAct
-
о Спасибо Большое!
-
Всем привет! Есть здесь эксперты по Materialized View? Я вижу что данные во вьюшке обновляются, но по прошествии некоторого времени значения начинают отставать от аналогичного SELECT запроса (на порядок). Вьюшка трекает таблицу с CollapsingMergeTree engine.
CREATE MATERIALIZED VIEW daily_mv
ENGINE = SummingMergeTree()
PARTITION BY toYYYYMM(created_at_date)
ORDER BY (created_at_date, customer_id)
POPULATE
AS
SELECT
created_at_date,
customer_id,
sum(sign) AS total_messages
FROM messages
GROUP BY created_at_date, customer_id
ORDER BY created_at_date, customer_id; -
-
Привет всем! Помогите ,плиз! Есть набор символов, среди них есть эмоджи. Как эти эмоджи достать и положить в отдельную колонку?
-
Приветствую, вопрос по clickhouse-client и импорту CSV файлов в таблицы с движками *MergeTree.
Можно ли каким нибудь образом исключить колонку version из импорта? В CSV нет колонки version. -
привет, есть продукт: https://github.com/housepower/clickhouse_sinker
хочется получить из него timestamp который есть в kafka record, как это сделать?GitHub - housepower/clickhouse_sinker: Easily load data from kafka to ClickHouseEasily load data from kafka to ClickHouse. Contribute to housepower/clickhouse_sinker development by creating an account on GitHub.
-
если есть default, должно работать с включенным параметром
https://clickhouse.tech/docs/en/operations/settings/settings/#settings-input_format_with_names_use_header -
-
Можно попробовать начать с этого SELECT replaceRegexpAll('@#$🐷#%dfg#$ 6456🚽 %^ABC& %^&💩 ', '[^\\p{So}]', '')
-
Круто, спасибо )
-
Здравствуйте!
1) В селекте такое выражение:
WITH
mccmnc_home = 12345
SELECT
IF( toUInt32OrNull( LEFT( replaceOne( CELL, '-', '' ), 5 ) ) = mccmnc_home, 1, 0 ) AS is_mccmnc_home,
GROUP BY is_mccmnc_home
при этом группировка работает странно
is_mccmnc_home|
--------------|
1|
1|
а если сделать
GROUP BY CELL
, то как надо одна строчка
is_mccmnc_home|
--------------|
1|
что не так?
2) И еще попутно вопрос что дешевле сравнивать строковые значения или приведенные строковые к целым, или всё равно?
Зарание спасибо -
У вас в итоге родилось какое-то решение? Могли бы примером заделиться?
Спасибо. -
Как массив превратить в строку? Например: массив [`qwerty`,`xyz`,`1234`] превращаем в строку qwertyxyz1234
-
select arrayStringConcat(['qwerty', 'xyz', '1234'])
-
спасибо
-
Здравствуйте. Кто сталкивался с такой проблемой и как ее починить
Alter is not finished because timeout when waiting for some replicas: <ip_address> (replication_alter_columns_timeout = 60). Alter will be done asynchronously. -
-
? через словарь?
-
Коллеги, нужен совет.
Есть таблица payment. Необходимо выбрать payment_id, которые являются строго вторыми по каждому user_id.
Как?
- Кореллированный подзапрос с лимитом - нельзя
- Оконных функций нет
Что делать?
На ум пока приходит только изотерическое решение, вида:
- отобрать все payment_id, являющиеся первыми через group by и argmin
- наложить их как фильтр not in и ещё раз отобрать payment_id, являющиеся первыми через group by и argmin
- тогда отберутся первые за вычетом первых из первой волны (простите за тавтологию)
Но это как-то совсем уж... А если надо отобрать не 2-е, а строго 3-е? -
Select user_id , groupArray(payment_id)[2]
From (select user_id, payment_id from payment order by ...)
group by user_id -
хм а если сделать в 1 запросе GROUP BY user_id ORDER BY user_id, ts то порядок в groupArray не детерменирован?
-
Joined.
-
нет
но можно отсортировать arraySort я просто не понял по какому полю надо вторым -
а вот и спонсор вопроса :)
-
По времени принятия payment)
-
SELECT PM.Account, argMin(PM.PaymentID,PM.DatePayment) as PaymentID
FROM payment PM
WHERE PM.PaymentID NOT IN (
-- Тут мы выбираем первые платежи, тогда в головном запросе первые отобраться уже не смогут и будут вторые
SELECT argMin(PaymentID, DatePayment) as PaymentID
FROM payment
WHERE 1=1
GROUP BY Account
)
GROUP BY PM.Account; -
ну такой вариант это прям на любителя)
-
Да, если мы захотим посмотреть тех, кто сделал 100 депозитов за 100 дней то умрем)
-
зачем все это, groupArray[2] проще и быстрее
-
Хотя не, не умрем)
-
Сейчас гляну что это такое, спасибо
-
Я опять со своими полисями =)
Удалось засунуть в кастомную политику два диска. Но как добавить второй диск в дефолтную политику?
<yandex>
<storage_configuration>
<disks>
<default>
<keep_free_space_bytes>1073741824</keep_free_space_bytes>
</default>
<hdd_disk>
<path>/data/clickhouse/</path>
<keep_free_space_bytes>1073741824</keep_free_space_bytes>
</hdd_disk>
</disks>
<policies>
<hdd_policy>
<volumes>
<hdd_volume>
<disk>default</disk>
<disk>hdd_disk</disk>
</hdd_volume>
</volumes>
</hdd_policy>
</policies>
</storage_configuration>
</yandex>
Так работает -
чисто в теории будет какая то польза от groupArray(2)(payment_id)[2]?
-
А так не работает (((
<yandex>
<storage_configuration>
<disks>
<default>
<!-- 1Gb Free for vsyakij pozharnyj and pod jupyter -->
<keep_free_space_bytes>1073741824</keep_free_space_bytes>
</default>
<hdd_disk>
<path>/data/clickhouse/</path>
<keep_free_space_bytes>1073741824</keep_free_space_bytes>
</hdd_disk>
</disks>
<policies>
<default>
<volumes>
<default>
<disk>default</disk>
<disk>hdd_disk</disk>
</default>
</volumes>
</default>
</policies>
</storage_configuration>
</yandex> -
Кстати да, будет. Я забыл про это
-
а какая ошибка?
-
А никакая - просто не запускается сервис
-
-
я не знал про этот способ, почитаю, спасибо!
-
-
-
-
-
Пробовал
-
-
И два диска в одном томе, и два тома с диском в каждом
-
-
-
чудесно работает
-
-
Похоже, ругается на то, что не может работать с таблицей, созданной при предыдущей конфигурации...
-
так создай еще полиси hdd_policy c старыми настройками
-
неужели никто не сталкивался с этим? 🤔
получается вьюшка не правильно считает sum(sign) из таблицы с CollapsingMergeTree -
Ну да, похоже, так и надо
-
вьюха это триггер на инсерт, скорее всего sum в таком виде групбай и ордербай может не иметь смысла
хотя для изначальной вставки смысл будет, да -
-
да спасибо, я в курсе про POPULATE
я тестировал 2 типа вьюшек: populate и to table …. Конечный результат одинаковый, счетчики на порядок меньше -
а какой запрос к основной таблице с которой сравниваешь?
-
да в общем почти такой же как и вью (только с HAVING total_messages >= 0) 😛
SELECT
created_at_date,
customer_id,
sum(sign) AS total_messages
FROM messages
GROUP BY created_at_date, customer_id
HAVING total_messages >= 0
ORDER BY total_messages desc -
-
Всем привет. Есть задача отсечь аномальные значения времени в выборке, что-то вроде https://ru.wikipedia.org/wiki/%D0%92%D1%8B%D0%B1%D1%80%D0%BE%D1%81_(%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0)
Попробовал использовать quantil, но это не совсем то что нужно. Может кто сталкивался с похожей задачей и может натолкнуть в какую сторону копать?Выброс (статистика)Выброс (англ. outlier), промах — в статистике результат измерения, выделяющийся из общей выборки.
-
-
-
У меня стоит такая задача. Есть список тикетов, у каждого тикета есть время его закрытия. Агент поддержки в среднем закрывает тикет за 10 минут, но в выборке из 50 объектов могут быть штук 5 у которых будет аномальное время закрытия, например неделю по разным причинам и их нужно как-то отсечь.
-
Прошу еще один совет.
Делаю импорт в кликхаус из внешней БД (постгре) через ODBC.
На очередной итерации имею массив айдюков источника, которые изменились или добавились (по last_update).
Не хватает операции типа UPSERT/MERGE, чтобы только лить изменения - приходится сначала удалять старые записи, так как дубли (старые и новые) не допустимы по бизнес логике.
Как лучше всего сделать эффект UPSERT/MERGE?
Видел ReplacingMergeTree - но там прямо пишут, что не расчитывайте, оно будет чистить в фоне, существование дублей возможно какое-то время.
Тоже самое с CollapsingMergeTree - это асинхронно, кроме того, это менее удобно, так как надо писать по две записи (одна из которыз сторнирующая). -
в статье википедии что вы скидывали выше есть пример формулы расчета граничных значений
-
А есть ли возможность произвести эти вычисления в процессе выборки? Или только в конечных результатах средствами ЯП?
-
сколько записей?
с ReplacingMergeTree можно жить, но нужно учитывать возможность дублей(либо составлять так что бы дубли не мешали, либо писать FINAL но это дольше будет, возможно сильно дольше) -
самая большая таблица - 20 миллионов строк, несколько гигабайт (с перспективой роста в разы)
инкремент в час - в пике до 50-100 тыс
дубли не допустимы при чтении из таблицы -
ну либо составлять запросы так(argMax(column,ts) в помощь), что бы дубли не мешали, либо FINAL
для словаря все же многовато выходит -
это не словарь, это основная таблица продакшен OLTP системы...
-
ага, то есть FINAL гарантирует что все будет “схлопнуто”, но это может быть сколь угодно долго, так?
-
а, даже не так, FINAL не приведет к MERGE таблицы (это будет по расписанию как обычно), он просто на уровне выборки данные смержит
-
да
-
есть еще OPTIMIZE FINAL он все домержит до конца
-
ага
-
а во время его работы - можно таблицей пользоваться?
-
читать и писать
-
да, но это так, нельзя рассчитывать на постоянное переливание полного объема данныз
-
а если я допустим попробую сделать два слоя, как в хранилищах
-
на слое RAW - таблицы с ReplacingMergeTree, куда буду лить данные периодически
на слое ODS - таблицы уже очищенные от дублей -
допустим места навалом и мощности IO и CPU - имеются
-
(все ограничения - только на источнике данных)
-
как лучше организовать, чтобы одна таблица обновлялась в зависимости от второй таблицы?
-
Может вам проще писать в кликхаус изменения данных, чтобы их не надо было обновлять?
-
поясните
-
Если например у вас в пг у юзера метрика скачет туда сюда 5-10-5, в кликхаусе пишите +5, +5, -5.
-
Идею понял, так не получится. Иточник - OLTP база, отдает данные крайне медленно. Даже просто ее вычитывать для загрузки - уже медленно и нудно.
Делаем хранилище, на текущем этапе стоит задача просто все выкачать как есть - максимально производительно. -
То есть решаемая задача - получить полную копию данных в локальном кликхаусе и обновлять ее инкрементально.
-
кликхаус + обновлять это уже плохая стратегия
-
Ну, кликхаус предназначен для хранилищ данных? Кажется, весьма да.
Тут не то, чтобы обновлять прям хочется, задача - получать копию данных.
ETL короче. -
как наиболее кошерно готовить ETL между OLTP (именно транзакционными базами, не БД логов) и кликхаусом?
-
Вообще, если что, все работает и загрузка данных уже налажена, просто я думаю как ее оптимизировать.
-
Сейчас я делаю выборку по ID из источника - получаю список новых или изменившихся ID
потом их удаляю из кликхауса
потом делаю INSERT AS SELECT -
и в этой истории не удобно только то, что приходится делать 2 запроса к источнику на 1 итерацию
- получить список айдюков для работы (чтобы их удалить из кликхауса)
- второй раз дернуть источник - уже чтобы загрузить данные в кликхаус по этим айдюкам -
просто в этом есть нечто порочное (чувствую)
-
-
думаю об этом, механика понятна, но кажется там те же издержки что и у ReplacingMergeTree
-
-
Соглашусь, вероятно это так. Встроенная механика merge tree - оптимизирована под это, а ALTER TABLE DELETE - нет.
Но, чисто практически, как оно есть на сегодня, у меня работает через DELETE и в текущих условиях оно отрабатывает практически мгновенно.
Я осознаю, что это концептуально не верно и против шерсти, но на практике это очень эффективно.
Сейчас процесс загрузки одного пакета данных может занимать несколько минут - все это время мы ждем запроса в источнике, а удаление из кликхауса через мутацию - менее секунды. То есть доля времени на не эффективную мутацию в КХ - на уровне погрешности.
С мутацией я получаю
- предсказуемый результат сейчас - нет дублей
- не надо учитывать это в запросах - данные получаются чистые
- не надо учитывать это в структуре данных (держать дополнительные поля под версию, работать с ними) - это конечно мелочи, я не против
Переход на replicating или collapsing версии движка merged tree на сегодня смущает
- неизвестностью
- отсутствие гарантий целостности (на момент чтения могут по факту быть дубли)
- … или необходимостью учитывать в запросах физику табличного движка -
-
Joined.
-
Всем привет! Как правильно проверить, что Clickhouse жив, по http? Отправить SELECT 1 и дождаться ответа с 1 норм?
-
да
-
Ну раз ты сам говоришь, что сейчас проблем нет - и не парься тогда.
Если найдешь источники побольше, то или с бизнесом договариваться о более грязных данных, или платную базу под etl покупать -
В текущих условиях хочется оптимизировать запросы к источнику.
Сейчас приходится делать 2 запроса на 1 пакет - потому, что
- мне надо сначала получить айдюки, которые буду загружать, чтобы их сначала удалить
- а уже после удаления их загружать
Ищу способ дергать источник один раз - сразу на INSERT-AS-SELECT BY RANGE.
Но спасибо за советы, я наверное буду копать в сторону collapsing версии движка и делать над ним вьюху с FINAL.
Наверное туда надо стремиться. -
Коллеги, можно ли выставить какой-то параметр при запросе, чтобы в случае ошибки не выдавалось текстовое описание?
-
Что за база в oltp?
-
всем привет. Кто знает почему сервер падает после Alter table ... update .... Это при апдейте нескольких тысяч записей
-
Postgre
-
В логах что?
-
Ну возьми Кафку, дебезиум и читай изменения из топика без запросов к базе вообще
-
Code: 412 Can't receive Netlink response
-
Проблема в том, что БД-источник находится на удаленном хосте, в другом административном юните и там НИЧЕГО нельзя ни установить, ни доработать, ни предприняти.
Есть только доступ к СУБД Postgre удаленно, с так себе скоростью. Доступно только читать БД.
Я так понимаю в этих условиях мне кафка мало поможет? -
Ну прям таки ничего нельзя? Там надо то просто wal replication врубить один, или как он там называется.
Мне кажется это в интересах самого источника будет, что ты перестаешь их ресурсы своими запросами забивать -
-
https://clickhouse.tech/docs/en/interfaces/formats/ а то тут все кроме SQL перечислено )
-
Организации доступа к БД ждали несколько месяцев, добавления поля lastUpdateDateTime - больше месяца. Все очень сложно.
-
так, почитал про дебизиум. А что мне потребуется от источника, говорите? Просто разрешить репликацию?
-
звучит очень перспективно
-
Ага
-
вот это тема, спасибо!
-
да, типа такого (если есть другие колонки, то использовать tuple):
select arrtpl2.1 as grp, grp2, arrtpl2.3 as aggValGrp1, aggValGrp2 from
(
select arrtpl.1 as grp2
, groupArray(tuple(grp, arrtpl.2, aggValGrp1)) as arrtpl2
, arrayReduce('max', arrtpl2.2) aggValGrp2
from
(
select grp, groupArray(tuple(grp2, val)) arrtpl,
arrayReduce('avg', arrtpl.2) aggValGrp1
from (
select number%13 grp, (number+6) %15 grp2, round(rand64()/1e18,2) val from numbers(100)
) group by grp
) array join arrtpl
group by grp2
) array join arrtpl2
order by grp2
; -
так лейте в новую таблицу и переименовывайте ее, старуй удаляйте
-
я за раз тяну только инкремент
-
думал о том, чтобы инкремент приземлять в новую (временную таблицу)
потом по ней анализировать новоприбывших
удалять их в основной таблице
и переносить в основную из временной -
почему -- в логе КХ написано,
или в сообщениях ядра sudo dmesg|tail -100 имскать oom -
тогда будет действительно только один запрос к источнику на круг
-
cat ffff.sql|clickhouse-client -mn
-
перечислить поля которые есть в csv insert into mytalbe(col1,col2,....)
или использовать input() -
похоже на баг, нужен семпл данных на котором видно багу.
целые дешевле сравнивать чем строки -
сreate table calendar ...
-
так это нормальное поведение
-
а insert при этом должен работать?
а то мне выдало:
Expected one of: SELECT query, possibly with UNION, SELECT query, subquery, possibly with UNION, SELECT, WITH, SELECT subquery, list of elements, SELECT query -
$ cat iii.sql
insert into XXXX(t) values(1);
insert into XXXX(t) values(1);
insert into XXXX(t) values(1);
insert into XXXX(t) values(1);
clickhouse-client -mn <iii.sql -
Благодарю.
-
Спасибо, но это немного не то
-
Привет! Подскажите, как в collapsingMergeTree доагрегировать дубликаты, строки или даты по признаку Sign? С int понятно можно sum(int * Sign) использовать, а как со строками быть
-
input() -- хорошая штука, можно входящий поток перемесить select-м и вставить результат select-а
https://clickhouse.tech/docs/ru/query_language/table_functions/input/ -
что то та же самая ошибка :(
-
values в той же строке?
-
что там может вообще не работать? Я это использую 8888 раз в день
-
-
-
-
-
clickhouse-client -m <iii.sql
-
-
-
Вечер добрый. Вопрос на выходные самообразованием заняться так сказать, не совсем по ckickhouse, но по базам. Гугл не забанен, но не нашёл с ходу. Вопрос постраничного поиска, сортировок в одинаковых данных, но разных базах, как один из вариантов, в шардах, в микросеовисах с паттерном Base per services. Скиньте если у кого есть мат часть почитать, можно в личку.
-
/// Query was killed before execution
он просто ждал чего-то, был блокирован например alter-м -
А есть какие-то обучалки, кроме документации Яндекса?)
Очень хотелось бы не тупить в каждом запросе, до этого писал на постгрес и МС скл -
deduplicate работает только с MergeTree.
collapsingMergeTree мержит по ключу -
У альтини есть несколько неплохих статей про кодеки сжатия, есть видео на ютубе от яндекса, где объясняется структура кликхауса
-
New Encodings to Improve ClickHouse Efficiency
July 10, 2019Modern analytical databases would not exist without efficient data compression. Storage gets cheaper and more performant, but data sizes typically grow even faster. Moore’s Law for big data outperforms its analogy in hardware. In our blog we already wrote about ClickHouse compression (https://altinity.com/blog/2017/11/21/compression-in-clickhouse) and Low Cardinality data type wrapper (https://altinity.com/blog/2019/3/27/low-cardinality). In this article we will describe and test the most advanced ClickHouse encodings, which especially shine for time series data. We are proud that some of those encodings have been contributed to ClickHouse by Altinity.This article presents an early preview of new encoding functionality for ClickHouse release 19.11. As of the time of writing, release 19.11 is not yet available. In order to test new encodings ClickHouse can be built from source, or a testing build can be installed. We expect that ClickHouse release 19.11 should be available in public releases in a…
-
-
Спасибо за ресурсы, с ними сталкивался. Они по факту ознокамливающие, а не обучающие
-
Есть сервер с ярдом запросов в сутки. RPS в пике 10к. Логи пишуться в отдельный файл (формат может быть любой). Вопрос, как наиболее эффективно инсертить такой объем в КХ ?
-
группировать запросы так что бы вставлялись раз в пару секунд, в общем то все
-
лярд в сутки не так много
-
спасибо, это понятно. но вопрос в каком формате (csv|json_row?) через http интерфейс, или clickhouse-client ? может ещё какие-то нюансы есть чтобы ускорить инсерт и снизить потребление ресурсов?
-
csv / tsv в разы быстрее чем jsoneachrow
-
ну я вставляют по http plain SQL INSERT VALUES
-
clickhouse-client / http не принципиально ,
по http поток прилетает в сервер и парсится,
clickhouse-client отпарсится на клиенте, и в сервер прилетит native, несколько уносит нагрузку на тачку на которой работает clietn -
если вам проще вставлять пофайлово, то csv/ tsv ваш выбор в таком случае
-
-
:) ну я не знаю, вот есть у меня текстовый файл, AAA.tsv как его превратить в Parquet? мне проще взять бинарь c названием clickhouse и сконвертировать AAA.tsv в AAA.native. Но смысл? Этот же бинарь зашлет AAA.tsv прямо в clickhouse
-
Ребята, вопрос про неактуальные дубли. Планируется перенести аналитику а CH. Всего планируется порядка миллиарда записей о звонках. Все метрики вызова плюс стоимость. Метрики неизменяемые, но стоимость редко но может пересчитаться по некоторым звонкам. Порядка 500 тыс.-1 миллиона записей за один два захода в месяц-два. Подойдёт ли а таком случае ALTER UPDATE? Пересчет можно делать по ночам но к утру информация должна быть уже актуальна. Или может использовать ReplacingMergeTreee и вызывать принудительно Optimize после вставки всей пачки... Какой подход оптимальнее?
-
Да, зависит от исходного формата. Условно при перегонке базы в базу паркет был лучше как промежуточный формат. При стриме конечно не так
-
Редко - это насколько редко?
-
-
Не чаще чем пару раз в месяц. Но сразу пачкой каждый пересчет.
-
Пачка в среднем не более миллиона
-
-
я бы использовал ReplacingMergeTreee и вызывать принудительно Optimize после вставки всей пачки
с update проблема в том что неизвестно что он вообще успешно завершится, и в куче случаев понадобится ручное вмешательство, прямо сейчас открыто с 10к тикетов, то КХ падает, то результат неверный, то куча апдейтов объединились в один суперапдейт и висят две недели и непонятно работают или нет и т.д. -
я каждую мутацию буквально пинаю ногами (но у меня 18.14) (и делаю раз в году)
то права на файлы не те, то размер результирующего парта больше максимального, то еще что-нибьдь -
-
-
я и в 400 млрд. таблице обновлял / удалял, но это жесть просто, как по минному полю
-
Ребят, спасибо за ответы
-
-
осторожнее надо, я уже потянулся за банилкой
-
-
Можно про кликхауз
-
-
написал в доку про force_deduplicate_childrens. Кто-нибудь понимает с кем я разговариваю? Или сильно запутано и надо переписать?
force_deduplicate_childrens
По умолчанию проверка дедупликации у материализованных представлений не производится, а наследуюется от Replicated* (основной) таблицы, за которой "следит" материализованное представление.
Т.е. если INSERT в основную таблицу д.б. пропущен (сдедуплирован), то автоматически не будет вставки и в материализованные представления. Это имплементировано для того, чтобы работали материализованные представления, которые сильно группируют данные основных INSERT, до такой степени что блоки вставляемые в материализованные представления получаются одинаковыми для разных INSERT в основную таблицу.
Одновременно это "ломает" идемпотентность вставки в материализованные представления. Т.е. если INSERT был успешен в основную таблицу и неуспешен в таблицу материализованного представления (напр. из-за сетевого сбоя при коммуникации с Zookeeper), клиент получит ошибку и попытается повторить INSERT. Но вставки в материализованные представления произведено не будет, потому что дедупликация сработает на основной таблице. Настройка force_deduplicate_childrens позволяет это изменить. Т.е. при повторном INSERT будет произведена дедупликация на таблице материализованного представления, и повторный инсерт вставит данные в таблицу материализованного представления, которые не удалось вставить из-за сбоя первого INSERT. -
не уверен, что т.е. хорошо выглядит в доке.
впринципе понятно, но наверное можно сделать лучше -
force_deduplicate_childrens
Изменяет поведение дедупликации для наследуемых от Replicated* материализованных представлений.
Условия применения:
* Материализованное представление зависит от Replicated* таблицы
* Произошла успешная вставка на уровне таблицы и ошибка на уровне мат представления
* Клиент повторяет вставку которая завершилась ошибкой в основную таблицу
Возможные значения
0 — проверка дедубликации производится для основной таблицы.
1 — проверка дедубликации производится для конкретного материального представления.
Если force_deduplicate_childrens = 0 при повторном INSERT будет произведена дедупликация на таблице основной таблицы, и автоматически не будет вставки данных в материализованные представления.
Если force_deduplicate_childrens = 1 при повторном INSERT будет произведена дедупликация на таблице материализованного представления, и произойдет вставка данных в материализованные представления. -
и уже внизу расписать что и почему было сделано
-
но это исключительно Имхо
- 07 March 2020 (74 messages)
-
-
-
Я тут создал таблицу с engine = Kafka
clickhouse и kafka запущены в docker контейнерах
в логах CH:
DB::StorageKafka::threadFunc(): std::exception. Code: 1001, type: cppkafka::HandleException, e.what() = Local: Timed out0.
Подскажите как это победить?
Сами сообщения в типики попадают если через python либу отправлять
producer = KafkaProducer(bootstrap_servers='localhost:9092', value_serializer=lambda v: json.dumps(v).encode('utf-8'))
producer.send('topic', value={"timestamp": 10, "level": "test", "message": "msg test"}) -
docker-compose такой
version: '3'
networks:
app-tier:
driver: bridge
services:
clickhouse-server:
image: yandex/clickhouse-server
restart: always
ports:
- 8123:8123
- 9000:9000
ulimits:
nproc: 65535
nofile:
soft: 262144
hard: 262144
networks:
- app-tier
kafka:
image: 'bitnami/kafka:latest'
ports:
- "9092:9092"
environment:
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,PLAINTEXT_HOST://:29092
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
depends_on:
- zookeeper
networks:
- app-tier
zookeeper:
image: 'bitnami/zookeeper:latest'
ports:
- '2181:2181'
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
networks:
- app-tier -
плюс в логах
clickhouse-server_1 | Include not found: networks
clickhouse-server_1 | %3|1583572792.903|FAIL|ClickHouse 20.1.4.14#consumer-1| [thrd:localhost:9092/bootstrap]: localhost:9092/bootstrap: Connect to ipv4#127.0.0.1:9092 failed: Connection refused (after 0ms in state CONNECT)
clickhouse-server_1 | %3|1583572792.903|ERROR|ClickHouse 20.1.4.14#consumer-1| [thrd:localhost:9092/bootstrap]: localhost:9092/bootstrap: Connect to ipv4#127.0.0.1:9092 failed: Connection refused (after 0ms in state CONNECT)
clickhouse-server_1 | %3|1583572792.903|ERROR|ClickHouse 20.1.4.14#consumer-1| [thrd:localhost:9092/bootstrap]: 1/1 brokers are down
clickhouse-server_1 | Include not found: clickhouse_remote_servers
clickhouse-server_1 | Include not found: clickhouse_compression -
У вас же кликхаус к локалхосту подключается, а должен к Kafka:9092
-
Если так producer = KafkaProducer(bootstrap_servers='kafka:9092', value_serializer=lambda v: json.dumps(v).encode('utf-8'))
то получаю ошибку
NoBrokersAvailable: NoBrokersAvailable -
-
у вас в конфиге таблицы с engine = kafka в поле хоста кафки должно быть название контейнера с кафкой
-
Там запаблишен порт, поэтому будет торчать и на локалхосте тоже. Но лучше имя хоста указать, во избежание.
Насчет проблемы - вероятно напутали с Advertised Listeners, у вас там локалхост:29092, попробуйте поменять на имя сервиса и пересоздать стек -
Порт на локалхосте открыт, но кликхаус поднят в другом контейнере у которого свой отдельный локалхост. После сммены хоста у человека к кафке подключилось, но появилась проблема с топиками
-
Да, но я про вызов продьюсера - кстати, он из контейнера запускается или просто с машины?
Если с машины - то про kafka она значит ничего не будет, нужно оставить локалхост.
И вдобавок: у битнами раньше были креды пользователя выставлены по умолчанию, стоит проверить, выставлены/сброшены ли -
с машины запускал, сообщения доходят до топиков
насчет кред, судя по доке такие по дефолту
KAFKA_BROKER_USER: Kafka client user. Default: user
KAFKA_BROKER_PASSWORD: Kafka client user password. Default: bitnami -
Может ктото сталкивался с проблемой хранения первых входов в систему (install приложения, новый пользователь и подобное).
На протяжении суток происходит порядка 500-700 млн входов с разных устройств, новыми из которых являются всего несколько миллионов. Необходимо хранить всех новых пользователей в отдельной таблице (или мат view), поскольку пользователи сервиса как всегда хотят видеть рост количества новых устройств\пользователей он-лайн.
Первым решением был ReplacingMergeTree с ver toDateTime(‘2100-01-01’)-now(). От такого решения отказались ввиду очень медленным SELECT с FINAL. А без FINAL данные за посление часы отображались криво что не устраивает пользователей системы.
Сейчас решение такое, ежеминутно запускается скрипт который новые входы за последнюю минуту инсертит в отдельную таблицу
INSERT INTO db.firstaccess
SELECT deviceID, accessdatetime FROM db.allaccess
WHERE accessdatetime between lastupdated and now()
AND deviceID GLOBAL NOT IN
(
SELECT distinct deviceID
FROM db.firstaccess
)
понятно что это костыль и с ростом таблицы db.firstaccess все становится медленнее и медленнее.
Возможно у вас есть какие то идеи для решения таких задач без костылей? Спасибо -
Судя по вашим логам, кх пытается подключится к брокеру на локалхосте, а должен идти на kafka. Можете показать, как создавали таблицу с кафка энджином?
-
сейчас так:
query = """
CREATE TABLE queue (
timestamp UInt64,
level String,
message String
) ENGINE = Kafka SETTINGS kafka_broker_list = 'kafka:9092',
kafka_topic_list = 'topic',
kafka_group_name = 'group1',
kafka_format = 'JSONEachRow',
kafka_num_consumers = 1;"""
print(client.execute(query))
до этого localhost:9092 был указан -
И с таким сетапом что в логах кх? Можно поскейлить кафку в 0-1, если кх таки подключился - будут видны сообщения о дисконектах
-
docker-compose logs clickhouse-server
Attaching to dev-deployment_clickhouse-server_1
clickhouse-server_1 | Include not found: clickhouse_remote_servers
clickhouse-server_1 | Include not found: clickhouse_compression
clickhouse-server_1 | Logging trace to /var/log/clickhouse-server/clickhouse-server.log
clickhouse-server_1 | Logging errors to /var/log/clickhouse-server/clickhouse-server.err.log
clickhouse-server_1 | Include not found: networks
clickhouse-server_1 | Include not found: clickhouse_remote_servers
clickhouse-server_1 | Include not found: clickhouse_compression -
docker-compose exec clickhouse-server cat /var/log/clickhouse-server/clickhouse-server.err.log
2020.03.07 13:54:43.716055 [ 1 ] {} <Error> Application: Listen [::]:8123 failed: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = DNS error: EAI: -9 (version 20.1.4.14 (official build)). If it is an IPv6 or IPv4 address and your host has disabled IPv6 or IPv4, then consider to specify not disabled IPv4 or IPv6 address to listen in <listen_host> element of configuration file. Example for disabled IPv6: <listen_host>0.0.0.0</listen_host> . Example for disabled IPv4: <listen_host>::</listen_host>
2020.03.07 13:54:43.716689 [ 1 ] {} <Error> Application: Listen [::]:9000 failed: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = DNS error: EAI: -9 (version 20.1.4.14 (official build)). If it is an IPv6 or IPv4 address and your host has disabled IPv6 or IPv4, then consider to specify not disabled IPv4 or IPv6 address to listen in <listen_host> element of configuration file. Example for disabled IPv6: <listen_host>0.0.0.0</listen_host> . Example for disabled IPv4: <listen_host>::</listen_host>
2020.03.07 13:54:43.716834 [ 1 ] {} <Error> Application: Listen [::]:9009 failed: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = DNS error: EAI: -9 (version 20.1.4.14 (official build)). If it is an IPv6 or IPv4 address and your host has disabled IPv6 or IPv4, then consider to specify not disabled IPv4 or IPv6 address to listen in <listen_host> element of configuration file. Example for disabled IPv6: <listen_host>0.0.0.0</listen_host> . Example for disabled IPv4: <listen_host>::</listen_host>
2020.03.07 13:57:36.718813 [ 40 ] {} <Error> void DB::StorageKafka::threadFunc(): Code: 27, e.displayText() = DB::Exception: Cannot parse input: expected { before: test: (at row 1)
, Stack trace (when copying this message, always include the lines below)
тут в конце видно сообщение test дошло, больше воспроизвести не удается -
блин, не красиво логи выводятся
-
отправлял сообщения через
kafka-console-producer.sh --broker-list kafka:9092 --topic test внутри контейнера -
Емнип по умолчанию он будет стоять на сломанном сообщении, нужно почистить топик / другой выбрать и попробовать отправить валидно
-
Странно конечно, что вы в кх никуда аутентификацию не передавали, а она вроде бы и есть
-
я сейчас взял образ от wurstmeister
kafka:
image: "wurstmeister/kafka:latest"
ports:
- "9092:9092"
hostname: kafka
links:
- zookeeper
environment:
- KAFKA_ADVERTISED_HOST_NAME=kafka
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
- KAFKA_ADVERTISED_PORT=9092
zookeeper:
image: wurstmeister/zookeeper:latest
ports:
- "2181:2181" -
Прекрасный выбор! Несколько дней назад его настраивали, все было шикарно
-
А что скажите насчет confluentinc/cp-kafka ?
-
Не смотрели - вурстмистер завелся, тесты прошел успешно, в том числе с HA сетапе (кроме осечек кх касательно дубликатов и напряжений с реконнектами, когда падает один брокер)
-
а удалось справиться с дубликатами?
-
MVP данного чата сразу пресек все попытки, пояснив, что такова жизнь. Их было несколько штук на 100к записей, что для нас терпимо в сценарии «упал брокер, пролежал, вернулся»
P.S. Пока все сервисы жили, дубликатов не появлялось -
ну да, если несколько записей, то думаю не критично
как понимаю, связку кафки и кх можно использовать на проде -
Очень надеюсь, мы как собираемся скоро выкатывать :)
-
эт отлично
так, удалил топик, пересоздал таблицу queue, отправил сообщение, во view появились данные и в основной таблице тоже, это огонь! -
Поздравляю с победой!
-
спасибо за помощь)
остается из локалхоста отправить сообщение, через питон клиент, сейчас отправлял через kafka-console-producer.sh в контейнере -
@anton_zhuravsky, можно еще вопрос, если сообщение сломано, всегда надо будет удалять топик? нет другого подхода?
-
Есть параметр skip_broken_messages, он разрешает пропускать Н сломанных сообщений. По идее еще можно подвинуть курсор в кафке на следующее сообщение, но как это точно сделать не скажу
-
Что-то вроде https://gist.github.com/marwei/cd40657c481f94ebe273ecc16601674b должно решать вопросHow to Reset Kafka Consumer Group Offset
How to Reset Kafka Consumer Group Offset. GitHub Gist: instantly share code, notes, and snippets.
-
Для того что-бы передвинуть курсор, необхожимо предварительно отключить консюмера.
-
Да, верно. В данном кейсе не проблема, так как консьюмер (кх) все равно стоит на одном сообщении и дальше не двигается
-
@anton_zhuravsky А если удалить предыдущую Kafka таблицу и создать новую с параметром skip broken message. То консюмер проигнорирует сообщения с ошибкой и продолжит работу
-
Да, можно так, но тут момент:
скип - это допустимое количество невалидных сообщений в блоке, то есть он будет постоянно пропускать до Н сообщений. Если у вас ситуация с невалидным сообщением исключительная - возможно, лучше чинить «вручную», быть может даже передобавляя исправленную запись в очередь, чтоб не начать пропускать сообщения в автоматическом режиме и ничего про это не знать -
в replacingmergetree какой order by был? по deviceid пробовали?
вообще, что-то - что ищет быстро по ключу, и позволяет делать много запросов вам подойдет больше (cassandra/scylla/любой key value/локальный dictionary/hashset в памяти) ну и добавить колонку isFirstAccess в КХ таблицу (т.е. лукап в КВ, и потом запись в КХ с соответствующим значением колонки). -
Горячий кеш в Redis, a вот для онлайн отчетов которые завязаны на новых пользователях нужны именно таблицы.
-
-
-
Нет, слишком большая база для key value
-
-
-
сколько у вас будет юников? 100 миллионов? можно смело по deviceID лукапить... вам и редис грузить не нужно. Считайте все в память и лукапьте на здоровье. Либо лукапьте по короткому хешу, если не найден, то проверяйте в редис (у вас таких 1%).
нету insert-ignore. опять таки, если прямо именно в КХ, можете поиграть с ордер by. FINAL может стать быстрее. -
Проблема в том что с одной стороны тут четкое кейвал deviceid->installdate, но отчеты всем нужны в другую сторону, то есть дайте всех клиентов у которых installdate=today(). Хоть 2 таблицы делай
-
-
-
Это точно нет. За сегодня от 50млн и до 200 млн записей, если 10-15клиентов одновременно сделают селект сервера лягут
-
тогда у вас очень слабые сервера. скан одной, двух колонок на таких объемах не должен ничего "ложить". Можете поиграться с потоками (уменьшить), тогда с параллелизмом будет получше, но скорость упадет.
-
Это да надо попробовать
-
-
-
простое решение передавать специальный параметр, первый ли заход) такая же вещь должна же трекатся гдето
-
Это только бэк трекает, sdk не наше, просто идет вал запросов:(
-
-
ну, в таком случае все решения получаются не очень простые, мг
вообще я бы попробовал вариант с replacingMergeTable только вместо использования FINAL argMin или что то подобное в запросе -
Я вообще думал optimize final каждых 5 минут и показывать данные с лагом в 5 минут - начальство не одобрило, но план был неплохой:)
-
а сколько памяти у сервера?
-
-
а шардируется как?
-
-
вообще грубо считая, миллиард uuid это ок 16гб, будет у вас много памяти, можно было бы попробывать с SET движком
-
-
но возможно это бы жутко тупило
-
типа вьюха с SELECT device_id FROM WHERE device_id NOT IN devices_list
-
-
Есть ли готовое решение по сохранению метрик из Prometheus или из VictoriaMetrics в CH?
-
>Мне на самом деле нужен insert ignore
>Который бы сходу мерджился
скорость света в этой реальности к сожалению ограничена. Поэтому вряд ли.
Вам нужен другой realm, с дедом морозом и феями и волшебными палочками. -
uniqState today - uniqState yesterday ?
- 08 March 2020 (139 messages)
-
Joined.
-
Joined.
-
-
Есть такие таблицы
таблица для очереди с engine = Kafka
консьюмер MATERIALIZED VIEW
и основная таблица куда консьюмер кладет данные.
И такой вопрос, если потребуется добавить столбец в основную таблицу, то какая должна быть логика работы?
Я должен:
1) отсоеденить материлизованное представление через DETACH,
2) удалить таблицу для очереди
3) добавить столбец в основную таблицу
4) добавить таблицу для очереди с engine = Kafka с обновленными столбцами
5) присоеденить материлизованное представление - консьюмер или может лучше пересоздать его
так или принято по другому? -
@anton_zhuravsky, можете помочь с вопросом выше? Вчера сильно помогли, сегодня имею наглость еще раз попросить помощи)
-
-
Ну давайте попробую :) Вам в любом случае придется поменять таблицы и для очереди, и для MV - так как вы добавили колонки. Детач звучит лучше, так как не придется двигать офсеты - ведь если вы пересоздадите таблицы, они начнут получать данные «с текущего момента». Если подвигать офсеты нетрудно - я бы пересоздал с нуля и руками выставил бы правильный офсет и казалось бы все
-
Навскидку, МВ можно смело пересоздавать вообще всегда, так как офсет привязан к таблице-очереди (она выступает консьюмером). Пока из нее не читаем (чем занимается мв), все окей. Но возможно я что-то упустил, лучше проверить лишний раз.
-
Главное создать Kafka engine с той же consumer group, что и была. Остальное, имхо, не оч важно
-
Ну а в проде (если это миграцим схем и пр) я делал через отдельные топики. Поменяли схему - пишем в топик в2; топик в1 доели - выключили все, жобавили колонки, подключились к новому. Так ничего не теряем, умеем выкатить в2 постепенно (роллинг деплои наше все) и не напрягаем никого ошибками
-
Собственно, в реюзе топика осн беда - это нечаянно смешать в1 и в2 сообщения, чего легко достичь, трудно починить и невозможно забыть :)
-
Интересно, идею вроде понял, в очередной раз спасибо)
-
Не за что, рад если полезно
-
А как надо выбирать ключ семплирования?
-
У меня в бд есть столбик event_name, я хотел по нему, clickhouse ругается что он string. Я хочу просто еще один столбик добавить и его через DEFAULT и функцию хеширования заполнять просто. Правильно я делаю?
-
Подскажите плз, вчера обновил версию до 20.1.6.30 сегодня на паре серверов (реплики друг-друга) ЛА под 250, вся память съедена и по сути все висит. Эти сервера объединяет только одна база с парой больших таблиц. Останавливаю кликхаус - машинки в норме, включаю - через какое то время начинается мердж партиций в одной из этих больших табллиц и через пару минут все стопорится, машинка умирает
-
-
Ключ семплирования должен быть чем-то, что бьет вашу выборку на «равноценные» куски. Поэтому реокмендуют брать что-то вроде UserId (предполагая, что пользователи у вас «одинаковые», и считая какие-то вещи для части пользователей, результат разумно экстраполировать на всю выборку).
В свете сказанного event_name, наверное, не лучший кандидат, хотя, конечно, зависит от того, что вы хотите -
-
А запросы котом какие должны быть для этого ключа? Найти среднее между пользователями (group by user_id) или найти среднее для одного пользователя с where user_id=%user% ?
-
Ключ семплирования должен быть чем-то, что бьет вашу выборку на «равноценные» куски. Поэтому реокмендуют брать что-то вроде UserId (предполагая, что пользователи у вас «одинаковые», и считая какие-то вещи для части пользователей, результат разумно экстраполировать на всю выборку).
В свете сказанного event_name, наверное, не лучший кандидат, хотя, конечно, зависит от того, что вы хотите -
Для сэмплированной выборки вы указываете SAMPLE часть в запросе (какую часть хотите, 0..1 или сколько значений, например 10000). Делать какие-то вычисления по, собственно, ключу семплирования, наверное, не оч разумно. Более валидный пример - вам интересен средний возвраст пользователя, хранящийся в колонке Age, но точности не нужно - тогда пишите SELECT avg(Age) FROM users SAMPLE 0.1 - кх посчитает среднее для 10% пользователей и даст вам (скорее всего) близкий к настоящему ответ
-
Если части SAMPLE в запросе нет - то выборки работают как обычно
-
кажется понял для чего он, я пытался понять запросы потом должны быть в контексте одного пользователя или на всех пользователей
-
понял что на всех
-
-
А запустить один из серверов (чтоб кластер не баловался репликацией) и сделать полный дамп можно (с учетом размера таблицы)?
-
-
-
-
-
А если прибить зукипер? По идее должен перевести таблицу в ридонли тогда...
-
-
-
-
-
Попробовать перевести данные в detached потом запуститься, и по тихонько делать attach
-
-
-
Я так понимаю, на это есть 30 секунд :)
-
-
Быть может попробовать всякие параметры типа merge_max_block_size потрогать, чтоб он память не выедал всю?
-
Попробуйте все же зукипер приложить, быть может мержи это тоже остановит
-
Теряете, я так понимаю, немного
-
В каталоге таблицы, переносите подпапки в директорию detached на выключенном ch. Запустите clickhouse, он не будет видеть эти данные. Главное про репликацию не забыть, чтобы с реплики не начали прилетать те данные, которые унесли в detached. Запустится, потом по имени партиций через запросы attach делаете атач. Проблемы подобные решал как то так. Разумеется недоступны были данные те что в detache какое-то время
-
-
-
-
а если у меня все запросы только в контексте одного пользователя?
SELECT AVG(field) FROM table SAMPLE 0.1 WHERE user_id = 1
Для таких запросов семплирование по user_id неправильно же будет? А если сделать семплирование по полю time? Там unix timestamp у меня -
А что вы хотите получить от сэмплирования собственно?
-
Я хочу получать примерный результат, не считывая все строки
-
Чем точнее, тем лучше
-
Как влияет на это ключ не очень понимаю, в доках толком не написано
-
Окей, у вас наверняка есть какие-то другие сущности в контексте пользователя - сессии например или что-то еще. Или просто поток событий, равнозначных между собой?
-
uuid, event_name, event_time, user_id и десяток полей, которые в большинстве случаев не заполняются
-
больше нету
-
В такой истории немного стремно советовать какой-то определенный sampling key, потому что можно получить жесткий байас в запросах. Ну, например, если сделать сэмплировпние по имени события - оно вырежет какие-то события из рассмотрения вообще, и запросы вида select uniqExact(event_name) from events where user_id = x sample 0.1 будут возвращать глупости. Можете попробовать завести сэмплирование по uuid (предполагаю, что это уникальный ключ события, что-то вроде уникального id).
А вообще говоря, на пользователя много событий приходится? Может, зря приседаете? -
Записей на user_id много, в каждом запросе еще event_name указывается по типу WHERE user_id = 1 AND event_name = 'pickup'
-
Ну если у вас такие выборки, и это все равно миллионы записей - вполне подойдет сэмплирование по uuid (опять же, если это это нейкое случайное число, которое не коррелирует с условиями запроса)
-
Invalid sampling column type in storage parameters: UUID. Must be unsigned integer type.
uuid добавлен в таблицу как какое-то уникальное поле чтобы запись по 1 можно было читать если требуется -
uuid у вас строка?
-
CREATE TABLE events (
uuid UUID DEFAULT generateUUIDv4(),
Тип UUID -
-
Понял, вам нужно как-то преобразовать его в число. Попробуйте SAMPLE BY intHash32(uuid) например
-
как его тогда в primary key (order by) добавить?
Ошибка Sampling expression must be present in the primary key. -
Пытался сделать так:
ORDER BY (user_id, event_name, event_time, uuid) -
Выражение целиком должно быть, то есть intHash32(uuid) тоже вместо uuid
-
Сделал так:
CREATE TABLE test (
uuid UUID DEFAULT generateUUIDv4(),
...
ORDER BY (user_id, event_name, event_time, intHash32(uuid))
SAMPLE BY intHash32(uuid)
Ошибка:
Illegal type UUID of argument of function intHash32. -
Трагедия. Давайте тогда intHash32(UUIDStringToNum(uuid)) вместо intHash32(uuid)
-
-
может какой нибудь cityHash64 поставить вместо intHash32?
-
-
Попытка не пытка, можно пробовать, но есть шансы, что функции хэширования просто не могут из uuid (поэтому и UUIDStringToNum). intHash32 и должен для строковых типов использовать cityHash (неясно, почему не хочет uuid как строковый тип хотя бы рассмотреть)
-
А где эту доку найти или draft только в чате?
-
Не забывайте, что семплирование работает поверх индекса. И если есть условие user-id = 1, то писать sample при семплировании по юзерам нет смысла
-
Joined.
-
И семплирование меньше одной сотой скорее всего помогать будет мало
-
а может просто добавить поле uint32 и вставлять туда случайное число и по нему делать семплирование? по uuid я понимаю, будет считать по первым записям?
-
Если мы смотрим результаты, как-то изменяем тактику работы в своем приложении, записи добавляются в другом диапазоне значений, а семприрование не будет учитывать последние записи, а всегда только вначале
-
Вы можете считать, что intHash32(UUIDStringToNum(uuid)) и будет тем самым случайным числом. Мы ведь верим,что хэш-функция достаточно хороша, а значит равномерно распределена - выходит, вы не отличите эти значения от рандома.
Короче говоря, не переживайте: случайные данные, смазанные хэшом можно считать все так же случайными :) -
Только если ключ семплирования это что то вроде intHash32(user_id), то и в запросе нужно писать не user_id = 1, а intHash32(user_id) = intHash32(1) and user_id = 1. Тогда индекс заработает.
-
Это не понял.
Куда это указывать? Есть у меня запрос например SELECT AVG(field) FROM table WHERE user_id = 1 SAMPLE 0.1
Семплирование в таблице по cityHash64(uuid) -
Sample выкинуть
-
В where добавить
-
Where user_id = 1 and cityHash64(user_id) = cityHash64(1)
-
Чтобы работало cityHash64(uuid) = cityHash64(1), uuid должно же быть равным 1, а оно строка 36 символов
И для чего тогда это? https://clickhouse.tech/docs/ru/query_language/select/#select-sample-clause -
И не стоит делать длинный (много столбцов) ключ в таблице или ключ который много весит (случайные строки произвольной длины). Так как семплирование последнее в ключе, то оно будет очень страдать.
-
Печатаю с телефона. Везде user_id.
-
Кажется, Ovseiko уже решил использовать сэмплирование по uuid, так как семплирование по user is лишено смысла в его случае :)
-
Это по моему максимально лишено смысла
-
для чего считать cityHash64 от user_id, когда бы берем только по одному пользователю?
-
Его никто и не считает, смотрите внимательнее. Хэш считаем от uuid
-
Я вот не понял почему оно лишено смысла :) если пользователей больше 10тысяч оно не только даст хороший физический смысл семплированию, но и позволит считать отдельных пользователей без семплирования с неплохим ускорением.
-
Так, я запутался уже окончательно, господа
-
user_id скорее сюда надо, а не в семплирование
PARTITION BY (user_id, event_name)
ORDER BY (user_id, event_name, event_time) -
@MashinaMashina вы хотите сэмплированные выборки делать в скоупе одного пользователя или по всем?
-
У меня where user_id = %N% во всех запросах
-
то есть в контексте одного пользователя
-
Ну тогда сэмплирование по любой производной от user_id вам не очень-то и нужно. То, что вероятно нужно - это сэмплированные выборки в скоупе пользователя (раз у вас все выборки в скоупе пользователя), а значит ключ сэмплирования должен быть чем-то, что не зависит от user id вообще от слова совсем. Потому и предлагаю взять uuid
-
тут я всё понимаю, я сбился с пути после слов @dancing_elf
-
(предполагая, что uuid вы никак к user id не привязывете, а генерируете уникальный для каждого события)
-
Если user_id такой большой, что будет в partition by, то тогда понятно почему uuid это неплохой вариант.
-
Сорян
-
я не понял почему не указывать sample в запросе? Вот же https://clickhouse.tech/docs/ru/query_language/select/#select-sample-clause
-
Sample работает через индекс. Его можно эмулировать самому подставляя в where выражения вида 0 <= sample_column < max_possible_value_of(sample column type) / 100
-
Просто удобно иметь для семплинга отдельный синтаксис
-
получаю ли я выигрыш с этого? Для чего самому эмулировать, когда clickhouse может штатными средствами?
-
Иногда хочется индекс использовать напрямую
-
А он и так используется
-
ch не дает указать sample key не входящий в индекс
-
тут я писал
-
как его тогда в primary key (order by) добавить?
Ошибка Sampling expression must be present in the primary key. -
/spam
-
Подскажи тогда как индекс использовать?
uuid например 6ce633f9-4341-4256-b31e-804717fdc7b3
ORDER BY (user_id, event_name, event_time, cityHash64(uuid))
Я хочу выбрать одну запись по uuid. Делаю запрос
WHERE
cityHash64(uuid) = cityHash64('6ce633f9-4341-4256-b31e-804717fdc7b3')
AND user_id = 1
AND uuid = '6ce633f9-4341-4256-b31e-804717fdc7b3'
Ничего не найдено. Запрос
SELECT uuid, cityHash64('6ce633f9-4341-4256-b31e-804717fdc7b3'), cityHash64(uuid)
FROM test
WHERE user_id = 1
AND uuid = '6ce633f9-4341-4256-b31e-804717fdc7b3'
Возвращает
{
["uuid"]=>
string(36) "6ce633f9-4341-4256-b31e-804717fdc7b3"
["cityHash64('6ce633f9-4341-4256-b31e-804717fdc7b3')"]=>
string(20) "18166799775718080968"
["cityHash64(uuid)"]=>
string(19) "2862894495263800216"
}
Как я понимаю там где-то типы uuid разные и cityHash64 возвращает разные значения -
cityHash64(uuid) = cityHash64(toUUID('6ce633f9-4341-4256-b31e-804717fdc7b3'))
-
1 rows in set. Elapsed: 0.136 sec. Processed 585.00 thousand rows, 9.63 MB (4.31 million rows/s., 70.93 MB/s.)
По моему индекс не использовался, что может мешать? -
ну очевидно же, как он может использоваться
-
у вас куча полей до uuid в индексе
-
забудьте про sampling
-
вам это не надо
-
Как не надо? Потому что 500к строк? Так это я пока на вечер нагнал, будет больше
-
вы не гугл
-
вводить ради семплинга uuid , это все равно что ногу отрезать, чтобы быстрее бегать, потому что масса тела уменьшится
-
А что мне тогда делать? Для чего мне считать 1кк записей, если можно 100к?
-
Это же не 1 человеку, все хотят что-то посмотреть, у всех свои данные
-
90% нагрузки снять
-
я перечитал ваши сообщения. Сейчас это выглядит так "я отрезал себе ногу и она чешется, что мне делать?".
мой ответ: "Я не знаю" -
есть масса инструментов, индексы, партиции, MV, LiveView
-
LiveView это про него? https://www.altinity.com/blog/2019/11/13/making-data-come-to-life-with-clickhouse-live-view-tables
Экспериментальная функция добавленная в конце 19 годаMaking Data Come to Life with ClickHouse Live View TablesHave you ever wanted to get a notification from your database when the query result has changed due to new data? Have you ever wanted to build a real-time dashboard where your graphs would change in real-time based on fresh aggregates from your ClickHouse cluster? Well, starting in the 19.14.3.3 ClickHouse release, an experimental feature was added to ClickHouse that you most likely did not notice.
-
Почитаем, за это спасибо) Затестим
-
А есть какие-то доки по LiveView? Интересная функция, ее бы к nodejs прикрутить и на лету изменения пользователю отдавать, не пересчитывая таблицу в бд каждый раз
-
Materialised view не использую, так как много пользователей. И у каких-то пользователей много записей, у каких-то мало, таблица основная одна, а запросов к ней много разных. Если делать Materialised view, то во много раз увеличится размер бд
-
ржака, uuid вам увеличил размер таблицы раз 5, если че
-
А что вместо него использовать тогда?
-
Вы бы подсказали что-нибудь, а не смеялись
-
я все еще рассматриваю отрезаную ногу, теряюсь в загадках, зачем вы так
-
Надо какое-то поле уникальное +-, тк auto increment нету, использую uuid
-
ой, все, я устал смеятся и одновременно лоб болит от фейспалмов, я пойду напьюсь, а завтра возьму больничный
-
подскажите пожалуйста, toNullable функция не работает с -State комбинатором ?
простейший запрос
SELECT 'maxState(10)', toTypeName(maxState(10))
union all
SELECT 'maxState(toNullable(10))', toTypeName(maxState(toNullable(10)))получаю вот такой ответ
maxState(10) AggregateFunction(max, UInt8)
maxState(toNullable(10)) AggregateFunction(max, UInt8) - 09 March 2020 (164 messages)
-
А самостоятельно имплементировть счетчик не получается?
-
кстати, а если на лету требуется добавить столбец? то есть пришел запрос по API, и на основе данных из запроса надо создать столбец если его не хватает
-
На лету - это значит динамически? А-ля пользователь в админке нажал кнопку «хочу еще колонку А» и она появляется в таблице?
-
да, динамически. И да, вариант с админкой как раз возможный кейс использования
-
Я бы тем более делал через отдельные топики со «своими» очередями/MV. Но ваш запрос уже достаточно сложный с точки зрения проектирования, так как поднимает много проблем (а что если пользователей создат 100500 колонок? а какие должны быть значения по умолчанию? а как обновятся продьюсеры?), поэтому я бы воздержался от какого-то конкретного предложения тут
-
допустим мы не знаем какие данные придут по API и структура таблицы возможно не подходит, то тогда можем создать столбцы сразу в API используя те советы с топиками которые были выше
-
Быть может тогда лучше завести json поле для вариабельной части схемы?
-
сейчас планируется около 100 - 150 колонок
-
про json думал, но опять же как по ним быстрые select запросы делать
-
Ну он будет медленнее колонок, разумеется, но не факт, что неприемлимо медленно. Я просто как-то в целом недолюбливаю автоматическое изменение схемы и в таком разрезе json кажется лучшим вариантов
-
> а как обновятся продьюсеры?)
да, это проблема, надо как то названия топиков на лету менять -
Может стоит рассмотреть изначально более гибкие схемы, например, вместо (eventName, metric1, metric2, ..., metricN) сделать (eventName, metricName, metricValue)?
-
Доброе утро,
кто-нибудь использует Spark Structured Streaming в связке с CH? Интерестно возможно ли записывая данные в CH из стриминга гарантировать "exactly once"? -
Про (eventName, metricName, metricValue) не очень понял)
-
Ну чтобы вместо данных вроде (‘click’, 1, 2, 3) под схему (eventName, userId, someId, otherId) делать три записи: (‘click’, ‘userId’, 1), (‘click’, ‘someId’, 2), (‘click’, ‘otherId’, 3)
-
хм, интересно, надо будет тогда группировать записи чтобы дубли дабы исключать дубли
-
возможно вариант с json полем попробую, не знаю только что скажут потом аналитики)
-
Зависит, вероятно комбинатор -If решит ваши нужны. Например, select countIf(metricName = ‘someId’) as someId, countIf(metricName = ‘otherId’) as otherId from events where eventName = ‘click’
-
никто не знает ? 🙈
-
если установить Tableau Server for Windows, то можно на нем же (локально) установить и запускать Tableau Desktop. и тогда если в Desktop коннект нормальный, то и на сервере он также (полу-автоматом) будет нормальным. а дальше можно (имея “положительный контроль”) заниматься творчеством (TS for Linux, TD for macOS итд)
-
NULL'ы скипаются при агрегации https://clickhouse.tech/docs/en/query_language/agg_functions/#null-processing
-
-
спс в целом уже подружили TS for Linux и TD for osx
-
тогда не за что :-)
-
я использу argMax агрегат, и, по-хорошему, NULL может остаться, если в принципе поле Nullable и значений никогда там небыло 🙈
-
всем привет. хочу создать простую таблицу для записи данных но не могу понять какой движок использовать…
-
MergeTree :)
-
-
-
а можно ли установить это значение через ClickhouseDriver для java?
-
-
в jdbc можно, через ClickHouseQueryParam
-
по крайней мере в dbeaver можно задать в свойствах JDBC драйвера
-
спасибо
-
Почему запрос читает все данные из таблицы, а не одну гранулу? Записи же хранятся по порядку event_time
Таблица:
CREATE TABLE events
...
ORDER BY (user_id, event_name, event_time)
Запрос:
SELECT uuid, event_name, event_time FROM events WHERE event_name = 'new_user' AND user_id = 167 ORDER BY event_time DESC LIMIT 21 -
не доделано, пока надо писать так
ORDER BY user_id DESC , event_time DESC -
тьфу ORDER BY user_id DESC, event_name DESC , event_time DESC
-
как в таблице, КХ оптимизация сортировки не видит что в where строгое равенство по user_id, event_nam
-
Да, к этому и пришел сейчас. В таблице 800к записей, запрос чтобы получить 21 запись, читает 63к записей, для чего? index_granularity=1024
SELECT
uuid,
event_name,
event_time
FROM events_dev
WHERE event_name = 'new_user' AND user_id = 167
ORDER BY
user_id DESC,
event_name DESC,
event_time DESC
LIMIT 21 -
а какой параметр ограничивает CPU на каждый запрос?
-
-
-
вы с mysql не перепутали кликхауз?
тут сразу читают вперед гигабайты, и запускают миллиадр параллельных потоков, чтобы быстрее 400млдр обмолотить
set max_threads=1, max_block_size=1024 -
у меня по другому работает, у меня не один человек работает, как я понял у большинства, а сотни человек свои данные смотрят, у каждого по ~1-10кк записей, каждому графики надо
-
так нафига вам КХ ?
-
КХ не для вас
-
возможно, нигде в доках нет про конкурентное использование, про одновременную работу с большим количеством пользователей. Поэтому не понятно как он себя поведет
-
кх это только про запросы, которые вызывают какое-то ограниченное количество раз, скажем в сутки?
-
что с set max_threads=1, max_block_size=1024
-
а как узнать максимальное количество потоков в системе? у нас тут 64 ядра
-
-
А что в таком случае использовать?
Или просто перед кх кеш для уже посчитанных данных юзать? -
ну а зачем для запросов
ORDER BY
event_time DESC
LIMIT 21
КХ ? Тут кассандра просится -
Lscpu
-
а threads это какой параметр?
-
max_threads = по дефолту количество ядер
-
все понял спасибо
-
так читает 7к строк
-
не знаю, может и вообще в постгрес потестить
-
нафиг вы КХ тогда взяли, если постгрес еще не проверяли?
Конечно постгрес и mysql будут стрелять на таких запросах, там по индексу 21 строка будет обрабатываться -
так запросы с 21 строкой они не частые, чаще подсчитать count(), avg() и так далее по записям, количество записей на один запрос около 1кк
-
Ну если не часто, то и проблемы в целом нет что оно 63к записей читает. Это же мгновенно почти происходит.
-
там больше интересует для чего оно всё это читает, проблемы то особо нет, просто может я что-то не правильно делаю и можно не читать 63к записей
-
Если использовать обычные реляционные бд, тогда упираюсь в то, что столбиков много и чтения много соответственно. Долго идут запросы на count, avg и так далее, а они у меня в подавляющем большинстве
-
Ну и данных приходит много и постоянно они льются, транзакции не нужны
-
потому что много потоков читают по 65к записей
поэтому нужен set max_threads=1, max_block_size=1024 -
вам надо использовать MV aggregatingMT чтобы не делать avg/ count даже в КХ
-
проблема в том, что каждый может себе графики настраивать как он хочет. Условия разные ставить. При том, что много самих пользователей.
А materialized view это больше оптимизация каких-то конкретных частых запросов -
тогда по умолчанию вам не придет 100500 конкуррентных запросов. Тюньте max_threads и все будет хорошо.
-
-
почему вы думаете что не использует?
что если перед запросом
set force_primary_key=1 -
-
как-то так
[V30LC-INCLKHSE1.PW.LOCAL] 2020.03.09 16:23:56.037013 {6b81bff0-7b1c-4a85-a57b-95ed78d4b932} [ 56 ] <Trace> ParallelAggregatingBlockInputStream: Aggregated. 0 to 0 rows (from 0.000 MiB) in 5.736 sec. (0.000 rows/sec., 0.000 MiB/sec.)
[V30LC-INCLKHSE1.PW.LOCAL] 2020.03.09 16:23:56.038898 {6b81bff0-7b1c-4a85-a57b-95ed78d4b932} [ 56 ] <Trace> ParallelAggregatingBlockInputStream: Aggregated. 0 to 0 rows (from 0.000 MiB) in 5.736 sec. (0.000 rows/sec., 0.000 MiB/sec.)
[V30LC-INCLKHSE1.PW.LOCAL] 2020.03.09 16:23:56.038929 {6b81bff0-7b1c-4a85-a57b-95ed78d4b932} [ 56 ] <Trace> ParallelAggregatingBlockInputStream: Aggregated. 0 to 0 rows (from 0.000 MiB) in 5.736 sec. (0.000 rows/sec., 0.000 MiB/sec.)
[V30LC-INCLKHSE1.PW.LOCAL] 2020.03.09 16:23:56.038947 {6b81bff0-7b1c-4a85-a57b-95ed78d4b932} [ 56 ] <Trace> ParallelAggregatingBlockInputStream: Aggregated. 0 to 0 rows (from 0.000 MiB) in 5.736 sec. (0.000 rows/sec., 0.000 MiB/sec.)
[V30LC-INCLKHSE1.PW.LOCAL] 2020.03.09 16:23:56.038978 {6b81bff0-7b1c-4a85-a57b-95ed78d4b932} [ 56 ] <Trace> ParallelAggregatingBlockInputStream: Aggregated. 0 to 0 rows (from 0.000 MiB) in 5.736 sec. (0.000 rows/sec., 0.000 MiB/sec.)
[V30LC-INCLKHSE1.PW.LOCAL] 2020.03.09 16:23:56.039008 {6b81bff0-7b1c-4a85-a57b-95ed78d4b932} [ 56 ] <Trace> ParallelAggregatingBlockInputStream: Aggregated. 0 to 0 rows (from 0.000 MiB) in 5.736 sec. (0.000 rows/sec., 0.000 MiB/sec.)
[V30LC-INCLKHSE1.PW.LOCAL] 2020.03.09 16:23:56.039053 {6b81bff0-7b1c-4a85-a57b-95ed78d4b932} [ 56 ] <Trace> ParallelAggregatingBlockInputStream: Aggregated. 0 to 0 rows (from 0.000 MiB) in 5.736 sec. (0.000 rows/sec., 0.000 MiB/sec.)
[V30LC-INCLKHSE1.PW.LOCAL] 2020.03.09 16:23:56.039087 {6b81bff0-7b1c-4a85-a57b-95ed78d4b932} [ 56 ] <Trace> ParallelAggregatingBlockInputStream: Aggregated. 0 to 0 rows (from 0.000 MiB) in 5.736 sec. (0.000 rows/sec., 0.000 MiB/sec.)
[V30LC-INCLKHSE1.PW.LOCAL] 2020.03.09 16:23:56.039125 {6b81bff0-7b1c-4a85-a57b-95ed78d4b932} [ 56 ] <Trace> ParallelAggregatingBlockInputStream: Aggregated. 0 to 0 rows (from 0.000 MiB) in 5.736 sec. (0.000 rows/sec., 0.000 MiB/sec.)
[V30LC-INCLKHSE1.PW.LOCAL] 2020.03.09 16:23:56.039159 {6b81bff0-7b1c-4a85-a57b-95ed78d4b932} [ 56 ] <Trace> ParallelAggregatingBlockInputStream: Aggregated. 0 to 0 rows (from 0.000 MiB) in 5.736 sec. (0.000 rows/sec., 0.000 MiB/sec.)
[V30LC-INCLKHSE1.PW.LOCAL] 2020.03.09 16:23:56.039191 {6b81bff0-7b1c-4a85-a57b-95ed78d4b932} [ 56 ] <Trace> ParallelAggregatingBlockInputStream: Aggregated. 0 to 0 rows (from 0.000 MiB) in 5.736 sec. (0.000 rows/sec., 0.000 MiB/sec.)
[V30LC-INCLKHSE1.PW.LOCAL] 2020.03.09 16:23:56.039227 {6b81bff0-7b1c-4a85-a57b-95ed78d4b932} [ 56 ] <Trace> ParallelAggregatingBlockInputStream: Total aggregated. 278 rows (from 0.000 MiB) in 5.736 sec. (48.465 rows/sec., 0.000 MiB/sec.)
[V30LC-INCLKHSE1.PW.LOCAL] 2020.03.09 16:23:56.039263 {6b81bff0-7b1c-4a85-a57b-95ed78d4b932} [ 56 ] <Trace> Aggregator: Merging aggregated data
[V30LC-INCLKHSE1.PW.LOCAL] 2020.03.09 16:23:56.039946 {6b81bff0-7b1c-4a85-a57b-95ed78d4b932} [ 95 ] <Information> executeQuery: Read 186646528 rows, 41.65 GiB in 5.756 sec., 32428651 rows/sec., 7.24 GiB/sec.
[V30LC-INCLKHSE1.PW.LOCAL] 2020.03.09 16:23:56.040006 {6b81bff0-7b1c-4a85-a57b-95ed78d4b932} [ 95 ] <Debug> MemoryTracker: Peak memory usage (for query): 83.45 MiB.
Ok.
0 rows in set. Elapsed: 5.757 sec. Processed 186.65 million rows, 44.73 GB (32.42 million rows/s., 7.77 GB/s.) -
а где начало? часть про сколько гранул будет прочитано
-
может КХ чего-то оптимизирует с LIKE на длинных строках?
-
не знаю, возможно в индексе хранится строка не целиком, я не знаю
-
-
5 parts by key, 22784 marks
22784* 8192 = 186 646 528 -
т.е. почему в 5 партах получилось 22784 марков, интересно сколько там всего марков
-
а случайно нет подчеркивания в строке которую ищем? like 'dsfdfg_fgdfgf;' ?
-
_ это тоже символ wildcard, и его надо экранировать
-
ahh tochno :)
-
семен семеныч
-
телепатия
-
-
-
хаха, нет, я угадал
-
сейчас проверил и вправду видно _
-
может я их подсознательно увидел и не понял сознанием
-
-
-
не надо ESCAPE, просто \ вроде
select 'xxx_dd' like 'xxx\_%' -
-
-
SELECT 'xxx11' LIKE 'xxx\\_\\_'
┌─like('xxx11', 'xxx\\_\\_')─┐
│ 0 │
└────────────────────────────┘
SELECT 'xxx__' LIKE 'xxx\\_\\_'
┌─like('xxx__', 'xxx\\_\\_')─┐
│ 1 │
└────────────────────────────┘ -
бекслеш съедается парсером строк, его надо удваивать
-
Вчера у меня была проблема - КХ съедал всю память сервера, непрерывно молотил дисками и машинка моментально умирала. Вылечилось переносом всех партов одной подозрительной таблицы в детачед. Сегодня начал разбираться с ситуацией и пытаться все привести в чувства. Все парты, кроме одного подключились и нормально работают, а один, самый крупный - примерно 100гб подключить не удается - как только я его аттачу - возвращается вчерашняя ситуация - сервер съедает все ресурсы и машинка превращается в кирпич. Какие варианты восстановления данных мне стоит рассмотреть? Это ReplicatedReplacingMergeTree.
-
даунгрейдится
-
-
разбираться на стейдже и оформлять тикет
-
обычно просто замена бинарника, но надо понимать в какую версию даунгрейд
-
манула нет, потому что нечего описывать
-
до mrk2 парты были совместимы
-
-
$ history |grep apt-get
apt-get install clickhouse-server=20.2.1.2362 clickhouse-client=20.2.1.2362 clickhouse-common-static=20.2.1.2362
apt-get install clickhouse-server=19.13.6.51 clickhouse-client=19.13.6.51 clickhouse-common-static=19.13.6.51
apt-get install clickhouse-server=19.13.6.51 clickhouse-client=19.13.6.51 clickhouse-common-static=19.13.6.51
apt-get install clickhouse-server=19.13.1.11 clickhouse-client=19.13.1.11 clickhouse-common-static=19.13.1.11
apt-get install clickhouse-server=19.17.4.11 clickhouse-client=19.17.4.11 clickhouse-common-static=19.17.4.11
apt-get install clickhouse-server=20.2.1.2362 clickhouse-client=20.2.1.2362 clickhouse-common-static=20.2.1.2362
apt-get install clickhouse-server=19.1.6 clickhouse-client=19.1.6 clickhouse-common-static=19.1.6
apt-get install clickhouse-server=19.1.6 clickhouse-client=19.1.6 clickhouse-common-static=19.1.6
apt-get install clickhouse-server=20.2.1.2362 clickhouse-client=20.2.1.2362 clickhouse-common-static=20.2.1.2362
apt-get install clickhouse-server=20.1.2.4 clickhouse-client=20.1.2.4 clickhouse-common-static=20.1.2.4
apt-get install clickhouse-server=20.1.4.14 clickhouse-client=20.1.4.14 clickhouse-common-static=20.1.4.14
apt-get install clickhouse-server=19.17.4.11 clickhouse-client=19.17.4.11 clickhouse-common-static=19.17.4.11
apt-get install clickhouse-server=19.17.4.11 clickhouse-client=19.17.4.11 clickhouse-common-static=19.17.4.11
apt-get install clickhouse-server=19.17.4.11 clickhouse-client=19.17.4.11 clickhouse-common-static=19.17.4.11
apt-get install clickhouse-server=20.1.4.14 clickhouse-client=20.1.4.14 clickhouse-common-static=20.1.4.14
apt-get install clickhouse-server=19.16.2.2 clickhouse-client=19.16.2.2 clickhouse-common-static=19.16.2.2
apt-get install clickhouse-server=19.13.6.51 clickhouse-client=19.13.6.51 clickhouse-common-static=19.13.6.51
apt-get install clickhouse-server=19.13.6.51 clickhouse-client=19.13.6.51 clickhouse-common-static=19.13.6.51
apt-get install clickhouse-server=19.4.5.35 clickhouse-client=19.4.5.35 clickhouse-common-static=19.4.5.35
apt-get install clickhouse-server=19.4.5.35 clickhouse-client=19.4.5.35 clickhouse-common-static=19.4.5.35
apt-get install clickhouse-server=18.14.19 clickhouse-client=18.14.19 clickhouse-common-static=18.14.19
apt-get install clickhouse-server=18.14.19 clickhouse-client=18.14.19 clickhouse-common-static=18.14.19
apt-get install clickhouse-server=19.17.4.11 clickhouse-client=19.17.4.11 clickhouse-common-static=19.17.4.11
apt-get install clickhouse-server=19.17.4.11 clickhouse-client=19.17.4.11 clickhouse-common-static=19.17.4.11
apt-get install clickhouse-server=20.1.2.4 clickhouse-client=20.1.2.4 clickhouse-common-static=20.1.2.4
apt-get install clickhouse-server=20.2.1.2362 clickhouse-client=20.2.1.2362 clickhouse-common-static=20.2.1.2362
apt-get install clickhouse-server=19.17.9.60 clickhouse-client=19.17.9.60 clickhouse-common-static=19.17.9.60
apt-get install clickhouse-server=20.2.1.2362 clickhouse-client=20.2.1.2362 clickhouse-common-static=20.2.1.2362
apt-get install clickhouse-server=19.17.9.60 clickhouse-client=19.17.9.60 clickhouse-common-static=19.17.9.60 -
-
-
сначала надо понять почему поведение изменилось, а потом уже крутить
-
хронология примерно такая - стояла версия 20.1.3.7 относительно недавно, наверно то то в духе месяца, никаких проблем не было, 07.03 поставил 20.1.6.30, 08.03 в середине дня появилась эта аномалия - два сервера (реплики), которые несут таблицу ушли в бешеную загрузку и перестали откликаться хоть как то. спустя какое то время получилось стопнуть КХ, по советам в чате перенес данные в детачед, поднялось и работает. Конечно возможно, что виновата не версия КХ, а какие то особенные данные, например, которые могли налиться 8го утром или 7го вечером, но доподлинно этого проверить никак не могу
-
-
я думаю не будет никаких проблем с даунгрейдом в 20.1.3.7
-
скорее всего длинные строки кто-то закинул, мегабайт по 100 в тех партах
-
мерж можно отключить system stop merges table
-
(временно)
-
и спокойно смотреть на тот парт на стейдже
-
та настройка которую вам предалгали вчера скорее всего должна помочь
-
можно поставить например 128
-
-
чтобы КХ стримил при мерже по 128 строк
-
как она называется? мне лень отматывать чат
-
-
Короче КХ читает парты, которые мержит в память в буфер размером merge_max_block_size
-
он в строках
-
по умолчанию 8192
-
- merge_max_block_size — Maximum number of rows in block for merge operations. Default value: 8192.
-
я бы поставил 128 чтобы проверить
-
сколько колонок в таблице? больше 11 ?
-
-
-
да
-
-
блин, я тут час бился и тоже пришел к этому выводу, только сейчас увидел сообщение )
в общем все хорошо, спасибо!
0 rows in set. Elapsed: 0.011 sec. Processed 40.96 thousand rows, 12.59 MB (3.58 million rows/s., 1.10 GB/s.) -
Всем привет! Подскажите какой ширины можно делать таблицы в CH чтоб не было деградации скорости. Интересуют примерные максимальные значения.
-
кол-во колонок?
-
до 1000
-
Да
-
каждая колонка это два файла на диске
-
каждая колонка это 2MB памяти при инсерте
-
С 1000 колонок будет драка за диск?
-
При чтении
-
будет запись 2тыс файлов при инсерте, это 2000-3000 random seek
-
При чтении КХ не читает колонки которые не просили
-
если читать select * -- то естественно тоже будет 2000-3000 random seek и плюс огромный расход памяти на буфера
-
Без * допустим только агрегации и пара столбцов в чистом виде по которым группировка
-
тогда ок
-
apt-cache madison clickhouse-server
apt-cache show clickhouse-server=<version> | egrep '^(Depends|Suggests):' -
?
-
-
-
-
-
-
20 не надо, адский глюкодром, такого еще не было.
-
вообще все версии глючат?
-
у меня все
-
мы юзаем 19.16.2.2, пробовали какую то двадцатаю - запросы, которые работали 300мс стали работать около секунды
-
откатились
-
такое надо репортить. Т.е. возможно это специфчно ваша проблема, и ее никогда не починят, пока вы не расскажете.
-
чтобы репортить, надо сведения собрать, в целом то идея неплохая
как будет свободное - соберу информацию -
Joined.
-
Joined.
-
Joined.
-
maxOrNull
SELECT 'maxState(toNullable(10))', toTypeName(maxOrNullState(toNullable(10)))
SELECT
'maxState(toNullable(10))',
toTypeName(maxOrNullState(toNullable(10)))
┌─'maxState(toNullable(10))'─┬─toTypeName(maxOrNullState(toNullable(10)))─┐
│ maxState(toNullable(10)) │ AggregateFunction(maxOrNull, UInt8) │
└────────────────────────────┴────────────────────────────────────────────┘
https://github.com/ClickHouse/ClickHouse/pull/7331
ClickHouse release v19.16.2.2, 2019-10-30
Add aggregate function combinators -OrNull and -OrDefault, which return null or default values when there is nothing to aggregate. #7331 (hcz) -
CH тут ни при чем.
Т.е. CH позволяет сделать идемпотентую операцию -- ретрай на replicated таблицах.
Т.е. если сможете сделать exactly once до КХ, то дальше просто повторы инстертов, т.е. наверное можно сдлеать через запись метаинфы в дополнительный топик, и комитить брокером в кафку разом и новые офсеты и этот доплнительный топик. И тогда прочитав успех из топика вы будете знать, что можно полить дальше, правда есть тонкость что надо делать абсолютно такие же блоки insert-в, и как это сделать с кафкой без промежуточного стора, непонятно - 10 March 2020 (397 messages)
-
Joined.
-
-
MemoryMax в systemd
-
Доброе утро, я решил самостоятельно построить график из данных, сейчас делаю следующее:
SELECT
toHour(EventTime) AS time,
LogLevel,
count() AS count
FROM
db.logs
WHERE
EventTime >= toDateTime('${args.starteventtime}') AND EventTime < toDateTime('${args.endeventtime}')
GROUP BY
time, LogLevel
ORDER BY
time ASC
запрос работает, в нем значения разбиваются по часам, но, проблема наступает когда в диапазон дат попадает от 2 дней и более ( происходит наложение, так как часы в дате одинаковы ), собственно вопрос - как разбить значения по времени ( допустим по промежуткам в 20 минут ), так, чтобы при этом учитывались даты, а не только время.
Ну выходе ожидаю график со значениями timestamp.
Подсмотрел аналогичное в Grafana, но, там много преобразований в unixtime, предполагаю, что есть иной и более простой вариант. -
-
-
Не подскажете что значит ошибка в clickhouseJDBC "Not enough space for external aggregation in /var/tmp/" ?
-
хм, возможно это не JDBC related проблема ;) почему решили что это именно JDBC а не ошибка которая с сервера пришла?
на сервере то есть место свободное? -
Так я на сервер ничего не выгружал это просто select запрос бы
-
Возможно я просто указал на источник
-
написано же, external aggregation.
у вас скорее всего происходит external group by (из-за того, что не лезет в память до max_bytes_before_external_group_by), а места для него в /var/tmp не хватает... -
-
аа типо если оперативки не хватает он использует эту папку как буффер и она перегружается?
-
-
А как поменять папку в которую он спиливает?
-
-
-
-
-
всем привет
-
есть какая-то странная проблема, при группировке данных через distributed таблицу Clickhouse не группирует данные с сервера на который я отправляю запрос
-
v20.1.2.4
-
если выполнять запрос на каждом сервере без dist таблицы, то кол-во записей возвращает правильное
-
если через distributed, то сервер с которого инициирован запрос почему-то выпадает
-
его какбудто нет
-
это я что-то делают не так или какое-то ошибочное поведение CH ?
-
Из простых моментов, а сервер перечислен в кластере, который используется для distriubuted таблицы?
-
Спасибо, похоже что понижение этой переменной спасло, все заработало.
-
-
у меня на одной группе серверов два кластера, один с репликой другой без
-
show create table zones_norepl.xxxx_dist? какой он кластер использует
-
cl-fi-01 :) show create table zones_norepl.xxxx_dist \G
SHOW CREATE TABLE zones_norepl.xxxx_dist
Row 1:
──────
statement: CREATE TABLE zones_norepl.xxxx_dist (date Date, zone String, name String, puny String, hash FixedString(64)) ENGINE = Distributed(zones_norepl, zones_norepl, xxxx, rand())
1 rows in set. Elapsed: 0.001 sec. -
у меня было подобное же на одной из версий КХ, спасла магия с настройками в рамках запроса, но что именно делал не помню, после апдейта на другую версию КХ все решилось само
-
какая у вас версия КХ?
-
вот эта
-
Добрый день, меня интересует вопрос по clickhouse-copier
На сколько я понял он не умеет работать с таблицами содержащими materialized колонки? Или существует способ обойти это ограничение?
Типичная ошибка выглядит так:
2020.03.10 07:42:16.738173 [ 5 ] {} <Error> ClusterCopier: Will retry: Code: 47, e.displayText() = DB::Exception: Missing columns: 'dt' while processing query: 'SELECT DISTINCT (dt, job_id) AS partition FROM _local.`.read_shard_0.destination_cluster.<schema>.<table>` ORDER BY partition DESC', required columns: 'dt' 'job_id', source columns: 'vals' 'job_id' 'ts' '_shard_num' 'cnt' 'event_name' 'keys', Stack trace:
Колонка dt конечно же существует: dt Date materialized toDate(ts) -
Спасибо большое за ответ. Столкнулся с другой проблемой, что argMaxOrNullState не работает :(
-
а уточните версию?
-
-
А какие могут подводные камни с тем, чтобы писать логи из микросервисов в КХ? Обязана ли быть для этого кафка в качестве буфера? Или если есть 10 приложений, которые сами могут аггрегировать свои логи и отправлять батчами, то промежуточный буфер не нужен? Получится суммарно около 60000 строк в минуту
-
Fluentd в качестве агрегатора вполне справляется с ~10млн строк в минуту
Не совсем логи, длина строки прям небольшая
Но вполне работает и переживает кратковременные падения/рестарты КХ -
А как он там таблицы создает и как реагирует на изменение формата логов?
-
Clickhouse
Deliver log data to the Clickhouse database
-
-
Но для логов может лучше использовать loki?
-
Раз вопрос стоит в широте формата логов).
-
а если у вас много приложений?
-
то тогда EFK
-
Таблицы руками, стараемся исходную строку сохранить как была и из неё растаскиваем через материализованные поля
При изменении полей или способа их вытягивания - гоним альтеры, иногда очень долго.
Задача немного странная - снапшоты системных таблиц постгреса сливаем в КХ и потом считаем дельты по счётчикам. -
Joined.
-
Ребят вопрос решен !
set prefer_localhost_replica=0 -
А у вас все в порядке с репликацией? Обычно этот параметр для использования всех реплик
-
у меня одна группа серверов в которой есть кластер с репликой и без. может из-за этого?
-
я выше показывал конфиг
-
вот
-
-
uncategorized SQLException for SQL [select ExpressionData.geneId, ExpressionData.expressionLevel from ExpressionData ExpressionData inner join RunRecord RunRecord on ExpressionData.runId = RunRecord.runId]
e.displayText() = DB::Exception: Logical error: unknown combination of JOIN
ЧЯДНТ? -
Доброго времени суток камрады, подскажите пожалуйста , есть сервера с установленным CH, хочу собрать кластер, установка zookeeper обязательна?
-
а кто будет кластером управлять?
-
я просто идеологию понять не могу =( так как только с репликами в postgres сталкивался а тут задачка прилетела
-
а писать получается надо будет чрезе zookeeper?
-
если "на пальцах" то зукипер нужен, что бы каждая нода кластера, знала, где остальные и как с ними общаться.
-
у меня тогда еще 1 вопрос, а если разрабы пишут в clickhouse через kittenhouse, т.е. zookeeper увидет изменения и пнет второго чтоб тот данные догнал?
-
думаю нужно покурить маны чуть глубже, и разобраться в вопросе, ибо вариантов архитектурных решений - вагон и мааленькая тележка, и какой нужен конкретно для Вашего решения - знать можете только Вы
-
Joined.
-
Привет! Кто нить может скинуть нормальный док на настройки юзверей в КХ? Просто интересно какого хрена я вставляя в нераспределенную таблицу юзером ххх должен где-то определить пароль к дефолтному юзеру? Что за дизайн?
-
С добрым утром (ну или доброго дня у кого какой пояс часовой).
Если совсем простым языком - зукипер нужен для репликации. Приписываешь к ENGINE таблицы Replicated, указываешь путь в ЗК и номер реплики при создании таблицы, на этом и остальных хостах такие же таблички начинают друг в друга реплицировать. Не указываешь Replicated - не пользуешься репликацией - ЗК не нужен. -
-
Спасибо большое! пойду дальше курить маны и пробовать разобраться)
-
Легко...
https://clickhouse.tech/docs/ru/operations/access_rights/
) -
Пока не зазбоит база
-
Фигня. Это все фейк. Поставь пароли - сам увидишь
-
-
-
Может я похож на идиота, но я внимательно прочитал. А вы внимательно прочитали вопрос? У меня как минимум 2 юзверя - один по умолчанию а второй нет. У каждого свой пароль. Когда оставляешь 3 этажный реквест со вторым юзверем в таблицу на движке MergeTree у меня выскакивает эксепшен, что надо определить пароль для дефолтного
-
Что за нах? Вот ищу нормальные настройки для продвинутых, а не
Базовый док -
а нет больше никаких доков, кроме этого.
-
Пользователь, который используется для обмена информацией между серверами, объединенными в кластер, не должен иметь существенных ограничений или квот - иначе распределённые запросы сломаются.
-
Сервер один движок MergeTree на мне по умолчанию?
-
-
Он покруче по умолчанию етл все-таки
-
Пост мортем если кому интересно: @milovidov_an например. Вообще пароли повесил на словари, а так же query_log и query_thread_log. И заработало. Хорошо бы улучшить док по защите КХ. А то впечатление, что база работает нормально только без паролей...
-
-
-
В каком смысле?
-
вообще никто ничего не понял поэтому никому не интересно, подземный стук у вас короче.
-
А что именно не понятно? Отсуствие полной документации по работе с защищеннвм КХ? У меня сложилось четкое впечатление, что защита кликхауза не является приоритетом.
-
а почему она должна быть приоритетом 🤓
-
есть разные куски документаций, но вот полной документации по настройке нет. Хорошо было бы сделать настройку как сделана документация на селект
-
-
мне непонятно какая ошбка была и почему
-
Я готов документировать и оформить багу если есть
-
до изменения сообщения было лучше XD
-
Непонятно что это было
-
у кого были проблемы с Lost connection to MySQL server at 'sending authentication information' на версиях 20.1.3.Х, сообщаю что после обновы до 20.1.6.30 проблемы пропали, надеюсь починили
-
Ошибка была такова: если есть активирование логов, то надо определать юзера и пароль для логов иначе все сложные реквесты с отличного от дефолтного защищенного юзера будут фэйлится с дурацким сообщением о том, что надо пароль дефолтного юзера. Кстати есть гипотеза (не проверенная мной), но если юзер не прописан в активированых логах,но имеет такой же пароль, что и дефолтный юзер, то все прокатывает нормально. Так яснее?
-
Товарищи, подскажите, пожалуйста.
Есть таблица в КХ, там есть дубли строк - полные дубли, включая sorting key.
Общий размер таблицы 1-20 миллионов строк. Количество дублей: до 100 тыс строк всего, в их числе строки, которые повторяются 2-3 раза.
Как вычистить?
Проблема в том, что я не могу никак таргетировать запрос на конкретную строку из числа дублированных строк - у них идентичные ВСЕ атрибуты. Какой бы критерий я не придумал - он затронет все дубли.
Единственное, что приходит в голову - написать запрос SELECT во временную чистую таблицу, сделать группировку ПО ВСЕМ полям. Тогда все дубли схлопнутся и будет выборка по 1 уникальной копии. Ну и потом в оригинале удалить все строки, чьи айдюки есть во временной и перенести назад.
Есть ли проще решения? -
select distinct ?
-
В доке у https://clickhouse.tech/docs/en/query_language/misc/#misc_operations-optimize описано волшебное слово DEDUPLICATE, но
1) никогда не пользовался, поэтому неточно
2) если дубли на разных шардах, то точно не поможет
3) наверное совсем всё оно не схлопнет, но тут см. пункт 1 -
как вариант select any(value)
-
Если указать DEDUPLICATE, то произойдет схлопывание полностью одинаковых строк (сравниваются значения во всех колонках), имеет смысл только для движка MergeTree.
-
Движок какой у таблицы?
-
MergeTree классик :)
-
20млн. Просто переложить в новую таблицу с insert select distinct *
-
Или optimize final deduplicate
-
а distinct * будет относиться ко всем полям? Ну то есть будет иметься в виду уникальные сеты значений?
-
Ко всем
-
попробуем решение DEDUPLICATE, о результатах расскажу
-
Коллеги всем привет.
Возможно кто-то сталкивался и сможет проконсультировать.
Есть КХ который развернут в docker swarm с явным указанием сетки.
Так же рядом в контейнере развернут clickhouse-jdbc (в той же сети что и КХ).
В конфиге КХ jdbc прописан (по DNS имени контейнера jdbc)
Проблема в том что КХ в упор не видит jdbc
DB::Exception: jdbc-bridge is not running. Please, start it manually (version 19.17.2.4 (official build))
При этом изнутри КХ контейнера я без проблем как пингую так и коннекчусь телнетом на порт jdbc контейнера.
Вроде конфигурация проста до безобразия, а не заводится.
Маякните если нужны скрины каких-либо конфигов. А то не хочу простыню сразу писать.
Заранее спасибо. -
Нет не понятно. Кто нибудь может объснить ?
-
Там в доке вроде написано что curl-м надо проверять, и что в трейсах в логе кх?
-
Joined.
-
0. 0x55b21a74ec40 StackTrace::StackTrace() /usr/bin/clickhouse
1. 0x55b21a74ea15 DB::Exception::Exception(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int) /usr/bin/clickhouse
2. 0x55b21d86e068 DB::XDBCBridgeHelper<DB::JDBCBridgeMixin>::startBridgeSync() const /usr/bin/clickhouse
3. 0x55b21d86aab2 DB::ITableFunctionXDBC::executeImpl(std::shared_ptr<DB::IAST> const&, DB::Context const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const /usr/bin/clickhouse
4. 0x55b21e0712e6 DB::ITableFunction::execute(std::shared_ptr<DB::IAST> const&, DB::Context const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const /usr/bin/clickhouse
5. 0x55b21daa5036 DB::Context::executeTableFunction(std::shared_ptr<DB::IAST> const&) /usr/bin/clickhouse
6. 0x55b21db0fb77 DB::InterpreterSelectQuery::InterpreterSelectQuery(std::shared_ptr<DB::IAST> const&, DB::Context const&, std::shared_ptr<DB::IBlockInputStream> const&, std::shared_ptr<DB::IStorage> const&, DB::SelectQueryOptions const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&) /usr/bin/clickhouse
7. 0x55b21db0fe07 DB::InterpreterSelectQuery::InterpreterSelectQuery(std::shared_ptr<DB::IAST> const&, DB::Context const&, DB::SelectQueryOptions const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&) /usr/bin/clickhouse
8. 0x55b21db33668 DB::InterpreterSelectWithUnionQuery::InterpreterSelectWithUnionQuery(std::shared_ptr<DB::IAST> const&, DB::Context const&, DB::SelectQueryOptions const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&) /usr/bin/clickhouse
9. 0x55b21e33420f DB::StorageView::read(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, DB::SelectQueryInfo const&, DB::Context const&, DB::QueryProcessingStage::Enum, unsigned long, unsigned int) /usr/bin/clickhouse
10. 0x55b21db271a9 void DB::InterpreterSelectQuery::executeFetchColumns<DB::InterpreterSelectQuery::Pipeline>(DB::QueryProcessingStage::Enum, DB::InterpreterSelectQuery::Pipeline&, std::shared_ptr<DB::SortingInfo> const&, std::shared_ptr<DB::PrewhereInfo> const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&) /usr/bin/clickhouse
11. 0x55b21db2ee39 void DB::InterpreterSelectQuery::executeImpl<DB::InterpreterSelectQuery::Pipeline>(DB::InterpreterSelectQuery::Pipeline&, std::shared_ptr<DB::IBlockInputStream> const&) /usr/bin/clickhouse
12. 0x55b21db10bd5 DB::InterpreterSelectQuery::executeWithMultipleStreams() /usr/bin/clickhouse
13. 0x55b21db30be3 DB::InterpreterSelectWithUnionQuery::executeWithMultipleStreams() /usr/bin/clickhouse
14. 0x55b21db32748 DB::InterpreterSelectWithUnionQuery::execute() /usr/bin/clickhouse
15. 0x55b21dc34dce ? /usr/bin/clickhouse
16. 0x55b21dc36383 DB::executeQuery(DB::ReadBuffer&, DB::WriteBuffer&, bool, DB::Context&, std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)>, std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)>) /usr/bin/clickhouse
17. 0x55b21a7e312e DB::HTTPHandler::processQuery(Poco::Net::HTTPServerRequest&, HTMLForm&, Poco::Net::HTTPServerResponse&, DB::HTTPHandler::Output&) /usr/bin/clickhouse -
18. 0x55b21a7e54a9 DB::HTTPHandler::handleRequest(Poco::Net::HTTPServerRequest&, Poco::Net::HTTPServerResponse&) /usr/bin/clickhouse
19. 0x55b21e6d4219 Poco::Net::HTTPServerConnection::run() /usr/bin/clickhouse
20. 0x55b21e6d0790 Poco::Net::TCPServerConnection::start() /usr/bin/clickhouse
21. 0x55b21e6d0ead Poco::Net::TCPServerDispatcher::run() /usr/bin/clickhouse
22. 0x55b21fda7021 Poco::PooledThread::run() /usr/bin/clickhouse
23. 0x55b21fda4dcc Poco::ThreadImpl::runnableEntry(void*) /usr/bin/clickhouse
24. 0x55b22051af40 ? /usr/bin/clickhouse
25. 0x7f214d98a6db start_thread /lib/x86_64-linux-gnu/libpthread-2.27.so
26. 0x7f214d2a788f clone /lib/x86_64-linux-gnu/libc-2.27.so
(version 19.17.2.4 (official build)) -
что я делаю не так?
Error: Cannot insert into table in readonly mode (version 20.1.4.14 (official build))
at parseError (/home/leonid/Документы/main/projects/untitled/node_modules/@apla/clickhouse/src/parse-error.js:2:15)
at errorHandler (/home/leonid/Документы/main/projects/untitled/node_modules/@apla/clickhouse/src/clickhouse.js:29:13)
at IncomingMessage.<anonymous> (/home/leonid/Документы/main/projects/untitled/node_modules/@apla/clickhouse/src/clickhouse.js:97:11)
at IncomingMessage.emit (events.js:333:22)
at endReadableNT (_stream_readable.js:1220:12)
at processTicksAndRejections (internal/process/task_queues.js:84:21) {
code: 164,
scope: 'DB::Exception:'
}
Insert complete! -
Предположим у вас есть конфиг:
users.xml
<users>
<default>
<password>pass1</password>
...
</default>
<another>
<password>pass2</password>
...
</another>
config.xml
<query_log>
<database>system</database>
<table>query_log</table>
<partition_by>toYYYYMM(event_date)</partition_by>
<flush_interval_milliseconds>7500</flush_interval_milliseconds>
</query_log>
<query_thread_log>
<database>system</database>
<table>query_thread_log</table>
<partition_by>toYYYYMM(event_date)</partition_by>
<flush_interval_milliseconds>7500</flush_interval_milliseconds>
</query_thread_log>
Есть таблица в которую вы вставляеете данные из других таблиц с помощью н-этажных запросов.
Так вот. Если вы вставляеете как юзер default - проблем нет. Если же пользователем another, то запросы сыпяться с ошибкой, что нужно указать пароль для пользователя default -
есть у кого идеи как пофиксить?
-
-
Коллеги, привет!
а подскажите, плз, как эффективнее решить: есть табличка Log() и нужно скопировать все строки из нее в другую таблицу. Строк немного - 53 тысячи
КХ ругается
`
Received exception from server (version 20.1.3):
Code: 252. DB::Exception: Received from localhost:9000. DB::Exception: Too many partitions for single INSERT block (more than 100). The limit is controlled by 'max_partitions_per_insert_block' setting. Large number of partitions is a common misconception. It will lead to severe negative performance impact, including slow server startup, slow INSERT queries and slow SELECT queries. Recommended total number of partitions for a table is under 1000..10000. Please note, that partitioning is not intended to speed up SELECT queries (ORDER BY key is sufficient to make range queries fast). Partitions are intended for data manipulation (DROP PARTITION, etc)..`` -
Get запрос ? все get ro
-
не понял подробнее
-
Раньше работало?
-
нет первый раз делаю запрос
-
Http get всегда readonly
-
ну да
-
http post надо
-
ето в опшнс прописать
-
Партиционирование слишком мелкое в приемнике
-
а что делать? ожидаю, что в скором времени хлынет поток данных и партиционирование будет нормальное
-
делюсь результатами
select dub_count, count() from(select ID, count(1) as "dub_count" from TABLE1 group by ID having dub_count > 1) group by dub_count;
-- 3 2
-- 2 56226
optimize table TABLE1 final deduplicate;
-- Повтор запроса на счет дубдей
-- 2 25300
(1) работает
(2) результат сразу
(3) дедублицировало не все - видимо там есть отличия в строках, уже знаю в чем дело
В общем и целом кажется решение рабочее - для полных дублей.
Но оставшиеся не полные дубли - придется дочищать с использованием distinct и временной таблицы. -
Написано же в сообщении что параметр можно изменить
-
спс пофиксил
-
а цель задачи то какая? сделать выборку по уникальным значениям, или вычистить таблицу?
-
вычистить таблицу конечно
-
SELECT * FROM url('http://clickhouse-jdbc:9020', 'CSV', 'id Int32')
Code: 86. DB::Exception: Received from localhost:9000. DB::Exception: Received error from remote server . HTTP status code: 400 HTTP/0.9 not supported, body: <h1>Bad Message 400</h1><pre>reason: HTTP/0.9 not supported</pre>.
curl http://clickhouse-jdbc:9020
HTTP method GET is not supported by this URL
Что то совсем странное происходит
jdbc висит на 9020 порту -
На стороне bridge netstat tcpdump
-
И ввобще netcat запустить для отладки на другом порту и в него стучать
-
ну по идее, есть такой движок как ReplacingMergeTree, который отличается от MergeTree тем, что сам вычищает дубликаты по ключу сортировки, мб быстрее было бы создать таблицу на этом движке, и insert to select сделать?
-
как вариант
-
И как вы это починили? Какая версия кх?
-
всем привет! подскажите пожалуйста:поле sex равное 0,1,2 в таблице mobile.events в mtch - как понять какой из полов где?
-
Ребят подскажите в чем может собака таиться <Error> Application: DB::Exception: Listen [0.0.0.0]:8123 failed: Poco::Exception. Code: 1000, e.code() = 98, e.displayText() = Net Exception: Address already in use: 0.0.0.0:8123 (version 20.1.6.30 (official build)) час уже сижу -_-
-
Посмотри по netstat, похоже кто то уже висит на этом порту у тебя
-
netstat -ltnp | grep -w ':8123'
-
увы нет не кого -_-
-
-
-
3049 ? Ssl 0:14 clickhouse-server --daemon --pid-file=/var/run/clickhouse-server/clickhouse-server.pid --config-file=/etc/clickhouse-server/config.xml
3098 pts/1 S+ 0:00 sudo tail -f /var/log/clickhouse-server/clickhouse-server.log
3099 pts/1 S+ 0:02 tail -f /var/log/clickhouse-server/clickhouse-server.log
5492 pts/2 S+ 0:00 grep --color=auto clickhous -
От рута надо с -p
sudo netstat -
-
так он у тебя при старте такое выдает?
-
-
Он поднимается и тухнет
-
попробую ребунуть
-
-
-
-
Секундочку
-
-
чето там скорее всего подвисло, после хардрезета завелось ровно все
-
Спасибо !
-
чуваки, можно ли поменять engine у таблицы?
-
-
нет
-
спасибо
-
да, но не всегда, файлы в партах на самом деле одинаковые
-
поэтому можно и replacing переделать в MT и summing и т.д.
-
и можно не рисковать исходной таблицей, а подсоединить зафриженное в таблицу с другим движком
-
естественно partition by / primary key останутся как были
-
добавил имя юзера по умолчанию и его пароль в <query_log> и <query_thread_log>. 19.17.4.11
-
-
для работы internal replication зукипер ненужен
-
но он нужен для запросов ON CLUSTER
-
-
и для работы replicated table тоже нужен зукипер
-
да
-
ok, т.е. когда делаю просто таблицу и включаю internal_replication=true - у меня будет реплицироваться между шардами.
т.е. ReplicatedMT не совместим с internal_replication=true? -
будет реплицироватся между репликами!, не шардами
-
internal_replication -- зависит от способа репликации.
Если у вас replicated таблицы (репликация через зукипер), internal_replication обязательно должен быть = true.
Если у вас "дешевая" репликаця, и репликацию делает distributed таблица то internal_replication обязательно должен быть = false
При internal_replication = false , при записи в distributed таблицу, distributed таблица вставляет во все реплики, таким образом достигается подобие репликации, без гарантий целостности.
При internal_replication = true , при записи в distributed таблицу, distributed таблица вставляет в одну из реплик, реплика так как у нее движок репликейтид, реплицирует уже сама (internal_replication). -
Joined.
-
Вы пишете в distributed, она смотрит на параметр internal_replication -- он true -- ага решает distributed, надо писать в любую реплику, дальше сами внутри replicated таблицы все сделают. Ура win.
Вы пишете в distributed, она смотрит на параметр internal_replication -- он false -- ага решает distributed надо писать во все реплики (там внутри не умеют реплицировать). Пишет в три реплики и все умножается на 3 в случае если там была replicated. -
все, я потерялся (
допустим зукипера нет, таблица дистрибютед.
А). что произойдет если я вставлю в, в дистрибютед таблицу
он вставит:
№1 в каждую реплику рандомного шарда?
№2 в каждую реплику всех шардов?
Б) что произойдет если я вставлю в дистрибютед таблицу, но internal replication=false
он вставит:
№1 в каждую реплику рандомного шарда?
№2 в каждую реплику всех шардов?
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>1.1.1.1</host>
<port>9000</port>
</replica>
<replica>
<host>1.1.1.2</host>
<port>9000</port>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>1.1.1.3</host>
<port>9000</port>
</replica>
<replica>
<host>1.1.1.4</host>
<port>9000</port>
</replica>
</shard> -
те наоборот все, но вообще это не очень логично internal_replication звучит, как будто репликацию делает сам кликхаус, а не через зукипер
-
я неправ был
-
Denny Crane (I don't work at Yandex (never did)), [Dec 13, 2019 at 10:22:33 AM (2019-12-13, 10:29:35 AM)]:
да. Нету. Из-за дедупликации последних 100 блоков.
distributed посылает в реплику1, реплику2 и реплику3 одно и тоже
реплика1 вставляет и пишет в зукипер контрольную сумму блока.
реплика2 проверяет что блок уже есть в зукипере (в ста последних) и не вставляет и скачивает новый парт с реплика1
реплику3 проверяет что блок уже есть в зукипере (в ста последних) и не вставляет и скачивает новый парт с реплика1
т.о. мы получили оверхед по сети и цпу.
Раз в полгода приходят люди и жалуются на дубликаты из-за этого. Почему?
реплика2 выключена или потеряла сеть.
distributed посылает в реплику1, реплику2 и реплику3 одно и тоже
реплика1 вставляет и пишет в зукипер контрольную сумму блока.
реплика3 проверяет что блок уже есть в зукипере (в ста последних) и не вставляет и скачивает новый парт с реплика1
через минуту сеть восстановилась
реплика2 проверяет что блока нет в зукипере (в ста последних) вставляет и скачивает новый парт с реплика1
рассылает вставленное на реплику1 и реплику3 через репликацию -- insert умножился на два -
https://t.me/clickhouse_ru/146982
можете сценарий А и Б глянуть?Dj in ClickHouse не тормозитвсе, я потерялся ( А). что произойдет если я вставлю в, в дистрибютед таблицу он вставит: №1 в каждую реплику рандомного шарда? №2 в каждую реплику всех шардов? Б) что произойдет если я вставлю в дистрибютед таблицу, но internal replication=false он вставит: №1 в каждую реплику рандомного шарда? №2 в каждую реплику всех шардов? <shard> <internal_replication>true</internal_replication> <replica> <host>1.1.1.1</host> <port>9000</port> </replica> <replica> <host>1.1.1.2</host> <port>9000</port> </replica> </shard> <shard> <internal_replication>true</internal_replication> <replica> <host>1.1.1.3</host> <port>9000</port> </replica> <replica> <host>1.1.1.4</host> <port>9000</port> </replica> </shard>
-
т.е. internal_replication=true - говорит КХ. чтоб он обрабатывал инсерт так как будто вставка идет в репликейтед таблицу с зукипером, так?
АПД. т.е. вставляется в первую реплику, а остальное идет асинхронно -
-
>А). что произойдет если я вставлю в, в дистрибютед таблицу
>он вставит:
>№1 в каждую реплику рандомного шарда?
>№2 в каждую реплику всех шардов?
вроде ошибка будет , или данные будут только в одной реплике
>Б) что произойдет если я вставлю в дистрибютед таблицу, но internal replication=false
>он вставит:
>№1 в каждую реплику рандомного шарда?
>№2 в каждую реплику всех шардов?
internal replication=false размажет по шардам, пошлет копии в реплики шардов --- так и надо конфигурить -
все будет асинхронно, никаких гарантий, со временем данные в репликах разойдутся, как и написано в доке, и будут разные в репликах
-
-
ДА!!!
-
Thank you!
-
почему разъедутся реплики (при репликации без REplicated):
в доке написано что не стоит ожидать консистентности.
Скорее всего иногда distributed таблица засылает в одну из реплик два раза одно и тоже, потому что первая посылка отвалилась с таймаутом, а реплика на самом деле получила и первую и вторую посылку. -
-
-
ну в доке написано, что реплики 100% разъедутся со временем :)
-
-
Добрый день. Подскажите, пожалуйста, как выполняется Retention на двухнодвом кластере с merge tree. Данные прорежеваются на одном сервере, а на второй разливаются изменения или одновременно на двух?
-
=) 99.99%
-
-
Могу ли я погасить одну ноду, выполнить прореживания на одной ноде, а потом подключить вторую, чтобы туда разлились изменения?
-
про что речь? про GraphiteMergeTree ?
-
Да
-
она replicated ?
-
Да
-
они вместе выполняют merge
лидер назначает merge, все реплики начинают мержить, в процессе merge -- они чистят, ролят, мерж завершается на всех репликах, контрольная сумма (2 разных суммы) полученных в результате мержа партов сравниваются, они 100% бинарно одинаковы, если нет, межр начинается снова или бинарные парты скачиваются с реплики которая успела закончтить мерж первой -
Спасибо большое. Следовательно, я могу выполнить мердж на одной реплике и перетянуть их на другую
-
ну это само работает, мержи идут одинаково одновременно на репликах
-
в доке описан тул который понимает GraphiteMergeTree и сам запускает optimize кроном когда он нужен (https://github.com/innogames/graphite-ch-optimizer)GitHub - innogames/graphite-ch-optimizer: Daemon to optimize GraphiteMergeTree automatically
Daemon to optimize GraphiteMergeTree automatically - GitHub - innogames/graphite-ch-optimizer: Daemon to optimize GraphiteMergeTree automatically
-
У нас просто данные так разрослись, что не хватает места для мерджа. Поэтому планируем вторую ноду отключить, на первую ноду подключаем дополнительный диск большей емкости и выполняем на нем optimize данных. После чего вводим в строй вторую
-
Пытаюсь понять, какие могут быть подводные камни
-
Кто то юзает флайэвэй для наката базы ?
-
Он разве умеет в ch?
-
Нет не умеет ,но может кто допилил под себя
-
-
Подскажите пожалуйста, а в каком формате в csv колонку типа DateTime нужно импортировать?
-
Yet another ClickHouse support by a-konyaev · Pull Request #2640 · flyway/flyway
Based on #2166 and #1773 This one has some improvements in comparison to previous implementations: more accurate declaration of the schema table's columns (types and default values) &q...
-
2020-01-01 00:00:00
-
Спасибо
-
ой забыл, на самом деле можно по разному форматировать, надо параметр в best_effort установить
-
--date_time_input_format arg "Method to read DateTime from text input formats. Possible values: 'basic' and 'best_effort'."
-
А как кто льет на кх изменения
-
А работает ?
-
вообще да, но я сам не пользуюсь, мне не надо, я дба (у меня все на баше и все вручную)
-
-
есть словарь range dictGetFloat('rates', 'conversion_rate', currecncy_id, date)
-
-
-
-
Привет, а напомните, пожалуйста, был какой-то gist с примером процессинга, как будто в кх есть оконные функции
-
Кажется, @den_crane, у вас было что-то похожее
-
Нужно выдать summary по подгруппам, и потом общую статистику по менее гранулярным группам
-
Если немного разозлился реплики, мерджи повторяется на отставке реплике. Если разница в часах/днях, просто о ставшая счётчик все с лидера и почистить устаревшее.
-
-
-
-
Joined.
-
-
-
-
-
-
Joined.
-
-
Joined.
-
-
Joined.
-
-
Joined.
-
-
Уэбчик)
-
-
давно пора
-
есть ли ограничение на количество запросов в UNION ALL?
-
кажется можно TTL было сделать на основе столбца
ttl ... interval column_b days -
ищите по groupArray
https://gist.github.com/den-crane/8f2db1e24564522788a2e1010dd38dea
https://t.me/clickhouse_ru/137604 -
ага, я уже так и сделал вручную. думал, с тех пор, как завезли rollup, стало лучше, но в итоге со всеми сортировками и т.д. вышло, что все равно проще самому написать, данных немного, скорость некритична
-
спасибо
-
нет, но скорее всего вы делаете что-то неправильно и вам нужен либо engine=Merge либо arrayReduce
-
ну баг это. Можно обычно починить перемержив
-
Вебинар от ReBrain
-
к движку доступа нет, нужно считать количество уникальных uid в сотне таблиц с логами
-
этот линк вне яндекса вообще работает?
-
Нет
-
Привет. А если у меня есть таблица
user_id | metric1 | metric2 | time
Метрики только растут. Как лучше всего получать прирост метрик за день? max(metric1) - min(metric1) или есть варианты умнее? -
вам надо накрыть их зонтиком -- Engine=Merge
-
сделать MV где будут готовые max per day
-
или select day, max()
потом groupArray и повычитать arrayDiff и т.д. -
доступ к кх только для чтения, не выйдет + идёт постоянная ротация логов
-
Спасибо!
-
вот бывает же жизнь, АДДДД
тогда union all -
А временную таблицу можно создать с правами RO?
-
как раз Merge для этого и сделан, он регулярками задает имена таблиц
-
RO=2 может temporary table
-
Там только мем движок к сожалению
-
Привет. Есть таблица с кликами, нужна дневная статистика, для этого делаем MV.
Но статистика нужна с учетом таймзоны, которая приходит с фронта.
Поэтому в MV держим часовые агрегации и генерируем запрос для доагрегации с учетом входящей таймзоны.
Есть ли лучшие решения? -
нету, вы все делаете правильно, и по другому сделать невозможно в принципе
-
чорт
-
спасибо
-
было бы глупо хранить все 38 раз, по числу таймзон
-
это да, 365*24=8760, т.ч. все норм вроде
-
почему 24, таймзоны и по полчаса и по 15 минут бывают
-
игнорируем зоны с :30 :15 - нет кейсов
-
Возможно эт кол во почасовых записей)
-
Joined.
-
Да эти массивы, понятных доков нет, примеров нет, обучения на сайте нет
-
Сам мучаюсь
-
Норм было если б выложили пример сравнения оконных функций и как их в кх можно заменить
-
-
-
у меня 385 полузаконченных комитов с документацией, я их разгребу и 21 января 2024 года займусь, потерпите
-
-
-
-
-
-
-
Самое смешное, что всю эту неделю я буду заниматься только вертикой, починкой странного глюка, при отвале ноды
-
-
-
-
я имею в виду починку своей заливалки которая странно себя ведет иногда
-
-
-
-
-
Joined.
-
Joined.
-
всем привет, ктонибудь stochasticLinearRegression использовал?
-
Ребят, а кто пользовался https://github.com/ClickHouse/clickhouse-go ?
Пытаюсь разобраться с типом IPv4. Как мне его в структуре объявить, чтобы sqlx его смогло съесть и заинсертить в базу? Пробовал передавать string и net.IP - оба не работают. Если юзать lib.column.IPv4, то я не догоняю, как преобразовывать net.IP в него. В примерах его нету, есть только в тестах и не вполне внятное:
https://github.com/ClickHouse/clickhouse-go/blob/master/lib/column/ip_test.go#L27
Судя по строчке 31 ниже - там возвращается интерфейсGitHub - ClickHouse/clickhouse-go: Golang driver for ClickHouseGolang driver for ClickHouse. Contribute to ClickHouse/clickhouse-go development by creating an account on GitHub.
-
Нормальные тесты, а то что автоматом не кастится - это плохо, если не забуду, то завтра попробую поправить
-
Так можете сказать, к чему кастовать?
-
https://github.com/ClickHouse/clickhouse-go/blob/master/lib/column/ip.go#L20, но это было когда в КХ еще не было типов для IP, что там щас я не знаю, попробую завтра глянутьClickHouse/clickhouse-go
Golang driver for ClickHouse. Contribute to ClickHouse/clickhouse-go development by creating an account on GitHub.
-
-
Сделай issue с примерами и поставь на меня
-
-
Заодно хотел поинтересоваться, как лучше завести там 2 колонки: одна для IPv4, другая - для IPv6. Если айпишник 4 версии, то в первую пишем, если шестой, то во вторую. Надо там ставить Nullable? И в случае sqlx - у обоих полей структуры будет тип`net.IP` тогда?
-
Я всегда использую FixedString(16) туда влезают оба типа, завтра, если дел не будет много, поправлю работу с IP и можно будет использовать IPv6
-
не. вопрос не во "влезает ли", вопрос в том, как их отличать. Мб лучше явно в структуре передавать типы IPv4, IPv6 и явно кастовать строки к ним?
-
-
-
Joined.
-
Добрый день! Подскажите плз, насколько строга (и, для понимания, чем обусловлена) рекомендация иметь не более 1000 партишенов? Насколько и чем плохо иметь, например 10к или 100к партишенов, при условии что активно используемых не более 1к, и что один запрос всегда использует только один партишен? (Всего данных порядка 1ТБ)
-
-
при старте КХ читает все парты, есть жалобы что при 30тыс. партов КХ стартует 4 часа.
при мутации КХ мутирует все парты и делает транзакцию в зукипере перечисляя все имена партов, при 10-50тыс. партов (длина имени парта различается) они не влезают в пакет 1.5МБ и мутации тупо не работают -
-
КХ сдизайнен для месячных партиций, select анализирует список партов для partition pruning, если список огромен, анализ начинает занимать много времени
-
инсерт должен затрагивать желательно только одну партицию, иначе он разбивается на много кусков, теряется атомарность, напрягается зукипер
-
-
-
Воу! Спасибо за ответ и подробности!
-
каждый парт это запись (z-node) в зукипере, чем больше партов, тем больше база ZK, ZK это in-memory db
-
але, у меня 4p.m.
-
-
я конацкий лесаруб
-
-
-
-
-
Еду в Магадан..
-
вопрос на миллион долларов для неспящих, после какого % данных/места на диске становится выгодно использовать Nullable типы? Например условный инт32. Скажем мы можем в аппе делать maxValue в качестве нулла либо делать его нуллаблом. Нуллабл это вроде доп файл. Но не нуллабл это 4 байта на строку (которая правда при одинаковых значениях симуляций нулла сожмется). Какой процент нулла хорош для применений nullable?
-
nullable всегда хуже по размеру и всегда по производительности.
-
-
create table XXN (A Int64, B Nullable(Int64)) Engine=MergeTree order by tuple()
insert into XXN select 45545645, null from numbers(100000000);
select column, formatReadableSize(sum(column_bytes_on_disk)) bytes_on_disk, formatReadableSize(sum(column_data_uncompressed_bytes)) uncompressed
from system.parts_columns
where active = 1 and table like '%XXN%'
group by database,table, column
┌─column─┬─bytes_on_disk─┬─uncompressed─┐
│ A │ 3.76 MiB │ 762.94 MiB │
│ B │ 4.38 MiB │ 858.31 MiB │
└────────┴───────────────┴──────────────┘ -
select count(), A from XXN group by A
┌───count()─┬────────A─┐
│ 100000000 │ 45545645 │
└───────────┴──────────┘
1 rows in set. Elapsed: 0.039 sec. Processed 100.00 million rows, 800.00 MB (2.56 billion rows/s., 20.49 GB/s.)
select count(), B from XXN group by B
┌───count()─┬────B─┐
│ 100000000 │ ᴺᵁᴸᴸ │
└───────────┴──────┘
1 rows in set. Elapsed: 0.096 sec. Processed 100.00 million rows, 900.00 MB (1.04 billion rows/s., 9.39 GB/s.) -
20.49 GB/s. VS 9.39 GB/s. !!!!!!
-
вот это поворот!
-
-
это все общеизвестно
-
и неоднократно демонстрировалось
-
ну я знал что NULL это как правило плохо. но не на стольок же =)
-
-
у меня тож по поводу места разрыв шаблона
-
так LZ4 и ZStd строят словарь
-
какая разница что в словарь положить
-
3.5M Mar 10 21:43 A.bin
286K Mar 10 21:43 A.mrk2
3.4M Mar 10 21:43 B.bin
286K Mar 10 21:43 B.mrk2
434K Mar 10 21:43 B.null.bin
286K Mar 10 21:43 B.null.mrk2
303 Mar 10 21:43 checksums.txt
67 Mar 10 21:43 columns.txt
8 Mar 10 21:43 count.txt -
т.е. в B.bin все равно лежит 0-лик или что-то там
-
ок те для nULL доп файлы на диске
-
по другому скорее всего не сделать, в столбцовой бд
-
кстаати
-
-
вопрос
-
-
а вроде битмапы в B.null.bin
-
задеплоил реплике на новом CH и зосдал таблицу чтоб зареплицировать дванные
Checksums of parts don't match: hash of uncompressed files doesn't match (version 20.1.6.30 (official build)). Data after merge is not byte-identical to data on another replicas. There could be several reasons: 1. Using newer version of compression library after server update. 2. Using another compression method. 3. Non-deterministic compression algorithm (highly unlikely). 4. Non-deterministic merge algorithm due to logical error in code. 5. Data corruption in memory due to bug in code. 6. Data corruption in memory due to hardware issue. 7. Manual modification of source data after server startup. 8. Manual modification of checksums stored in ZooKeeper. We will download merged part from replica to force byte-identical result.
стоит ли волноваться? -
это надо в дев. чатике обсуждать, я не копенгаген
-
реплика до 19.7 ?
-
да
-
старая
-
надо как можно быстрее ее апгейдить
-
селекты отдают одинаковые результаты
-
пока
-
зачем-то в 19.7 поменяли LZ4
-
теперь они парты с друг друга тягают
-
потому что не совпадает сумма после LZ4 компресси
-
так, лучше новую релпику погасить? Я не буду писать в новый сервер пока
-
они и будут давать одинаковые результаты, просто нагрузка на сеть и cpu
-
наверное да, я не знаю зачем он вам
-
чтоб смигрировать с одного резиза на другой
-
Мой план был такой -
деплою реплики на новой версии
пеереключаю запись
обновляю старые реплики -
причем обновлять старые реплики путем rm -rf /datadir
-
спасибо, и судя по всему B.bin чего то решает для себя хранить, несмотря на то, что там одни нули...
3.4M Mar 10 21:43 B.bin
в общем на данный момент нуллабл это доп файл и никакой экономии/пропусков в самой колонке.
===
Non-Nullable with "specialValue" >> Nullable -
Ну, Есть Дейт который в теори БД говорит о том, что NULL недопустим, если исходить из этого - то проектировать становится проще, хотя после прочтения Дейта все становится проще)
-
да нет, почему null-ы нужны иногда. Вот сейчас в КХ у меня лежит -1000F температура, и постоянно какие-нибудь грабли с min( или еще с чем-нибудь и я жалею что null не положил), а для дат например удобнее 0000-00-00 и 9999-12-31, для between
-
-
-
leb128 ещё можно
-
-
Хм, чёт не туда сказанул. Хотел сказать, что можно на +1 все сдвинуть и место под null освободить.
-
? в смысле внутри КХ зарезервировать значения в типах под null ?
не получится, вся быстрая математика внутри cpu/sse сломается, cpu не в курсе как nulll-ы складывать, сравнивать -
Это только для хранения. При распаковке будут нормальные nullable
-
-
Забавно про дейта слышать в чате olap базы xd
-
-
забавно что кто-то помнит вообще про дейта, я читал 20 лет назад последний раз, ниче не помню, помню что толстая
-
- 11 March 2020 (274 messages)
-
Так оно для этого и создано :)
-
Joined.
-
А подскажите пожалуйста в чем разница между max(x) и maxState(x) для mv. Это нужно для того чтобы собирать из распределенных таблиц данные?
-
ага, у нас почти все колонки такие, и для всех руками искать невалидные значения + логика приложения с добавлениями WHERE column<> invalidReserved, а когда аггрегация нескольких колонок, то это вообще не работает... тот ещё "фан"
-
-
Какие ограничения вы делаете для пользователей КХ, что бы они не клали Кх потребляя слишком много памяти ? Вот допустим есть у на. 256 гигов на сервере. Какие лимиты по бест практис нужно выставить ?
-
так жешь зависит от профиля нагрузки - какие запросы и как часто.
-
Ну может практики есть..создать профили 1/4, 2/4,3/4,.. unlimit
-
еще глупый вопрос, но что-то не могу initial_address из query_log в удобочитаемый вид конвертнуть. какая функция для этого?
-
-
Там в виде ipv6 хранится?
-
да, но там fixed string
-
Ну в ipv6 скорее всего можно скастить, но что бы получить ipv4 придется возможно написать функцию
-
Joined.
-
Joined.
-
-
> When inserting data into ClickHouse, you can use different formats of date and time strings, depending on the value of the date_time_input_format setting.
> Default value: 'basic'.
> ClickHouse can parse only the basic YYYY-MM-DD HH:MM:SS format. For example, '2019-08-20 10:18:56'. -
Понял, спасибо!
-
Всем доброго! Прошу оказать помощь.
Есть Mssql с данными в 3 нормальной форме. Есть потребность переноса (отображения) этих данных в ClickHouse.
Подскажите, пожалуйста, каким образом лучше сформировать таблицы в ClickHouse - в таком же нормализованном виде или произвести денонрмализацию в интересах производительности. -
а как в дальнейшем планируете пользоваться данными?
-
Для аналитических запросов.
-
-
в таком случае, как показывает практика, имеет смысл разорбаться что такое OLAP вектор и привести таблицы к виду вектора.
если таблиц мало - то да, можно просто сджойнить все в 1 таблицу.
дело в том, что для CH - одна из самых дорогих операций, не group by не order by а join и избежав его - избавитесь от большого числа проблем с производительностью на серьезных аналитических запросах -
И справочники получается лучше не выносить а сливать все в одну таблицу?
-
для себя мы решили, что в нашем случае - справочники, как правило, не большие, и не сложные, а следовательно и джойн допустим 1000 записей - не существенен, хуже когда нужно сделать джойн 2 таблиц по 3-5 миллионов записей.
так что нужно смотреть. справочник справочнику рознь.
я как-то кидал скрин, как на сервере отъелось пол терабайта оперативки при джойне 2 таблиц по 30 миллионов записей =) -
-
Открытый код в Яндексе. Спринты по CatBoost и ClickHouse. 28 марта в Москве.
https://events.yandex.ru/events/otkrytyj-kod-v-yandek-28-03-2020LinkUPD: Нам очень жаль, но наша встреча переносится из-за ситуации с коронавирусом — мы не хотим подвергать вас даже минимальному риску заражения. Мы не отказываемся от планов провести встречу в нашем офисе, но выберем новую дату вместо 28 марта. Для тех, кто хочет попасть на мероприятие — регистрация по-прежнему открыта. Как только дата станет известна, мы обновим эту страницу и отправим статус рассмотрения заявки всем, кто прошёл регистрацию. Остаёмся на связи! *** Метод машинного обучения [CatBoost](https://catboost.ai/ "CatBoost") и аналитическая СУБД [ClickHouse](https://clickhouse.tech "ClickHouse") — технологии Яндекса с открытым исходным кодом. Поучаствовать в их разработке может любой желающий. 28 марта мы вновь проведём для разработчиков встречу в формате спринтов. Участники будут группами по 2–3 человека или индивидуально решать небольшие задачи. Вы посмотрите, как ведётся разработка CatBoost и ClickHouse, узнаете структуру их кода, научитесь писать и запускать тесты. И, мы надеемся, внесёте изменения…
-
None
-
Грац!
-
Спасибо, большое!
-
-
-
-
System reload dictionary 'name'. Не оно?
-
-
всем привет есть вопрос. хочу получать дату с таблицы таким запросом
ch.query(SELECT * FROM ${tableName} WHERE err LIKE '%device.geo.country%', (err, data) => {
а получаю метадату -
как пофиксить?
-
-
а вы сколько инсертов в секунду делаете?
-
-
-
-
-
-
CREATE TABLE default.simple_event_raw (id UInt64, raw_data String, create_at DateTime DEFAULT now(), updated_at DateTime DEFAULT now(), sign_flag Int8) ENGINE = CollapsingMergeTree(sign_flag) PARTITION BY toYear(create_at) PRIMARY KEY id ORDER BY id SETTINGS index_granularity = 8192
-
-
Коллеги, настраиваю доступ и кое что поставило меня в тупик. Мне надо одну БД сделать рид онли, а другую - разрешить на запись.
Идея такая:
- работает аналитик данных, человек;
- есть общая БД-источник, туда стекаются данные из других внешних источников (это все - хранилище), эта БД - рид-онли для аналитиков;
- есть БД конкретного пользователя, где он может вьюшки создавать, таблицы, держать и считать свои данные и тп.
В документации вижу такое:
https://clickhouse.tech/docs/en/operations/access_rights/
You can't grant full access to one database and readonly access to another one.
Серьезно? Какой можно посоветовать workaround?
Первое что пришло на ум - создавать по 2 пользователя, но это не подойдет. В процессе работы с личной БД на запись необходимо иметь доступ на чтение в общую рид-онли базу. -
Ну доступы прописываются через профиля, у пользователя может быть только 1 профиль с правами, потому мне видится только 2 пользователя. Но правда еще можно разграничить, через выполнение команды set profile = 'name', но как это впихнуть идей нет.
-
Привет.
Можно спросить про эту конструктор?
https://a.yandex-team.ru/arc/trunk/arcadia/contrib/libs/clickhouse/libs/libcommon/include/common/LocalDateTime.h?rev=3832398#L76
это возвращает по каким Таймзона ? Гринвич или локальный ? -
Раньше (год назад) не было simpleaggregatingfunction работал только maxState
-
Можно в словари