- 15 June 2021 (89 messages)
-
С форматом все ок, пушил с теми же скриптами и данными в тот же кх, работает. А в контейнере нет
-
тогда предлагаю посмотреть что в error логе пишет )
-
5 сек)
-
Можно использовать JSONExtract:
WITH JSONExtract('[{"id":1,"name":"Test","subtotal":84.99,"count":1},{"id":2,"name":"Test2","subtotal":267.0,"count":3}]', 'Array(Tuple(id UInt64, name String, subtotal Float64, count UInt64))') AS parsed_json
SELECT
tupleElement(parsed_json, 'id') AS id,
tupleElement(parsed_json, 'name') AS name,
tupleElement(parsed_json, 'subtotal') AS subtotal,
tupleElement(parsed_json, 'count') AS count
┌─id────┬─name─────────────┬─subtotal────┬─count─┐
│ [1,2] │ ['Test','Test2'] │ [84.99,267] │ [1,3] │
└───────┴──────────────────┴─────────────┴───────┘
1 rows in set. Elapsed: 0.020 sec. -
Спасибо, попробую
-
Здравствуйте, подскажите пожалуйста:
В базе данных есть две таблицы, на таблицу номер один довольно высокая нагрузка на запись разделена на 3 шарда
На таблицу номер 2 нагрузки почти что нет
Можно ли для записи в таблицу номер два использовать только один шард а для таблицы номер один все шарды? -
вы собираетесь потом объединять таблицу 1 и таблицу 2 или это полностью независимые данные?
-
независимые
-
ну смотрите
если вы говорите "шарды"
то значит у вас комбинация
SELECT из Distrbuted Таблицы
вставка в Distributed или в *MergeTree таблицу напрямую
можно в <remote_servers> определить два разных кластера с разными хостами или с разными весами...
и таким образом регулировать вставку...
переопределение remote_servers работает без перезагрузки сервера -
Example for schema bootstraping Clickhouse cluster were added in docs by solyard · Pull Request #722 · Altinity/clickhouse-operator
Thanks for taking the time to contribute to clickhouse-operator! Please, read carefully instructions on how to make a Pull Request. This will help a lot for maintainers to adopt your Pull Request. ...
-
Всем привет. Кто-то стыкался с проблемой, когда внешний словарь с источником PostgreSQL и аттрибутом типа bool (UInt8 в CH) не создается из-за того что PostgreSQL возвращает t, f значения вместо 1, 0. И CH не может спарсить эти значения в UInt8.
Проблемы не было, когда источником был ODBC и в DSN уже были указаны параметры подключения к базе.
Когда поменяли на SOURCE(POSTGRESQL(...)) все сломалось. -
Решил проблему, добавил EXPRESSION 'colname::int'
-
Спасибо
-
-
None
-
всем привет
В онлайне нужно обновлять статистику, можно ли джойнить табличку с движком NULL c таблицей MergeTree??
Вот пример запроса,данные по итогу не поступают в финальную табличку
CREATE MATERIALIZED VIEW adm.mv TO adm.tab_stat
(
col1 Date,
col2 String,
hits Int64
) AS
select
t1.col1,
t2.col2,
sum(hits) as hits
from tab_engine_null as t1
left join tab_engine_mergetree as t2
on t1.id = t2.id
group by t1.col1,t2.col2 -
-
вообще можно, но МВ реагирует только на вставку в левую табличку
-
в _null табличку
-
а подскажите как мне синхронизировать данные в двух одинаковых табличках?
одна табличка у меня заполняется по крону(редко)
а вторая из пушей, которые приходят по хттп(в реальном времени)
данные в них одинаковые
но так как сервис по приему пушей писал умный девопс(я), то во второй образуются "дырки" когда сервис сломан или не отвечает
мне хочется недостающие данные из первой таблички доложить во вторую
есть какой-то способ обнаружить чего не хватает во второй таблице? -
например найти места, где разница между датами между двумя последующими строками больше 10 минут, или чего-нить такое
-
SELECT * FROM t1 LEFT JOIN t2 on(t1.id = t2.id) where t2.id is null
-
оно в память должно влезть?)
-
дайте ddl таблиц для быстрого воспроизведения ситуации
-
должно
-
Кажется, что можно для начала посчитать каунты посекундные для одного дня ( всего 100к ключей в GROUP BY) а потом сравнивать
-
есть ли какие-то нюансы для partial updates словарей? RockDB/View в качестве исходной таблицы можно сделать - или это пока не поддерживается?
Делаю примерно как вот тут - https://kb.altinity.com/altinity-kb-dictionaries/partial-updates - с LIFETIME(MIN 0 MAX 0) ничего не обновляется, как не меняй таймстемп, но с LIFETIME(5) - все обновляется. -
так естесвенно с LIFETIME(MIN 0 MAX 0) ничего не обновляется, я опечатался в kb, сейчас на 30 заменю
-
поправил
-
-
да
- 16 June 2021 (182 messages)
-
GitHub - growthbook/growthbook: The Open Source A/B Testing Platform
The Open Source A/B Testing Platform. Contribute to growthbook/growthbook development by creating an account on GitHub.
-
большое спасибо! помогло!
-
-
Нет ли сериал какого-то в постгресе, как ключ? Мб него берёт
-
Там есть индекс, который идёт 1-й колонкой. Я его не пробрасываю в dictionary намерено.
-
Вот он, скорее всего и берется, как UInt8,но хз почему))
-
Добавил индекс в словарь, сделал его PRIMARY KEY, всё починилось. Спасибо )
-
-
Пытаюсь подключиться к удаленной базе postgresql, выдает ошибку
Code: 998. DB::Exception: Received from localhost:9000. DB::Exception: Unable to connect to any of the replicas.
В чем может быть дело? -
А что делать при подключении внешней таблицы через Dictionary, если ни одна колонка не подходит в качестве PRIMARY KEY? Составной ключ не получается сделать. А если я выбираю любую стринговую колонку в качетсве ключа - она исчезает из результирующей таблицы в CH.
-
Всем привет
Может кто подскажет, ситуация такого плана, необходимо перелить данные в агрегированном виде из одной таблицы в другую(При SELECT используется FINAL). Одним запросом не получается, падает по памяти. Сейчас разделили запрос на пакеты, по одному из полей. Запускаем эти запросы силами backend, соотвественно приходится контролировать данный процесс. Вопрос: есть ли у Clickhouse какой-либо механизм пакетного переноса агрегированных данных?
p.s. Materialized View не подходит из-за движка таблицы источника ReplacingMergeTree и поменять его в данный момент возможности нет. -
Добрый день, у меня задача посчитать агрегационные данные для разных когорт объектов, объединенных общим признаком.
Для примера - это товары в рубриках магазина. Нужно построить таблицу, где будут указаны рубрики и суммарные данные по всем товарам + по тем товарам, которые делают 80% оборота рубрики.
Пока не могу придумать ни одного варианта, кроме как перебор каждой рубрики отдельно с серией запросов на каждую, но, видимо, я не замечаю какой то возможности.
Условная таблица
create table sales (rubric UInt32, product_id UInt32, revenue UInt32)
Сейчас делается запрос
select rubric, count(distinct product_id), sum(revenue) from sales group by rubric
и далее отдельными запросами для каждой рубрики выбираются товары
select product_id, sum(revenue) as rev from sales where rubric='some_rubric' group by product_id order by rev desc
пробегаемся по результату набирая 80% оборота нарастающим итогом и получаем информацию о том, сколько товаров делают 80% оборота в рубрике.
Уверен, есть более изящный и правильный способ, намекните, пожалуйста. -
-
что такое результирующая таблица?
в смысле в SELECT * ... не появляется?
а через SELECT field FROM db.dictionary выбирается? -
вот та таблица, что создалась, в ней даже в описании колонок отсутствует та колонка, которую я взял за primary key, но она есть в DDL
-
нет, механизм это запросы вида INSERT ... SELECT ... WHERE ... FINAL
-
в смысле имеется ввиду таблица которая в system.tables возникает как результат CREATE DICTIONARY ?
вам для чего словарь то нужен? dictGet делать? или JOIN ?
и какой источник? -
Да, результат create dictionary. Источник postgres, нужен этот словарь для джойна с другими данными из других источников. Решили что это все в ch будет собираться и в нем джойниться
-
Привет! Ты работал с движком postgresql в clickhouse?
-
сколько записей в таблице postgres?
и какая структура в postgres? неужели там нет id SERIAL какого нибудь? -
только в тестах всяких
имеется ввиду Engine=PostgreSQL() для таблиц ?
а что конкретно интересует? -
Пробую простое подключение к базе, а тут ошибка
-
-
что-то не похоже это на ошибку которая к postgres относится
-
аа... а через psql пытался соедениться?
-
сервер к которому цепляетесь точно с сервера clickhouse Доступен?
-
Да
-
35000 строк, нет индекса, нет чего-либо, похожего на primary key, если имеется в виду колонка с уникальными значениями.
Составной primary key тоже не получается использовать в DDL при создании словаря.
В результате выбрал колонку, которую готов потерять, в качестве primary key. В результате с CH на 13 строк меньше, чем в оригинальной таблице в PG. -
Порты открыты для данного сервера
-
для составного primary key нужен layout COMPLEX_KEY_HASHED
-
в чем может быть проблема, такая ошибка
-
SQL Error [241]: ClickHouse exception, code: 241, host: clickhouse.prod.aliengain.com, port: 443; Code: 241, e.displayText() = DB::Exception: Memory limit (for query) exceeded: would use 64.00 GiB (attempt to allocate chunk of 5386060 bytes), maximum: 64.00 GiB: While executing AggregatingTransform (version 20.12.6.29 (official build))
-
│ max_memory_usage │ 422000000000 │
-
Может что то типа того:
SELECT rubric,
product_id,
runningAccumulate(sum_revenue, rubric) / totals.revenue as runnind_revenue_pct
FROM (
SELECT rubric,
product_id,
sumState(revenue) as sum_revenue
FROM sales
GROUP BY rubric, product_id
ORDER BY rubric, sum_revenue DESC
) ranged_sales
ALL LEFT JOIN (
SELECT rubric, sum(revenue) AS revenue
FROM sales
GROUP BY rubric
) AS totals USING rubric -
Привет, ребят
Подскажите, пожалуйста, как правильно писать Avro decimal черезе Kafka Engine ?
В Avro это
"type": "bytes",
"logicalType": "decimal",
И он в Decimal CH не ложится -
max_memory_usage_for_user?
max_server_memory_usage? -
от запроса зависит
-
ух, мощно, разбираюсь. Спасибо. Выглядит дьявольски
-
наверное вы первый кто в Avro на этом канале за пол года спрашивает
сложно сказать почему не мапится
я бы в отдельный файл сохранил
и попробовал через file() табличную функцию прочитать... -
Я без файла могу в КХ записать -> в String
Но вижу там только bytes, думаю может есть простой способ делать преобразование -
ну там же все преобразования через схемы делаются
https://clickhouse.tech/docs/en/interfaces/formats/#data-format-avroInput and Output Formats | ClickHouse DocumentationFormats for Input and Output Data ClickHouse can accept and return data in various formats. A format supported for input
-
Ага, увидел, ClickHouse поддерживает все
https://avro.apache.org/docs/1.10.2/spec.html#schema_primitive
а с Logical Types парсит Дату и время, но не Decimal) -
спасибо
-
почему данные в таблицу могут не вставляться?
select count(*) from item_daily_data;
1621302942
select count(*) from tmp_tmp_item_daily_data_2021_06_16_1491f208bd;
1438
INSERT INTO "item_daily_data" ("added","main_spider_id","spider_item_id", ..., "version","source","sign") SELECT "added","main_spider_id","spider_item_id", ....,"version","source","sign" FROM "tmp_tmp_item_daily_data_2021_06_16_1491f208bd" ORDER BY "sign";
Ok.
0 rows in set. Elapsed: 0.006 sec. Processed 1.44 thousand rows, 271.41 KB (227.21 thousand rows/s., 42.88 MB/s.)
select count(*) from item_daily_data;
1621302942 -
Ребята, может ли происходить мерж в mergeTree если у 2х строк один праймари кей?
-
Если в 1 инсерте - мержится
-
потому что таблица ReplicatedMergeTree и вы повторно пытаетесь вставить тот же самый блок данных
происходит дедупликация на уровне блоков по контрольной сумме
ReplicatedMergeTree хранит контрольную сумму 100 (настраиваемая величина) последних вставленных блоков -
-
есть PRIMARY KEY
есть ORDER BY (sorting key)
если таблица просто MergeTree то нечего мержить
вставит просто две строки -
в одном инсерте умно выкидывает 1 строку
-
ерунда какая то =) куда вставляете этот INSERT? в какой ENGINE?
-
MergeTree
-
сейчас попробую примерчик
-
SELECT engine_full FROM system.tables WHERE table='item_daily_data'; ?
-
VersionedCollapsingMergeTree(sign, version) PARTITION BY toYYYYMM(added) ORDER BY (added, main_spider_id, spider_item_id, region_id) SETTINGS index_granularity = 8192
-
попробуйте сделать пустую таблицу с такой же структурой как item_daliy_data
и дважды вставить через INSERT SELECT из вашей временной -
сделал. не вставляет вообще
-
в обычный collapsing вставляет
-
так, может у вас version поля в данных нет?
что-то странное -
но вообще странно конечно
-
version во временной таблице у всех строк 1623793578225
-
а sign разный? или -1 ?
-
часть с -1, часть 1
-
либо дедупликация инсертов insert_deduplicate=1 --insert_deduplicate arg For INSERT queries in the replicated table, specifies that deduplication of insertings blocks should be performed
либо оптимизация инсертов --optimize_on_insert arg Do the same transformation for inserted block of data as if merge was done on this block. -
вообще не вставляет в смысле проглатывает без ошибок и потом SELECT count() FROM new_table = 0 ?
-
всё проще, локально ReplacingMergeTree была ^_^ извинити
-
чуть не поседел
-
Добрый день, нашли вроде как ошибку
Делаем POST запрос на создание заведомо уже созданной таблицы получаем ожидаемую ошибку
****.mdb.yandexcloud.net 9440 57 Code: 57, e.displayText() = DB::Exception: Table test.test2 already exists. (version 21.3.12.2 (official build)) 1 0
****.mdb.yandexcloud.net 9440 57 Code: 57, e.displayText() = DB::Exception: Table test.test2 already exists. (version 21.3.12.2 (official build)) 0 0
Code: 57, e.displayText() = DB::Exception: There was an error on [********.mdb.yandexcloud.net:9440]: Code: 57, e.displayText() = DB::Exception: Table test.test2 already exists. (version 21.3.12.2 (official build)) (version 21.3.12.2 (official build))
но когда мы выполняем запрос на CREATE или DROP с FORMAT JSON чтобы получить ответ в JSON формате получаем рузльтат со сломанным JSON-ом
{
"meta":
[
{
"name": "host",
"type": "String"
},
{
"name": "port",
"type": "UInt16"
},
{
"name": "status",
"type": "Int64"
},
{
"name": "error",
"type": "String"
},
{
"name": "num_hosts_remaining",
"type": "UInt64"
},
{
"name": "num_hosts_active",
"type": "UInt64"
}
],
"data":
[
{
"host": "********.mdb.yandexcloud.net",
"port": 9440,
"status": "57",
"error": "Code: 57, e.displayText() = DB::Exception: Table test.test2 already exists. (version 21.3.12.2 (official build))",
"num_hosts_remaining": "1",
"num_hosts_active": "0"
},
{
"host": "********.mdb.yandexcloud.net",
"port": 9440,
"status": "57",
"error": "Code: 57, e.displayText() = DB::Exception: Table test.test2 already exists. (version 21.3.12.2 (official build))",
"num_hosts_remaining": "0",
"num_hosts_active": "0"
}Code: 57, e.displayText() = DB::Exception: There was an error on [********.mdb.yandexcloud.net:9440]: Code: 57, e.displayText() = DB::Exception: Table test.test2 already exists. (version 21.3.12.2 (official build)) (version 21.3.12.2 (official build)) -
Во временной таблице N строк с sign = -1, N строк по тому же PK с sign = 1
при вставке в debug таблицу ошибок нет, по результату count выдает 0. Видимо во временной все сразу же схлопывается? -
set optimize_on_insert=0 помог
спасибо -
-
так и задумано
-
задумано ломать JSON ответ ?
-
его не возможно прочитать
-
да, HTTP протокол не позволяет вернуть ошибку если body уже началось, поэтому ошибка пишется прямо текстом посреди ответа, ломая CSV / TSV/ JSON
и это хорошо. -
ошибка в http code возвращается?
-
а можно тогда не возвращать 200 код .... по сути при запросе мы не можем 100% знать что произошла ошибка .... и узнать какая мы тоже не можем чтобы принять решение что делать
-
возращается 200
-
проверяйте на 21.1 должно было не 200 вернуться при такой ситуации.
-
у нас 21.3 LTS
-
есть еще http параметр wait_end_of_query=1 , но и без него должно быть ок
-
пробелема как раз в том что не ОК .... приходит 200 мы поэтому начали пытаться читать JSON а он испорченный
-
не знаю про POST может c POST всегда так было
-
echo 'drop table xxxx format JSON' | curl -vvv 'http://localhost:8123' --data-binary @-
< HTTP/1.1 404 Not Found -
echo 'CREATE TABLE parsing_stat.xxxx ON CLUSTER c9q930o5i86rsdloqlc9 (date dateTime) ENGINE = ReplicatedMergeTree() ORDER BY (date) format JSON' | curl -vvv '***.mdb.yandexcloud.net:8443' --cacert /usr/local/share/ca-certificates/Yandex/YandexInternalRootCA.crt -H 'X-ClickHouse-User: ' -H 'X-ClickHouse-Key: ' --data-binary @-
-
< HTTP/1.1 200 OK
< Date: Wed, 16 Jun 2021 12:08:18 GMT
< Connection: Keep-Alive
< Content-Type: application/json; charset=UTF-8
< X-ClickHouse-Server-Display-Name: rc1a-1xqj5fcgypyn4f4y.mdb.yandexcloud.net
< Transfer-Encoding: chunked
< X-ClickHouse-Query-Id: 53f9dd9b-b2cf-4107-b54e-10692ccd9931
< X-ClickHouse-Format: JSON
< X-ClickHouse-Timezone: Europe/Moscow
< Keep-Alive: timeout=3
< X-ClickHouse-Summary: {"read_rows":"0","read_bytes":"0","written_rows":"0","written_bytes":"0","total_rows_to_read":"0"}
<
{
"meta":
[
{
"name": "host",
"type": "String"
},
{
"name": "port",
"type": "UInt16"
},
{
"name": "status",
"type": "Int64"
},
{
"name": "error",
"type": "String"
},
{
"name": "num_hosts_remaining",
"type": "UInt64"
},
{
"name": "num_hosts_active",
"type": "UInt64"
}
],
"data":
[
{
"host": "rc1a-1xqj5fcgypyn4f4y.mdb.yandexcloud.net",
"port": 9440,
"status": "57",
"error": "Code: 57, e.displayText() = DB::Exception: Table parsing_stat.xxxx already exists. (version 21.3.12.2 (official build))",
"num_hosts_remaining": "1",
"num_hosts_active": "0"
},
{
"host": "rc1b-lpvh2az57kvuujgy.mdb.yandexcloud.net",
"port": 9440,
"status": "57",
"error": "Code: 57, e.displayText() = DB::Exception: Table parsing_stat.xxxx already exists. (version 21.3.12.2 (official build))",
"num_hosts_remaining": "0",
"num_hosts_active": "0"
}Code: 57, e.displayText() = DB::Exception: There was an error on [rc1a-1xqj5fcgypyn4f4y.mdb.yandexcloud.net:9440]: Code: 57, e.displayText() = DB::Exception: Table parsing_stat.xxxx already exists. (version 21.3.12.2 (official build)) (version 21.3.12.2 (official build))
* Connection #0 to host rc1a-1xqj5fcgypyn4f4y.mdb.yandexcloud.net left intact -
а ну да из-за ON CLUSTER
тут да , ничего не сделать, HTTP протокол, боди уже идет, уже клиенту никак не сообщить ошибку -
попробуйте wait_end_of_query=1
-
ну т.е. JSON специально ломается, чтобы клиенту просигналить об ошибке
-
ну или вам можно CREATE TABLE if not exists использовать
-
Все привет
Нужно создать словарь на основании таблички
CREATE DICTIONARY adm.host_category
(
name String,
cat String
)
PRIMARY KEY name
SOURCE(CLICKHOUSE(HOST '127.0.0.1' PORT 9000 USER 'login' PASSWORD 'pass' DB 'adm' TABLE 'tab'))
LIFETIME(MIN 300 MAX 360)
LAYOUT(FLAT());
При обращении
select dictGetString('adm.host_category', 'cat', tuple('003ms.ru'))
Ошибка
Unsigned type must not contain '-' symbol: Cannot parse UInt64 from String: while converting source column name to destination column name
Не погу понять из за чего ошибка? -
flat только числовой UINT64 ключ умеет,
вам complex_key_hashed надо layout -
flat это обычный массив в памяти, обращение в элементам по индексу (числу)
-
спасибо
-
Прошу прощения за тупой вопрос. Сдох диск с данными КХ. Если я запущу КХ с теми же конфигами, с тем же ЗК, но с пустой папкой данных — он ведь сам скачает все данные с реплик?
-
Или лучше его как новую реплику теперь заводить, под новым именем?
-
Скачает. Но нужен файлик force recovery что-то там. В доке написано. А и нужны файлы метаданных, можно скопировать с реплики
-
спасибо
-
При вставке в колонку type: Array(String) пустого значения падает с Cannot parse input: expected [ before. Можно ли как-нибудь обойти? Колонку на Nullable(Array(String)) не удается поменять (Nested type Array(String) cannot be inside Nullable type (version 19.16.4.12)
-
Array(Nullable(String))
должен по идее пустой массив воспринимать как [] -
Array does not start with '[' character: while executing
INSERT INTO test2 VALUES ('') -
INSERT INTO test2 VALUES([]);
-
да мне либа https://github.com/yndx-metrika/logs_api_integration возвращает
Column 20, name: From, type: String, parsed text: <EMPTY>
Column 21, name: GoalsCurrency, type: Array(String), parsed text: <EMPTY>ERROR
и я думаю она пытается что-то типа пустой строки пропихнуть.GitHub - yndx-metrika/logs_api_integration: Script for integration with Logs APIScript for integration with Logs API. Contribute to yndx-metrika/logs_api_integration development by creating an account on GitHub.
-
не знаю, лично я предпочитаю https://bitbucket.org/clickhouse_pro/metrika2clickhouse
но не знаю насколько оно сейчас с текущими лимитами на logs API совмесимо -
странно, что не помогает
'input_format_allow_errors_num': 99999,
'input_format_allow_errors_ratio': 1 -
-
-
-
-
Абсолютно нормально. По умолчанию кх подставляет дефолтные значения типа
-
Настройки | Документация ClickHouse
Настройки distributed_product_mode Изменяет поведение распределенных подзапросов. ClickHouse применяет настройку в тех с
-
Спасибо большое!
-
а как там вообще строки в массиве записываются / возвращаются либой?
-
IDENTIFIED WITH sha256_hash BY 'hash'
https://clickhouse.tech/docs/en/sql-reference/statements/create/user/#identification -
Разобрался, спасибо. Под конец дня голова не работает
-
content = content.encode('utf-8')
query_dict = {
'query': 'INSERT INTO ' + table + ' FORMAT TabSeparatedWithNames ',
'input_format_allow_errors_num': 99999,
'input_format_allow_errors_ratio': 1
}
if (CH_USER == '') and (CH_PASSWORD == ''):
r = requests.post(CH_HOST, data=content, params=query_dict, verify=SSL_VERIFY)
else:
r = requests.post(CH_HOST, data=content, params=query_dict,
auth=(CH_USER, CH_PASSWORD), verify=SSL_VERIFY) -
go больно. У вас при работе с ней не возникало проблем/необходимости в переписывании?
-
переписывании чего?
вы в целом про golang сейчас или конкретно про metrika2clickhouse?
я ее достаточно давно использовал
но если у вас трудности будут, смогу помочь
Яндексовский репозиторий вообще не обновлялся довольно давно -
golang, надеюсь, не переписывали) имел ввиду metrika2clickhouse, так как питон либу я уже переписывал (вернее, дополнял) несколько раз
спасибо за предложение, но пока использование metrika2clickhouse самый крайний вариант (даги на питоне вертятся) 🙌 -
Привет, а никто не сталивался с такой проблемой. Пытаюсь базу создать Postgresql. делал по доке: https://clickhouse.tech/docs/ru/engines/database-engines/postgresql/
Команда такая у меня: CREATE DATABASE production_gp ON CLUSTER my_cluster ENGINE = PostgreSQL("my_host:5432", "gp_db", "user", "pw", 1);
На что получаю ошибку, которая немного ставит в тупик:
Code: 36, e.displayText() = DB::Exception: Database engine PostgreSQL cannot have arguments (version 21.1.2.15 (official build)).
Никто не подскажет, что я не так делаю?PostgreSQL | Документация ClickHousePostgreSQL Позволяет подключаться к БД на удаленном сервере PostgreSQL. Поддерживает операции чтения и записи (запросы S
-
вроде как в 21.1 PostgreSQL движка нет
-
эх (
-
Спасибо
-
жутко извиняюсь за ап темы, но может быть найдутся еще какие то варианты, кажется, единственный предложенный не совсем про это
-
Привет!
Поймал в логах КХ такое:
Got exception while starting thread for connection. Error code: 0, message: 'No thread available'
И КХ перестал отвечать. Что может быть? -
посмотрите загрузку CPU
выглядит так что тредов не хватает ... и слишком много коннектов... -
Ага вижу спасибо. Кол-во коннектов возрасло с 10 до 500+ в один момент.
-
Мб что то такое
WITH
sumMap([product_id], [revenue]) AS map,
arrayReverseSort(x -> (x.2), arrayZip(map.1, map.2)) AS sorted,
arrayFilter((x, y) -> (y < (0.8 * total)), sorted, arrayPushFront(arrayPopBack(arrayCumSum(sorted.2)), 0)) AS product
SELECT
rubric,
countDistinct(product_id),
sum(revenue) AS total,
product
FROM sales
GROUP BY rubri
Либо через оконки делать -
кто-нибудь сортировал по алфавиту имена колонок в схеме бд?
-
что бы что?
-
мне тут вставка идет по отсортированным колонкам, и запрос типа INSERT INTO, пытается вставить часть данных не в те колонки (некоторые колонки в схеме не упорядочены, а при вставке идут упорядоченно) - это насколько я понял, дебажа
-
Приветствую, кто-нибудь сталкивался с такой ситуацией?
Нужно удалить таблицу на серверах кластера. Одна нода (или ни одной) отработали, а на остальных запрос зависает и нормально отрабатывает только после перезагрузки зависших серверов
DROP TABLE products_mv_v2_2 ON CLUSTER cluster
Query id: 6b5b5547-e97a-4c1a-9a0d-555829f01749
┌─host───────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ node4.some_host.net│ 9000 │ 0 │ │ 3 │ 0 │
└────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘
↘️ Progress: 1.00 rows, 62.00 B (4.55 rows/s., 282.33 B/s.) 24%
1 rows in set. Elapsed: 180.761 sec.
Received exception from server (version 21.3.9):
Code: 159. DB::Exception: Received from 10.0.1.30:9000. DB::Exception: Watching task /clickhouse/task_queue/ddl/query-0000000675 is executing longer than distributed_ddl_task_timeout (=180) seconds. There are 3 unfinished hosts (0 of them are currently active), they are going to execute the query in background.
Такое происходило раза 4 за 5 месяцев -
alter table modify column after|first
tl;dr -
select * from system.merges на том сервере где зависло
-
SELECT *
FROM system.merges
Query id: ec657678-3547-4be4-85af-7b19c2320452
Ok.
0 rows in set. Elapsed: 0.002 sec. -
в момент когда висит
-
то же самое, в одном окне терминала делаю дроп, в другом селект из system.merges, и все равно ничего не выдает
-
товарищи, а кто использует ssd+hdd? У нас при наполнении SSD взрывается по i/o всё, таймауты в зукипер, реплика умирает, может можно ограничить как-то откладывание с SSD на HDD по скорости?
-
а кусок кх лога, с дропом? Теоритически drop table может работать довольно долго (минуты), если много партов в таблице то их надо удалить с диска, если таблица replicated надо удалить все из зукипера.
-
чего, кто где стоял, на ком?
типа место на ssd заканчивается и КХ начинает двигать сразу много партов одновременно? -
несет 700Gb с SSD на HDD (80% накопил и начинает тащить на HDD)
-
-
-
в кассандре есть настроечка ограничить интенсивность использования диска, в кх не найду для вот этих мувов такого
-
<max_data_part_size_bytes>50000000</max_data_part_size_bytes>
-
если поставить такое - парты будут падать на другой диск при мерже или просто появится очень много партов?
-
нету в КХ
-
будет очень много партов
-
сколько мержей TTL одновременно?
-
осталось выяснить как происходит мув - вдруг это просто один большой парт
-
если да, то много x2 партов в обмен на тихие мувы выглядит норм
-
видно это в логе и таблице part_log
-
Через 15 минут англоязычный ClickHouse meetup. Там будут интересные новости про Tableau: https://www.meetup.com/San-Francisco-Bay-Area-ClickHouse-Meetup/events/278144089/ClickHouse June [Virtual] Meetup
Wed, Jun 16, 2021, 12:00 PM: Hello ClickHouse Fans,Welcome to the June 2021 ClickHouse Meetup! We have a talk from Alexey Milovidov on ClickHouse roadmap plus popular ways to visualize ClickHouse data
-
Стрим: https://youtu.be/4bixbIUHDQwJune ClickHouse Bay Area Meetup -- ClickHouse News
Join us for this session on latest #ClickHouse news. We'll cover ClickHouse Roadmap (starring Alexey Milovidov, lead committer) and have another TBD talk. You can ask questions from Youtube. See the meetup invite for more information: https://www.meetup.com/San-Francisco-Bay-Area-ClickHouse-Meetup/events/278144089/ #DataWarehouse #Meetup ----------------- Check out more ClickHouse resources here: https://altinity.com/resources/ Join Reddit community: https://www.reddit.com/r/Clickhouse/ ----------------- Learn more about Altinity! Site: https://www.altinity.com LinkedIn: https://www.linkedin.com/company/alti... Twitter: https://twitter.com/AltinityDB
-
а с какой версии сть part_log?
-
с 1-й
-
The system.part_log table is created only if the part_log server setting is specified.
-
ага включить
-
спасибо, будем смотреть
-
-
@alexanderzaitsev
-
-
тож самое, что и link с eventribe, я буду с youtube смотреть...
-
SELECT isp,
count(DISTINCT log.messageId),
count(DISTINCT last.messageId)
FROM log
LEFT JOIN
(
SELECT messageId
FROM log
WHERE typeId = 5
GROUP BY messageId
) AS last USING (messageId)
WHERE typeId = 1
GROUP BY isp;
Помогите с запросом.
last.messageId может быть NULL, и DISTINCT посчитает его как отдельную запись, как не считать? -
Where last.messageId is not null
-
count null не считает (неважно distinct там или нет)
-
Это так же уберет значения из log.messageId
-
Набросал пример
-
я тут немного погрепал...
получается так...
была мутация (дроп колонки) на много партиционную таблицу, но она никак не отрабатывала.
и видимо кто-то замерджил парт до того как мутация отработала.
Как вообще очередность между мерджами и мутациями решается?
2021.04.27 08:35:33.156739 [ 12284 ] {} <Trace> mnp.tblname: Executing log entry to merge parts 20210427-421_0_6_1, 20210427-421_7_14_1, 20210427-421_15_21_1, 20210427-421_22_29_1, 20210427-421_30_30_0, 20210427-421_31_31_0, 20210427-421_32_32_0, 20210427-421_33_33_0, 20210427-421_34_34_0, 20210427-421_35_35_0, 20210427-421_36_36_0 to 20210427-421_0_36_2
2021.04.27 08:35:51.237777 [ 12284 ] {} <Trace> mnp.tblname: Renaming temporary part tmp_merge_20210427-421_0_36_2 to 20210427-421_0_36_2.
2021.04.30 19:33:23.693630 [ 12294 ] {} <Debug> mnp.tblname (ReplicatedMergeTreeQueue): Not executing log entry MUTATE_PART for part 20210427-421_0_36_2_111 because source parts size (324.06 MiB) is greater than the current maximum (0.00 B). -
какой-то неудачный пример, не понимаю к чему он
-
count (что-то) -- считает КОЛ-ВО СТРОК!!! где что-то не null.
-
любая агрегирующая функция просто пропускает null
-
Значит я что-то не понимаю(
Для messageId = 2, нету записи в last как выходит что там 1 -
join в КХ не продьюсит null по дефолту
-
--join_use_nulls arg Use NULLs for non-joined rows of outer JOINs for types that can be inside Nullable. If false, use default value of corresponding columns data type.
-
по идее они последовательно должны выполнятся, странно каким образом мутация с drop колонки ждала и мерж пролез раньше, надо спросить у девелоперов
-
спасибо, ладно, когда остальные логи доедут, I'll be back
-
выведи message_id. Думаю, тебе не надо группировать по тому полю по которому считаешь каунт
-
А как тогда лучше обойтись в таком случае?
SELECT isp,
count(DISTINCT log.messageId), -- if typeId = 1
count(DISTINCT log.messageId), -- if typeId = 5
FROM log
GROUP BY isp;
Можно как-то условие на count поставить чтобы посчитать уникальные записи для каждого typeId? -
countif
-
countIf(distinct log.messageId, log.messageId=1)
-
Спасибо всем =)
- 17 June 2021 (246 messages)
-
Подскажите пожалуйста наилучший вариант аналога постгрессовского
SELECT DISTINCT ON (a) a, b, c, d from table
ORDER BY a, b
с использованием GROUP BY для Clickhouse
Нужно взять для каждого уникального "a" по 1 строке с наименьшим значением "b", например. Или для более сложной сортировки. -
order by a, b... limit 1 by a
-
Спасибо, невероятно изящно. Постепенно меняю отношение к CH
-
-
INSERT INTO table(column1, column2)
в том порядке какой вам нужен задаете и вставляете -
-
не проходит с какой то ошибкой? или просто молча говорит ОК и данные не удаляются
какой engine у таблицы? не distributed случайно? -
движок ReplicatedMergeTree
-
ошибка то какая?
timeout? -
да, просто таймаут
-
-
Значит что-то еще блокирует таблицу
вставка идет паралельно например -
Добрый день. Второй день ловлю ошибку 473 при попытке удаления таблицы (эта таблица в базе с движком Ordinary, первая была в базе с движком Atomic). Можно ли как-нибудь "побороть" такую ошибку ?
-
... версия сервера КХ : 21.2.5.5
-
пока нет
-
https://github.com/ClickHouse/ClickHouse/pull/24420
подписывайтесь мониторьте тестируйтеSupport conditions in JOIN ON section by vdimir · Pull Request #24420 · ClickHouse/ClickHouseI 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...
-
ну очевидно можно, путем того что перестать пытаться паралельно вставлять в таблицу... или перейти на более свежую версию clickhouse и сконвертировать базу в Engine=Atomic
-
Параллельных вставок в таблицу нет, один процесс занимается изменением данных. Atomic на другой таблице был, такая же беда. Но на новую версию, наверное, уже пора перейти. Еще вопрос - можно ли сконвертировать базу из Ordinary в Atomic без пересоздания и перезаливки всех таблиц исходной базы ?
-
эквивалент джойна с OR это UNION:
SELECT * from A
LEFT JOIN B ON A.a = B.a
UNION ALL
SELECT * from A
LEFT JOIN B ON A.b = B.b -
+
-
Это 1С весь на КХ ?
-
нет, просто репортинг скорее всего сделали
-
Нет, с КХ синхронизируются документы, влияющие на остатки, справочники и часть регистров. И расчет остатков в КХ выполняется. Остатки/обороты в разрезах товар/магазин/дата. Цены в разрезе товар/дата (вместо срезов, так быстрее)
-
Из КХ аналитики затем свои отчеты делают в Excel и PowerBI
-
ну если сервер выключить
и ручками в metdata покопаться добавив UUID и потом перенести в /var/lib/clickhouse/store
может что нибудь и получится -
Часть ресурсоемких отчетов в 1С также из КХ данные берут
-
о, а расскажите как выостатки обороты считаете в clickhouse?
ну вот есть у вас таблица с движениями
есть отдельная таблица с итогами?
как пересчет этой таблицы идет?
а то всегда хотел понять как именно регистр сведений организовать средствами кликхаус -
Остатки и обороты количественные (не партионный учет конечно). Обороты просто - все документы, которые двигают остатки, сложить с соответствующим знаком и приведением датывремени к дате. Перемещение - два раза (т.к. два магазина). В результате получим в КХ обороты за каждый день.
-
А как синхронизируете чем ? ETL какой-то или скриптами ?
-
Затем циклом в 1С к остаткам на начало прибавляются (запросом КХ) остатки на следующий день, и т.д.
Т.е. таблицы итогов нет. Есть остатки на каждый день -
Отдельная технологическая база 1С для зтого. И набор "мультискриптов", сценариев их исполнения. Мультискрипт - смешанный код на 1С, включает исполнение пакетных запросов в КХ, обращения к базе 1С через универсальный Web (или HTTP) сервис для удаленного исполнения запросов и алгоритмов 1С, обращения к SQL базе 1С через ADO,
формирование SQL запросов для исполнения утилитой BCP.EXE -
спасибо
-
Скриптом выполняется быстрое сравнение (тип документов/дата/сумма) или медленное по SHA256, если за какой-то день найдены расхождения, в КХ удаляются данные и грузятся заново
-
через ALTER TABLE данные удаляете или через DROP PART?
-
Через ALTER TABLE с mutation_sync=2
-
-
Данные чеков - только в КХ, грузятся непрерывно
-
Добрый день.
Подскажите, может кто сталкивался, есть словарь который хранится в MS SQL
В поле Version лежат значения вроде 1.0.5, 1.0.6 и тд
При запросе словаря в клике получаю ошибку
type: std::invalid_argument, e.what() = stoull: no conversion
Я так понимаю у него проблемы с конвертацией данных, как с этим бороться?
Тип данных в словаре указан String -
Т.е в 1С остались ОРП, а сами чеки только в КХ?
-
ОРП (реестры) есть и в КХ и в 1С, чеки только в КХ, 1С не "вывозит" ~10000 магазинов
-
-
-
ну вот выглядит так что к этой таблице у вас что-то еще прилетает, репликация какая нибудь постоянная или вставки
и DROP TABLE просто не может заблокрировать таблицу
смотрите system.merges, system.processes, system.mutations, system.replication_queue для этой таблицы -
Заблокировалась другая таблица, work.tovzap. Она по расписанию раз в сутки обновляется одним процессом.
С чеками пока проблем не было.. -
хм, выборка из нее идет из этой таблицы?
просто суть в том что DROP TABLE в Ordinary
это блокировка на запись, и потом физическое удаление файлов и каталог в metadata и data
если у вас replicated merge tree
то еще отдельно из ZK вычищается реплика для этой таблицы
я бы попробовал DROP TABLE ... ON CLUSTER ... SYNC -
Evgeniy Sergeev, [17.06.21 10:07]
Т.е в 1С постоянно все меняется и использовать мутации тяжело, интересно используете ли встроенные механизмы устранения дублей которые дает клик
Именно поэтому онлайновой синхронизации нет, раз в сутки выполняется сравнение данных 1С и КХ, затем через bcp.exe выгружаются данные по датам с расхождениями, в КХ ALTER TABLE удаляются прежние данные за эти даты и заливаются обновленные данные из 1С. На всё уходит около часа времени -
-
Реплик нет, рабочий сервер КХ пока один (256 Гб ОЗУ + 2 Тб SSD), поэтому и непонятно. Движки таблиц - MergeTree, SummingMergeTree,
-
добрый день. Подскажите с точки зрения настроек
например у нас 2 шарда и каждый реплицируется *2 .... если данные находятся на 2ом шарде ... клиент может обращаться к любому шарду/реплике или это нам нужно на своей стороне контролировать где хранятся данные ? -
MergeTree для Ordinary блокируется либо background merge либо мутациями либо другими insert
смотрите в system.merges, system.mutations, system.processes, system.query_log и system.part_log
по времени когда случается ошибка с фильтрацией по имени таблицы -
Спасибо, попробую в system поискать
-
... и версию обновить и перезалить таблицы в базу Atomic
-
День добрый.
Есть 6 шардов, на каждом стоит словарь с типом hashed. При этом объём занимаемой памяти словарём около 80 gb.
На одном из шардов решил поменять тип на sparse_hashed и при этом после обновления словаря объём занимаемой им памяти остался прежним.
Хотя в документации сказано:
Аналогичен hashed, но при этом занимает меньше места в памяти и генерирует более высокую загрузку CPU.
Подскажите куда копать? Спасибо
ver. 19.15.3.6 -
-
а если попробовать PREALLOCATE=0 ?
"less memory"
означает что на сам хеш памяти меньше, а значения атрибутов наверняка столько же весят...
если у вас 80 гигов то экономить вам скорее всего получится 1-2 гига максимум а скорее всего 100-200 мегабайт если кол-во элементов большое... -
источник у словаря какой?
-
Postgre.
У словаря 13 атрибутов -
да, я чего то с ходу так и не понял в чём назначение этой штуки preallocate. Чтож попробую. Спасибо
-
ну, ничего особенного, сильно прямо ничего такого не получится экономить...
-
можно попробовать обновить clickhouse и использовать ssd_cache layout
https://clickhouse.tech/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-layout/#ssd-cache
или просто попробовать cache
если у вас не все элементы словаря используютсяStoring Dictionaries in Memory | ClickHouse DocumentationStoring Dictionaries in Memory There are a variety of ways to store dictionaries in memory. We recommend flat, hashed an
-
Подскажите, если в system.columns в поле compression_codec пусто, то это значит, что использован кодек по-умолчанию?
-
да
LZ4 -
Спасибо!
-
но на всякий случай посмотрите внимательно на вашу секцию <compression> в конфигах
https://clickhouse.tech/docs/en/operations/server-configuration-parameters/settings/#server-settings-compressionServer Settings | ClickHouse DocumentationServer Settings builtin_dictionaries_reload_interval The interval in seconds before reloading built-in dictionaries. Cli
-
Привет, вопрос. Есть кластер с шардами в каждом шарде по 2 реплики, в нем есть таблица, replicatedmergetree над этой таблицей строится материальная вьюшка на каждой реплике и уже на эти вьюшки смотрит дистрибутед, вопрос вот в чем, проходили работы на железе и выключались реплики на несколько дней, после включения исходная табличка догналась данными, а вот материальная вьюшка нет, что делать? Данных хулиярг и небольшая тележка пересоздавать вьюшку не вариант, есть какието альтернативные методы. В связи с этой проблемой возникает другой вопрос, если данные на сервер приходят не через запрос а через репликацию, они попадает во вьюшку или нет? CH v.21.3.12.2
-
У меня эта секция вообще закомментирована.
-
тогда LZ4
-
Надо было materialized view делать с TO db.another_replicated_mergetree_table выражением
а так у вас похоже обычные MergeTree внутри MV созданы
POPULATE делать не вариант
можно попробовать руками данные догнать
INSERT INTO db.inner_таблица_из_mv SELECT ... FROM db.исходная_replicated_tree
WHERE (тут грамотно подобрать условие чтобы повторно данные не вставить) GROUP BY ...
имя inner Таблицы смотрите через SHOW TABLES -
CREATE MATERIALIZED VIEW mv_table ENGINE = SummingMergeTree(…) AS SELECT … FROM source_table вот так создавалось
-
ну значит создали локальную inner таблицу внутри mv_table
SHOW TABLES посмотрите... -
-
Добрые люди, насколько безопасно обновлять
ClickHouse server version 19.4.1 revision 54416.
до актуальной с ReplicationMergeTree на борту?)
вроде тут писали, что что-то у ребят не завелось, но ответа я не нашел , как в итоге он вышел из оказии
мож безопаснее на какой-нибудь 19.9 и тд и так по одному мажору обновлять? -
ну вот в нее руками через INSERT .. SELECT аналогичный тому что в CREATE делали и вставляйте , только условие WHERE добавьте чтобы повторно данные не вставить
-
тут, понятно, в другом не ясность, если реплика отстала, в момент репликации в эту inner не добавится?
-
ну если сервера стопнуть от вставок... и обновлять одновременно, то нормально должно обновиться...
-
а если начать писать в другие таблички и обновлять кусками? а потом просто хвост долить
-
ну тоесть в процессе востановления реплики, почему она не догнала в inner таблице?
-
ну по идее репликация это не вставка
это просто регистрация имени нового парта в ZK
и его последующая асинхронная скачка через HTTP протокол в виде как есть...
а MV это after insert trigger
а вставки вроде как и не было... -
ясно
-
-
-
ну INSERT через distributed это сначала разбиение по sharding key и буфферизация в .bin в ноде инициаторе, а потом push передача .bin файлов через distributed sends на реплики шардов соответсвующих условию sharding_key
то есть смотрите, движки таблиц они друг другу ортогональны и НИЧЕГО не знают обычно друг про друга -
ну вы собираетесь повторно данные вставлять?
мы же все еще кейс с выключением реплики говорим...
в общем надо разбираться смотреть когда срабатывает INSERT TRIGGER а когда нет... -
я просто, по ходу пьесы посмотрел исторические данные увидел, что count() в mv одного шарда отличается иногда оооочень сильно.
-
-
Всем добрый день. Подскажите, пожалуйста, такой момент: в системе есть Kafka, в которую загружаются ивенты из некоторой системы в один топик event_topic,
ивенты из себя представляют некоторый JSON с произвольным набором столбцов, который зависит от типа самого ивента, в каждом ивенте есть атрибут
eventtype, который хранит название типа события в системе.
Будет ли хорошей практикой в clickhouse создать таблицу следующего вида:
create table t_kafka_message
(
message String,
insert_date DateTime default now()
) engine = Kafka()
settings
kafka_broker_list='127.0.0.1:9092',
kafka_topic_list='event_topic',
kafka_group_name='clickhouse_kafka_group',
kafka_format='JSONEachRow';
а далее с помощью материализованного представления выполнять разбор содержимого в столбце message в таблице t_kafka_message
с последущей записью в заданные таблицы (для каждого типа события создана своя таблица)? Есть ли потенциальные проблемы с производительностью
при таком подходе к реализации задачи? -
В последней версии КХ появилась возможность задания комментария при создании таблицы. А команды ALTER для этого нет ? Существующая только для колонок работает
-
кто знает, подскажите пожалуйста, как столбец с типом AggregateFunction(uniq, UInt32) в секции where проверить на какое-то значения, например на нулевое. uniqMerge в секции where не доступена
-
переделать MV
на триггер + отдельная replicated merge tree таблица
вместо inner делать TO db.имя_отдеьной_таблицы
посмотрите синтаксис
https://clickhouse.tech/docs/en/sql-reference/statements/create/view/#materializedVIEW | ClickHouse DocumentationCREATE VIEW Creates a new view. Views can be normal, materialized and live (the latter is an experimental feature). Norm
-
а почему на CREATE DICTIONARY tarifs ON CLUSTER
выдает: Syntax error: failed at position 8:
Expected one of: DATABASE, TEMPORARY, MATERIALIZED, TABLE, VIEW
? -
Всем привет! Помогите пожалуйста разобраться с проблемой.
Clickhouse запущен в докере
Необходимо было удалить записи из таблицы, запрос удаления выдавал "0 rows in set", запрос на выборку с такими же условиями работал корректно.
Произвел перезапуск докер-контейнера.
После этого любые запросы в эту таблицу перестали работать, через 300 секунд отваливались по таймауту, но в процессах все также продолжают висеть
Что делать?
UPD: kill query и kill mutation зависает также как и обычный запрос -
покажите весь код
и в вашей версии КХ можно создавать через create dictionary? -
что такое КХ ? 🙂
-
ClickHouse)
-
)))
-
Здравствуйте.
—————————-
select
argMaxMerge(actual_st) as actual_st,
ifNull(minIfMerge(order_created), '1970-01-01 00:00:00') as order_created
—————————-
Объясните, пож-та, тайный смысл приставки Merge
Доку на сайте читал.
Не понимаю.
Может статья есть с объяснением работы функций с Мержами? -
либо Clubhouse, в зависимости от контекста)
-
а как узнать можно или нет ?
-
можно наверно на гитхабе погулять, думаю
-
мы юзаем yandex cloud
-
не кастом
-
с ним не работал, но можете прислать весь текст создания словаря, мб в синтаксисе ошибка
-
смотрите
любая аггрегатная функция, для того чтобы выдать конечный результат аллоцирует в памяти какие то структуры (например хеш таблицы с ключами по которым идет группировка)
это промежуточное состояние называется aggregation State и State можно использовать как модификатор имени аггреганой функции в запросе
соответственно *Merge как модификатор берет эти промежуточные состояния с предыдущих этапов выборки
и "доаггрегирует"
подробнее тут
https://clickhouse.tech/docs/en/sql-reference/aggregate-functions/combinators/Combinators | ClickHouse DocumentationAggregate Function Combinators The name of an aggregate function can have a suffix appended to it. This changes the way
-
Спасибо.
Всё равно не понимаю :)
Можно наводящий вопрос
1) функция с приставкой Merge, например argMaxMerge уместна только на движке AggregatingMergeTree ?
2) На движке MergeTree она уже не будет работать? -
нет
-
сейчас попробую пояснить примером
-
SELECT sumMerge(s) FROM (SELECT sumState(number) s FROM numbers(1000));
вот тут никакого MergeTree нет и AggregatingMergeTree нет
AggregatingMergeTree
это движок который как раз использует преймущество модификаторов Merge и State при background merge -
-
Пойдем сначала )))
-
Пойду читать про aggregation State
-
ну давайте на пальцах поясню
вот смотрите
у вас есть простой запрос
SELECT count() as goods_count, category FROM goods GROUP BY category
чтобы посчитать goods_count
что нужно?
нужно в памяти создать hashMap в котором ключ category а значение это счетчик который увеличивается на 1 на каждую строку с этой category. мы читаем поточно и передаем строку из 1 поля category на вход агрегатной функции
вот этот hash Map можно передать по конвейеру вышестоящему как countState() -
Подскажите, пожалуйста, можно как-то узнать, что лочит query?
-
Привет, а никто не сталивался с такой проблемой. Пытаюсь базу создать Postgresql. делал по доке: https://clickhouse.tech/docs/ru/engines/database-engines/postgresql/
Команда такая у меня: CREATE DATABASE production_gp ON CLUSTER my_cluster ENGINE = PostgreSQL("my_host:5432", "gp_db", "user", "pw", 1);
На что получаю ошибку, которая немного ставит в тупик:
Code: 36, e.displayText() = DB::Exception: Database engine PostgreSQL cannot have arguments (version 21.3.4.25(official build)).
Базу Postgresql выкатили в 21-2, вроде как, должно работать.
Никто не подскажет, что я не так делаю?PostgreSQL | Документация ClickHousePostgreSQL Позволяет подключаться к БД на удаленном сервере PostgreSQL. Поддерживает операции чтения и записи (запросы S
-
SELECT engine_full FROM system.tables WHERE name='restaurant_timetables' ?
-
Спасибо. А что это такое?
-
это метаданные таблицы, просто хочется понять что за таблица нет ли там каких нибудь зависимостей
-
Удалось узнать, что запросы к этой таблице стали зависать после alter table, который не прошел. И запросы к system.mutations тоже виснут.
-
странно конечно
LIMIT из обычной MergeTree не должен тормозить... тем более у вас там ни сортировки ничего
DROP TABLE там паралельно никто не делает? -
а, ну дык это
SELECT * FROM system.mutations WHERE is_done=0
делайте KILL MUTATION -
Drop никто не делает. В списке 'show processlist' только свежие select. Мы можем перезапустить весь сервер, тогда processlist очищается, а все новые запросы к этой таблице старательно виснут.
upd: kill mutation тоже виснет. -
"select * from system.mutations where is_done=0;"
запрос зависает. -
ну KILL MUTATION виснет видимо потому что кто-то у вас убил таблицу большим кол-вом мутаций, не понимая как это работает
-
ну, тяжко вам
ищите в system.query_log
что именно делали с таблицей -
Спасибо, причина уже понятнее и мы так больше не будем, честно-честно. А как можно починить эту таблицу обратно?
-
только если стопнуть миграции через KILL MUTATION WHERE ... SYNC
с большим receive_timeout (если используете clickhouse-client) -
ну еще можно наверное стопнуть сервер и .txt файлы с миграциями ручками поудалять в /var/lib/clickhouse/data/имя_бд/имя_вашей_проблемной_таблицы
только аккуратно не все txt файлы надо удалять а те которые migration_xxx.txt -
посмотрите еще в system.merges и в system.parts_log что происходит с вашей таблицей там по имени таблицы можно фильтровать
-
Спасибо. system.merges пустая совсем, а parts_log у нас нет, только parts и parts_columns
-
Всем привет. Есть ли в кх механизм, который по определённым параметрам будет перенаправлять запросы к таблице в её материализованное представление?
Ситуация такая, что для более эффективного поиска было принято решение создать 2 представления. С java не проблема на основании параметров решать, у кого производить поиск. Но интересно, можно ли это сделать средствами кх. -
part_log
-
SELECT count() FROM system.mutations;
тоже виснет? -
Да, этот виснет. А вот count() из проблемной таблицы отвечает. Запрос "kill mutation where database='dbname' sync;" висит пока.
Вижу много mutattion_$$.txt в /var/lib/clickhouse/data/dbname, почищу их руками. -
Так и было, clickhouse не смог выполнить одну из mutation, а таблица залочилась до завершения. Собрали список mutations перед удалением, найдем проблемную.
Спасибо, все запустилось. -
при выключенном сервере
-
мутации асинхронно выполняются
с ними осторожно надо по условиям мутаций
либо запускайте только с ALTER TABLE ... UPDATE|DELETE ... SETINGS mutations_sync=2
вообще если вы вдруг решили делать дофига мутаций
значит вы не понимаете как это рабоает и путаете OLAP Таблицу с OLTP -
таблица может оказаться в непонятном состоянии в этом случае
в смысле где то мутации прошли, где то нет -
Добрый день. Простите за нубский вопрос. А посоветуйте, пожалуйста, как для временных рядов в клике(Path, Timestamp, Value) посчитать максимальный промежуток времени, когда значение Value не менялось. Верчу в голове вопрос, но не понимаю, как его на уровне самой базы решить. Наверняка с богатым перечнем функций клика это не обязательно выносить на уровень скриптов.
-
Так и есть, путаем, но у нас это еще dev и мы просто пробуем всякое.
-
IMHO через WINDOW functions наверное
SELECT DISTINCT
path, value,
min(timestamp) over (PARTITION BY path, value ORDER BY timestamp) AS min_time,
max(timestamp) over (PARTITION BY path, value ORDER BY timestamp) AS max_time
toDateTime(max_date) - toDateTime(min_date) AS period,
formatReadableTimeDelta(period) AS readable_period
FROM ts_table
ORDER BY path, timestamp, period DESC
но может памяти не хватить для DISTINCT -
Спасибо большое! Это, видимо, с версии 21. По моему оконные функции там добавили
-
да, 21.4 и выше
-
всем привет, подскажите куда смотреть и как подобраться пожалуйста к решению задачи)
есть таблица логирования времени над задачей, отрезки хранятся в периоде 5-10 минут.
user int64
datetime_start Datetime
datetime_end Datetime
seconds int64
activity_percent int64
Как можно сгруппировать интервалы начала и конца по дням, часам, неделям, месяцам?)
Если нужны какие то уточняющие данные, скину)
Итого хочу получить отчет по дням сколько человек отработал
Искал в документации работу с Interval но там ничего интересного для задачи не нашел :( -
возможно такое подойдет?
select toStartOfInterval(dt_start, INTERVAL 1 day) as dt_start1,
toStartOfInterval(dt_end, INTERVAL 1 day) as dt_end1, sum(dt_end - dt_start)/3600, user from
(select 1 as user,now() as dt_start, now() + interval 3 hour as dt_end
union all
select 1 as user,now() + interval 4 hour as dt_start, now() + interval 6 hour as dt_end
union all
select 2 as user,now() + interval 4 day as dt_start, now() + interval 6 day as dt_end
union all
select 2 as user,now() + interval 8 hour as dt_start, now() + interval 10 hour as dt_end) as t
group by user,dt_start1, dt_end1; -
-
-
CH не понимает VarChar(-1), используйте VarChar(255)
-
Всем привет.
Вчера весь день (компьютер) собирал по инструкции https://clickhouse.tech/docs/en/development/build/#how-to-build-clickhouse-debian-package
А куда он в итоге deb пакеты складывает, я так и не нашёл, или опять не так понял фразу "How to Build ClickHouse Debian Package" ?
Какие-то переменные возможно нужно установить кроме
$ export CC=clang-11
$ export CXX=clang++-11
кто подскажет?Build on Linux | ClickHouse DocumentationHow to Build ClickHouse on Linux Supported platforms: x86_64 AArch64 Power9 (experimental) Normal Build for Development
-
вообще проблема не в этом, скорость может упасть в 100 раз, может вырасти.
-
А от чего это зависит?
-
зависит от запросов, если select читает 1000 партиций это очень медленно. Если у вас 10тыс. партиций и запрос читает одну партицию, это очень быстро. Если у вас 100тыс. партиций то запрос тратит 3 сек. на анализ партиций еще до старта. Если инсерт делает вставку в одну партицию и у вас 100 тыс. партиций то это очень быстро, если запрос делает вставку в 10 партиций и у вас 20 партиций, то это очень медленно, если у вас больше 1000 партиций то скорее всего у вас сломались любые мутации и alter, если у вас 100 тыс партиций то скорее всего КХ будет стартовать около часа на HDD.
-
Подскажите, как правильнее будет добавить индекс к таблице по двум колонкам с типами datetime, string?
Немного не понимаю за что отвечает Type type
ALTER TABLE [db.]name ADD INDEX name expression TYPE type GRANULARITY value
А также в каком формате указывать условие? -
Спасибо большое!
-
skip индексы это совсем не те индексы что вы подумали. Что лежит в полях индексируемых и как выглядит запрос?
-
В полях лежат event_time, и название проекта.
Запросы разного формата, зачастую это агрегация из сырых данных с условие where event_time >= '2021-05-05' and project_name = 'same_project' а также ряд условий на другие колонки -
Проблема заключается в том, что имеется большая таблица в которой хранятся события с множества проектов и партиция установлена на toYYYYMMDD(event_time)
-
а ORDER BY какой у таблицы?
-
ORDER BY event_time
-
тогда я рекомендую сделать ORDER BY (toStartOfDay(event_time), project_name, event_time) или ORDER BY (project_name, event_time)
в принципе вам возможно подойдет skip index min_max, но скорее всего нет. Потому что возможно project_name размазан по гранулам и в каждой грануле есть любой project_name и отбросить нельзя ни одну гранулу. -
order by можно будет изменить через alter table?
а также необходимо ли будет делать final? -
>ORDER BY (toStartOfDay(event_time), project_name, event_time) или ORDER BY (project_name, event_time)
а хотя я чушь сказал у вас уже по дням партиции toYYYYMMDD
скорее всего вам просто надо ORDER BY (project_name, event_time) -
ORDER BY изменить нельзя
-
То есть это делать уже непосредственно в запросах?
-
нет
-
одскажите плз, а есть ли возможность сделать следующим образом
у нас есть например 10 строк в каждой строке описывается некое состояние ... нам нужно посчитать количество строк ну т.е. COUNT() он будет равен 10 и вывести последнее по времени состояние т.е. запрос должен отдать типа SELECT COUNT(), last_status FROM *** и если возможно то как это сделать ?
В реляционных базах данных приходилось делать вложенный запрос ... сначала доставать данные - сортировать и потом группировать .... как это работает здесь ? -
Просто пересоздавать таблицу выглядит явной проблемой — так как надо будет переместить примерно 3-4 ТБ данных
-
есть функция argMax -- argMax(last_status, timestamp)
-
все так, надо раньше думать и тестить
-
оо спасибо большое
-
"зато возможно из-за правильной сортировки данные станут лучше сжиматься и сэкономите половину терабайта на диске" - это можете шефу сказать, чтобы он одобрил данную процедуру , но выхлоп вряд ли будет большой, и то только если у вас в рамках каждого проекта более менее консистентные данные иначе только больше занимать станет :)
-
А админы тут есть? этого парня бы забанить.
-
тут скорее проблема в том. что раньше была другая структура которая из-за ошибочного решения была изменена на одну таблицу сразу под все проекты. Раньше под проект была отдельная таблица, но это диктовало другие проблемы в работе с tableau
-
возможно в новой структуре в ключ партицирования также стоит добавить project_name
-
в данный момент уже 352 партиции. И 420 уникальных проекта
-
кстати как вам tableau? мы сейчас юзаем metabase и tableau как-то выглядит как перегруженая система для суровых аналитиков и не очень юзер френдли для обычных менеджеров и обычных юзеров.
-
Есть сомнения что партиция по (event_time, project_name) может очень сильно увеличить количество партов, или я что-то не понимаю в построении партиций
-
можно сделать партиции не по дням, а не по месяцам. но это конечно зависит от кейсов использования.
-
Добрый день
Есть таблица, небольшая по меркам КХ, около 18млн строк
в силу бизнес логики эта таблица каждый день пересоздается (новые данные льются в новую таблицу > drop current table > rename tmp table to current)
и нужно по этой таблице делать запросы с разными фильтрами
охота несколько индексов повесить на разные столбцы, чтобы фильтровать по ним, искать по ним
ЗЫ: таблица с товарами. надо искать по брендам, поставщикам, артикулу, по категориям -
скорее всего в /root
-
Там все очень сильно зависит от назначения.
Но в целом по личному опыту он очень удобен и функционален. К сожалению, не всегда легко найти нужный док по настройке или реализации той или иной фичи.
Так же есть настройка privacy в дэшах в зависимости от того,какие данные надо отображать юзеру.
metabase использовал на небольшом стартапе - он клевый, но на текущем месте был выбран табло -
вот не надо такого советовать. Это 70% выстрел в ногу. Замедление инсертов и умножение кол-ва партиций в десятки раз.
-
возможно поможет с лучше помощью в вопросе. По большей части таблица имеет события пользователей и большая часть sql это аналитика на юзер левеле либо общая по событиям
-
ну после определенного уровня, остается только табло. Там наверху пирамиды больше никого нет.
-
почитайте про индексы пропуска https://clickhouse.tech/docs/ru/engines/table-engines/mergetree-family/mergetree/#table_engine-mergetree-data_skipping-indexesMergeTree | Документация ClickHouse
MergeTree Движок MergeTree, а также другие движки этого семейства (*MergeTree) — это наиболее функциональные движки табл
-
В целом вариант с построением новой таблицы с другим ORDER BY - устраивает. Но возможно есть еще советы которые стоит учитывать.
-
@BloodJazMan может быть Merge говорит о том, что вычисления аггрегатных функций делать не каждый раз - а брать и сохранять эти вычисления аггрегатов, и в последующие вызовы не пересчитывать - а показывать их сразу?
"соответственно *Merge как модификатор берет эти промежуточные состояния с предыдущих этапов выборки
и "доаггрегирует"" -
К сожалению, нет. Запуск find ./ -name *.deb в каталогах /root и в домашнем каталоге пользователя ничего не дают.
Собрались бинарники в build/programs, но руками их раскидывать по дереву каталогов системы как-то не хочется. Разве что положить куда-то и прописать в PATH.
Но почему всё же не собрались deb пакеты, завершилось всё без ошибок... -
ну у меня только 3 проекта, а вот для пары сотен проектов такой подход уже вообще не гуд, насколько я понимаю, потому что при каждом инсерте в 10к записей велика вероятность зацепить чуть-ли ни все партиции, вызвать кучу мёрджей и т.д.
-
sumMerge говорит что берем sumState
и досуммируем -
Всем привет, а есть какой-то простой способ материализовать array колонку в зависимости от каких-то условий?
tags Array(String) MATERIALIZE
push(tags, 't1') if condition1
push(tags, 't2') if condition2
и тд -
такого функционала нет. Так как индекс в кх это просто сортировка данных. Можно только один индекс
-
Как рекурсивный вызов?
-
Привет всем пользователям управляемого Clickhouse Яндекс Облака в этом чате!
Хотим поделиться последними новинками нашего сервиса.
- Поддержка быстрых дисков без дополнительной репликации для случаев когда скорость важнее повышенной надежности
- Управление пользователями через нативный интерфейс Clickhouse (GRANT ... и друзья). Возможность управления грантами через API сохраняется: это удобно когда нужно занести это в сценарии терраформа.
- Полноценная поддержка Terraform. Теперь все, что можно из API, можно из Terraform.
- Автоматическое копирование схемы данных при добавлении новых хостов в кластер.
- Наконец, как всегда -- самые актуальные ClickHouse версии, включая 21.6.3.14 от 5 июня. -
-
зачем вам собирать самому?
-
привычных индексов нет, но есть индексы пропуска данных
-
Я собираю форк с фичей MaterializedPosrgreSQL
-
State / Merge имеет смысл для нелинейных функций , AVG, uniq. Потому что нельзя из AGV посчитать AVG
стейты в первую очередь нужны для шардов / Distributed.
Каждый шард считает avgState и передает на инициатор, на инициаторе Distributed делает Merge, прозрачно для юзеров.
Но это оказалось удобной фичей для Aggregated движков -
такое ощущение что вы не понимаете что я пишу
давайте вы перечитаете... и попробуете понять
https://t.me/clickhouse_ru/222986Slach [altinity] in ClickHouse не тормозитну давайте на пальцах поясню вот смотрите у вас есть простой запрос SELECT count() as goods_count, category FROM goods GROUP BY category чтобы посчитать goods_count что нужно? нужно в памяти создать hashMap в котором ключ category а значение это счетчик который увеличивается на 1 на каждую строку с этой category. мы читаем поточно и передаем строку из 1 поля category на вход агрегатной функции вот этот hash Map можно передать по конвейеру вышестоящему как countState()
-
так возьмите готовый, тысячи deb пакетов, на кажый комит.
скачайте testing https://repo.yandex.ru/clickhouse/deb/testing/main/ 21.7.1.7112 -
я же написал " Но это оказалось удобной фичей для Aggregated движков "
-
Спасибо, посмотрю
-
Читаю :) И по несколько раз :) Спасибо. Просто не понимаю.
это "вот этот hash Map можно передать по конвейеру вышестоящему как countState()" похоже на рекурсию... -
То есть приписка к функции Merge
minIfMerge(order_created)
говорит о том, что сначала посчитай по шардам и потом вычисли на мастере наименьшее, так?
а если так
minIf(order_created)
то ... не будет же он считать по другому? пройдет по шардам, сведет и отминимайзит. -
нет
-
@BloodJazMan @den_crane спасибо за объяснения.
Я правда не понимаю, сорри :)
Завтра попробую разобраться.
Надо уложить нейроны выспаться и выстроиться ) -
вы не должны использовать minIfMerge, minIfMerge только для стейтов.
если вы делаете запрос одноуровневый в Distributed то просто minIf
если запрос select from select from Distributed и вам нужно сгруппировать по разным полям и функция типа AVG , тогда нужно State+Merge. Откуда вообще такие вопросы? -
этой фичи вроде ещё нету в теститнг. эта ветка ещё никуда не была вмержена, даже в мастер
https://github.com/ClickHouse/ClickHouse/pull/20470MaterializePostgreSQL table engine and database engine by kssenii · Pull Request #20470 · ClickHouse/ClickHouseI 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...
-
мне такой не известен. разве что самому писать простенький прокси на nodejs/njs парсить запрос и подменять название таблицы.
-
Народ проголосуйте https://github.com/dbgate/dbgate/issues/104FEAT: Add support for ClickHouse · Issue #104 · dbgate/dbgate
Is your feature request related to a problem? Please describe. There is no ClickHouse in the list of supported DBMS. Describe the solution you'd like Add support for ClickHouse. Describe al...
-
Есть вопрос, а если я табличку создаю у которой engine = postgresql мне надо что-то настраивать дополнительно, или оно должно работать сразу? Есть какие-то ограничения на символы в пароле? )
-
https://clickhouse-builds.s3.yandex.net/20470/00e76ca372edccde2b6f7ac7430d3231878b19e8/clickhouse_build_check/report.html
ClickHouse build check — 15/15 builds are OK <Details> -
сначала проголосовал, потом почитал :) а прикольная штука. прямо в браузере работает. то что надо. наконец-то можно будет заменить adminer.php
PS: для тех кто не переходил по ссылке: крутой веб-интерфейс для быстрого просмотра данных в табличках бд, можно быстро отфильтровать, сгруппировать и т.д. -
огонь. спасибо!
-
-
ёмаё, там даже графики можно строить
-
возьмите 18.14.18. (он лучше чем 18.10 и там все будет работать что работало в 18.10)
-
Да, в мастере она только в моём личном форке. Так что всё же буду использовать получившийся бинарник и самопальный конфиг systemd.
-
не надо :) выше ссылку давали, там на каждый пулл-реквест уже собраный пакет есть :)
https://clickhouse-builds.s3.yandex.net/20470/00e76ca372edccde2b6f7ac7430d3231878b19e8/clickhouse_build_check/report.html -
Ok (-:
-
посмотрите, есть ли еще колонки, упорядочивание по которым приведет к появлению подряд идущих одинаковых или похожих данных в других колонках. Если да, тоже можно добавить в ORDER BY (project_name, /*еще низкокардинальные колонки,*/event_time). Так можно отдельные колонки пожать в сотни раз, и в общем таблицу как повезет. Попробуйте разные кодеки сжатия - рекомендую codec(T64, LZ4) для целых типов, особенно для маленьких значений, Gorilla и DoubleDelta у меня редко оказывались лучше T64. Можно ZSTD для редко используемых жирных колонок. Еще стоит узнать, какие запросы идут к этой таблице (особенно частые или тяжелые), и добавить в order by низкокардинальные колонки, по которым часто идет фильтрация. Создайте несколько вариантов таблиц с разными order by и кодеками, скопипастите туда данные за один день, и смотрите что там по месту и производительности запросов.
Если в order by добавится высококардинальная колонка, то задать еще primary key, где указать всё из order by до первой высококардинальной колонки, включая ее, и не включая все последующие. Ну то есть типа ORDER BY (project_name, country, user_id, event_time) primary key (project_name, country, user_id) -
-
Нет, что-то не задалось.
CREATE database mydb ENGINE = MaterializePostgreSQL('localhost:5432', 'mydb', 'user', 'password');
Code: 36. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Database engine MaterializePostgreSQL cannot have arguments.
С собственноручно собранным бинарником то же сообщение. Вот и потестили фичу MaterializePostgreSQL
Вот дока https://github.com/kssenii/ClickHouse/blob/pg-ch-replica/docs/en/engines/database-engines/materialize-postgresql.md
Видимо, ещё не доработано. -
-
потому что второй arrayJoin(range(0,2)) заменяется на алиас
-
Multiple arrayJoins with same expression being calculated only once. · Issue #24225 · ClickHouse/ClickHouse
Clickhouse replaces second arrayJoin with result of first, but most likely it's not what users want in this situation. How to reproduce clickhouse version 21.6 SELECT arrayJoin([1, 2, 3, 4]...
-
средствами КХ нет. Есть сторонние фреймворки jskube или как-то.
на самом деле может вам взять projections вместо MV ? -
Хм, интересно, а где можно прочитать про projections? Не нашёл в документации клика.
-
по той же причине что и
SELECT
rand(),
rand()
┌─────rand()─┬─────rand()─┐
│ 3602581504 │ 3602581504 │
└────────────┴────────────┘
одинаковые выражения вычисляются один раз.
в случае ArrayJoin это очень важная штука, которая решает сложную проблему. -
да всем лень писать.
https://youtu.be/jJ5VuLr2k5kAmos Bird - kuaishou.com - Projections in ClickHouse - Percona Live 2021Projections are collections of table columns with different physical layout to speed up queries. They are the main constructs of Vertica. Comment 💬, Share 🔗, Like 👍, and Subscribe ✅ to our channel 📺, and turn on the 🔔 to be alerted to new videos about #OpenSource #Databases... and many other things! https://percona.tv/subscribe At kuaishou.com we have implemented PROJECTIONs support for ClickHouse. It boosts our OLAP analytic capabilities by an order of magnitude. This talk will highlight the design considerations, some implementation details, how it is integrated into #ClickHouse design. Examples and demo of the feature will be shown. You can find more information about #OpenSource #Databases and Percona Database Events in these links 👇👇👇 Watch Percona Live 2021 Talks ⏩ https://percona.tv/PerconaLive2021 Percona Services ⏩ https://per.co.na/Q8eykw Monitor your Database For Free ⏩ https://percona.tv/pmm-yt Kubernetes Operator for Databases ⏩https://per.co.na/kubernetes-operators Connect With us on our…
-
Спасибо!)
-
-
я думаю это очень сложно, в конце рассказа Амос намекал удаление данных таблицы, но похоже у него тоже нет в голове картины как это впихнуть
-
Ну эт понятно, но без подобного сейчас все сводится к нескольким таблицам с мердж енджин поверх (и для гибридов, и для проекций). ДДЛ делать очень больно в реальных случаях. А такие вещи как частые изменения или более точечные recent партиции - частая вещь.. в гринпламе в этом плане хорошо сделано в плане возможностей гибридных партиций
-
Вообще кажется, что проще научить кх переписывать запросы на MV, тем более переписывать для проекций он уже умеет.
-
Ну в проекциях есть плюс в плане уменьшенного мейнтенанса (не надо держать в 10 раз больше таблиц, автогенерация данных), просто этот плюс нивелируется довольно сильно отсутствием возможности сделать гибридное партиционирование (либо для самих проекций, либо на всю таблицу хотя бы для старых данных)
-
Ну, главный плюс проекций для меня это консистентность и автогенерация запросов, если мы потерям консистентность(тк исходных данных уже нет) то смысл городить это конкретно на проекциях уже отпадает, тк MV дает тоже самое.
-
Не знаю как в гринпламе, но в постгре партиционирование вообще делается через создание таблицы для каждой партиции, емнип.
-
я консистентность все объединил под автогенерацией данных. когда данных проекции ещё нет они при запросе создадуться
-
в ПГ это вообще костыль который ещё и на триггерах (!сик) и все эти версии это осталось костылем даже с декларативным partitioning.
в ГП этот костыль красиво обернут в хороший синтаксис, структуру папок и без левых триггеров и одним ДДЛ, но автосоздание партиций недовезли
(
но суть в том что там можно держать горячие данные в строках, дальше допустим по месяцам, ещё старее по годам... и это очень хорошо ложится на энтерпрайз реалии обычно... потому что тут всегда есть момент когда данные приходится "чинить" ( -
А, ну это кстати обсуждалось
https://github.com/ClickHouse/ClickHouse/issues/18695
Но хороший способ как описать логику создания партиций так и не придумали, если есть идеи то можешь предложить кстати.Subpartition (RFC) · Issue #18695 · ClickHouse/ClickHouseSubpartitions are parts of a MergeTree table's partition. It's defined by an expression based on minmax columns (not the partition expr). It provides the ability to confine merges i...
-
да, я читал этот тикет, но если честно по мне в других системах subpartition это не про лямбда архитектуры, а скорее для того чтобы делать прунинг в двух измерениях, либо менять данные по второму ключу. как по мне этого в КХ не надо с учетом того что в КХ партишнинг по нескольким полям поддерживается с отдельным прунингом по любому из них.
-
т.е. название как минимум неудачное, ну и синтаксис мягко говоря непростой
-
я догрепал. к КХ вопросы отпали.
было так:
реплика2 запустила и отработала мутацию
реплика1 зависла с ошибкой об отсутствии места (или потоков). - "... is greater than the current maximum (0.00 B)"
после рестартов уже ничего не поднималось и не мерджило - местные данные - part mutations (625) is greater than max_replicated_merges_in_queue (32), so won't select new parts to merge or mutate
короче после нескольких смен параметров и рестартов человек просто удалил очередь ЗК для реплики и стартанул, и с тех пор данные разъехались.
Лидеры не причем походу -
кстати вот, https://github.com/ClickHouse/ClickHouse/issues/25445
не нашел другого такого, но мы как то часто ловим дедлок на раных продах...Improve logging for "Not executing log entry ... is greater than the current maximum" errors · Issue #25445 · ClickHouse/ClickHouse(you don't have to strictly follow this form) Use case There are many scenarios when clickhouse goes into infinite error saying: Not executing log entry MUTATE_PART for part xxxx-421_0_36_2...
-
Коллеги, подскажите, пожалуйста: Можно ли в CREATE VIEW использовать CTE (WITH main AS (SELECT .. ) ? У меня выдает ошибку: WITH movement as (
SELECT
da. Expected one of: SELECT query, possibly with UNION, list of union elements, SELECT subquery, SELECT query, subquery, possibly with UNION, SELECT query, SELECT, WITH (version 21.4.3.21 (official build)) -
обновитесь
https://github.com/ClickHouse/ClickHouse/pull/22657Fix CTE usage in view definition by amosbird · Pull Request #22657 · ClickHouse/ClickHouseI hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Improvement Changelog entry (a user-readable short description of the cha...
- 18 June 2021 (101 messages)
-
Привет!
В наличии есть парты PARTITION BY formatDateTime(dt, '%Y%m%d%H') с engine=CollapsingMT, которые нужно приаттачить.
В них есть не схлопнувшиеся строки, подскажите, как правильно, их приаттачить(интересуется последовательность attach, так как при неправильной последовательности происходит нарушение алгоритма их вставки). Вставлены были 1-> -1 -> 1. Следовательно хочу оставлять только последнюю строку. -
непонятно про какое нарушение идет речь
аттачишь парт
это просто аттач парта, он только потом будет попадать на background merge это разные процессы
и при background merge два парта будут мержиться так чтобы
почасовая partition by, не лучший выбор, у вас там правда так много данных? или вы всегда в выборке используете только один час? -
>почасовая partition by
да, много, таблица пару дней, с горячими данными. 95% выборок в 1 час укладываются. -
добрый день
подскажите пожалуйста, для ускорения джоинов таблиц какой лучше использовать тип индекса ? тип столбца String -
>непонятно про какое нарушение идет речь
насколько я понял, что при неправильной последовательности аттача парта, неправильно схлопнуться.
т.е данные вставлялись 3 строками 1-> -1 -> 1
а при аттаче может получится, что порядок такой: -1-> 1 -> 1
и отсюда следует, что схлопнуться не так, как ожидается( -
вот набросал:
create table default.test_del_tab1(id UInt8, value UInt8, sign Int8)
engine =CollapsingMergeTree(sign)
PARTITION BY id ORDER BY id;
insert into default.test_del_tab1 values(1, 1, 1);
insert into default.test_del_tab1 values(1, 1, -1);
insert into default.test_del_tab1 values(1, 2, 1);
alter table default.test_del_tab1 freeze;
дальше перенести в detached и 3 парта приаттачить не в неправильной последовательности( 1_1_3_0, 1_1_2_0, 1_1_1_0 )-название взял как пример -
Всем привет!
@BloodJazMan , вроде ты контрибьютил в телеграф плагин клика. С такой проблемой ранее не сталкивались, случайно? Используется сингл-нода.
[root@a0410dadmgtmon01 telegraf.d]# telegraf --test --config clickhouse.conf
2021-06-18T07:33:26Z I! Starting Telegraf 1.19.0
> clickhouse_tables,database=graphite,host=a0410dadmgtmon01.grameenphone.com,source=192.168.213.23,table=graphite bytes=2032539934i,parts=20i,rows=1640760866i 1624001606000000000
...
Ещё 10 строк про clickhouse_tables
...
panic: runtime error: index out of range [0] with length 0
goroutine 41 [running]:
github.com/influxdata/telegraf/plugins/inputs/clickhouse.(*ClickHouse).replicationQueue(0xc000dec360, 0x5648b38, 0xc000662a00, 0xc000dd7020, 0x0, 0x0)
/go/src/github.com/influxdata/telegraf/plugins/inputs/clickhouse/clickhouse.go:334 +0x333
github.com/influxdata/telegraf/plugins/inputs/clickhouse.(*ClickHouse).Gather(0xc000dec360, 0x5648b38, 0xc000662a00, 0x0, 0x0)
/go/src/github.com/influxdata/telegraf/plugins/inputs/clickhouse/clickhouse.go:212 +0x176
github.com/influxdata/telegraf/agent.(*Agent).testRunInputs.func2(0xc000dd09b0, 0xc000383b70, 0xc000d2dce0, 0xc0006629a0, 0xc000da5950)
/go/src/github.com/influxdata/telegraf/agent/agent.go:403 +0x222
created by github.com/influxdata/telegraf/agent.(*Agent).testRunInputs
/go/src/github.com/influxdata/telegraf/agent/agent.go:372 +0x109 -
Добрый день. Был кластер версии 19.14.10.16 на 2 шарды по 2 реплики.
К нему подключили ещё по две реплики на каждый шард, но, самой свежей версии 21.6.4 и создали там две таблицы ReplicatedSummingMegreTree, после чего данные стали попадать только на один шард и только на сервера новой версии .
В логах старой версии были ошибки DB::Exception: Cannot parese input: expected quorum
После обновления старого кластера до версии 20.3.21 появились ошибки
Only Wide parts can be used with non-adaptive granularity.
И часто пишет что не находит Marks file "some_path/table_name/tmp_fetch_202106_289863_310914_5333/event_date.mrk" doesn't exist
Вопрос, куда сейчас попадают данные, так как ошибок что данные не записались нет , но и а КХ их не видно ( по крайней мере из одной шарды ) ?
И как можно починить репликацию ? Безопасно ли продолжать обновление кластера до версии 21.6.4? -
-
COALESCE(NULLIF(a, ‘’), b)
-
не пойму что не так ?
ALTER TABLE test ADD INDEX ssidHash TYPE minmax
Syntax error: failed at position 22:
ALTER TABLE test ADD INDEX ssidHash TYPE minmax
Expected COLUMN
у меня ENGINE = ReplicatedMergeTree -
Спасибо, то, что надо
-
а что тут ожидается на выходе?
Одна запись 1,2,1 ? а получается 1,1,1 ? -
привет
надо разбираться, с такой проблемой не сталкивались, можете Issue на мена повесить в github ? -
да
-
ну да, поведение при мержах такое...
и да,надо как то в правильном порядке аттачить... -
еще проверить хочу как аттачиться, если указываем аттач партишн, внутри партишена правильно ли они схлопнуться.
а как нейминг партов происходит? можно ли по неймингу понять очередность аттача? -
каждый парт в подкаталоге
<partition_by_expression>_<min_block>_<max_block>_<layer>
блин не помню 0 layer это самый свежий или самый старый только -
0 это вроде который еще не мержился
-
подскажите пожалуйста, каким образом указать на столбец при создании таблицы фиксированную точность ? использую Float32 ... ноль оказался бесконечностью .... хочется чтобы ну хоть 0.00 было ... )
-
decimal
https://clickhouse.tech/docs/ru/sql-reference/data-types/decimal/#decimalp-s-decimal32s-decimal64s-decimal128sDecimal | Документация ClickHouseDecimal(P, S), Decimal32(S), Decimal64(S), Decimal128(S), Decimal256(S) Знаковые дробные числа с сохранением точности оп
-
Здравствуйте.
Подскажите пожалуйста, можно ли написать выражение в select, которое представляло бы собой таблицу из двух колонок и более чем одной строки.
А ля:
select * from (a, b) values (b, c), (d, e)
пока приходит в голову только
select b, c union all select d, e
что коряво -
Разбираю наследство...
Все знают, но объяснить не могут. Видимо, я тупой! :)
Пока понимаю одно, что если убрать эти постфиксы Merge то всё перестает работать... видимо они какой-то флаг для агрегирующих функций выполняют ...
https://altinity.com/blog/2017/7/10/clickhouse-aggregatefunctions-and-aggregatestate
"уникальная особенность ClickHouse - агрегатные состояния"
И статей с доступным изложением уникальных особенностей нет - всё же весьма просто и все телепаты :)
Заметьте, сколько статей написано про Оракл и МССКЛ и мало не понимает. А тут КликХаус! :) -
ну там имя_идекса имя_колонки должно быть
https://clickhouse.tech/docs/en/sql-reference/statements/alter/index/
см. expressionINDEX | ClickHouse DocumentationManipulating Data Skipping Indices The following operations are available: ALTER TABLE [db].name ADD INDEX name expressi
-
ALTER TABLE test ADD INDEX indexName ssidHash TYPE minmax
? -
SELECT engine_full FROM system.tables WHERE name='orders'
что показывает -
да, вроде так
-
та же ошибка
-
ALTER TABLE test ADD INDEX indexName(ssidHash) TYPE minmax
может так? -
нет тоже самое (
-
Сейчас скину скрин, спасибо.
Если можно - поделитесь, пожалуйста, ссылками на статьи, где почитать про агрегатные состояния, движки и фишки функций Merge или State на нижнем уровне.
...
Можно посмотреть устройство эти комбинаторных функций на Си ? Может так я быстрее пойму? Можете скинуть код этой функции? -
-
CREATE TABLE t1(v UInt64, indexed_value UInt64) ENGINE=MergeTree() ORDER BY v;
ALTER TABLE t1 ADD INDEX index_name indexed_value TYPE minmax GRANULARITY 1;
ошибку невнимательно читаете
GRANULARITY в data skip индексе это кол-во гранул из PK -
CREATE TABLE t1 ON CLUSTER c9q930o5i86rsdloqlc9 (v UInt64, indexed_value UInt64) ENGINE=ReplicatedMergeTree() ORDER BY v;
ALTER TABLE t1 ADD INDEX index_name indexed_value TYPE minmax GRANULARITY 1;
Syntax error: failed at position 20:
ALTER TABLE t1 ADD INDEX index_name indexed_value TYPE minmax GRANULARITY 1;
Expected COLUMN
я так понимаю проблема в ReplicatedMergeTree
но в документации заявлена поддержка *MergeTree -
ок. таблица Distributed
построена поверх какой то другой таблицы
скриншот то специально образеный скинули вместо текста, чтобы поиздеваться?
извините если вы не понимаете что тут написано, я не знаю как еще более понятно расписать
https://t.me/clickhouse_ru/222977Slach [altinity] in ClickHouse не тормозитсмотрите любая аггрегатная функция, для того чтобы выдать конечный результат аллоцирует в памяти какие то структуры (например хеш таблицы с ключами по которым идет группировка) это промежуточное состояние называется aggregation State и State можно использовать как модификатор имени аггреганой функции в запросе соответственно *Merge как модификатор берет эти промежуточные состояния с предыдущих этапов выборки и "доаггрегирует" подробнее тут https://clickhouse.tech/docs/en/sql-reference/aggregate-functions/combinators/
-
версия clickhouse какая?
SELECT version() -
21.3.12.2
-
Не всё могу я скринить, не обижайтесь.
Но на ваш вопрос - ответил :)
Спасибо за то, что написали, почитаю Инет, вернусь к allocated memory ... И поверьте, не я один не понимаю, что значат эти Мерджи 😉 -
Добрый день. Не могу никак разобраться с Созданием Materialized View с движком AggregatingMergeTree
Есть таблица
CREATE TABLE IF NOT EXISTS indicators_processes_ingest
(
id VARCHAR(255),
machine_id VARCHAR(255),
ts_start Nullable(TIMESTAMP),
ts_end Nullable(TIMESTAMP),
command_line Nullable(TEXT),
parent_id Nullable(VARCHAR(255))
) ENGINE = Null();
Пытаюсь создать вью и оно падает с ошибкой, то не хватает колонок id, machine_id и я что-то никак не пойму где именно их не хватает
CREATE MATERIALIZED VIEW IF NOT EXISTS indicators_processes
ENGINE = AggregatingMergeTree() ORDER BY (machine_id, id) AS
SELECT (
machine_id,
id,
anyIfOrNull(parent_id, isNotNull(parent_id)) AS parent_id
) FROM indicators_processes_ingest
GROUP BY (machine_id, id)
[2021-06-18 13:06:36] Code: 47, e.displayText() = DB::Exception: Missing columns: 'id' 'machine_id' while processing query: 'machine_id, id', required columns: 'machine_id' 'id' 'machine_id' 'id' (version 21.6.4.26 (official build)) -
CREATE MATERIALIZED VIEW IF NOT EXISTS indicators_processes
ENGINE = AggregatingMergeTree() ORDER BY (machine_id, id) AS
SELECT
machine_id,
id,
anyIfOrNull(parent_id, isNotNull(parent_id)) AS parent_id
FROM indicators_processes_ingest
GROUP BY (machine_id, id) -
Ох, я такой идиот. Не знаю почему мой мозг решил там скобки поставить.
Спасибо! -
вы какой то странный тапл формируете, зачем скобки в SELECT ( ... ) ?
-
Видимо недостаточно сплю. Не знаю почему вдруг такую глупость сделал. Да ещё и разобраться не мог в проблеме минут 20.
-
SELECT countIf(num_tries>1) AS replication_num_tries_replicas, countIf(num_tries>100) AS replication_too_many_tries_replicas FROM system.replication_queue
что говорит на вашем сервере? -
вы ссылку на github issue можете прислать?
-
Возможно, проще понять на примере матвью.
Допустим, вам нужно матвью для подсчета количества уникальных id юзеров в день. Вот у вас есть какое-то текущее состояние дел посреди дня. 1000 уникальных id, например. Вы записываете в исходную таблицу еще пачку записей с 10 уникальными id. Чтобы узнать новое количество уникальных id за весь день, матвью не может просто сделать 1000+10. Нужно сначала проверить, а были ли в этой 1000 старых id кто-то из этих новых 10 id. То есть хранить в матвью мы должны больше данных, чем просто число 1000. Например, массив уникальных id. При добавлении новых 10 id мы проверяем, есть ли они в нашем массиве из 1000 id, и добавляем недостающих. Вот этот вот массив и будет State состоянием. То есть некое состояние, из которого легко получить готовый ответ (у нас это будет длина массива), и при этом позволяет пересчитывать данные при добавлении новых.
Для avg состоянием avgState может быть, например, пара значений: сумма и количество значений. И т.п. Ну и, в реальности State состояния могут быть внутри устроены более сложно и оптимально с точки зрения ресурсов, и нам не обязательно знать, как именно.
Когда нужно получить готовый ответ, нам нужно "схлопнуть" это State состояние, для этого используем суффикс Merge. -
@seriych благодарю, заскринил, почитаю 🤝
-
Коллеги, добрый день,
А может кто-то подсказать, для какого числа нод нужен Zookeeper? Из доки я так понял, что для трёх минимум, но не понимаю логики. Ведь он для репликации, а реплика может быть и одна... 🤔 -
И нужен ли он вообще для настройки репликации?
-
он нужен для взаимодействия реплик между собой
-
Что это значит? Без него же реплика тоже работает, верно?
-
Репликация не зависит от шардирования. На каждом шарде репликация работает независимо.
При создании таблиц Replicated* вы указываете путь в zookeeper -
А по числу нод zookeeper?
Я правильно понимаю, что для настройки репликации простой (две ноды Clickhouse) мне надо иметь три ноды с zookeeper? -
как только у вас есть хоть одна ReplicatedMergeTree таблица, вам нужен ZK
Даже если у вас всего один сервер, без ZK ReplicatedMergeTree не работает -
нет
одной ноды ZK достаточно,
3 ноды ZK надо если вам нужно отказоустойчивый ZK кластер -
там есть правило 2N+1, но одной тоже хватит
-
А его можно запихнуть туда же, где chproxy стоит уже? Какие тут риски?
-
ну риск один
что ZK будет с chproxy за CPU \ Disk \ RAM бороться ... и от этого может страдать репликация...
ZK достаточно чувствителен к дисковым задержкам -
Я помню, что ClickHouse хотели потихоньку от ZK переходить на что-то своё, или я придумываю?
-
Есть в роадмапе ) поищите на Гите/офф сайте
-
Я в доке ничего подобного не видел. Везде пишут про ZK
-
Это только в планах вроде
-
Roadmap 2021 (discussion) · Issue #17623 · ClickHouse/ClickHouse
This is ClickHouse roadmap 2021. Descriptions and links to be filled. It will be published in documentation in December. Main tasks Provide alternative for ZooKeeper Implementation of a server with...
-
А может быть кто-нибудь поможет мне исправить мою картину мира?
Есть таблица с движком NULL, и есть MaterializedView с движком AggregatingMergeTree.
CREATE TABLE IF NOT EXISTS indicators_processes_ingest
(
id VARCHAR(255),
machine_id VARCHAR(255),
ts_last_update TIMESTAMP default NOW(),
ts_start Nullable(TIMESTAMP),
ts_end Nullable(TIMESTAMP),
command_line Nullable(TEXT),
parent_id Nullable(VARCHAR(255))
) ENGINE = Null();
CREATE MATERIALIZED VIEW IF NOT EXISTS indicators_processes
ENGINE = AggregatingMergeTree()
TTL ts_last_update + INTERVAL 1 MONTH
ORDER BY (machine_id, id)
AS
SELECT machine_id,
id,
max(ts_last_update) AS ts_last_update,
anyIfOrNull(ts_start, isNotNull(ts_start)) AS ts_start,
anyIfOrNull(ts_end, isNotNull(ts_end)) AS ts_end,
anyIfOrNull(command_line, isNotNull(command_line)) AS command_line,
anyIfOrNull(parent_id, isNotNull(parent_id)) AS parent_id
FROM indicators_processes_ingest
GROUP BY (machine_id, id);
Я предполагал, что после мержа партов в мат-вью он будет выполнять эту же аггрегирующую функицю на строки с одинаковым набором значений в колонках ORDER BY
Для проверки вставлю 2 строки
INSERT INTO indicators_processes_ingest (id, machine_id, ts_start, ts_end, command_line, parent_id)
VALUES ('id', 'machine_id', NULL, NOW(), 'cmd.exe', NULL);
INSERT INTO indicators_processes_ingest (id, machine_id, ts_start, ts_end, command_line, parent_id)
VALUES ('id', 'machine_id', NOW(), NULL, NULL, 'test');
И выполняю вот такой селект
SELECT
*,
'original' AS s
FROM indicators_processes
UNION ALL
SELECT
*,
'final'
FROM indicators_processes
FINAL
UNION ALL
SELECT
machine_id,
id,
max(ts_last_update) AS ts_last_update,
anyIfOrNull(ts_start, isNotNull(ts_start)) AS ts_start,
anyIfOrNull(ts_end, isNotNull(ts_end)) AS ts_end,
anyIfOrNull(command_line, isNotNull(command_line)) AS command_line,
anyIfOrNull(parent_id, isNotNull(parent_id)) AS parent_id,
'group-by'
FROM indicators_processes
GROUP BY (machine_id, id)
Чтобы посмотреть что есть в таблице, что в ней будет после мержа и что выдал бы GROUP BY. Видим, что результат GROUP BY и то, что в FINAL это совершенно разные значения
┌─machine_id─┬─id─┬──────ts_last_update─┬────────────ts_start─┬──────────────ts_end─┬─command_line─┬─parent_id─┬─s────────┐
│ machine_id │ id │ 2021-06-18 11:45:56 │ ᴺᵁᴸᴸ │ 2021-06-18 11:45:56 │ cmd.exe │ ᴺᵁᴸᴸ │ original │
│ machine_id │ id │ 2021-06-18 11:45:57 │ 2021-06-18 11:45:57 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ test │ original │
│ machine_id │ id │ 2021-06-18 11:45:57 │ 2021-06-18 11:45:57 │ 2021-06-18 11:45:56 │ cmd.exe │ test │ group-by │
│ machine_id │ id │ 2021-06-18 11:45:56 │ ᴺᵁᴸᴸ │ 2021-06-18 11:45:56 │ cmd.exe │ ᴺᵁᴸᴸ │ final │
└────────────┴────┴─────────────────────┴─────────────────────┴─────────────────────┴──────────────┴───────────┴──────────┘ -
нет
нужно использовать maxState вместо max
чтобы при мерже сливались состояния ... а не конкретные значения
из документации
https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/aggregatingmergetree/
ClickHouse replaces all rows with the same primary key (or more accurately, with the same sorting key) with a single row (within a one data part) that stores a combination of states of aggregate functions.AggregatingMergeTree | ClickHouse DocumentationAggregatingMergeTree The engine inherits from MergeTree, altering the logic for data parts merging. ClickHouse replaces
-
@timofeevdmitry вот, почитайте, может больше поймете
-
Призываом, наверное ошиблись, но спасибо!
-
@timofeevdmitry
-
нет, там человек не понимает зачем нужны State и Merge
-
А, понял
-
Теперь всё заработало! Огромное спасибо!
-
там видимо в таблице у поля order_created специальная AggregateFunction(minIf )
desc таблица покажите -
Привет, подскажите если выставить параметр <listen_host>::</listen_host > на сервере подключения по каким ip будет принимать?
-
всем привет
desc default._q
seg_proba_impl Array(Float32)
Для экономии места хочу конвертнуть в другой тип
alter table default._q MOdify column seg_proba_impl Array(decimal(10,3))
select * from default._q
Но к данным уже не обратиться
org.jkiss.dbeaver.model.exec.DBCException: Can't extract array data from JDBC array
at org.jkiss.dbeaver.model.impl.jdbc.data.JDBCCollection.makeCollectionFromArray(JDBCCollection.java:263)
......
Что не так и как можно конвернтнуть? -
будет отвечать всем
-
это IPv6 аналог IPv4 0.0.0.0
-
-
как можно избавиться от множества зависших записей в replication_queue, вида
Code: 234, e.displayText() = DB::Exception: Not found part 3_3514_3514_26 (or part covering it) neither source table neither remote replicas (version 21.3.12.2 (official build))
как вообще Кликхаусу сказать, чтобы он уже больше не мучался? -
SYSTEM RESTART REPLICA ...
-
не помогает
-
а как считаете?
у вас там случайно не в один бакет с нескольких реплик данные слились? -
есть 2 реплики, на каждой КХ даже меньше показывает если смотреть только партиции на S3 53.57 * 2 = 107 Gb. Консоль S3 показывает что в бакете занято 438.3 GB. Настроена только эта таблица, других данных не должно быть. 2 реплики пишут в 1 и тот же бакет, из-за этого могут быть проблемы?
```
SELECT formatReadableSize(sum(bytes)) AS size
FROM system.parts
WHERE (table = 'impressions_log_shard_v1') AND (disk_name = 's3')
┌─size──────┐
│ 53.57 GiB │
└───────────┘
``` -
UP
Может у кого-то есть практики аттача CollapsingMT? -
ну, в s3 хранятся только .bin файлы а метаданные для них хранятся в /var/lib/clickhouse/store
для Atomic
походите по store и поищите соответсвие в s3 бакете
https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/mergetree/#table_engine-mergetree-s3
у вас S3 endpoint разный для разных реплик?MergeTree | ClickHouse DocumentationMergeTree The MergeTree engine and other engines of this family (*MergeTree) are the most robust ClickHouse table engine
-
Ребят, напомните функцию, которая ищет по пользователям цепочки ивентов, которые мы задали. Никак в документации не могу найти
-
windowFunnel
-
Спасибо
-
Добрый вечер. Версия кликхауса 21.4.3.21 из таблицы flat есть несколько матвью на aggregatingmergetree. Матвью ничем не отличаются , отличается лишь ордер бай в конечных таблицах. Структура таблиц одинаковая . Но данных разное количество. Запросы делали с final. Кто-то сталкивался с подобным ?
-
база Ordinary, это же не должно никак влиять?
2 реплики пишут в 1 бакет, поэтому и спрашиваю, могут ли быть из-за этого проблемы? Сейчас рядом настроим похожую таблицу только с разными папками в бакете под разные реплики -
это по идее положительно должно влиять
потому что нету всех заморочек с неблокирующими атомарными alter и тем что "данные не удаляются" -
Всем привет только начал админить clickhouse.
Скиньте плиз кто нибудь статейку годную, как настроить с бэкап сервера резервное копирование. -
GitHub - AlexAkulov/clickhouse-backup: Tool for easy ClickHouse backup and restore with cloud storages support
Tool for easy ClickHouse backup and restore with cloud storages support - GitHub - AlexAkulov/clickhouse-backup: Tool for easy ClickHouse backup and restore with cloud storages support
-
-
@BloodJazMan @temurlord мерси, посмотрю 🤝 Хороший кейс, становится ближе... ТТТ
https://clickhouse.tech/docs/ru/sql-reference/data-types/aggregatefunction/#data-type-aggregatefunction
тут инфа есть
надо изучатьAggregateFunction | Документация ClickHouseAggregateFunction Агрегатные функции могут обладать определяемым реализацией промежуточным состоянием, которое может быт
-
Да, около этого.
Не ругайтесь, пожалуйста, если не то или не всё :)
Подскажите - исправлюсь. -
-
Introduction to ClickHouse Backups and clickhouse-backup
This article will explore the plumbing involved in backing up ClickHouse and introduce the clickhouse-backup tool for automating the process.
-
мн, так есть специальные движки AggregatingMergeTree / SummingMergeTree они умеют коллапсить/ агрегировать строки.
Для хитрых функций надо использовать стейты, если храним aggregateFunction, то надо домерживать их результат -Merge комбинатором -
Здравствуйте. Хотелось бы узнать корректность схемы таблицы.
CREATE TABLE <table name> (ServerName String, MetricName String, CreatedAt DateTime, Value Float) ENGINE = MergeTree() ORDER BY (ServerName, MetricName, CreatedAt) PARTITION BY (ServerName, toYYYYMM(CreatedAt))
Серверов мало, метрик чуть побольше (около 200 на каждый сервер), а вот собираются данные каждую секунду, так что по итогу строк много.
У меня возникает сразу же несколько вопросов:
1) Целесообразна ли здесь замена строк на целые числа? (т.е. вместо ServerName String использовать ServerId UInt16)
2) Подойдёт ли такая схема для того, чтобы данные можно было визуализировать --- выбирать определённый сервер, несколько метрик, определённый промежуток времени и отображать соответственно данные (агрегация на уровне avg, median)?
3) Подходит ли вообще эта БД для такого типа задач? Есть всякие Prometheus, но возникает проблема с историческими данными и с их количеством.
4) Можно ли как-то улучшить схему? -
1) можно не париться
2) да
3) victoria metrics как раз для этого -
лучше всего закодировать сервер в id метрики, просто сквозная нумерация и хранить только 3 поля.
расшифровку Metric хранить в mysql или в отдельной таблице в КХ + словарь
(Metric UInt32, CreatedAt DateTime, Value Float CODEC(Delta?/Gorilla?, ....) )
ENGINE = MergeTree() ORDER BY (Metric, CreatedAt)
в victoria metrics все это уже решено и оптимизировано внутри и огромный плюс victoria поддерживает promql - 19 June 2021 (47 messages)
-
ну не сказал бы что прямо promql это такой уж плюс
всякие if внутри instant vector не поделать -
привет! вопрос, у меня следующая таблица, добляю около 1bil записей раскиданных в пределах 3 месяцев, name='price' получаю около 1000 parts, я так понимаю я должна создаваться одна part YYYYMM-name
-
-
а получаю неслько десятков для одного partition key
-
-
-
-
a понял, по принципу MergeTree работает, спасибо!
-
после optimize final 1000 -> 30
-
не надо было делать optimize. Парты active=0 удаляются через 8 минут. Optimize зря только диски насиловал
-
Спасибо. Я и то, и другое решение сравню
-
-
-
-
-
Вопрос не критический, но сталкиваюсь часто: Запятая перед FROM вызывает в CHYT ошибку, в отличие от некоторых других диалектов SQL. При этом сообщение об ошибке довольно неинтуитивное. Можно ли с этим что-то сделать?
-
в clickhouse over youtube, как в обычном, trailing coma запрещены
-
А что за диалекты такие? В мускуле или постгре так можно?
-
такое допускается в YQL, или вот тут в T-SQL
также допускается в списках в Питоне, например.
Удобство такой гибкости в том, что иногда нужно отключить/добавить фичу в списке и это можно сделать поставив/убрав знак комментария, а дополнительная перестановка финальной запятой реально раздражает.Why doesn't a trailing comma after the last field matter when creating a table using T-SQL?Shouldn't one of these statements work and one fail? Intuition says Statement 2 should fail because there is a comma after int and no second column listed. Yet both work and the trailing comma ","
-
Ещё есть люди, которые ставят запятую перед элементом списка, но это переносит проблему с последнего элемента на первый...
-
Так себе диалекты конечно. Но идея хорошая, такое есть почти в каждом языке программирования. Только sql конечно более консервативный язык, я бы не надеялся
С другой стороны кх - динамично развивается, может и добавчт такую фичу. В любом случае для этого надо заводить таску на гитхабе. Обсуждение этой проблемы в телеге ни к чему не приведёт. Может такоц фича реквест уже и был создан. -
спасибо за идею, попытаю счастья на ГХ
-
напомните, пожалуйста, как слить 2 списка из разных столбцов таблицы в словарь?
-
два списка это что?
массивы? -
По каким правилам сливать
-
да массивы. одинаковой длины. в одном ключи, в другом значения.
-
ну тогда
ARRAY JOIN arr_1, arr_2 -
либо arrayZip но не понятно, что конкретно вы хотите на самом деле
-
не то - это массивы, которые сидят в полях одной и той же таблицы. (Аппметрка Яндекса )
-
Скорее нужно что-то типа Map(key, value), но он дает ошибку "Unknown function map"
-
Мне в общем достаточно найти позицию ключа и взять значение...
-
a
через indexOf можно
value[indexOf(key,'key_name')] -
либо через arrayFirst((x,y)-> y='key_name',value,key) думаю
-
сделал через indexOf. спасибо!
-
arrayFirst - перспективно. Изучу.
-
а как делать WITH с несколькими выражениями. Цель: определить 2 выборки SELECT, обозначить их через WITH и далее использовать в джойнах.
-
кто может придумать магический способ скипать несуществующие таблицы для cluster/clusterAllReplicas?
приложение вставляет временные стейдж данные в лог на конкретном хосте и хочется уметь читать их с любого другого, но не громодить велосипеды с созданием на всех хостах / набрасыванием distributed
select * from clusterAllReplicas('clustername', schema.tblname);
There is no table `schema`.`tblname` on server: host-02-ro:9000
: While executing Remote (version 21.3.12.2 (official build))
т.е. игнорировать эту ошибку (можно конфигом).
и имеет ли смысл такой ФР -
а skip_unavaliable_shard пробывали?
-
ну вдруг
-
-
Кластер вроде как раз Distributed создает, там же нужно груп бай считать правильно
-
насколько я знаю skip_unavaliable_shard это фича именно distributed
-
Поигрался я с VM, интересная вещь и Grafana из коробки поддерживает, не так долго пришлось разбираться с настройкой панели, но данные вставлять --- это боль, надо разобраться с нативным форматом, чтобы это выполнять операцию быстро, а для CH есть clickhouse-driver, который работает очень даже быстро
-
данные? вставлять?
В смысле у вас неоткуда скрепать метрики в формате прометея? -
Можно было бы данные в реал-тайме получать, но, если честно, задача немного другая, но а это как пример. Я упомянул исторические данные, с ними беда (скорость вставки). А так данные собираются в одном файле за час, потом его надо прочитать и за этот последний час вставить данные
-
Гайз, а можно как-то настроить роль юзера, что бы тот для всех таблиц базы имел readonly, а только в одну write access?
-
Через sql rbac можно
- 20 June 2021 (66 messages)
-
Извините за то, что я не разбираюсь в этой теме, но если исходить из моего последнего комментария, то что лучше выбрать или разницы нет особой?
-
всем привет! никто не сталкивался с подобной ошибкой? Обновлял версию с 20.11 по 21.3.12 не помогло
Code: 49, e.displayText() = DB::Exception: Can't adjust last granule because it has 8192 rows, but try to subtract 24555 rows.: While executing MergeTreeThread -
Добрый день.
Можно ли добавить комментарий к уже существующей таблице (версия сервера 21.6.4.26). При создании таблицы это работает, хотелось бы не перезаливать из-за комментарев все таблицы. -
COLUMN | ClickHouse Documentation
Column Manipulations A set of queries that allow changing the table structure. Syntax: ALTER TABLE [db].name [ON CLUSTER
-
По этой ссылке речь о добавлении комментариев для колонок. А вопрос был о комментарии к таблице.
-
При создании таблицы можно добавить комментарий:
CREATE TABLE IF NOT EXISTS work.test
(
s String
)
ENGINE=Memory()
COMMENT 'Тестовая таблица' -
не вижу возможности, судя по документации, комментарий можно добавлять ток при создании
-
-
Тоже не нашел. Хотя через ALTER TABLE было бы удобно, функциональность простая.
-
... что-то типа: ALTER TABLE test TABLE COMMENT 'Тестовая ятаблица'
-
ALTER TABLE xxx MODIFY COMMENT?
-
нет такого, емнип
-
Но это в новых версиях ктолько
-
👍 да, именно так хотелось бы
-
ну пишите фича реквест, хз почему не сделали
-
погодите, а разве он не может сделать через rename/exchange переход на таблицу с идентичной структурой и добавленным комментарием? Или я туплю? 🤔
-
Да может.
А если это MergeTree таблица, не реплицированная то можно просто файл на диске обновить -
и сделать DETACH ATTACH
-
мм, про этот нюанс про файл на диске моя забыль
-
Через DETACH / ручная правка метаданных / ATTACH - да можно.
Нелогично просто, в SHOW и CREATE поддержка есть, а в ALTER TABLE - нет -
нууууу логично/нет - приходится решать проблему обходным путем :)
-
ага, как все "нормальные герои" 😁
-
В VM данные будут занимать места сильно меньше, чем в клике. Берите VM.
-
чот не встаёт 21.1 со словарями в xml, хотя фикс вроде вмержен. ругается на то же самое.
-
Замените запросы на dictGetUInt8, те на те у которых есть тип
-
dictGetFloat64('currencies', 'rate', tuple(toString(currency))) вот такой дефолт используем. вроде типизированный.
а есть какой-то способ бесшовно с xml-словарей переехать на ddl? или такой переезд не поможет с этой проблемой? -
А, ну тогда хм
-
Какая конкретно ошибка то
-
помогите плз ... ни как не могу разобраться, запрос выполняется очень медленно
запрос: select a.ssid, b.ssid from adsApi a left join mongodb b ON (b.ssidHash = a.ssidHash) LIMIT 0, 10
таблица которая присоединяется
CREATE TABLE parsing_stat.mongodb
(
date DateTime,
sourceId UInt64,
ssid String,
regionId UInt64,
avg UInt64,
parsingType String,
ssidHash UInt64 DEFAULT sipHash64(ssid),
INDEX ssidHash ssidHash TYPE minmax GRANULARITY 4,
INDEX ssidHash2 (sourceId, ssidHash) TYPE minmax GRANULARITY 4
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/f8dd7945-db55-43a0-a667-b3146a9b183b/{shard}', '{replica}')
ORDER BY (sourceId, regionId, date)
TTL date + toIntervalMonth(3)
SETTINGS index_granularity = 8192
в итоге отрабатывается это все со следующими результатами
Progress: 3.12 million rows, 93.29 MB (4.06 million rows/s., 121.34 MB/s.) 92%
10 rows in set. Elapsed: 0.769 sec. Processed 3.12 million rows, 93.29 MB (4.06 million rows/s., 121.32 MB/s.) -
Сколько записей в правой таблице
-
3 млн
-
Ну кх сначала джойнит те поднимает правую таблицу в памчть а только потом делает лимит
-
А в чем смысл запроса то
-
в левой таблице 5 млн запросов в правой 3 ... мне нужны листинги с пониманием того у каких записей левой таблице отсутствуют записи в правой
-
Ну сделайте через not in
-
Как часто вы его выполнят то будете
-
да тут дело немного не в этом ... у меня это объединение работает в даталенсе .... для построения графиков .... и график поднимается очень медленно
-
а учитывая что графиков много .... это прям очень медленно работает ... вот сижу пытаюсь индексами ускорить процесс
-
Индексами это дело вы не ускорите
-
Вам либо правую таблицу в join table движок пихать либо как словарь
-
хм
-
спасибо .... ща буду копать
-
Но запрос странный, если он один раз посмотреть то ок
-
А если постоянно вызывается, то это странно
-
Всем привет!
В этот вторник, 22-го июня, специалисты из Glowbyte совместно с Яндекс.Облаком проводят семинар по построению рекомендательных движков. Стек: ClickHouse, S3, BI (DataLens), Kafka, ML-стек (Data Sphere).
Вебинар будет интересен всем, перед кем стоит задача в сжатые сроки построить эффективный механизм рекомендаций для повышения среднего чека или уменьшения оттока клиентов (e-commerce, retail, финтех, сервисы, ad tech).
Будет секция вопросов и ответов - можно будет пообщаться онлайн.
https://cloud.yandex.ru/events/368Рекомендательные системы: архитектура и применениеПокажем современную архитектуру рекомендательного движка на базе платформы данных Yandex.Cloud
-
а если использовать CollapsingMergeTree (order by ssid) и 2 мат вью, чтобы когда в таблицу adsApi запись происходила, то в CollapsingMergeTree писать sign=1, а если втавка в mongodb, то в CollapsingMergeTree писать sign=-1. т.о. в отдельной таблице всегда будет актуальный список записей ssid, которые есть в adsApi, но нет в mongodb?
-
Для Collapsing MT принципиальна последовательность записей с 1 и -1. Сначала всегда должна идти 1.
-
-
ну у меня вообще монги нету, я только набрасываю варианты решения понравившейся мне задачи. как там у ТС пишется - хз :)
-
а если сделать проекцию с order by ssid? тогда по идее при джойне правая таблица уже будет "готовой", её не надо будет пересортировывать и джойн по идее будет быстрее
-
Разве проекция хоть каким-то образом влияет на join?
-
Правая таблица будет "готовой", если её положить в подходящий Join заранее
-
этот вариант уже озвучивали выше
-
Верно, просто обратил внимание про "готовность" таблицы
В моем представлении проекция и джойн - это никак не связанные вещи -
а в моём представлении, проекция должна использоваться для ускорения запроса и не важно где находится таблица с проекцией в FROM или в JOIN. но сейчас скорее всего проекция не используется при джойн, потому что сейчас в проекциях даже WHERE не работает. так что может потом такое и сделают.
-
я вот задумался
если проекцию задать с ключом group by, который в каком-то конкретном случае сильно жмет данные
затем джойнить другую таблицу на исходную так, чтобы должно было хватать проекции, это КАК-БУДТО ДОЛЖНО ускорить по крайней мере создание мапы
это работает/будет работать, не знаете?
p.s. это не про mergejoin -
SYSTEM RESTORE REPLICA replica [ON CLUSTER cluster] by myrrc · Pull Request #13652 · 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...
-
вряд ли, проекции пока что только в зачаточном состоянии, даже доки нету :) но КХ развивается стремительно, могут и добавить. пока что в ближайших планах только поддержка WHERE и SimpleAggregateFunction
-
дожжжждалассссссь!
-
Это вместо подмены на не replicated и аттачей детачей?
-
На пару неделек бы раньше)
-
Да
-
Так скрипт был для автоматизации )
-
Всем доброго вечера. Обращаюсь к КХ с питона через infi.clickhouse_orm, но периодически ловлю ошибки по типу Connection broken: IncompleteRead(288 bytes read, 224 more expected). На сколько понимаю, это КХ сервер обрывает соединение, но куда дальше копать для поиска причины проблемы даже предположить не могу. Что можно делать в такой ситуации?
-
Мы руками 100500 партиций вжж, скрипт не нашли, да и спешили)
-
- 21 June 2021 (144 messages)
-
Добрый день!
Подскажите как в запросе создать последовательность дат по месяцам от фиксированного месяца до текущей даты?
Что-то вроде этого примера https://clickhouse.tech/docs/ru/sql-reference/table-functions/numbers/ но только с первым днём месяца в каждой строкеnumbers | Документация ClickHousenumbers numbers(N) - возвращает таблицу с единственным столбцом number (UInt64), содержащим натуральные числа от 0 до N-
-
SELECT toDate('2020-01-01') + INTERVAL toUInt64(number) MONTH FROM numbers(toUInt64(dateDiff('month',toDate('2020-01-01'),now())) + 1);
-
Спасибо!
-
Привет! Спрошу еще раз)
В наличии есть парты PARTITION BY formatDateTime(dt, '%Y%m%d%H') с engine=CollapsingMT, которые нужно приаттачить.
В них есть не схлопнувшиеся строки, подскажите, как правильно, их приаттачить(интересуется последовательность attach, так как при неправильной последовательности происходит нарушение алгоритма их вставки). Вставлены были 1-> -1 -> 1. Следовательно хочу оставлять только последнюю строку. -
#вакансия #удаленка #dba #clickhouse
ищем dba. clickhouse или с желанием изучить. зарплата от 180 обсуждаемая. Любой город, можно в офисе(мск сити), если хочется. тк рф, дмс, все дела. ищем активных и целеустремленных :-) по вопросам в лс -
Ребят привет клик выдает ошибку DB::Exception: File not found: /var/log/clickhouse-server/clickhouse-server.log.0 может кто знает как пофиксить?
-
touch /var/log/clickhouse-server/clickhouse-server.log.0
-
я так понял это архивация логов (как в настройках) и странно что при всех правах не может создать
-
есть мысль
попробуйте
SYSTEM STOP MERGES db.table;
ATTACH PART в любом порядке;
SYSTEM START MERGES db.table; -
спасибо, сейчас попробую)
-
как округлить datetime до 8 часов?
-
в смысле либо 0 либо 08 либо 16 ?
-
ага
-
чтобы 2019-11-09T09:03:42 превратилось в 2019-11-09T08:00:00
-
intDiv(a, b) ?
-
ой, а можешь ответить утверждением, плз, а то так не понятно
-
пару минут, за комп попаду
-
SELECT toDate(now()) + INTERVAL intDiv(toHour(now()),8) * 8 HOUR;
-
спасибо
-
а права то точно есть?
кто owner у каталога? -
помогло, но придется по 1ой партиции так делать(ATTACH/DETACH включают мердж)
-
все права есть (owner = clickhouse ) и при chmod -R 777 на дир логов тоже самое. При ручном создании файла клик удаляет его (он пропадает )
-
мне вот народ в чатеге подсказывает что вообще по идее не должно для MergeTree порядок подключения менять
разве вы нагрузку какую то делаете
и у вас на самом деле не в порядке дело а в том что пока вы делаете ATTACH вам прилетают еще данные которые мержатся...
и тогда да, STOP MERGES и STOP FETCHES и STOP TTL MERGES , STOP MOVES перед attach Должно помогать -
ACL может какой нибудь дополнительно настроен?
-
а можете полный stacktrace скинуть ошибки?
-
работает в докере с офф image
-
ClickHouse server version 20.11.2.1 (official build)
-
не, нагрузки никакой нет, я же кидал тестовую табличку, сначала вставляю 3 строки, потом детач ПАРТИЦИИ, аттач ПАРТОВ(по 1 шт) в рандомном порядке, и отсюда все сбивается.
-
он пытается удалить файл, Purge в stacktrace
и файла типа нет к этому времени...
какие у вас настройки для <logger><size> и <logger><count>
прописано в конфигах /var/lib/clickhouse/preprocessed_configs/config.xml ? -
-
1000м 10
-
ну вроде все правильно...
странно ...
так я не пойму... а на какой запрос у вас python clickhouse_driver такую ошибку выдает? -
помоему на Insert (это ELT с airflow )
-
ошибка повторяющаяся и раньше при перезагрузке click какое-то время работало
-
что-то очень странное, нужен точный запрос
у вас там случайно не кончается место? -
нет место я первым проверил
-
из 1тб 200 used
-
-
@BloodJazMan спасибо большое вот в чем и была ошибка
-
это ДРУГОЙ каталог =)
df -h /var/log/clickhouse-server
у вас там 100% занято =) в корне -
да я сразу не заметил это
-
<Error> Application: DB::Exception: external dictionary 'currencies' not found: While processing cast(dictGetFloat64('currencies', 'rate', tuple(toString(cast(toFixedString('USD', 3) AS currency_tmp_alter4390137639752471181, 'FixedString(3)') AS currency))) AS currency_rate_tmp_alter14854700397755831138, 'Float64') AS currency_rate: default expression and column type are incompatible.
поля там такие:
* currency FixedString(3) DEFAULT toFixedString('USD', 3)
* currency_rate Float64 DEFAULT dictGetFloat64('currencies', 'rate', tuple(toString(currency))) -
SELECT * FROM system.dictionaries FORMAT Vertical
-
чтобы запрос сделать, надо чтобы кликхаус встал, а он не встаёт.
если исключить проблемные таблицы из metadata, а потом им сделать аттач, то всё ок. -
а блин, старая проблема зависимость от словарей при выводе типов
какая версия clickhouse?
в 21.3 должно было починиться -
https://altinity.com/blog/tag/altinity-stable/
следуем вашим советам :) 21.3 ещё не стейбл. как с этим жить, пока он не станет таковым?
замена xml на запросы поможет? -
dictGet ищет словарь, словарь не загружен
без разницы как он объявляется в XML или в SQL -
я понял. спасибо!
пойду изучать ченжлог 21.3. -
насчет того что 21.3 в altinity stable пока не вышел... пока конкретных сроков насчет altinty-stable увы сказать не могу
-
Привет! Напоминаю, что завтра вечером на вебинаре спецы из компаний Glowbyte и Yandex.Cloud рассказывают об опыте построения рекомендательных движков на ClickHouse + Kafka +S3. Приходите!
-
Хорошо, спасибо. Правда, придётся поприседать с бинарным форматом
-
Привет!
Вопрос - а можно как-то преоброзовать Nullable(String) в словарь/json? -
Всем привет!
SYSTEM RELOAD DICTIONARIES стала выдавать ошибку:
Received exception from server (version 21.6.5):
Code: 86. DB::Exception: Received from localhost:9000. DB::Exception: Code: 86, e.displayText() = DB::Exception: Received error from remote server /?connection_string=DSN%3DMSSQL%3BUID%3Dxxxxxxxx%3BPWD%xxxxxxxxxxxxxxxxxxxxxx&max_block_size=8192. HTTP status code: 500 Internal Server Error, body: ÿstd::exception. Code: 1001, type: nanodbc::database_error, e.what() = ../contrib/nanodbc/nanodbc/nanodbc.cpp:1625: 2400: [FreeTDS][SQL Server]Invalid cursor state , (version 21.6.5.37 (official build)).
Смотрю в system.dictionaries на каком словаре выдаётся ошибка (поле last_exception).
Выдает один (иногда два словаря). Делаю перегрузку конкретно этих словарей - всё OK. Кто-нибудь сталкивался с таким?
стек-трейс из поля last_exception:
Code: 86, e.displayText() = DB::Exception: Received error from remote server /?connection_string=DSN%3DMSSQL%3BUID%3Dxxxxxxxxxxxxxx%3BPWD%xxxxxxxxxxx&max_block_size=8192. HTTP status code: 500 Internal Server Error, body: � std::exception. Code: 1001, type: nanodbc::database_error, e.what() = ../contrib/nanodbc/nanodbc/nanodbc.cpp:1625: 2400: [FreeTDS][SQL Server]Invalid cursor state , Stack trace (when copying this message, always include the lines below):
0. ? @ 0x3a8cac2 in /usr/bin/clickhouse-odbc-bridge
1. ? @ 0x3a8f15d in /usr/bin/clickhouse-odbc-bridge
2. ? @ 0x3a8e271 in /usr/bin/clickhouse-odbc-bridge
3. ? @ 0x2b64fa0 in /usr/bin/clickhouse-odbc-bridge
4. ? @ 0x2b57184 in /usr/bin/clickhouse-odbc-bridge
5. ? @ 0x2b50ce5 in /usr/bin/clickhouse-odbc-bridge
6. ? @ 0x3a2c3d0 in /usr/bin/clickhouse-odbc-bridge
7. ? @ 0x531c2af in /usr/bin/clickhouse-odbc-bridge
8. ? @ 0x531dd1a in /usr/bin/clickhouse-odbc-bridge
9. ? @ 0x5eb9db9 in ?
10. ? @ 0x5eb682a in ?
11. start_thread @ 0x7ea5 in /usr/lib64/libpthread-2.17.so
12. clone @ 0xfe8dd in /usr/lib64/libc-2.17.so
(version 21.6.5.37 (official build)) (version 21.6.5.37 (official build)) -
стек трейс говорит что у вас в ODBC bridge ошибка,
есть пакет с debug символами
clickhouse-common-static-dbg
можете его поставить? -
если немного погуглить
похоже odbc-bridge не закрывает курсор не профетчив все записи из курсора до конца
https://stackoverflow.com/questions/26401996/invalid-cursor-state-pdo-odbc-freetds-sql-server
можно попробовать включить в unixodbc tracing
https://www.easysoft.com/support/kb/kb00945.html
и посмотреть как odbc-bridge общается с SQL Server
и с полным стектрейсом и трейсфалом можно issue вот тут завести
https://github.com/ClickHouse/ClickHouse/issues/Invalid cursor state - pdo_odbc FreeTDS SQL ServerWe're running a completely nonchalant query and are getting the following error: PDOException : SQLSTATE[24000]: Invalid cursor state: 0 [FreeTDS][SQL Server]Invalid cursor state (SQLExecute[0] at /
-
чот 21.3.12.2 с такой же ошибкой падает :(
-
https://github.com/ClickHouse/ClickHouse/issues/21101#issuecomment-820530857
похоже все еще падаетclickhouse 20.12.5 restart error: external dictionary not found · Issue #21101 · ClickHouse/ClickHouse(you don't have to strictly follow this form) Describe the bug Reproduce of 12454. When creating a dictionary and a materilized column, after restart we get external dictionary not found Do...
-
ну, вот да. я посмотрел, что https://github.com/ClickHouse/ClickHouse/pull/19805 уже в 21.1 есть. но чот не работаетFix starting the server with tables having default expressions containing dictGet() by vitlibar · Pull Request #19805 · ClickHouse/ClickHouse
I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category: Bug Fix Changelog entry: Fix starting the server with tables having default expressio...
-
я думаю вам надо по моей ссылке комментарий оставить с определением ATTACH TABLE таблицы и стектрейсом
и протегировать @kitaisreal -
Добрый день! Не подскажите почему не работает запрос с like? Мне нужно вывести все записи, которые начинаются с буквы: поле like '[a-z]%' - выдает пустой запрос....
-
потому что для этого надо использовать match(field, '^[a-z]')
-
Спасибо, попробую!
-
-
window functions же завезли
-
-
У них вроде и не бинарный есть. По крайней мере для вставки - точно
-
Да, есть не только они (всеразличные JSON, CSV и т.п.), но по скорости самый быстрый --- бинарный. Проблема с тем, что если вставлять в JSON, то придётся долго ждать, пока вставятся данные за 5 лет
-
Немного не в тему и даже не в этот чат, но в последнем хроме на арче вот по этой ссылке во вкладке SIGTRAP
https://clickhouse.tech/docs/en/sql-reference/statements/alter/ttl/
😂😂TTL | ClickHouse DocumentationManipulations with Table TTL MODIFY TTL You can change table TTL with a request of the following form: ALTER TABLE table
-
-
ну вроде когда делаешь freeze парты из system.parts исчезают
так что думаю что нет
clickhouse-backup никакого UNFREEZE не делает, тупо mv хардлинков из shadow в бекап папку делает -
ну с freeze все ясно.
смысл команды unfreeze пытаюсь понять. -
-
а локал инкрементал не работает в clickhouse-backup?
-
-
Поясните за template, не особо понятно
-
Ch только для эвент аналитики, если придеться что-то большое джойнить одумайся
-
Какой docker-compose, kubernetes сетап
-
Вот для ивент аналитики подходит
-
-
-
-
-
-
я так данные из инфлюкс дб переносил за 5 лет. меньше чем за сутки всё перенеслось. сидеть и разбираться в бинарном протоколе гораздо дольше. померяйте скорость вставки - если за пару дней уложитесь, то к чёрту этот бинарный протокол
-
Так и не надо на первых порах усложнять инфру слету
-
-
=) а какой в нем смысл?
inodes экономить? -
смысл делать локальный, который потом агент бекапера забирает.
чтобы меньше забирал по сети -
Господа, подскажите, почему приме anyIfOrNullMerge в этом случае не NULL получается, а пустая строка (этот столбец во всех строках NULL)
2da301ca5031 :) SELECT anyIfOrNull(parent_id, isNotNull(parent_id)) AS X FROM indicators_processes_ingest;
SELECT anyIfOrNull(parent_id, isNotNull(parent_id)) AS X
FROM indicators_processes_ingest
Query id: 2001122f-9723-4b0e-96f4-43402d96ad50
┌─X────┐
│ ᴺᵁᴸᴸ │
└──────┘
2da301ca5031 :) SELECT anyIfOrNullMerge(X) FROM (SELECT anyIfOrNullState(parent_id, isNotNull(parent_id)) AS X FROM indicators_processes_ingest);
SELECT anyIfOrNullMerge(X)
FROM
(
SELECT anyIfOrNullState(parent_id, isNotNull(parent_id)) AS X
FROM indicators_processes_ingest
)
Query id: d7e24f86-96cb-4d2c-8a9c-907b7f039699
┌─anyIfOrNullMerge(X)─┐
│ │
└─────────────────────┘
1 rows in set. Elapsed: 0.010 sec.
Это толкьо пример в реально миспользовании создаётся матвью и селект с anyIfOrNullMerge делается именно из него, но с сабзапросом воспроизводится -
смотрите =)
локальный бекап это просто хардлинки
чтобы предотвратить удаление партов после мержа
соответственно, когда делается upload он легко может быть сделан через --diff-from и тут как раз будет реальная экономия
и при download тоже, там парты которые инкрементальные и base backup будет сливаться -
indicators_processes_ingest
у вас тут реально только Null ? -
в столбце parent_id — да
-
Подскажите, пожалуйста, почему в такой элементарной ситуации возникает ошибка "таблица asna.first_sid не существует? (версия 21.3 LTS)
create view asna.first_sid as with temp as(
select distinct ClientID cid, Date, VisitID sid
from asna.visits)
select cid, min(sid) sid from temp group by cid -
2da301ca5031 :) SELECT parent_id from indicators_processes_ingest FORMAT PrettyCompactMonoBlock
SELECT parent_id
FROM indicators_processes_ingest
FORMAT PrettyCompactMonoBlock
Query id: 4a2096de-f14a-4f24-88fc-06b192864d6b
┌─parent_id─┐
│ ᴺᵁᴸᴸ │
│ ᴺᵁᴸᴸ │
└───────────┘ -
про это я в курсе. мой вопрос другой.
после того как clickhouse-backup все пофризил и перенес их в другую папку, делает ли он что нибудь ещё при режиме local (zip, добавляет мета, имя)? -
metadata.json и еще там файлики делает
-
но не зипует, да? т.е. доп место на диске занимать не будет (по крайней мере до удаления оригинальных партов)?
-
ifNotNull всегда false
и
вы используете
any аггегатную функцию в которой добавляются два модификатора
+ If + OrNull
if c постоянным false - вернет пустой результат
OrNull заменит его на Null
если сюда добавить State
то есть шанс что в State будет пустой результат получившийся на If
а OrNull возможно не срабатывает
и тогда
any + If + OrNull + Merge просто получит пустой результат, в котором кстати нет условий. и домержит это дело до пустой строки
второй anyIf кажется в нем отсутствует условие -
именно так. zip, tar и прочее это для заливки на remote storage
если посмотрите на конфиг станет ясно что для локальных бекапов используется только секция clickhouse
(Ну по крайней мере я не помню в исходниках чтобы видел что это не так) -
Отлично. Просто не пробовал руками сам. Спасибо!
-
Звучит рационально
-
А есть ли какой-нибудь способ обойти это поведение?
Условно я хочу сохранять первый (я понимаю, что any это не совсем первый, но в данном случае меня устраивает) Not Null результат и думал, что аггрегации меня спасут, но пока не осиливаю -
-
Пробую выполнить такой запрос и получаю ошибку
ALTER TABLE table.user_aggregation_shard
UPDATE name =
(
SELECT argMaxState(toNullable('John Doe'), toInt64(now())) AS name
) WHERE user_id = 38
————
Unknown function argMaxState: While processing argMaxState(toNullable('John Doe'), toInt64(now())) AS name -
=)) вы еще в SELECT ... FROM Забыли добавить
-
так а там фром не нужен
забиваю статической стрингой имя пользователя -
вот такое хочу получить
-
Лучше наверно insert вместо update, но он не гарантирует перезапись
-
Привет! Обновил версию клика до последней (21.6.5.37). Но синтаксис projection почему-то не работает. Что я упускаю?
-
клиент парсит SQL запросы
-
Т.е. надо через клиент последней версии передавать запросы?
-
в случае clickhouse-client да
и select будут пользоваться прожекшинами если включено allow_experimental_projection_optimization -
для проверки можно использовать force_optimize_projection
-
-
db grip ?
-
Да.
-
db grip на кой-то хер пытается парсить / валидировать SQL запросы, и отстал на 3 года по синтаксису, звоните в jetbrains
-
-
Коллеги, а транкейт в кх сносит все данныее и индексы к ним?
-
Добрый вечер )
-
да
-
Вместе с файлами на дисках?
-
да, но некоторые файлы будут удалены через 8 минут.
-
есть небольшой косяк
-
Спасибо, замечал такое, решил лишний раз переспросить
-
Дроп партиций примерно так же работает
-
спасибо
-
Смешная штука, КХ хранит неактивные парты 8 минут, для защиты от потери данных при внезапном ребуте хардвари.
Так вот truncate / drop partition удаляют активные парты моментально, а неактивные, которые естественно тоже не нужны, хранятся еще 8 минут. Ну и если будет внезапный рестарт и таблица не Replicated, то естественно КХ приатачит неактивные парты назад. что вообще баг. -
Подскажите пожалуйста, а можно два зеркала replicated таблиц натравить на один путь s3 хранилища? Это будет работать? Подумываем сгружать старые данные в s3 но возник вопрос - можно ли сэкономить на s3 или нужно хранилища x2 так же? Данные там мержиться уже не будут естественно.
-
-
а что с ним?
-
DataGrip выдает ошибку Read timed out. И что, куда дальше копать не понятно
-
в настройках уставновите нужное вам значение
-
В конфигах драйвера(или конекшена) нужно поправить параметры связанные с таймаутами
socket_timeout, datatransfer_timeot и тд. -
И там ещё прикол, что часть операций (мутации, создания таблиц, ещё что-то) могут в бекграунд уйти и с таумаутом и когда-то закончится)
-
Спасибо, это socket_timeout. Через settings не нашел его
-
https://github.com/ianton-ru/ClickHouse/blob/06eb2d8dfd039873d73e1715bfe88cfd497342e4/tests/integration/test_s3_zero_copy_replication/configs/config.d/s3.xml#L26
<allow_s3_zero_copy_replication>1</allow_s3_zero_copy_replication> -
Добрый вечер! Кто-нибудь пробовал запускать КХ на Apple Silicon с 8GB RAM? У меня по любому поводу пишет DB::Exception: Stack size too large и Cannot set alternative signal stack for thread, errno: 12, strerror: Cannot allocate memory.
Setting max_server_memory_usage was set to 6.40 GiB (8.00 GiB available * 0.80 max_server_memory_usage_to_ram_ratio)
<Information> Application: Uncompressed cache size was lowered to 4.00 GiB because the system has low amount of memory
<Information> Application: Mark cache size was lowered to 4.00 GiB because the system has low amount of memory -
Куда копать? Заранее спасибо!
-
ClickHouse 21.7.1.1 with revision 54452
-
сами собирали? или это arm офф. сборка?
-
Сам. По инструкции в документации
-
Arm64 офф. сборка как я понял под линукс. У меня не запустилась совсем.
-
тут человек на freebsd тоже не мог запустить КХ. пролестайте чат может и решение найдете.
- 22 June 2021 (161 messages)
-
запустить он смог
у него через какое то время вываливался segfault и было непонятно почему -
А есть ли возможность создавать вьюхи с использованием CTE?
Если я пробую сделать что-то вроде
CREATE VIEW temp_view AS
(
WITH source as
(select * from table)
SELECT * FROM source
)
То я просто получаю ошибку:
Table schema_name.source doesn't exist (version 21.4.3.21 (official build))
При этом в обычных запросах CTE в подобных вариантах работают нормально -
Это вроде пофиксили в 21.5
-
Fix CTE usage in view definition by amosbird · Pull Request #22657 · ClickHouse/ClickHouse
I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Improvement Changelog entry (a user-readable short description of the cha...
-
skip_unavailable_shards ПОЧТИ норм сработал =)
clusterAllReplicas работает только если на том хосте где произходит запуск таблица есть, когда нет то падает.
видимо в локальную он ходит не remote -
Привет!
Пытаюсь создать dictionary на основе таблицы из mysql. Там есть два поля: id и информация. Недавно в mysql id с числа поменяли на binary(16), и теперь получается, что ключ в словарях в CH тоже должен быть строкой, но CH такое не поддерживает. Подскажите, есть ли какие-то решения для таких проблем? -
Есть
CREATE DICTIONARY (
field1 String,
field2 String
...
)
PRIMARY KEY field1, field2
https://clickhouse.tech/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-structure/Ключ и поля словаря | Документация ClickHouseКлюч и поля словаря Секция <structure> описывает ключ словаря и поля, доступные для запросов. Описание в формате XML: <d
-
Забавность
-
Оба поля сделать ключами не получится, мне кажется. Потом получится, что надо брать значение по ключу, а ключ и есть значение. То есть у меня будет:
CREATE DICTIONARY (
id String,
info String
...
)
PRIMARY KEY id, info
А потом, если использовать dictGetString, то получится, что мне нужно info, чтобы получить info -
нужен setting force_remote_for_localhost
-
Да в целом можно создать отдельный remote_servers. с айпи 127.0.0.2
-
Используйте COMPLEX_KEY_* layout
-
КХ не поймет что это локальный?
-
там как бы вся подсеть локальная просто...
-
Угу, была бага-фича на эту тему
https://github.com/ClickHouse/ClickHouse/issues/23504Make is_local recognize loopback addresses 127.0.1.1 · Issue #23504 · ClickHouse/ClickHouse127.0.1.1 is used in ubuntu / debian by default in /etc/hosts for fqdn. Due to the fact that address don't literally match the address of network interface isLocal fails to detect that addr...
-
Точнее там другой адрес 127.0.1.1
-
ну вот, после того как там починят, этот хак поломается
-
Всем привет. Я прошу прошения за такой вопрос. А как сменить имя пользователя и пароль в базе данных? Все перелапатил но без результатно.
-
Как пользователь создавался, с помощью xml?
-
Создавался при установке базы на комп
-
Создавался каким образом
-
При установке базы запросил пароль но не имя пользователя. А имя пользователя теперь пустое. Я новичок в ClickHouse и сильно не разбираюсь
-
Это пароль для default пользователя
-
Да
-
смотрите его в
/etc/clickhouse-server/users.xml
/etc/clickhouse-server/users.d/* -
User Hardening
User hardening security procedures.
-
Он не даёт создать словарь, если все поля, которые объявлены, указаны в PRIMARY KEY. Получаю ошибку DB::Exception: Dictionary has no attributes defined
Если добавить ещё одно дополнительное поле, то получаю ошибку, так как этого поля нет в mysql источнике Exception: Unknown column 'test' in 'field list' -
Зачем вам такой словарь тогда?
-
может вы просто хотите два словаря создать?
-
Нет, мне нужен словарь, источник которого mysql таблица. Но в ней поменяли id с типа int на binary(16). То есть раньше я по id получала какую-то информацию, а сейчас не могу, так как ключ стал строкой
-
всем привет.
может, кто подскажет.
на 21.1.7.1 иногда в докере ловим Received signal Segmentation fault (11). не в докере - всё ок (или просто везло).
очень похоже на https://github.com/ClickHouse/ClickHouse/issues/25202, где советуют на 21.3 обновиться. есть в этом смысл? или на 21.3 тоже сегфолты кто-нить ловил?clickhouse server start fatal. · Issue #25202 · ClickHouse/ClickHouse2021.06.11 18:57:22.349719 [ 25903 ] {} BaseDaemon: Received signal 11 2021.06.11 18:57:22.349894 [ 26078 ] {} BaseDaemon: ######################################## 2021.06.11 18:57:22.349945 [ 2607...
-
В чем проблема, создать словарь используя только одну колонку как ключ?
-
В том, что эта колонка больше не int, а CH не даёт создавать словари с ключом по одной колонке не числового типа
-
Вы можете создать, просто укажите как ключ тупл из одной колонки
-
это работает
-
tuple(column_x)
-
Позволяет, вам уже написали что надо использовать complex_key_* лейауты
-
А, хорошо, спасибо большое! Я, видимо, просто не до конца поняла, что мне объясняли
-
ЕМНИП тупл надо только в dictGet, при создании словаря можно без него
-
Ну мб, просто если говорят, что не дает создать, кто знает :)
Хуже не будет -
коллеги, доброго дня! подскажите, пожалуйста, есть ли какой перечень показателей, при которых стоит задуматься о переводе zabbix с mysql или postgresql на clickhouse? столько-то сигналов в секунду, столько-то хостов и проч. или это необходимо сугубо при ощутимом падении производительности?
-
Это я думаю лучше идти в чатик по глабберу
-
Привет, подскажите в чем может быть проблема, спустя ~5 минут падает контейнер по оом, в логах кх
{} <Fatal> Application: Child process was terminated by signal 9 (KILL). If it is not done by 'forcestop' command or manually, the possible cause is OOM Killer (see 'dmesg' and look at the '/var/log/kern.log' for the details).
в kern.log
Task in /docker/ac246e933d20a7dbef60fd5e7af264b4ff809692adf2d379cc033b53cb483a77 killed as a result of limit of /docker/ac246e933d20a7dbef60fd5e7af264b4ff809692adf2d379cc033b53cb483a77
Jun 22 12:13:08 db kernel: [362545.294885] memory: usage 1048576kB, limit 1048576kB, failcnt 157
Jun 22 12:13:08 db kernel: [362545.294887] memory+swap: usage 0kB, limit 9007199254740988kB, failcnt 0
Jun 22 12:13:08 db kernel: [362545.294888] kmem: usage 8236kB, limit 9007199254740988kB, failcnt 0 -
лимит ставили по памяти, скок вообще памяти доступно?
-
Спасибо помогло.
-
Начал проверять на данных побольше, странное поведение, не везде помогает(
некоторые партиции нормально аттачит, там данные в правильном порядке. Некоторые в неправильном.
Может ли быть такое из-за того, что когда копировали данные партов, файлы внутри не в том порядке записались и от этого сменился их порядок? -
нет
-
и тогда еще вопрос, attach включает мержи независимо от того, были они выключены или нет.
Может ли это мешать, если я делаю сразу несколько аттачей партов. Или перед каждым аттачем надо делать stop merges? -
я честно говоря не знаю включает ли аттач мержи если их стопали специально
-
в доке так написали
https://clickhouse.tech/docs/ru/sql-reference/statements/system/#query_language-system-stop-mergesSYSTEM | Документация ClickHouseЗапросы SYSTEM RELOAD EMBEDDED DICTIONARIES RELOAD DICTIONARIES RELOAD DICTIONARY RELOAD MODELS RELOAD MODEL DROP DNS CA
-
-
Коллеги, всем доброго дня.
Есть следующая проблема. Реал тайм система, которая на основе входного джейсона генерит набор sql, которые расчитывают показатели. Встал вопрос балансировки и управления ресурсами.
Как оценить сложность задачи и определить потребление ресурсов кликхауса?
Что пробуем:
- Оценить сложность формульно - не получилось. Json довольно сложный, много несвязанных объектов.
- Собрать датасет с фичами, понять как и какие ресурсы тратятся, сколько времени это занимает и тд. Обучить модель предсказаний. - Какие-то результаты есть, но довольно много времени сбор и формирование датасетов занимает. Есть ощущение, что сложный путь, который не факт что приведет к решению.
В результате есть желание получить некую цифру, которая будет отображать размер ресурсов ноды кластера в попугаях и уметь оценивать задачу в этих попугаях, тем самым не убивать кластер. Иметь представление какой клиент какую нагрузку дает на сервер в исследуемый интервал.
Может есть более простые решения, методики? -
Вообще cloudflare пытались оценить с помощью машин лернинга планирование расширения кластеров.
https://blog.cloudflare.com/clickhouse-capacity-estimation-framework/ -
Но вы хотите решить еще более сложную задачу, как по мне
-
Ребят.... я даже на знаю как это... Вообщем есть табличка в кликхаусе у которой есть поле FixedString(3) допустим geo
Есть табличка в постгресе у которой тоже есть поле geo которое просто text.
И есть голанг который забирает из кх и кладёт в постгрес...
И на пустых значениях из КХ в постгре вылетают ошибки вида
ERROR: invalid byte sequence for encoding "UTF8": 0x00 (SQLSTATE 22021)
И я вот не пойму как это адекватно обработать и с точки зрения чего вообще ;D
То есть я могу в goкоде на все FixedString поля в КХ делать на всякий случай
strings.ReplaceAll(some_field, "\x00", "")
Но чё-т как-то.. хз, такое себе помоему
Или лучше в SELECT для КХ навесить на geo поле toStringCutToZero (или есть другой метод преобразования) ? -
судя по сообщению об ошибка это не ошибка clickhouse
у вас там точно по дороге где нибудь ODBC словаря какого то не завалялось -
Я не говорю что кх ошибка, ошибка в постгре
-
всем доброго времени, как безболезненно заменить макрос <replica> (были ИП хочу написать имена/алиасы хостов).
при замене предсказуемо все таблицы не аттачатся с
2021.06.22 11:17:18.982265 [ 2680 ] {} <Error> Application: Coordination::Exception: No node, path: ....
я почему то думал что в метадате хранятся не макросы а уже подставленные значения. Кто подскажет, почему не так? -
тогда надо смотреть в golang скрипт
если там выбирается из clickhouse
то есть где то промежуточная структура в golang перед тем как положить в postgres
в нее надо глядеть для этого поля там точно пустая строка или что-то еще -
-
/report
-
Блин, я думал я понятно всё описал...
-
Я как-то решал такую задачу. Попугаев там много.
от стороны железа
Размер/скорость дисков, производительность процессора / количество штук, размер/скорость памяти, пропусная спопобность сети.
от данных
Размер данных, их сжатие, частота попадания запроса в кеш, сложность запросов, их количество.
Короче можно с обеих сторон перевести всё в попугаи и рассчитать примерно (для сферического коня в вакууме) как будет справляться конкретное железо с конкретным юзкейсом. -
Даже пустая FixedString в КХ это 3 байта, и я так понимаю на промежуточном моменте при выгрузке они принимают dbl \x00\x00\x00 и при попытке вставить такое значение в постгре, постгре вылетает с ошибкой из за как бы NULLстроки
У меня скорее вопрос на каком моменте FixedString лучше конвертировать, можно ли из КХ сразу достать String из поля FixedString(3) и тд -
/stat@combot
-
Можно в скриптах все заменить на значение старого макроса
-
-
ну да, там автодополнение
toString()
можно сделать -
/stat@combot
-
-
https://clickhouse.tech/docs/en/sql-reference/functions/type-conversion-functions/#tostring
Это вы про этот метод? -
а вообще есть идеи зачем держать в сгенерированных metadata макро-placeholders, учитывая что они используются только в аргументах в RMT и намертво женятся на нодах ЗК после создания.
КМК изменение макросов не должно вести к таким последствиям от слова ну совсем... -
В новых версиях кх при создании таблицы разрешает макросы вида database-table, за реплику не уверен
-
да
-
-
В доках рекомендуют не трогать дефолтные config.xml и users.xml, а все свои кустомные настройки запихивать в файлы в дире conf.d/
-
а вы его содержимое посмотрите
по умолчанию стандартный конфиг который идет в .deb пакетом делает listen 127.0.0.1
что логично для standalone сервера
для docker нужен 0.0.0.0 или :: -
лучше сделайте volume ваших специфичных настроек внутрь /etc/clickhouse-server/conf.d
-
ну так о чём я?
создать таблицу
alter table rename
??? (словить ошибку на старте ) -
Ну в новых версиях RENAME корректно отработает :)
-
корректно это как?
- меняет путь в ЗК?
- заменяет макрос на старое имя таблицы? -
Нет, в момент создания таблицы макросы заменяются на значения макросов (точно для database, table)
-
ok, т.е. некоторые заменяются, некоторые нет ) я к тому что все таки "правильно" заменять все... изменение конфига не должно ронять метадату... проверим в 21.6
-
за replica я не уверен :)
-
Апну, мб у кого-то будут идеи)
-
можно сначала сделать OPTIMIZE FINAL а потом аттачить :)
А вообще достаточно аттачить в порядке возрастания block_min_block_max number -
а как мне поможет optimize final на данные, которые лежат в detached? Все данные, которые должны свернуться всегда лежат в одной партиции.
Вот второе предположение сейчас опробую, спасибо -
А, те вы хотите приатачить из detached, понял
Я бы попробовал на кошках сначала, в временной таблице -
>А вообще достаточно аттачить в порядке возрастания block_min-block_max number
Извиняюсь, уточню, block_min отнять block_max и в порядке возрастания этого числа? -
Нет, если упростить то в порядке возрастания block_min.
тк в кх не должно быть пересекающихся этих интервалов -
да я тут уже 2-3 дня тестирую это и на кошках и на собаках
вроде сначала stop/start merges помогло на маленьой таблице, перешел к тестам на прод данных и не поехало(
потом перепроверил на маленьком снова и понял, что не работало и там, просто получился правильный порядок аттача. -
да, все гениальное просто)
спасибо Вам -
Добрый день! Есть вопрос по еще не вышедшему коннектору ClickHouse от Altinity для Tableau https://docs.altinity.com/operationsguide/integrations/clickhouse-and-tableau/tableau-desktop-with-clickhouse/. Проблема следующая: в случае некоторых расчетов расчетов в Tableau и при группировке по некоему полю возникает ошибка:
Bad Connection: Tableau could not connect to the data source.
Error Code: B19090E0
HTTP status code: 501
Received error:
Code: 48, e.displayText() = DB::Exception: JOIN ON does not support OR.
В этом OR поля join’а проверяются на null. Такая проблема уже встречалась:
https://community.tableau.com/s/question/0D54T00000C6XDNSA3/tableau-still-generate-join-with-tdc-and-sqlsql92relationaljoinoperators-set-to-0
Там предлагается кастомизировать ODBC драйвер через некие параметры так, чтобы проверки на null не проводилось, но по треду не понятно, сработало ли. Хочу узнать, в коннекторе от Altinity такие ситуации обрабатываются? СпасибоConnect Tableau Desktop to ClickHouseConnect your Tableau Desktop application to ClickHouse
-
Ребята, всем привет.
Тут столкнулись с проблемой потребления большого к-ва памяти при join таблиц.
Есть 2 большие ReplacingMergeTree таблицы с партициями по месяцм. Эти таблицы джойнятся во вьюхе(left join).
Когда пытаешься селектить данные из вьюхи с date between, кликхаус выбирает все данные в память, джойнит, а потом уже фильтрует данные по дейт ренджу. Все согласно документации:
При запуске JOIN, отсутствует оптимизация порядка выполнения по отношению к другим стадиям запроса. Соединение (поиск в «правой» таблице) выполняется до фильтрации в WHERE и до агрегации. Чтобы явно задать порядок вычислений, рекомендуется выполнять JOIN подзапроса с подзапросом.
Но такой подход потребляет очень большое к-во оперативной памяти.
Вопрос: в будущем планируется ли оптимизация планировщика запросов, чтобы он добалял фильтрацию в таблицы, которые джойнятся? -
На сколько это важная и сложная задача для контрибьютеров clickhouse?
-
Если известны условия фильтрации, то можно (и лучше) сразу вместо join table2 делать join (select field1, field2 from table2 where ...).
-
Спасибо. Но у нас другой кейс, очень нужно сделать вьюху, в которой будут джойниться таблицы, а потом менять условия селекта
-
это он? https://github.com/Altinity/clickhouse-tableau-connector-odbc
тогда лучше им тикет на гитхабе завестиGitHub - Altinity/clickhouse-tableau-connector-odbc: Tableau connector to ClickHouse using ODBC driverTableau connector to ClickHouse using ODBC driver. Contribute to Altinity/clickhouse-tableau-connector-odbc development by creating an account on GitHub.
-
Если допустимо отставание в актуальности данных, можно ещё вместо фильтрации сделать таблицу типа Set/Join, обновлять её по мере необходимости и работать с ней вместо джойна целой таблицы.
Мне для обновления статистики раз в сутки такой вариант подошёл и сэкономил очень много времени. -
Видимо да. Спасибо
-
-
у нас около 70тыс таблиц)
-
а откуда они взялись эти 70 тыщ таблиц?
это из MySQL один в один перетекли данные?
зачем так вообще? -
Выглядит как хороший вариант, спасибо. Но как такой вариант будет работать, если мы подключим BI tool типа Tableau или Looker? Будет ли вообще работать, т.к. SQL выглядит кастомным
-
Храним репорты клиентов, много клиентов у каждого много репортов
-
Ну, это к сожалению уже другой вопрос :)
-
Сейчас задумываемся делать кастомные трансформации через DBT и визуализировать эти трансформации в BI Tool
-
нельзя хранить в одной общей таблице с client id в PK?
и сделать RBAC и row policy чтобы вытаскивать только то что можно... -
У каждого отчета отдельная структура и гранулярность данных
-
Насколько эта структура отлична друг от друга?
-
Можете попробовать включить эту опцию?
-
насколько я понимаю условия которые указываются в WHERE у вьюхи накладываются на результаты уже в самом конце, а не пробрасываются внутрь вьюхи. так что даже если сделают какую-то оптимизацию для джойнов, то при построении вьюхи сначала загрузятся все данные, а потом уже в самом конце отфильтруются за один день.
-
Лучше всего завести issue на github
Либо прислать
Tableu version
ODBC driver version
ClickHouse table DDL
Tableau workbook
На dborovtsov@altinity.com -
сильно различаются, в одном репорте может быть 30 колонок, в другом 1000
Зависит от дата соурса и к-ва динамических метрик в нем настроенных -
Я б на вашем месте вначале попробовал бы узнать наличие дублей (не помню, вы говорили какой движок у таблиц или нет), это раз. Динамические метрики, но суть их одна и та же? Вынести в таблицу и переделать схему хранения
-
Такая же проблема будет, если просто взять SQL вьюхи и дописать where в конце.
Вьюха - это же просто сохраненный SQL.
Я это к тому, что бд должна найти оптимальный план запроса, чтобы эффективно достать данные. -
У наз ReplacingMergeTree, дублей либо нет, либо их совсем немного.
Что вы имеете ввиду Вынести в таблицу и переделать схему хранения? -
В прямом смысле, рассмотреть с точки зрения бизнес-логики верны ли ваши схемы, и можно ли информацию, там имеющуюся, переделать.
ReplacingMergeTree? Ну хз, если задан неправильный ORDER BY key, да даже при правильно заданном, юзер может искать пробовать одну и ту же инфу -
С точки зрения бизнес логики и здравого смысла у нас правильная схема данных. Все данные в одну таблицу запихать непоулчится.
И это не решает вопрос с неоптимальным планом queery при join таблиц -
Ммм, я б поспорил,да не буду. Я б задался вопросом: а правильно ли выбор пал на Кликхаус в вашем случае? Но менять что-либо поздно. :)
-
Ну не прям поздно) просто очень дорого)
-
важная, только делать особо некому
-
Подскажите, пожалуйста, как можно такой запрос переписать:
SELECT *
FROM ch_table ct
INNER JOIN mysql_table mt ON mt.cid = ct.cid
WHERE like(ct.url, mt.pattern);
ругается: Argument at index 1 for function like must be constant
в целом, из доки ясно, что надо передавать строку, но может быть есть какой-то workaround? -
никак к сожалению, и через match тоже не получится
там особенность этих функций в том что они там чуть ли на JIT код генерируют чтобы скорость LIKE была пара гигабайт в секунду на ядро... -
Здравствуйте!
Подскажите, пожалуйста, в Clickhouse есть возможность конвертировать String в JSON?
Я что-то не нашёл в документации такую функцию, может плохо искал.
Спасибо. -
😢спасибо за помощь!
-
clickhouse в настоящее время не имеет встроенного бинарного типа для JSON
you can extract some parts of JSON via JSONExtract* functions
https://clickhouse.tech/docs/en/sql-reference/functions/json-functions/JSON | ClickHouse DocumentationFunctions for Working with JSON In Yandex.Metrica, JSON is transmitted by users as session parameters. There are some sp
-
https://github.com/ClickHouse/ClickHouse/pull/24148
https://github.com/ClickHouse/ClickHouse/pull/23932Jsonpath by l1tsolaiki · Pull Request #24148 · ClickHouse/ClickHouseI 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...
-
Спасибо.
-
привет всем
подскажите пожалуйста, в логах 21.6 вижу что на 9005 порту слушает postgre interface. попытка подключится к нему (попробывать) приводит к SSL ошибке и "authentication method is not support". это work in progress или что то нужно знать об этом? интересует выдача больших log stream таблиц через graphql, возможность работаь через postgre протокол позволила бы очень легко это сделать -
Есть логи такого вида
| messageId | domain | valid | eventId |
|-----------|-------------------|-------|---------|
| 1 | somedomain.com | | 1 |
| 1 | | | 2 |
| 2 | anotherdomain.com | | 1 |
| 2 | | | 2 |
| 2 | | 1 | 3 |
Мне зачастую требуется делать выборки к примеру для eventId = 2, при этом получать domain и valid по messageId. C join как и пологается запросы безбожно тормозят.
Какие есть варианты? Матерлизованные пердставления, еще что-то? -
что такое "domain и valid по messageId"?
-
SELECT domain, valid, … FROM log LEFT JOIN log USING messageId
-
Если посмотреть на табличку выше, там у eventId=2 не заполнены domain и valid, н опо messageId мы можем их узнать
-
не понятно, этот запрос без многоточие упадёт, тк не понятно, из какой таблицы брать столбец
но, кажется, я понял логику:
1. отфильтровать по eventId, взять messageId
2. для каждого messageId взять domain и valid, которые не null/'', верно? -
Это просто как пример, брать конечно из таблиыи котора приджойнена
-
Основной вопрос как не юзать join при этом
-
И делать что-тов вроде SELECT domain, count(*) FROM log WHERE eventId = 2 GROUP BY domain
-
основной вопрос в том, что вы не сказали, что хотите
то, что я написал выше совпадает с вашими ожиданиями? -
Да, и сейчас это работает через join, но очень медленно
-
-
Коллеги, прошу подсказать, я хочу скопировать таблицу с немного другими ключами сортировки и небольшим преобразованием нескольких полей.... Вопросы, я учитываю новые ключи сортировки при создании новой таблицы, а преобразование полей учитываю при копировании (инсерте) - этого достаточно и автоматически проставятся индексы и даные при копировании будут размещаться в новой таблице с учетом новых ключей сортировки или индексы надо прописывать отдель после копирования?
-
заранее спасибо
-
где эффективно можно посмотреть какие индексы используются при запросе?
-
set send_logs_level='trace';
в clickhouse-client -
-
С чем связаны вопросы - есть таблица с ключами сортировки order by syslogdate, ..., ..., ..., timestamp, запрос типа select ... from ... where syslogdate < ... and syslogdate >... and timestamp <... and timestamp >... order by eventid desc limit 100 - делает фулскан по всему диапазону syslogdate и timestamp из запроса, а запрос типа select ... from ... where syslogdate < ... and syslogdate >... and timestamp <... and timestamp >... order by syslogdate desc, timestamp desc, eventid desc limit 100 - ищет начиная с последней даты диапазона и если там есть 100 записей, в другие не лезет
-
insert-select будет сортировать данные в новой таблицу по конфигурации новой таблицы
-
проблема в том, что в первом случае скорость выборки в 2 раза быстрее чем во втором - почему?, и если значение timestamp ближе к вечеру - результат во втором случае получается медленне..., стоит ли вводить поле с градацией по часам, чтобы искпла за последний час... т.к. все запросы с limit
-
нужны ддл и запросы.
но в целом по первому ключу из ключей сортировки всегда должно отсеиваться... -
спасибо за подсказки
-
последний (timestamp) погоды делать не будет
-
думаю просто данные так легли... или eventId тоже в сортировке но сильно раньше чем timestamp
-
в одной syslogdate может быть до млрд событий, а нужно всегда от силы не больше 100К, делать поле с градацией по часам?
-
нет, eventid уникальное на 100% и не ставили в сортировку
-
можно
order by syslogdate, toHour(timestamp), ... все остальное
попробовать -
-
это в запросах или при создании новой таблицы?
-
И на этом огромное спасибо, попробую так
-
новой
-
спсб, буду пробовать
- 23 June 2021 (130 messages)
-
https://t.me/MacSoftwareFree/201
This is a channel that focuses on Mac free cracking software. They are free forever and are updated weekly.Mac software crack freeFast, lightweight and easy-to-use PDF editor Easily complete PDF editing, reading, annotating, editing text, adding photos, filling in forms, signing contracts, merging PDF documents, and encryption protection on MAC with just a few clicks, an unprecedented experience. The latest free cracked version, and it is free forever!
-
-
-
какого типа "пустая" колонка сейчас?
и что вы хотите получить в итоге?
Nullable или обычный скалярный тип? -
желательно Nullable. Так значит можно б ыло кастовать null as Nullable(String), например, точно, дошло
-
так, еще раз что такое "пустая колонка"?
она есть в таблице или нет? -
Её нет в одной таблице, но есть в другой, хочу наделать балванок таких, чтобы потом сделать юнион
-
в той таблице в которой она есть, она имеет тип Nullable?
тогда лучше без CAST а сразу toNullable('')
просто CAST еще типы выводит а потом только toXXX вызывает внутри -
А если не Nullable? Например, просто select '' может восприняться не как String
-
если не nullable то просто '' AS column
в таблице которой нет
если пустая строка '' у вас значащее значение и вам нужен Null
тогда
Null AS column
в пустой таблице
и
toNullable(column) AS column
в полной
поздравляю, вы напарываетесь на тормоза в особенности реализаций Nullable в clickhouse
и еще почитайте про join_use_null
https://clickhouse.tech/docs/en/operations/settings/settings/#join_use_nulls
он не просто так выключен по умолчаниюSettings | ClickHouse DocumentationSettings distributed_product_mode Changes the behaviour of distributed subqueries. ClickHouse applies this setting when
-
-
Select now()+interval number day from numbers(10);
Попробуйте -
-
Ребят, а подскажите как в кликхаусе отключить query_log ?
Прописываю /etc/clickhouse-server/config.d/logs.xml
<?xml version="1.0"?>
<yandex>
<query_log>
<log_queries>0</log_queries>
</query_log>
</yandex>
Перезапускаю кликхайс, смотрю SELECT name, value FROM system.settings WHERE name LIKE '%log_queries%';
┌─name──────────────────────────────┬─value───────┐
│ log_queries │ 1 │
│ log_queries_min_type │ QUERY_START │
│ log_queries_min_query_duration_ms │ 0 │
│ log_queries_cut_to_length │ 100000 │
└───────────────────────────────────┴─────────────┘
Что не так? -
<query_log remove="1" />
-
спасибо, но не помогло, прописал так, порестартил КХ
root@e6d66fb4980d:/# cat /etc/clickhouse-server/config.d/logs.xml
<?xml version="1.0"?>
<yandex>
<query_log remove="1" />
<query_thread_log remove="1" />
<trace_log remove="1"/>
</yandex>
смотрю значение не поменялось
e6d66fb4980d :) SELECT name, value FROM system.settings WHERE name LIKE '%log_queries%';
┌─name──────────────────────────────┬─value───────┐
│ log_queries │ 1 │
│ log_queries_min_type │ QUERY_START │
│ log_queries_min_query_duration_ms │ 0 │
│ log_queries_cut_to_length │ 100000 │
└───────────────────────────────────┴─────────────┘
e6d66fb4980d :) SELECT count() FROM system.query_log;
SELECT count()
FROM system.query_log
Query id: 83410882-01af-4f3b-a6ab-e13ca4d9da12
┌─count()─┐
│ 14 │
└─────────┘
1 rows in set. Elapsed: 0.004 sec. -
ну так это =)) таблица то никуда не денется =)
она раньше была создана
DROP TABLE system.query_log
и добавьте /etc/clickhouse-server/users.d/disable_log_queries.xml
<yandex><profile><default><log_queries>0</log_queries></default>
а чем вам log_queries мешает?
полезная же таблица. потом очень много интересного из нее можно узнать... -
а query_thread_log, и query_thread_log так же получается отключаются?
отключить нужно для оптимизации, при необходимости можно и включить обратно. -
да
-
ок, спасибо, проверю)
-
оптимизации чего? ;)
вы замеряли скорость с включенными и отключенными таблицами? ;) -
дискового пространства)
-
дак для этого TTL включите через <engine>
чтобы данные в таблице за последнюю неделю или день были...
вот тут пример есть в котором все показано
https://clickhouse.tech/docs/en/operations/server-configuration-parameters/settings/#server_configuration_parameters-query-logServer Settings | ClickHouse DocumentationServer Settings builtin_dictionaries_reload_interval The interval in seconds before reloading built-in dictionaries. Cli
-
-
спасибо, посмотрю
-
можно время потраченное на разные активности посчитать через system.events_log
дальше поделить это время на кол-во ядер ...
получить какую то утилизацию...
описание метрик есть тут
SELECT * FROM system.events WHERE event ILIKE '%second%'
или скрейпить периодически system.events
например через prometheus
https://clickhouse.tech/docs/en/operations/server-configuration-parameters/settings/#server_configuration_parameters-prometheus
IMHO rusage и т.п. вещи медленно через syscall изнутри приложения снимать
поэтому утилизацию CPU по процессам проще посчитать снаружи
какая у вас система мониторинга?Server Settings | ClickHouse DocumentationServer Settings builtin_dictionaries_reload_interval The interval in seconds before reloading built-in dictionaries. Cli
-
Забикс, мы снимаем с помощью него. Но он усредняет за 5 минут, довольно большая гранулярность.
У нас поток задач большой идет, которые превращаются в sql query, ищем варианты как оптимизировать нагрузку, чтобы в потолок не улетала утилизация.
К примеру, видим 100% нагрузку, не берем больше задач из очереди, нагрузка снижается, начинаем набирать. -
Похоже, нужно смотреть
UserTimeMicroseconds =185093080000
Только я не понял, как эту цифру поделить, чтобы получить утилизацию в процентах. Можете по подробнее? -
слушайте. 100% CPU для clickhouse это не страшно, он старается отожрать CPU по максимуму чтобы быстрее результат отдать и с усреднением до 5 минут вплолне нормальная петля обратной связи, до 0.95 например, чтобы была
IMHO это регулируется обычно все таки степенью паралелелизма (кол-вом воркеров которые шлют запросы)
и длинной очереди из которой воркеры разгребают -
поделите ее на SELECT count() FROM system.asynchronous_metrics WHERE metric LIKE 'CPUFrequencyMHz%'
-
Да, я понимаю, но там такие 100%, что аж среднее время выполнения эталонной задачи начинает в разы увеличиваться.
Поток представляется собой сейчас следующее - есть клиенты, для каждого из них статический параметр 20 задач, когда 10-20 клиентов одновременно запускают задачи, начинает все тормозить, именно этот момент и хотим оптимизировать.
Оценить сложность задачи мы пробуем, но это сложно, мы уже и МЛ тестируем, но структура фич слишком размашистая.
Итого пробуем создать некий backpressure -
спасибо
-
Привет. Подскажите, пожалуйста. Я планирую схему таблички и есть вопрос про массивы.
Есть табличка с, скажем, 3мя массивами равной длины: ключ, значение1, значение2
Я хочу получить 3 массива, у которых key like 'foo%bar'.
Есть функция arrayFilter, но она вернет только первый массив, а я бы хотел получить все.
Или просто вызвать 3 arrayFilter:
arrayFilter(key -> key like "foo%bar", key),
arrayFilter((v, key) -> key like "foo%bar", value1, key),
arrayFilter((v, key) -> key like "foo%bar", value2, key),
И я же правильно понял, что нет варианта sumMap с переменным кол-вом массивов, чтобы можно было сделать sumMap(key, value1, value2)
Как подобные задачи решают? -
так, а это странно, что у меня нет такой метрики?
-
ну так на этот показатель и ориентируйтесь тогда
растет, снижайте интенсивность...
и следите за длинной очереди -
а какая у вас версия clickhouse?
-
Так я для этого и написал, ищу способ мониторинга из приложения, которое задачи переводит из статуса in_queue -> in_progress
Просто из забикса брать не удобно, там обновление у нас раз в пять минут.
Видимо, проблема в версии, в деве посмотрел - показывает, в проде нет. Обновимся.
Прошу прощения за свою тугодумность, не понимаю, вот у меня на ноде 24 ядра, если я поделю 185093080000 / 24 = 7 712 211 666, что это за цифра? -
надо не system.events конечный счечик делить
а из system.events_log ProfileEvents_* инкремент счетчика делить... -
-
но я вам уже сказал
бесполезную метрику включаете
тем более если у вас clickhouse Нагружен а вы в него еще и из него же утилизацию пытаетесь посчитать
считайте время выполнения задачи с приложения
и тупо в приложении sleep вставляйте по трешхолду рандомный... -
а в заббикс мониторьте длину очереди и триггер на нее...
-
where arrayCount(x->x like 'foo%bar', key)>0
-
если я правильно понял, то тут нужно arrayExists
и предполагается фильтрация уже на клиенте?
эти ключи есть почти в каждой строке. И нужно-то массивы отфильтровать, а не строки найти -
этот момент я тоже понял, что лучше мерить из вне, не из клика, я его согласовываю с девопсами, но это может затянутся, поэтому буду использовать решение на котором можно алгоритм обкатать, источник данных в готовом сервисе заменить довольно быстро
-
тогда я не очень понял из первого сообщения что вам нужно, лучше всего показать пример на данных, как данные хранятся и что по вашему мнению должно быть на выходе запроса
-
строка1
keys: ['foo_1_bar', 'other', 'foo']
vals1: [1, 2, 3]
vals2: [10, 20, 30]
нужно из этих 3х массивов получить новые 3 массива.
в массиве keys найти значения like 'foo%bar'
по индексам ключей получить занчения из массивов vals1, vals2
Результат:
keys: ['foo_1_bar']
vals1: [1]
vals2: [10] -
3 arrayFilter как вы сами написали подходит
-
-
там может сметчиться несколько ключей, и я не видел функции вроде selectByIndexes(array, [1, 10, 43])
-
-
foo_1_bar, foo_2_bar и т.п.
-
Вариант должен быть рабочим.
Но меня несколько смущает то, что массив keys сканируется 3 раза.
Там будет примерно сотня значений.
А строк будет несколько тысяч.
Или это все не критично? -
SELECT
arrayEnumerate(a) AS nums,
a,
b,
arrayFilter((x, y) -> (y LIKE '%d%'), nums, a) AS filtered_a,
arrayFilter((x, y) -> has(filtered_a, y), b, nums) AS filtered_b
FROM
(
SELECT
['aaaa', 'bbbb', 'cdfg', 'd', 'asb', 'd'] AS a,
['b1', 'b2', 'b3', 'b4', 'b5', 'b6'] AS b
)
Row 1:
──────
nums: [1,2,3,4,5,6]
a: ['aaaa','bbbb','cdfg','d','asb','d']
b: ['b1','b2','b3','b4','b5','b6']
filtered_a: [3,4,6]
filtered_b: ['b3','b4','b6'] -
у меня есть вопросы к этому решению, и наверное их не имеет смысла обсуждать, чтобы не отнимать время
но я понял идею, спасибо за помощь -
еще маленькое уточнение
system.events_log или system.metric_log?
первой таблицы нигде нет, даже в документации найти не могу -
event_log
metric_log
SHOW TABLES FROM system; -
Всем добрый день. Подскажите плз, как понять какие запросы или процессы грузят CPU, clichkouse в докер контейнере
-
вам в моменте или в истории?
в моменте смотрите в
SELECT * FROM system.processes;
SELECT * FROM system.merges;
SELECT * FROM system.migrations WHERE is_done=0; -
в моменте, system.processes; или повылазило или CPU нет там
-
Коллеги, добрый день! Прошу подсказать: есть значение, которое я отражаю боксплотом, а есть норматив, которое хочу отразить линией на графике. Визуализацию делаю в redash. Он позволяет делать разные типы графиков для разных серий. Серия это значение груцппировки, в моем примере - оборудование. Т.е. чтобы добавить линию, мне надо добавить в колонку Оборудование норматив со значением норматива, как это можно сделать?
-
CPU в system.processes нет
но есть elapsed
обычно CPU жрет запрос который дольше всего исполняется сейчас
ну еще можно system.trace_log включить и flamegraph построить
https://github.com/Slach/clickhouse-flamegraph/#create-etcclickhouse-serverusersdprofilingxml-config-reloaded-every-1sec-or-via-system-config-reloadGitHub - Slach/clickhouse-flamegraph: CLI utility for build flamegraph based on system.trace_logCLI utility for build flamegraph based on system.trace_log - GitHub - Slach/clickhouse-flamegraph: CLI utility for build flamegraph based on system.trace_log
-
Красной линией отметил, как я хочу установить норматив
-
а редаш вообще разве умеет выводить цель на боксплот?
-
Подскажите пожалуйста, в какую сторону копать...
есть (и это я не могу обсуждать, так оно мне дано извне) две колонки - массивы. 1й массив - месяц в году (1...12), второй - сумма в этом месяце.
Пример:
[3,6,8,6,10]
[1200,2753,5000,2000,4240]
Мне надо выбрать и просуммировать элементы второго массива помесячно, за период. Например за первое полугодие должен получиться массив
[1200, 4753] (1200 за 3и месяц и 2753 + 2000 за шестой).
Заранее благодарен!, все утро проведено в поисках ((( -
-
Цель - нет, я хочу попробовать сделать это за счет серии. Поэтому у меня вопрос - как можно в одну колонку соединить значения из разных колонок
-
привести колонки в стринг и сделать concat?
-
-
Спасибо!!
Вот что получилось:
select
fm_el,
sum(fa_el) as sm
from
(
select
filtered_a[num] AS fa_el,
filtered_m[num] AS fm_el
from
(
select
arrayFilter((x, y) -> (y >= 1 AND y <= 6), b, a) AS filtered_a,
arrayFilter((y) -> (y >= 1 AND y <= 6), a) AS filtered_m
from
(
select
[3,6,8,6,10] AS a,
[1200,2753,5000,2000,4240] AS b
)
) ARRAY JOIN arrayEnumerate(filtered_a) AS num
)
group by fm_el
Монстр. Может есть более короткое решение? -
Всем привет! Ищу человека, который сможет проконсультировать по разворачиванию clickhouse (конечно за деньги).
Что у нас по данным:
Сейчас 5-10млн строк в день добавляется и потом по этим данным строятся запросы/отчеты, но будет со временем сильно больше. Уже не хватает тестового инстанса развёрнутого на 12GB RAM с дефолтными настройками (например на group by памяти не хватает)
Что хочется обсудить:
– Какой инстанс и какие настройки подойдут под наши задачи?
– Разворачивать самим или взять в яндекс.облаке или где-то ещё?
– Как настроить бекапы?
– Какими мониторингами стоит сразу обложиться?
– Как обслуживать в дальнейшем? -
SELECT arrayFilter((x, y) -> (y <= 6), sumMap(a, b).2, sumMap(a, b).1)
FROM
(
SELECT
[3, 6, 8, 6, 10] AS a,
[1200, 2753, 5000, 2000, 4240] AS b
) -
> – Как настроить бекапы?
https://altinity.com/blog/introduction-to-clickhouse-backups-and-clickhouse-backup
> – Какими мониторингами стоит сразу обложиться?
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-monitoring
> – Разворачивать самим или взять в яндекс.облаке или где-то ещё?
Можно так же посмотреть в сторону нашего облака и пообщатся с @AurimasJ :)
https://altinity.com/altinity-cloud-test-drive/Introduction to ClickHouse Backups and clickhouse-backupThis article will explore the plumbing involved in backing up ClickHouse and introduce the clickhouse-backup tool for automating the process.
-
Нужна помощь с какой-то непонятной магией. Создаю внешний словарь и Postgres, в таблице-источнике есть поле r$code. Если я это поле прописываю в имя атрибута, то все работает. Если я хочу сделать псевдоним и прописываю поле в expression, то словарь создается, но при загрузке словаря ClickHouse добавляет ` вокруг этого поля и запрос к постргесу падает. Если в имени поля нет $, то все работает. Если создавать словарь через XML-файл, то все работает. Ошибка выглядит так: COPY (SELECT "code", (`r$code`) AS "up", (term) AS "name”… (HINT: No operator matches the given name and argument type. You might need to add an explicit type cast.). Вопрос, как избежать добавления `?
-
Телеграм распарсил ` как признак кода, простите 🙂
-
а найти человека который назвал поле r$code и гвоздиком ему на темечке написать "переименуй", никак нельзя? ;)
-
он уволился в 2007 году
-
Ахах
-
Самое безболезненное наверное будет создать VIEW на стороне постгреса и там переопределить это поле.
Ну и написать баг репорт в гитхаб -
Да, я так и сделал, просто думал, что я неправильно готовлю запрос на создание словаря. Спасибо!
-
в общем это конечно похоже на баг, но очень специфический...
по идее конечно должно быть "r$code" вместо одинарных кавычек
сделайте issue с примерами структуры таблицы и того как словарь создаете -
не, просто скорее всего код который кавычки ставит из MySQL или еще откуда то более общего места перекочевал...
-
-
нет смысла
-
-
External dictionaries from Postgres: alias with $ is wrapped with wrong quotes · Issue #25622 · ClickHouse/ClickHouse
Describe the bug Postgres table is used as a source for CH external dictionary. The table contains field with $ in the name (r$code). During dictionary creation this field is intended to have an al...
-
-
мб кодеки на сжатие данных помогут временно
-
фактически PARTITION BY
это выражение по которому считается ПРЕФИКС в имени директории для каждого парта, в подпапке /var/lib/clickhouse/data/db/table/
больше ничего, дальше если можно быстро вычислить партиции из запроса просто только этот префиск и используется при сканировании партов
отдельное поле конечно нафиг не нужно, вы ведь в запросах все равно будете использовать WHERE old_field ... -
-
ClickHouse/ClickHouse tagged: v21.5.7.9-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.5.7.9-stable
Release notes:
v21.5.7.9-stableRelease v21.5.7.9-stable · ClickHouse/ClickHouseClickHouse stable release v21.5.7.9-stable
-
Всем привет, вопрос про kafka engine.
В кафку продюсится около 150к сообщений, по размеру они все сильно разные.
При создании таблицы КХ начинает очень хорошо консумить, начиная с 5кк сообщений, но потом падает до 20к.
CREATE TABLE IF NOT EXISTS logs.k8s_logs_kafka_queue (
`hostname` String,
`pod_namespace` String,
`stream` String,
`date` String,
`container_name` String,
`pod_name` String,
`message` String)
ENGINE = Kafka
SETTINGS kafka_broker_list = 'kafka.xxx:9092',
kafka_topic_list = 'k8slogs',
kafka_group_name = 'clickhouse_k8slogs_consumer',
kafka_num_consumers = 8,
kafka_thread_per_consumer = 1,
kafka_format = 'JSONEachRow';
Но самое интересное что на хосте метрика сетевки говорит что RX утилизируется ~ 700Mbps
И без параметра kafka_thread_per_consumer = 1 после хорошего консуминга с кафки стала 0, даже 10к сообщений не консумит
погрепал тут сообщения по кафке, но чето так и не увидел какой то "серебрянной пули" и в какую сторону копать чтобы это работало. -
Ну @BloodJazMan вы конечно правы в данном контексте. Но я всё равно дополню, глаз режет формулировка "больше ничего кроме как префикс", вобщем то замените toYYYYMM на toYYYYMMDD и получите что парты разных дней не мержатся по понятной причине. Ну и действительно ли вы не будете использовать в запросах хотя бы where event_date=today()? Мы вот используем. Вобщем, @ufaweb , желаю дополнить что в вашем контексте всё правильно @BloodJazMan сказал, но будьте внимательны при будующих кейсах, не обязательно будет так же )
-
ClickHouse/ClickHouse tagged: v21.3.13.9-lts
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.3.13.9-lts
Release notes:
ClickHouse lts release v21.3.13.9-ltsRelease v21.3.13.9-lts · ClickHouse/ClickHouseClickHouse lts release v21.3.13.9-lts
-
типичный кейс - что-то сделать с данным которые были записаны за прошедщий день, в запросе where created_at between '01-01-2021 00:00:00' and '01-01-2021 23:59:59', если я правильно понимаю то оптимизатор запросов кликхауса поймет что надо брать только ту партицу которая нужна (в определии таблицы собственно указано партишин бай toyyyymm(created_at)
-
спасибо что дополнили, про то что мержи parts делаются только внутри partitions я забыл упомянуть
и что важно чтобы PARTITION BY разбивал ваши данные равномерно
и что важно чтобы один INSERT не пробовал создавать parts больше чем в 100 partitions за раз -
Привет. Подскажите, если в кх создать табличку, где ключ - datetime, а в значениях есть колонка типа string и datetime, если класть строки с разными ключами, но при этом в колонках со "значением" будут одинаковые значения, то кх будет дублировать эти данные на диске или нет?
-
Дублировать будет, но чем больше одинаковых значений подряд, тем лучше будет работать сжатие. Можно сделать тип колонки LowCardinality(String), тогда значения будут закодированы в словари, будет мало места занимать
-
к сожалению не смогу сказать точно настолько ли кликхаус умен, ибо у меня везде отдельная колонка date и партиционируемся по ней и не могу проверить (((
можете сказать set send_logs_level = 'trace' и проверить
вот так будет если да ( таблица с partition_key toYYYYMMDD(date) ):
SELECT count()
FROM ****.****
WHERE toYYYYMMDD(date) = toYYYYMMDD(today())
<Information> executeQuery: Read 1 rows, 4.01 KiB in 0.016716746 sec., 59 rows/sec., 239.75 KiB/sec.
вот так если нет (та же таблица)
SELECT count()
FROM ****.****
WHERE toYYYYMMDD(timestamp) = toYYYYMMDD(today())
<Information> executeQuery: Read 252509822 rows, 963.25 MiB in 4.144599248 sec., 60925027 rows/sec., 232.41 MiB/sec -
Челики, никто не знает есть ли такой SQL гуи клиент (для макоси) который позволяет строить кастомные вьюхи и сохранять их. Например определенный селект который я часто смотрю. Но как бы сохранять внутри клиента (и отображать как типа виртуальную сущность) а не создавать реальный VIEW в таблице - этого не надо!! потому что их хер отредактируешь в пг например
-
metabase
-
не знал что у них есть мак апп, спасибо
-
-
Подскажите, а как вообще может вылезти такая дата, если в запросе её нету?
-
-
в кликхаусе по дефолту в JOIN используется пустое значение а не Null для записей ненашедших совпадений.
-
1. беру пустое значение
2. даты такой в таблице вообще нету -
1970 это дефолтное значение для даты
-
замените FULL JOIN на INNER
-
Но мне FULL JOIN нужен.... Проблема только с одной таблице из десяти
-
Это не проблема, просто эта строка не нашла себе пару, тк у вас FULL JOIN, 1970 это дефолтное значение для таймстампа
-
добавьте в конце запроса
SETTINGS join_use_nulls=1 -
Здравствуйте! Имею кликхаус кластер состоящий из 2-х шардов, есть дистрибьютед таблица аггрегирующая данные с обоих. Захожу на один шард, запускаю clickhouse-client и делаю селект из дистрибьютед таблицы. Результат: DB::Exception: default: Authentication failed: password is incorrect or there is no user with such name.
Подскажите, плз, в чем тут мб проблема? -
Authentication failed, гугл переводчик
-
а какого пользователя использует clickhouse-client ?
-
думаю, в remote_servers у вас не указан юзер/пасс
-
не указан, но и без него все работало.. хочу понять почему теперь не работает
-
а что изменилось после того момента, когда это работало?
-
-
так а почему с дефолтным пользователем 'default' и дефолтным паролем '' не получается сделать селект из дистрибьютед таблицы если для реплик в remote_servers.xml не указан пользователь и пароль? Менялась версия кликхауса с 20.5 на 21.3 - там теперь такое поведение?
-
Привет!
Подскажите такой момент, на сколько мне известно clickhouse-server сам следит за изменениями конфигурационных файлов и применяет изменения на лету.
Я добавляю в users.xml -> <database_atomic_wait_for_drop_and_detach_synchronously>1
В запросе вижу, что изменения применились:
SELECT value
FROM system.settings
WHERE name LIKE '%synchronously'
┌─value─┐
│ 1 │
└───────┘
Но при этом если удалить таблицу с движком ReplicatedMergeTree, то данные из Zookeeper будут подчищены когда пройдет таймаут database_atomic_delay_before_drop_table_sec.
Получается database_atomic_wait_for_drop_and_detach_synchronously не отработал и при удалении таблицы не был подставлен модификатор SYNC.
Если рестартануть clickhouse-server, то настройка применится и при удаление таблицы ReplicatedMergeTree будут сразу подчищаться данные из Zookeeper.
Это баг или фича? :)
ClickHouse 21.4.3.21 -
лог завален вот такой ошибкой:
2021.06.23 16:32:00.720411 [ 69 ] {} <Error> bool DB::DNSResolver::updateCacheImpl(UpdateF &&, ElemsT &&, const DB::String &) [UpdateF = bool (DB::DNSResolver::*)(const Poco::Net::IPAddress &), ElemsT = std::__1::unordered_set<Poco::Net::IPAddress, std::__1::hash<Poco::Net::IPAddress>, std::__1::equal_to<Poco::Net::IPAddress>, std::__1::allocator<Poco::Net::IPAddress>> &]: Code: 198, e.displayText() = DB::Exception: Cannot getnameinfo(::ffff:10.210.2.1): Name or service not known, Stack trace (when copying this message, always include the lines below):
0. ? @ 0x8594874 in /usr/bin/clickhouse
1. ? @ 0x8596253 in /usr/bin/clickhouse
2. DB::DNSResolver::updateAddress(Poco::Net::IPAddress const&) @ 0x85989db in /usr/bin/clickhouse
3. bool DB::DNSResolver::updateCacheImpl<bool (DB::DNSResolver::*)(Poco::Net::IPAddress const&), std::__1::unordered_set<Poco::Net::IPAddress, std::__1::hash<Poco::Net::IPAddress>, std::__1::equal_to<Poco::Net::IPAddress>, std::__1::allocator<Poco::Net::IPAddress> >&>(bool (DB::DNSResolver::*&&)(Poco::Net::IPAddress const&), std::__1::unordered_set<Poco::Net::IPAddress, std::__1::hash<Poco::Net::IPAddress>, std::__1::equal_to<Poco::Net::IPAddress>, std::__1::allocator<Poco::Net::IPAddress> >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) @ 0x8598431 in /usr/bin/clickhouse
4. DB::DNSResolver::updateCache() @ 0x859746e in /usr/bin/clickhouse
5. DB::DNSCacheUpdater::run() @ 0xe8908fc in /usr/bin/clickhouse
6. DB::BackgroundSchedulePoolTaskInfo::execute() @ 0xe86a830 in /usr/bin/clickhouse
7. DB::BackgroundSchedulePool::threadFunction() @ 0xe86c827 in /usr/bin/clickhouse
8. ? @ 0xe86d5f2 in /usr/bin/clickhouse
9. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0x852dabf in /usr/bin/clickhouse
10. ? @ 0x85315e3 in /usr/bin/clickhouse
11. start_thread @ 0x9609 in /usr/lib/x86_64-linux-gnu/libpthread-2.31.so
12. __clone @ 0x122293 in /usr/lib/x86_64-linux-gnu/libc-2.31.so
(version 21.3.12.2 (official build)) -
Hi
-
скорее баг чем фича
-
Кто может поделиться опытом наката долгих скриптов?
Условния наката: 1 сервер кликхауса, накат идет через liquibase. По времени наката пока ограничений нет, т.е. даже долгий накат одного скрипта сейчас возможен.
В идеале получить синхронный накат, чтобы скрипты отрабатывали последовательно.
Сейчас сделал отдельный профиль, для наката и там переопределил настройки
mutations_sync = 2
lock_acquire_timeout = 600
Один из примеров, таблица на 2-3кк строк, было создано несколько колонок с таймерами, теперь рещено их объединить в одну. Для этого надо скопировать старые значения с новую колонку.
ALTER TABLE events
UPDATE dutaion = event_timer
WHERE type = 'event_timer';
Скрипт очень долго выполняется и отваливается по таймауту.
Подскажите если есть прямое решение такой проблемы, либо в какую сторону смотреть, чтобы понять процесс обновления схемы бд -
alter table ничего не блокирует
он просто ждет когда тред на мутацию в фоне выполнится
объем данных прочитанный \ записанный при мутации зависит от WHERE
мутация это принудительное перечитывание и перезаписывание всех партов в которых есть event_timer
сколько у вас данных в таблице? -
сейчас около 4 млн записей
-
при обновлении схемы обычной бд, например постгреса, каждый скрипт выполняется последовательно, тоже самое сделал и для кликхауса, но сейчас уперся в то, что скрипт может выполняться достаточно долго. Пытаюсь понять, как вычислить это "долго", кроме эксперементов (может отслеживать процесс мутации).
-
-
#помогу #продажи #маркетинг
Хотите увеличить продажи вашего сайта?
Проект Digital Association это ваш навигатор в сфере маркетинга, мы точно знаем что для бизнеса важны ❗️продажи❗️, а не трафик и заявки.
Проведем диагностику вашего сайта и конкурентной ситуации в Яндекс.Директ, и это ДАРОМ!.
В результате вы получите:
✅ мы поставим бизнес-цели
✅ посмотрим ваших конкурентов в рекламной системе Яндекса и на сколько они активны
✅ оценю готов ли ваш сайт к продвижению
✅ при предоставлении доступа в рекламный кабинет проведу диагностику рекламных кампаний и аналитических данных Яндекс Метрики.
✔️ Чтобы записаться на ДАРМОВУЮ консультацию пишите @sementarget, и мы определим удобное время. -
Если версия ch не слишком старая и движки бд Atomic, используйте макросы при создании таблиц.
Тогда создание новой таблицы не будет требовать удаления метаданных со стороны zookeeper.
upd: я про макрос uuid конкретно - 24 June 2021 (107 messages)
-
DROP TABLE db.table SYNC;
-
-
ну видимо при загрузке данных сконвертиловалось... в актуальную таймзону...
данные в MSSQL в каком time zone писались?
в MSSQL случайно unixtimestamp нет ? -
Добрый день, подскажите плз а есть возможность из одной таблицы перелить данные в другую чисто одной командой ? структура одинаковая, в рамках одного КХ
-
insert into <destination_table> select * from <source_table>;
-
о круто, спасибо большое
-
В MS SQL данные типа datetime без таймзоны, такое подозрение, что CH увидел дату когда была другая разница с UTC и сдвинул на час данные
-
спасибо огромное
-
Разобрались - это все похоже из-за перевода на час времени в России в 2014 году. Дата/время в 2013 смещается на +1 час к текущей таймзоне. Вот запрос:
SELECT
timezone(),
toDateTime('2013-05-01 00:00:00', 'Asia/Vladivostok') - toDateTime('2013-05-01 00:00:00'),
toDateTime('2015-05-01 00:00:00', 'Asia/Vladivostok') - toDateTime('2015-05-01 00:00:00') -
ну да, ну вам надо тогда добавить timezone при импорте
чтобы то что выдает MSSQL было правильно интерпретируему -
-
мне кажется это в ci/cd автоматом из master бранча генерится
-
никто не подскажет по этой теме? 😰
-
Попробуйте тегнуть Михаила Филимонова, может он Вам подскажет что-то
-
FAQ смотрели? https://altinity.com/blog/clickhouse-kafka-engine-faqClickHouse Kafka Engine FAQ
Kafka is a popular way to stream data into ClickHouse. ClickHouse has a built-in connector for this purpose -- the Kafka engine. This article collects typical questions that we get in our support cases regarding the Kafka engine usage. We hope that our recommendations will help to avoid common problems.
-
нет нельзя.
но можете сначала SELECT * FROM system.macros сделать в приложение
потом в приложении сконструировать запрос CREATE TABLE ... с нужными значениями макросов
а какой у вас Use case?
зачем вам разные имена таблиц в зависимости от макроса?
и какой у них будет движок? -
Организация кросс-репликации без заморочек с приложением
-
И тут есть набор тем: https://kb.altinity.com/altinity-kb-integrations/altinity-kb-kafka
-
Спасибо, а эти темы актуальны для версии 20.10.Х ?
Q. What configuration options can be adjusted?
Q. How can I configure a Kafka engine table for the maximum performance? -
непонятно, что такое "кросс репликация"?
ReplicationMergeTree между датацентрами?
ну так там нужно чтобы имена таблиц были одинаковые как раз
и разные имена для макроса replica который надо использовать в параметрах при создании... -
Где то видел, что чето тюнили с kafka engine
-
Второй вопрос нет, это уже было добавлено в конфигурацию по умолчанию с 20.5+
-
Кросс-репликация, она же circular replication, о которой есть статья на сайте Altinity. Нужно, чтобы на каждом сервере были соответствующие database_name и т.д.. Вот макросами можно было бы делать это через простой инструментарий.
-
Лучше не делать такого
-
одно не понятно, че так много трафика на КХ хосте с кафки
-
а какой в этом смысл?
я понимаю там еще для MySQL master-master через circular replication люди пытаются нагородить
но для clickhouse это бессмысленно
как минимум объем данных которые будете хранить будет больше, а производительность меньше... -
Может у Вас есть "битые" сообщения с Kafka и пока не пофиксите их может не консьюмить.
kafka_skip_broken_messages не пробовали задавать? -
кажется что в дебаг логах КХ битые сообщения отобразились бы или я не прав?
-
Если он у Вас включён
-
Да, конечно, дебаг лог включен
-
Объем данных зависит от количества копий, а количество копий будет одинаковым.
С другой стороны, при тройной репликации по стандрартной схеме, допустим, на 9 серверах, у нас данные для distributed таблиц будут распределены на три сераера. При кросс-репликации данные можно распределить на 9-ти серверах и реплики хранить на соседних. В этом случае, мы не потеряем в скорости скриптов и при отказе одного сервера недостающий кусок данных возьмется с соседнего. -
-
Всем привет!)
Вопрос по оптимизации.
Есть запрос SELECT ta.val, tb.val
FROM
ta, tb
WHERE
ta.a BETWEEN tb.a and tb.b;
Таблица tb содержит диапазон UInt32 - a,b и соответствующие значение val. Ищем вхождение ta.a в диапазон и выводим результат.
Запрос чертовски тормозной... 1500 из ta записей за 5 минут. Размер tb - 3М записей.
Куда покопать? (словари смотрел - даипазоны не умеет, хотя есть хак. скорость сопоставима) -
ну. запрос тормозной потому что сначала ta + tb JOIN делается
в памяти а потом только фильтрация
какой объем данных в tb в байтах несжатых? -
если верить дбиверу 65мб, но это я так понимаю пожатых..
-
Здравствуйте! требуется перекодировать geo_id в название страны.
в YQL делаю так: Geo::RoundRegionById(CAST (geo_id AS Int32), "country").name as country_0,
а как сделать это в CH? -
и как такое порешать? держать отдельную таблицу с хешами или типа того и обновлять ее по уникальным значениям из ta?
-
-
SELECT * FROM system.tables WHERE name='tb'
-
ну можно попробовать сделать из второй таблицы словарь
и вместо JOIN
через ta, tb
делать
SELECT ta.val, dictGet( ...)
FROM
ta
WHERE ta.a BETWEEN dictGet() AND dictGet() -
Привет всем. Помогите пожалуйста. Я сделал DETACH "ALTER TABLE domain DETACH PARTITION tuple(toYYYYMM(toDate('2021-06-23')))" на локальном а на серваке хочу сделать ATTACH "ALTER TABLE domains_db.domain ATTACH PARTITION tuple(toYYYYMM(toDate('2021-06-23')))", а сервер выдает ошибку. SQL Error [226]:
-
а партицию то физически перенесли?
там кроме номера ошибки еще бы и текст ошибки полный показать -
SQL Error [226]: ClickHouse exception, code: 226, host: 127.0.0.1, port: 57392; Code: 226, e.displayText() = DB::Exception: Marks file '/var/lib/clickhouse/store/309/309f1b42-699e-45dc-ba03-f4722a4cc2e7/detached/attaching_202106_13196_19583_12/zone.mrk' doesn't exist (version 21.1.7.1 (official build))
-
какая версия clickhouse локально?
ну и файл то есть или нет? после того как DETACH PARTITION на локальном сделал? -
в папке нет файл zone.mrk а есть файл zone.mrk2
-
версия на локале ClickHouse client version 21.6.5.37
-
И партиции перенес
-
А чем не подошел словарь с range_hashed? https://kb.altinity.com/altinity-kb-dictionaries/altinity-kb-range_hashed-example-open-intervals
-
mrk2 это mrk но с адаптивной гранулярностью...
странно что на 21.1 она это распознать не может ее вроде давно ввели...
на удаленном сервере -
Час назад
-
А другие парты в этой таблице имеют какие файлы?
mrk или mrk2 -
мб вам нужно миксед гранулярити включить
-
Во всех папках mrk2
-
В таблице назначения?
-
да
-
А покажите все файлы в той партиции
-
Там много папок с партициями
-
Я про которая не может присоединится
-
checksums.txt count.txt domain.bin lastupdate.bin minmax_lastupdate.idx primary.idx zone.mrk2
columns.txt default_compression_codec.txt domain.mrk2 lastupdate.mrk2 partition.dat zone.bin -
А овнер у файлов какой?
-
Не знаю если честно.
-
ls -alh some_path/*
-
апну простой вопросик)
-
Ну да, все вставки КХ через ЗК координирует..
-
ок, попробуем так сделать
-
друзья, подскажите, пожалуйста,
пробую оставить коммент к таблице по доке https://clickhouse.tech/docs/en/sql-reference/statements/create/table/#comment-table
CREATE TABLE test.users ON CLUSTER '{cluster}'
(
id Int32
)
ENGINE=ReplicatedMergeTree()
COMMENT 'test'
PARTITION BY tuple()
ORDER BY tuple();
получаю
Code: 62, e.displayText() = DB::Exception: Syntax error: failed at position 101 ('COMMENT') (line 6, col 1): COMMENT 'test'
PARTITION BY tuple()
ORDER BY tuple(). Expected one of: PRIMARY KEY, end of query, AS, INTO OUTFILE, OVER, TTL, ORDER BY, SETTINGS, PARTITION BY, SAMPLE BY, FORMAT (version 21.3.12.2 (official build))
К колонкам без проблем добавляется. Что делаю не так? -
используете не ту версию КХ?)
-
-
версия clickhouse старая, эту фичу в 21.6 ввели
https://github.com/ClickHouse/ClickHouse/commit/99e2f83c690e534d8446474a999d0178ff056a5bMerge pull request #23548 from ucasFL/table-comment · ClickHouse/ClickHouse@99e2f83Implement table comments
-
-
Добрый день, вопрос по работе ODBC:
При импорте словаря через ODBC для колонок с типом DateTime64 происходит что-то не понятное.
А именно: даты при SELECT из этого словаря отображаются корректно, но сравнить такую дату с любым другим DateTime уже не получается
CREATE DICTIONARY dict_test_64_odbc(
id Int8,
d64 DateTime64
)
PRIMARY KEY id
LAYOUT(FLAT)
SOURCE(ODBC(DB 'some' TABLE 'test_table' CONNECTION_STRING 'DSN=someDSN'))
LIFETIME( MIN 600 MAX 1200)
;
SELECT
t.id,
t.d64,
toTypeName(t.d64),
toColumnTypeName(t.d64),
toDateTime64('2020-01-01 00:00:00', 3) as datetime_param,
toTypeName(datetime_param)
-- , less(t.d64, datetime_param)
FROM dict_test_64_odbc t;
Запрос выдает результат как на скриншоте, но если раскомментировать сравнение less(t.d64, datetime_param)
То уже кидает ошибку
DB::Exception: Wrong column in Decimal comparison (21.6.5.3) -
Связано ли это поведение с fallthrought для vDateTime64 здесь https://github.com/ClickHouse/ClickHouse/blob/e9e49a908598f6851abc9fa0c135e22a97adb4ad/programs/odbc-bridge/ODBCBlockInputStream.cpp#L141 ?ClickHouse/ClickHouse
ClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Ребят, привет! Хотел узнать, как можно оптимизировать запрос, в котором мне нужно найти максимальное значение числового поля в таблице, которая отсортирована не по это этому полю. Просто через функцию MAX(field) это выходит достаточно долго и вот спрашиваю, есть ли тут ещё какие-то варианты?
-
тип поля правильно выбрать
-
-
Тип поля в таблице?
-
-
С этим все хорошо. Тип подходящий
-
-
Растёт, но иногда пару значений могут в случайном порядке стоять
-
-
Можно попробовать навесить minmax skip index, но не уверен
-
-
https://clickhouse.tech/docs/en/sql-reference/functions/geo/coordinates/#pointinpolygon
pointInPolygon(Point, Ring)Geographical Coordinates | ClickHouse DocumentationFunctions for Working with Geographical Coordinates greatCircleDistance Calculates the distance between two points on th
-
Спасибо
-
построить MV? C недоагреггированным значением? Projections? Всё это уже попробовали и чем-то не подходит?
-
А на это нет ни у кого ответа?
-
Вот МВ попробую, скорее всего
-
как-то можно через explain увидеть будет ли использоваться projection для запроса, т.к. explain select ... не показывает различий для таблицы с и без projection при выборке, в которой данные из projection могут использоваться
-
set allow_experimental_projection_optimization=1, force_optimize_projection=1
-
в дебаг в трассе видно
-
да, спасибо, все отлично видно
-
Через python requests кто-то читает X-ClickHouse-Progress во время выполнения длинного запроса? Это можно вообще как-то сделать?
-
Коллеги, подскажите, пожалуйста.
Имеем кластер из 3-х баз ClickHouse версии 20.10.3.30 (official build) с несколькими distributed-таблицами.
Проблема №1
На одном сервере распределение памяти выглядит так:
select metric, round(value/1024/1024/1024,2) gbsize from system.metrics m where metric like 'Memory%';
metric |gbsize |
---------------------------------------------------+-------+
MemoryTracking | 64.86|
MemoryTrackingInBackgroundProcessingPool |-227.75|
MemoryTrackingInBackgroundMoveProcessingPool | 0.0|
MemoryTrackingInBackgroundSchedulePool | 0.0|
MemoryTrackingInBackgroundBufferFlushSchedulePool | 0.0|
MemoryTrackingInBackgroundDistributedSchedulePool | 1.25|
MemoryTrackingInBackgroundMessageBrokerSchedulePool| 0.0|
MemoryTrackingForMerges | 236.9|
На двух других картина такая:
metric |gbsize|
---------------------------------------------------+------+
MemoryTracking |117.58|
MemoryTrackingInBackgroundProcessingPool | -1.8|
MemoryTrackingInBackgroundMoveProcessingPool | 0.0|
MemoryTrackingInBackgroundSchedulePool | 0.0|
MemoryTrackingInBackgroundBufferFlushSchedulePool | 0.0|
MemoryTrackingInBackgroundDistributedSchedulePool | 0.77|
MemoryTrackingInBackgroundMessageBrokerSchedulePool| 0.0|
MemoryTrackingForMerges | 3.68|
1. Что за странное значение MemoryTrackingForMerges = 236.9 Гб (столько памяти физически на сервере просто нет!)?
2. Что означает отрицательное значение в MemoryTrackingInBackgroundProcessingPool = -227.75 Гб?
3. Как понять, на что ушло потребление MemoryTracking = 117.58 Гб (это фактически предел доступной для ClickHouse памяти)? В system.processes нет ресурсоемких запросов.
Проблема №2
После отключения внешнего источника в distributed-таблицы продолжают идти insert'ы (судя по system.query_log и фактическому кол-ву строк в shard-таблицах). Что это за "отложенные insert'ы", как оценить их оставшееся кол-во и можно ли принудительно обнулить такую накопившуюся очередь? Рестарт баз на это никак не влияет. -
1. обновляйтесь. например 20.10.7.4 ,
Какую проблему решаете?
но MemoryTracking несоврешеннен и может уходить в минус и может врать, можно просто не смотреть на эти числа.
2. distributed работает по дефолту асинхронно, принимает инсерт кладет себе в .bin файл, потом позже пересылает в шарды
--insert_distributed_sync arg If setting is enabled, insert query into distributed waits until data will be sent to all nodes in cluster.
можно мониторить файлы .bin в каталоге таблицы, можно select * from system.distribution_queue -
-
вписать в конфиг у старой ноды все 3 ноды, убрать standalone=true
рестартовать ее -- она не будет отвечать, работать, потому что одна
стартовать две других, у них должно быть пусто в снепшотах и логах
а ну и надо в конфигах проставить разные id у всех 3х (до рестарта) -
Конфиги у всех конфиги одинаковые, за исключением myid?
И потом можно их вписать в кх? -
Проблему потребления памяти - непонятно, почему ClickHouse столько потребляет, на какие процессы/задачи?
-
Да, именно так. И не упустите из внимания что пустыми Denny сказал стартовать две новых, старая конечно должна быть с данными а то новым двум будет не откуда данные стянуть и получите просто пустой ЗК )
После того как пропишете в кх, дайте селект в system.zookeeper where path='что нибудь' для проверки что кликхаус ЗК увидел. Ещё в версии 19.17 нужен был рестарт кх для перечитывания этой части конфига. Нужен ли до сих пор не знаю ) -
сколько столько? Сколько RSS/RES в top у КХ процесса?
-
2. Принудительно обнулить/удалить эти bin-файлы можно?
-
Понял, сейчас не нужен в кх рестарт для этой части
-
если не жалко инсерты, можно удалить файлы
-
-
-
/report
- 25 June 2021 (104 messages)
-
нужна комбинация GET параметров
send_progress_in_http_headers=1&wait_end_of_query=1
тогда прогресс будет отдаваться в HTTP заголовках
но при этом будет буфферизироваться тело ответа на сервере
вам progress нужен на SELECT или на INSERT ? -
несколько лет назад у меня была похожая задача на другой БД. Я должен был определить какому оператору принадлежит огромный список телефонов. Была таблица с диапазонами. Все очень сильно тормозило. В итоге я пришел к такому решению.
Диапазоны выпрямил скриптом
была одна запись
212000 - 215000 Мухосрансктелеком
стало много
212 Мухосрансктелеком
213 Мухосрансктелеком
214 Мухосрансктелеком
215 Мухосрансктелеком
И уже с таким списком все работало быстро
условие переписывается на = и индексы работают
substring(mytel,1,3) = t.prefix -
-
нет, пока что вычисляется каждый раз
https://github.com/ClickHouse/ClickHouse/pull/23367
некоторые оптимизации готовятся тут
но непосредственно с WITH они не связаныImplement short circuit function evaluation by Avogar · Pull Request #23367 · ClickHouse/ClickHouseI 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...
-
-
Спасибо за идею, оценю кол-во новых записей, может и выгорит.
-
Пробовал, возможно где-то косякнул - скорость сравнимая была. И грузился он очень долго..
-
Попробую ещё один заход со словарём. Очень не хочется вытаскивать это в скрипты)
-
SELECT [('a',5),('b',2),('c',1)] AS a, arrayMap(x -> x.1, a) AS k, arrayMap(x -> x.2, a) v, tuple(k, v) AS unzipped
как то так... -
да, спасибо.
-
Селект
-
-
Без этого чата, я думаю, клик бы загнулся. XD
-
По трем цифрам кода (ABC/DEF) сегодня нельзя определить оператора. Таблица Россвязи уходит вглубь до 5-6 знаков. Поэтому простой словарь будет слишком большим. Но range_hashed вполне нормальных размеров получается. У меня так:
select dictGet('e164_ru','operator',toUInt64(7965),1234567);
ключ - ABC/DEF код, диапазоны как у россвязи -
это был пример приблизительный
-
сколько строк на выходе получается? много?
клиент у вас python requests?
само приложение web или CLI ? -
Много, гигабайт.
Python requests и запрос на веб. Это вопрос больше по питоновскрй части, чем по КХ, но вдруг кто делал: хочется тянуть данные или иметь прогресс одновременно -
Словарь не требует скриптов. Можно считать, что это такой способ обращения к таблице. Единственое неудобство, что требуется указать логин/пароль. Как это красиво обойти - пока непонятно. Приходится делать спец пользователя и ограничивать его права.
-
что-то непонятно, вы тащите МНОГО данных из clickhouse и при этом потом еще стараетесь это как то обработать?
а на clickhouse стороне никак обработать нельзя? -
Нет, обработки нет, я просто хочу показывать пользователю прогресс поиска, rows read/rows to read total. Да и строк на выходе может быть немного (может и не быть вовсе), но понимать пользователю эстимейт выполнения в поиске по большому интервалу было бы приятно
-
извините. я вас спросил по русски "сколько строк на выходе получается? много?"
вы ответили несколько гигабайт
про выход я имел ввиду именно результат
если результат небольшой, но сам запрос долгий
то прогресс можно через
https://t.me/clickhouse_ru/224019
смотретьSlach [altinity] in ClickHouse не тормозитнужна комбинация GET параметров send_progress_in_http_headers=1&wait_end_of_query=1 тогда прогресс будет отдаваться в HTTP заголовках но при этом будет буфферизироваться тело ответа на сервере вам progress нужен на SELECT или на INSERT ?
-
в python requests есть еще streamable
его вроде как можно доставать, но я не знаю распостраняется ли это на заголовки -
В контексте этого вопроса количества строк на выходе вообще не важно, причём это? Про заголовки мне понятно, курлом я запрос с keep alive отправляю и вижу, что приходит всё как надо. Аналогичный запрос я формирую и через питоновский requests (с опцией stream), но в том и вопрос, как параллельно получать апдейт состояния в response headers и сами данные (iter_content/iter_lines используется для чтения данных чанками)
-
По идее надо использовать async http, но и там подходящего инструментария для получения апдейтов хэдэров в процессе чтения данных не наблюдается.
-
апдейт состояния не получится получать паралельно с данными
HTTP Interface такое не позволяет
и в в stream=True врятли попадут заголовки в requests
думаю придется вам обычный socket использовать и заголовки из него читать -
Спасибо, придётся костылить драйвер
-
Из airflow периодически возникают подобные ошибки, если порестартить проходит. Кто нибудь сталкивался?
они всё-таки есть. снова эта ошибка на тех же тасках
DB::Exception: Watching task /clickhouse/task_queue/ddl/query-0000004190 is executing longer than distributed_ddl_task_timeout (=180) seconds. There are 2 unfinished hosts (0 of them are currently active), they are going to execute the query in background. Stack trace: -
Всем привет. Может кто сталкивался? Отдельно запрос отрабатывается, но стоит добавить строчку
create or replace view asna.statuses as
как начинает выдавать ошибку
Cannot detect left and right JOIN keys. JOIN ON section is ambiguous
В чем может быть дело???? я уже мозг сломал.((
(версия 21.3 LTS) -
вы пытаетесь запустить на Database Engine=Ordinal DDL запросы ALTER ... ON CLUSTER... SYNC
и оно не успевает раскатиться на кластер, потому что видимо кто-то еще паралельно вставляет данные в реплики
смотрите на запрос... -
алиасы для таблиц везде прописаны?
имена колонок содержат имена таблиц через точку?
не работает выборка из VIEW?
или создание VIEW? -
именно создание
-
алиасы прописаны везде. имена через точку.
-
тогда скорее всего баг в парсере, сможете
сделать минимально воспроизводимый пример
SHOW CREATE TABLE от всех таблиц
и запрос на CREATE OR REPLACE VIEW ...
и сделать issue на github? -
это сложновато для меня)))) но если это делается просто в dbeaver, то попробую
-
Т.е. Это можно исправить перестав записывать в момент альтера?
-
по идее да, или сконвертировать все БД в Atomic
но там свои приколы к которым надо привыкать -
Коллеги, добрый день! Есть колонка в clickhouse с типом Nullable(float32) - по ней не считается сумма, при этом даже если поставить ifnull(x,0) все равно не работает. Проверку на null делал, их нет. В чем может быть причина?
-
что значит "не считается сумма"?
sum(xxx) выдает 0 ? -
запрос выполнял в редаш, сейчас выполнил в табиксе, пишет nan
-
табикс помог, вопрос снимается) Спасибо за наводящий вопрос
-
Обычно вот так, но бывает и больше:
# cat /proc/39117/status
Name: clickhouse-serv
...
Pid: 39117
...
VmPeak: 145749736 kB
VmSize: 145749732 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 124967536 kB
VmRSS: 120994988 kB
RssAnon: 120962624 kB
RssFile: 32364 kB
RssShmem: 0 kB
VmData: 145140772 kB
VmStk: 132 kB
VmExe: 171220 kB
VmLib: 0 kB
VmPTE: 256140 kB
VmSwap: 3020784 kB -
Если таки решим удалять bin-файлы, то надо ли параллельно удалять содержимое /broken и /tmp? Или там в любом случае мусор?
-
Добрый день. кто-то наблюдает возрастание zookeeper watches на 21.3? По метрикам доходит до 30к. После рестарта сервера значение держится в рамках 200- 400 вотчей. И спустя время снова начинает расти. Проблем с репликацией, мерджами не наблюдаю. Нагрузки не критические. При этом рядом есть кластер с такой же версией и без возрастания этой метрики. znode count так же растет. Грешу на optimize table on cluster final.
-
ну по идее правильно грешите
ON CLUSTER ...
это работа с ZK через ddl_queue
плюс сами парты когда мержатся порождают в ZK движение... -
может лучше свитчнуться на SELECT .. FINAL вместо того чтобы диск гробить?
-
Тут просто виду прямую зависимость между вотчами и запросом оптимизации. Но после ручного выполнения запроса метрика возвращается в прежнее значение. Думаю что может по крону некоторые операции не успевают за 180сек... И при этом появляется эта утечка. Хз
-
Здесь больше выбирают чем пишут. И скорость выборки важнее. Решили что лучше один раз в час оптимизировать нужный парт в котором были правки. Чем всю таблицу выбирать с final
-
Всем привет!
CH гарантирует ли удаления данных из Zookeeper'a?
У себя в задаче строю materialized view с движком ReplicatedMergeTree.
Строиться по таблицам в (> 40 млн записей) раз в 2 часа, используя POPULATE.
Делаю именно перепостроение (удаляю старую вьюшку, создаю новую с POPULATE), т.к. иначе будет задействуется только блок обновлений (в запросе для построения view используются и GROUP BY и INNER JOIN)
Чтобы не было downtime решил делать через создание представления с постфиксом _tmp и ренеймом после построения с удалением старого представления:
1) создаем view_tmp
2) переименновываем view в view_for_remove
3) переименновываем view_tmp в view
4) удаляем view_for_remove
Но в этом случае приходится добавлять в имя реплики timestamp, чтобы гарантировать ее уникальность.
В связи с этим вопрос - когда буду удалять старые представления раз в 2 часа, не засру ли zookeeper целой кучей реплик?
P.S.: если видите в моем алгоритме изъян - напишите, буду рад обсудить. Возможно я что-то где-то упускаю -
Всем привет. Есть вопрос по функции s3. Поддерживает ли она урлы со схемой s3:// ? При попытке INSERT INTO FUNCTION s3('s3://bucket-name/taxonomy_1624620149.csv') получаю ошибку. В issues такую проблему не нашел
Code: 36, e.displayText() = DB::Exception: Bucket or key name are invalid in S3 URI: s3://bucket-name/taxonomy_1624620149.csv (version 21.6.3.14 (official build)) -
а если только один парт, тогда ок...
-
-
Всем привет народ. Подскажите что подтюнить можно чтобы не вылетал такой эксепшн:
<#dc9dee01> java.lang.Throwable: Code: 252, e.displayText() = DB::Exception: Too many parts (318). Merges are processing significantly slower than inserts. (version 20.8.18.32 (official build))
Ответ разрабов почитал на гитхабе по диагонали сообщение:
https://github.com/ClickHouse/ClickHouse/issues/3174#issuecomment-423435071
Интересует 5 пункт в его ответеDB::Exception: Too many parts (600). Merges are processing significantly slower than inserts · Issue #3174 · ClickHouse/ClickHouseClickHouse client version 18.6.0. Connected to ClickHouse server version 18.6.0 revision 54401. Hello all, I have been working on this issue for almost a week and still see the problem coming back....
-
рекомендуется делать инсерты не чаще раза в секунду, при этом желательно батчами побольше
-
-
Вот да, этого золотого правила пытаемся придерживаться но видимо где-то сбоить начали
-
-
-
-
-
-
-
-
-
-
-
RssFile: 32364 kB
32 GB -- все ОК -
там мусор, можно удалять
-
можно 300 поменять на 900.
Я ставлю 900, и более агресивное замедление
<parts_to_delay_insert>150</parts_to_delay_insert>
<parts_to_throw_insert>900</parts_to_throw_insert>
<max_delay_to_insert>5</max_delay_to_insert>
</merge_tree>
и до кучи останавливаю заливку если 300 партов (заливальщик проверяет и притормаживается тоже) -
А т.е вы еще на стороне заливальщика проверяете не уперлись ли в лимит и тротлите
-
-
да, я параноик
-
Я думаю иногда это очень полезно. Спасибо будем смотреть
-
КХ тоже замедляет, вот этим
<parts_to_delay_insert>150</parts_to_delay_insert>
<max_delay_to_insert>5</max_delay_to_insert> -
Настройки MergeTree таблиц | Документация ClickHouse
Настройки MergeTree таблиц Значения настроек всех MergeTree таблиц собраны в таблице system.merge_tree_settings. Их можн
-
Привет! Вроде год назад бьіл анонс, что КХ умеет (будет уметь) по TTL вьігружать даньіе на google storage, в том числе и использовать его в качестве хранилища кусков (возможно я что-то не так помню). В документации не нашол ничего, тут по чату поиск тоже ничего не дал. Что-то подобноє реализовано, куда смотреть?
-
https://kb.altinity.com/altinity-kb-integrations/altinity-kb-google-s3-gcs
https://altinity.com/blog/clickhouse-and-s3-compatible-object-storage -
А про 120 гб в
VmRSS: 120994988 kB
RssAnon: 120962624 kB
что скажете? -
я хз что это за метрики, вам сложно в top посмотеть или ps ?
-
я сколько RSS в top?
-
Спасибо, то что нужно.
-
Можно и в top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
39117 elkadmin 20 0 139.0g 115.6g 12204 S 29.5 92.2 170:05.41 clickhouse-serv -
-
Привет, друзья!
Как запретить default юзеру обращение по HTTP\API ?
Как для нового юзера разрешить общение только по HTTP\API ?
Разворачиаю БД через Altinity/clickhouse-operator
Версия 20.3.7.46
Можно ли в этом чате получить помощь по этому вопросу ?
Если это уже где-то описано в доке, то дайте пожалуйста ссылку, офф доку уже покурил https://clickhouse.tech/docs/en/operations/settings/settings-users/ , доку оператора тоже.User Settings | ClickHouse DocumentationUser Settings The users section of the user.xml configuration file contains user settings. Information ClickHouse also s
-
никак. Можно выключить http вообще как порт
-
Ясно, благодарю за ответ.
-
а зачем вам запрещать общение по http?
clickhouse-operator для мониторинга использует 8123 порт
может просто default пользователю пароль задать? -
Коллеги, добрый вечер, столкнулся с проблемой после перезагрузки и обновления одного из шардов:
SELECT count()
FROM system.replication_queue
┌─count()─┐
│ 18547 │
└─────────┘
SELECT value
FROM system.metrics
WHERE metric = 'BackgroundSchedulePoolTask'
┌─value─┐
│ 16 │
└───────┘
Кластер состоит из двух шардов без реплик, однако есть таблицы с движком Replicated. Пока увел запись на другой шард.
Подскажите, в чем причина может быть? -
как вариант... Но задача была чуть другая
-
Решил проблему, не заметил в логе сообщений на каждую таблицу:
2021.06.25 21:37:07.813047 [ 18062 ] {} <Error> logs.`.inner_id.55389c4b-9213-47b6-9fe2-da1a9eede2f1` (ReplicatedMergeTreeRestartingThread): Couldn't start replication (table will be in readonly mode): Replica /clickhouse/tables/2/logs.activity_1m_7d/replicas/10.0.9.46 appears to be already active (host: golf24, port: 9009, tcp_port: 9000, database: logs, table: .inner_id.55389c4b-9213-47b6-9fe2-da1a9eede2f1, scheme: http, ). If you're sure it's not, try again in a minute or remove znode /clickhouse/tables/2/logs.activity_1m_7d/replicas/10.0.9.46/is_active manually. Code: 224, e.displayText() = DB::Exception: Replica /clickhouse/tables/2/logs.activity_1m_7d/replicas/10.0.9.46 appears to be already active (host: golf24, port: 9009, tcp_port: 9000, database: logs, table: .inner_id.55389c4b-9213-47b6-9fe2-da1a9eede2f1, scheme: http, ). If you're sure it's not, try again in a minute or remove znode /clickhouse/tables/2/logs.activity_1m_7d/replicas/10.0.9.46/is_active manually, Stack trace (when copying this message, always include the lines below):
Удалил в zk is_active для всех таблиц для проблемного шарда. После рестарта replication_queue рассосалась. Вот только вопрос остался, что послужило возникновению данной проблемы... -
Всем привет. Подскажите пожалуйста молодому бойцу на ClickHose. Как правильно удалить все данные из таблицы. Я пользуюсь Alter Table delete но это команда работает асинхронно и не гарантирует удаление данных в нужное время.
-
DROP TABLE и создать заново таблицу?
-
Truncate, как и везде
-
Этот вариант я знаю. Но хотелось бы узнать более правельный вариант.
-
Это и есть правильный.
-
-
Если вам не трудно пример не скинете?
-
Я же скинул ссылку на доку и пример в предыдущем соообщении
Если таблица реплицирована, то
TRUNCATE TABLE <table_name> ON CLUSTER cluster -
Огромное спасибо. Помогло.
-
Всем привет, такой вопрос есть таблица A и есть матвьюха на эту таблицу которая пишет в таблицу B. Если при вставке в таблицу A вылетает ошбика
Memory limit (total) exceeded: would use 56.62 GiB (attempt to allocate chunk of 4217492 bytes), maximum: 56.62 GiB: while write prefix to view
Запись в таблицу A произошла или нет? -
неизвестно, возможно частично вставилось. Зависит от множества факторов, я могу воспроизвести любой вариант, нет, да, частично
-
А никакой возможности это контролировать нет?
-
нет, планируется внедрить атомарные вставки, приходите через год.
-
Всем привет, подскажите, а INSERT в обычную MergeTree таблицу идет асинхронно?
условно какая-то такая таблица CREATE TABLE {new_table_in_db} ({cols_sql}) ENGINE = MergeTree() ORDER BY tuple()
и дальше вставляю в нее данные INSERT INTO {new_table_in_db} VALUES ... ~ 30-60к строк
есть ли у меня вероятность, что если сразу после этого запрошу SELECT по этой таблице, я наткнусь на пустую таблицу? -
Инсерт занимает какое-то время. В интерактивной сессии может отвалиться по таймауту, но обязательно продолжит работать в фоне.
30-60к строк (не очень толстых) для кх -- пыль, должны быть видны почти мгновенно - 26 June 2021 (37 messages)
-
https://t.me/MacSoftwareFree/201
This is a channel that focuses on Mac free cracking software. They are free forever and are updated weekly.Mac software crack freeFast, lightweight and easy-to-use PDF editor Easily complete PDF editing, reading, annotating, editing text, adding photos, filling in forms, signing contracts, merging PDF documents, and encryption protection on MAC with just a few clicks, an unprecedented experience. The latest free cracked version, and it is free forever!
-
Пользуюсь python clickhouse-driver, там по таймаутат все хорошо вроде (300 секунд)
То есть я правильно понял что Insert все-таки синхронная операция? И сервер не вернёт мне ответ на клиент, пока вставка не будет завершена (я так понял что не для всех движков таблиц это верно, где-то вставка асинхронная) -
Да. И да, некоторые движки/настройки могут аффектать сие поведение.
-
-
Разница будет только в случае включения настройки ttl_only_drop_parts, тогда кх сможет дропать парты сразу, а не сканировать и фильтровать, что бесплатно
-
Но в этом случае TTL по сути будет немного увеличен до того же порядка, что и ключ партиционирования. В смысле если TTL в днях, а ключ партиционирования toYYYYMM, то записи будут жить до конца месяца, верно?
-
Да, ну если TTL в днях, скорее всего вам и месячные партиции могут быть не нужны
-
Недельные-дневные
-
-
Всем привет. Помогите правильно мигрировать данные из одной таблицы в другую. Но нада мигрировать те данные которых нет в другой таблице. Данных в таблице назначения около 300 милион а таблице из которого нужно мигрировать 10000 постоянно, потом эти данные удаляются и заполняются новыми. Я написал такой запрос "insert into table1 (col1,col2) select tt.col1, tt.col2 from table_temp tt where tt.col1 not in (select t1.col1 from table1 t1)" но этот запрос работает очень долго. Сложность квадратичная.
-
.
-
Всем привет. Помогите правильно мигрировать данные из одной таблицы в другую. Но нада мигрировать те данные которых нет в другой таблице. Данных в таблице назначения около 300 милион а таблице из которого нужно мигрировать 10000 постоянно, потом эти данные удаляются и заполняются новыми. Я написал такой запрос "insert into table1 (col1,col2) select tt.col1, tt.col2 from table_temp tt where tt.col1 not in (select t1.col1 from table1 t1)" но этот запрос работает очень долго. Сложность квадратичная.
-
Почему квадратичная? Просто надо сначала всё прочитать из таблицы table1, потом прочитать из table_temp и пофильтровать
-
-
У меня такое ощушения что можно делать быстрее но не знаю как
-
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-data-migration
Мигрируйте по партициям -
Там человеку надо поинсертить только то, чего в таблице нет
-
попробуйте вставить все. а потом дедупликацию запустить. но только не всей таблицы. а только измененных партиций.
-
Правильно.
-
Хотелось бы по точнее узнать как. Я новичок в Clickhouse
-
ищите в доке команду optimize
-
-
Спасибо.
-
Я протестировал OPTIMIZE. С маленькими данными все нормально работает. но при больших данных, около 300 милионнов строк возникает ошибка.
SQL Error [159]: ClickHouse exception, code: 159, host: localhost, port: 8123; Read timed out -
-
в примерах не было я даже не знаю как их указывать
-
OPTIMIZE TABLE table1 FINAL DEDUPLICATE BY col1, col2 , col3;
-
-
-
Это клиент по таймауту отпадает. Но оптимайз идёт в бекграунде, вроде
-
Optimize проходит после 3 попыток и в каждый раз бросает ошибку
-
-
Дайте ему быстрый и честный бан
-
Это мне что ли?
-
всем привет. что можно с этим сделать ?
DROP TABLE IF EXISTS job_posts.final_job_posts;
RENAME TABLE job_posts.final_job_posts_tmp TO job_posts.final_job_posts;
и получаю
DB::Exception: WRITE locking attempt on "job_posts.final_job_posts_tmp" has timed out! (120000ms) Possible deadlock avoided. Client should retry.. -
Possible deadlock avoided. такое я встречал. правда, в другом контексте. лечил рестартом )
-
Ну в логе ж написано) уже есть мутация, которая не до конца выполнилась, а когда новая мутация пришла на таблицу, то по таймауту старая не завершилась и вот и эксепшн
select * from system.mutations where table = '...' and is_done = 0 - 27 June 2021 (16 messages)
-
добрый день.
CREATE TABLE job_posts.final_job_posts_tmp
ENGINE = MergeTree()
ORDER BY id
SETTINGS index_granularity = 8192 AS
SELECT * FROM job_posts.job_posts
далее делаю DROP TABLE IF EXISTS job_posts.final_job_posts;
удаляются обе job_posts.final_job_posts_tmp и job_posts.final_job_posts; -
-
а можно как то запретить КХ мерджить парты?
-
SYSTEM STOP MERGES
-
start потом сделать не забудьте
а вам это зачем? у вас что-то случилось? -
в новых версиях можно на определенных дисках запретить мержить парты
-
Added `disable_merges` option for volumes in multi-disk configuration by excitoon · Pull Request #13956 · 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...
-
как всегда :)
что то накапливает память, пытаюсь отследить, мерджи слишком много шума вносят -
Пасиб, про SYSTEM я и забыл
-
есть глобальный memory profiling
<!-- memory profiling for each query, dump stack trace when 1MiB allocation with query_id not empty
Whenever query memory usage becomes larger than every next step in number of bytes the memory profiler
will collect the allocating stack trace.
Zero means disabled memory profiler.
Values lower than a few megabytes will slow down query processing.
-->
<memory_profiler_step>1048576</memory_profiler_step>
<!-- Small allocations and deallocations are grouped in thread local variable and tracked or profiled only
when amount (in absolute value) becomes larger than specified value.
If the value is higher than 'memory_profiler_step' it will be effectively lowered to 'memory_profiler_step'.
-->
<max_untracked_memory>1048576</max_untracked_memory>
<!-- Collect random allocations and deallocations and write them into system.trace_log with 'MemorySample' trace_type.
The probability is for every alloc/free regardless to the size of the allocation.
Note that sampling happens only when the amount of untracked memory exceeds 'max_untracked_memory'.
You may want to set 'max_untracked_memory' to 0 for extra fine grained sampling. -->
<memory_profiler_sample_probability>0.01</memory_profiler_sample_probability>
и потом через system.trace_log
пробуем посмотреть где больше всего памяти аллоицируется
https://github.com/Slach/clickhouse-flamegraph/
если probability чуть побольше поставить чем 0.01 можно попробовать поймать
правда наверное это все таки будет аффектить скорость выполнения запросовGitHub - Slach/clickhouse-flamegraph: CLI utility for build flamegraph based on system.trace_logCLI utility for build flamegraph based on system.trace_log - GitHub - Slach/clickhouse-flamegraph: CLI utility for build flamegraph based on system.trace_log
-
👍
-
Всех приветствую. Назрел такой вопрос, в процессе работы изменял enum, добавлял новое значение в конец.
Так вот, переносил данные на другой хост - обнаружил что старые PARTITION ругаются на то, что енум отличается. Есть идеи как с этим бороться?
У меня идея только деаттачнуть все партиции, изменить к старому виду, аттачнуть старые, после изменить к новому виду и аттачнуть новые партиции. -
/report
-
/report
-
а данных много?
если нет, то можно приатачить каждый срез (набор партиций) таблицы к своей таблице со своим ddl (например по дату1 в таблицу с enum v1, с даты1 по дату2 в таблицу с enum v2 и т.д.)
позже insert select в целевую таблицу с enum vN
таким образом, вы во всех партициях поднимите версию enum до актуальной и при следующем переносе не нужно будет повторять эту рутину
но я не настоящий пользователь ch, завтра мб что получше посоветуют
к тому же у вас мб пара петабайт данных -
старые парты ругаются на хосте где был альтер? или что? какая версия КХ ?
- 28 June 2021 (122 messages)
-
-
SELECT toTypeName(your_datetime_field);
https://clickhouse.tech/docs/en/sql-reference/data-types/datetime/
есть поля с TZ есть без TZ
если поле без TZ то входящее строковое интерпретируется как время в системной TZ установленной на сервере где
SELECT timeZone()
покажет какая TZ в clickhouse для полей по умолчанию
что касается того как DataLens данные показывает, это лучше задать в поддержку Yandex Cloud сразу вопрос =)
https://console.cloud.yandex.ru/supportDateTime | ClickHouse DocumentationDatetime Allows to store an instant in time, that can be expressed as a calendar date and a time of a day. Syntax: DateT
-
Спасибо! Буду пробовать
-
20.8.9. Нет, старые парты также переносятся на новый хост, и вот на новом хосте при попытке аттача старого парта - происходит такая ошибка
-
Данных примерно 1-2 тб, (где старые енумы), рассмотрю также ваш вариант, спасибо)
-
Добрый день. Подскажите пожалуйста если в ClickHouse стандартные функции опредления GeoIP?
-
нет, но можно посмотреть в сторону ip_trie словаря
-
Благодарю
-
-
Насколько я знаю мутации выполняются на все партиции (кластер) так как они пишут таски в зукипер а на зукипер смотрят все реплики, так что скорее всего нет явной необходимости. Но могу ошибаться
-
в доке примерно это поведение описано + есть опция mutations_sync
просто столкнулись с очень странной проблемой — после переезда таблиц на реплицированный движок, мутация + последующая вставка рапортует что всё ок, а данных нет -
Всем привет, подскажите что делать с зависшими партами в replication_queue?
Code: 234, e.displayText() = DB::Exception: No active replica has part all_1965828_1989252_20297 or covering part (version 21.6.5.37 (official build))
Все ошибки на одну реплику, Attach/detach, SYSTEM RESTART REPLICAS не помогает. Replication lag растет. -
Мутации работают на шард и его реплики, где была запущена мутация (без on cluster)
У нас раньше были проблемы с on cluster, что-то висло постоянно (если отдельно на каждом шарду запускали, все ок) после обновления , ещё тогда до 20.8, вроде прошла болячка и on cluster норм начал отрабатывать -
Не совсем) там у зукипера структура ЗК нод с нумерацией шардов (0..n) и мутация на шард(все реплики) идёт.
-
Коллеги, всем привет... Не поможете с ошибкой - ранее похожие в чате были, да не такие - Received exception from server (version 21.6.5):
Code: 241. DB::Exception: Received from localhost:9000. DB::Exception: Memory limit (for query) exceeded: would use 14.90 GiB (attempt to allocate chunk of 4255066 bytes), maximum: 14.90 GiB: (avg_value_size_hint = 19, avg_chars_size = 13.2, limit = 7412): (while reading column deviceVendor): (while reading from part /var/lib/clickhouse/data/cef_storage/cef_data/20210607_996350_1040287_637/ from mark 29042 with max_rows_to_read = 7412): While executing MergeTreeReverse. - и многие пишут про параметры типа max_bytes_before_external_group_by - где ими управлять (ни в config.xml, ни в users.xml не нахожу таких) - спасибо -
настройки профайла?
-
-
-
Restrictions on Query Complexity | ClickHouse Documentation
Restrictions on Query Complexity Restrictions on query complexity are part of the settings. They are used to provide saf
-
спасибо, а ошибка Received exception from server (version 21.6.5):
Code: 241. DB::Exception: Received from localhost:9000. DB::Exception: Memory limit (for query) exceeded: would use 14.90 GiB (attempt to allocate chunk of 4255066 bytes), maximum: 14.90 GiB: (avg_value_size_hint = 19, avg_chars_size = 13.2, limit = 7412): (while reading column deviceVendor): (while reading from part /var/lib/clickhouse/data/cef_storage/cef_data/20210607_996350_1040287_637/ from mark 29042 with max_rows_to_read = 7412): While executing MergeTreeReverse. с чем может быть связана? - возникает при обращении к таблице select (при этом при обращении к ней же через view ошибки нет, но результат получаю через 700 сек) -
-
Я думаю это банально для выборки не хватило оперативки
-
-
и увеличение max_memory_usage не помогает
-
А вы точно для необходимого юзера меняете параметр?
-
Привет!
Пытаюсь скачать данные из кх по http, результат которого не влезает в оперативку машины, где установлен кх.
Подскажите это возможно сделать?
Пытаюсь обратиться вот с такими параметрами, но без результата(
http://{ch_ip}:8123/?enable_http_compression=1&wait_end_of_query=1&buffer_size=21474836480 -
Возможно этот ищью даст понимание картины в вашей ситуации
-
How to limit the memory usage but still get the query running? · Issue #8067 · ClickHouse/ClickHouse
Hello community! first of all, congrats for the great work! I find incredible the pace of releases ClickHouse has, and I think this is possible thanks to the great effort of the community contribut...
-
Спасибо.
Сам запрос выполняется, вот такие сетинги использую: -
```join_algorithm = 'auto',
max_memory_usage=107374182400,
max_bytes_before_external_group_by=21474836480,
max_bytes_before_external_sort=21474836480,
max_execution_time = 3600,
max_rows_in_join = 0,
max_bytes_in_join = 10737418240`` -
-
-
Спасибо, жаль
-
А как понимать тогда назначения параметров wait_end_of_query=1 и buffer_size= ?
-
HTTP-интерфейс | Документация ClickHouse
HTTP-интерфейс HTTP интерфейс позволяет использовать ClickHouse на любой платформе, из любого языка программирования. У
-
/report
-
Всем добрый день! Можете пожалуйста посоветовать надежную In-memory субд желательно opensource для осуществления join'ов данных из КХ?
-
trino
-
Спасибо!! Раньше не слышала оказывается о такой, поизучаем!
-
Это же бывший presto я так понял?
-
да
-
Добрый день,
не получается заставить работать пример из документации про TTL столбца https://clickhouse.tech/docs/ru/engines/table-engines/mergetree-family/mergetree/#mergetree-column-ttl
Если создать таблицу
CREATE TABLE example_table
(
d DateTime,
a Int TTL d + INTERVAL 1 MONTH,
b Int TTL d + INTERVAL 1 MONTH,
c String
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(d)
ORDER BY d;
Потом засунуть в нее
insert into example_table values ('2018-01-01 10:10:10', 1,2,'10') , ('2028-01-01 10:10:10', 1,2,'10');
То сколько ни делай OPTIMIZE example_table FINAL, числа в первой строке не превратятся в нули.
А вот без PARTITION BY toYYYYMM(d) все работает ожидаемым образом.
Вижу это в master и в 21.3
Это баг/фича/моя криворукость/что-то еще?MergeTree | Документация ClickHouseMergeTree Движок MergeTree, а также другие движки этого семейства (*MergeTree) — это наиболее функциональные движки табл
-
мержи идут внури одной партиции...
-
-
выглядит так, что у вас просто нечему мержиться
и TTL не применяется
одна строка в партиции... -
но вообще странно конечно, OPTIMIZE ... FINAL вроде все равно должен парт вычитывать и TTL применять
-
попробуйте
SET send_logs_level='trace';
OPTIMIZE table FINAL;
сравнить с PARTITION BY и без него -
select * from system.merge_tree_settings mts where name like 'ttl_only_drop_parts';
во что выставлено по умолчанию -
┌─name────────────────┬─value─┬─changed─┬─description──────────────────────────────────────────────────────────┬─type─┐
│ ttl_only_drop_parts │ 0 │ 0 │ Only drop altogether the expired parts and not partially prune them. │ Bool │
└─────────────────────┴───────┴─────────┴──────────────────────────────────────────────────────────────────────┴──────┘ -
тут вроде не TABLE TTL а COLUMN TTL ;)
но да, можно потеребонькать настроечку -
Ну я попытался, предположил что оно вообще не трогает парт когда флаг выставлен...
Но у товарища 0. Поэтому мимо -
-
-
-
Это скорее не баг, а неожиданное поведение)
Тут дело в том, что при удалении столбца целиком ничего не вычисляется, а столбец просто дропается. Но в компактных кусках (по-умолчанию до 10МБ), чтобы это сделать, нужно переписать кусок полностью, что слишком затратно, поэтому ничего не удаляется. На реальных данных компактные куски живут недолго, потому что мержаться в широкие, а на них TTL уже применяется и это поведение почти незаметно. Но на маленьких примерах выглядит так, как будто ничего не работает. Надо исправить, наверное.
Например, такое работает:
https://pastebin.com/MZQRZUq7CREATE TABLE example_table( `d` DateTime, `a` Int TTL d + toInterval - Pastebin.comPastebin.com is the number one paste tool since 2002. Pastebin is a website where you can store text online for a set period of time.
-
-
да, а может и не надо исправлять )
-
Да, заменяются только database/table.
остальные остаются макросами... -
dremio?
-
У нас кликхаус используется как основная база на критическом пути, где мы храним транзакции, не чисто аналитический солюшн. И вот дело дошло до того, чтобы выдать ее аналитикам с их произвольно написанными квирями и с непонятным профилем нагрузки. У нас два шарда, 8 боксов. Я вот думаю, можно ли как-то изолировать часть боксов чисто для аналитического использования, чтобы если они что-то завалят, то импакт на приложение был минимальный? Или так делать не надо и нужно настраивать программную репликацию в отдельный кластер? Профили для «аналитиков» мы нарисуем отдельные, но все равно страшно их пускать в базу приложения
-
Мы попробовали на двух боксах конфиги, в которых эти боксы как бы изолированы. Казалось, что репликация и вообще кластер должен сломаться, но все работает, при этом пользователи остаются в пределах этих боксов
-
Сделать отдельный инстанс для аналитиков, или машину... Но вообще есиь же RBAC и grant
-
-
-
тут видимо очень хочется чтобы чтение аналитиков не убило вставки \ чтения для основного pipeline
-
ограничьте аналитикам max_execution_time
и max_memory_usage
для начала -
Тогда я б разграничил и разбил, возможно для аналитиков вывел бы в отдельный инстанс, по сути, репликация.
Чтение аналитиков, - ну тут отчасти проблема в первичном ключе сортировки может быть :) -
-
Да, именно про это вопрос
-
Да, это первое что в голову приходит, но почему-то ещё хочется их убрать куда-то отдельно, при этом не создавая новый кластер
-
дальше смотрите за нагрузкой со стороны основной pipeline
будет тормозить стопните нагрйзку аналитики
и организуйте им отдельный cluster для distributed в remote_servers
куда будет только их чтение от них прилетать
и репликация из ReplicatedMergeTree -
Репликация replicated работает без кластеров - через зукипер. Я бы в таком случае к каждому шарду подцепил бы по 1 ноде и на них настроил бы Replicated таблицы, но в кластер эти ноды не добавлял бы. Если читаете из Distributed то сделать из этих 2 нод отдельный кластер со своими Distributed и пусть аналитики оттуда кверятся.
-
а в чем проблема то?
одни и теже хосты могут входить в разные кластера
кластера и репликация ортогональны -
Да просто сразу реализовать, кмк. :)
-
О как интересно!
-
=)
ну, IMHO степень влияния adhoc запросов часто сильно преувеличена
аналитики их делают не так часто как принято думать =) -
Фантастика какая-то, я не знала, что так можно, пошла читать, спасибо!
-
Да, но тут еще зависит и от них самих, i.e. я б задался вопросом, а почему они убивают один раз базу, если вы должным образом их не обучили, ну или же попробовать отказаться от КХ или подумать над хранением данных. Но это уже уровень более бизнесово-сеньорный :)
-
По-разному бывает, бывает что кто какой-то табло репорт рисует, а в это время графики на юае начинают тормозить
-
-
Всем привет.
У меня есть dt (UTC)|shipment_id|time_zone
Хочу посчитать распределение количества заказов по часам. Для Москвы работает toHour(shipped_at, 'Europe/Moscow'). Если в tz засунуть аргумент, то ругается. Как быть? -
Привет!
Подскажите: как сделать последовательность datetime’oв в заданном интервале.
что-то вроде timeSlots, только чтобы получить не array, а “столбец” на который потом можно поджойниться -
SELECT some_date - arrayJoin(range(toUInt16(duration+1))) as date
-
так и делайте timeslots + arrayJoin
-
Приветствую всех!
Подскажите пожалуйста, на двух нодах из 30, выполнилась внеплановая перезагрузка с такими логами:
2021.06.25 11:51:00.126556 [ 292156 ] {} <Fatal> BaseDaemon: (version 21.3.7.62 (official build), build id: 935A293066A3B70BC15412A2AC994369BDF672A9) (from thread 79272) Terminate called for uncaught exception:
Code: 24, e.displayText() = DB::Exception: Cannot write to ostream at offset 394, Stack trace (when copying this message, always include the lines below):
0. DB::WriteBufferFromOStream::nextImpl() @ 0x8711020 in /usr/bin/clickhouse
1. DB::WriteBufferFromHTTPServerResponse::nextImpl() @ 0xf8f4aa0 in /usr/bin/clickhouse
2. DB::WriteBufferFromHTTPServerResponse::finalize() @ 0xf8f5092 in /usr/bin/clickhouse
3. DB::WriteBufferFromHTTPServerResponse::~WriteBufferFromHTTPServerResponse() @ 0xf8f5726 in /usr/bin/clickhouse
4. DB::HTTPHandler::handleRequest(DB::HTTPServerRequest&, DB::HTTPServerResponse&) @ 0xf867c96 in /usr/bin/clickhouse
5. DB::HTTPServerConnection::run() @ 0xf8ed8af in /usr/bin/clickhouse
6. Poco::Net::TCPServerConnection::start() @ 0x11f983bf in /usr/bin/clickhouse
7. Poco::Net::TCPServerDispatcher::run() @ 0x11f99dd1 in /usr/bin/clickhouse
8. Poco::PooledThread::run() @ 0x120d04f9 in /usr/bin/clickhouse
9. Poco::ThreadImpl::runnableEntry(void*) @ 0x120cc35a in /usr/bin/clickhouse
10. start_thread @ 0x7ea5 in /usr/lib64/libpthread-2.17.so
11. clone @ 0xfe8dd in /usr/lib64/libc-2.17.so
(version 21.3.7.62 (official build))
2021.06.25 11:51:00.129613 [ 233384 ] {} <Fatal> BaseDaemon: ########################################
2021.06.25 11:51:00.129697 [ 233384 ] {} <Fatal> BaseDaemon: (version 21.3.7.62 (official build), build id: 935A293066A3B70BC15412A2AC994369BDF672A9) (from thread 79272) (query_id: 69c2b7d9-f866-49ca-99ad-c3b99279300d) Received signal Aborted (6)
2021.06.25 11:51:00.129738 [ 233384 ] {} <Fatal> BaseDaemon:
2021.06.25 11:51:00.129769 [ 233384 ] {} <Fatal> BaseDaemon: Stack trace: 0x7f7f6371b387 0x7f7f6371ca78 0x87d3178 0x13ae28c3 0x13ae286c 0x8616ceb 0xf8f588d 0xf867c96 0xf8ed8af 0x11f983bf 0x11f99dd1 0x120d04f9 0x120cc35a 0x7f7f63abaea5 0x7f7f637e38dd
2021.06.25 11:51:00.129873 [ 233384 ] {} <Fatal> BaseDaemon: 1. gsignal @ 0x36387 in /usr/lib64/libc-2.17.so
2021.06.25 11:51:00.129918 [ 233384 ] {} <Fatal> BaseDaemon: 2. abort @ 0x37a78 in /usr/lib64/libc-2.17.so
2021.06.25 11:51:00.129962 [ 233384 ] {} <Fatal> BaseDaemon: 3. ? @ 0x87d3178 in /usr/bin/clickhouse
2021.06.25 11:51:00.130031 [ 233384 ] {} <Fatal> BaseDaemon: 4. ? @ 0x13ae28c3 in ?
2021.06.25 11:51:00.130626 [ 233384 ] {} <Fatal> BaseDaemon: 5. std::terminate() @ 0x13ae286c in ?
2021.06.25 11:51:00.130655 [ 233384 ] {} <Fatal> BaseDaemon: 6. ? @ 0x8616ceb in /usr/bin/clickhouse
2021.06.25 11:51:00.130683 [ 233384 ] {} <Fatal> BaseDaemon: 7. DB::WriteBufferFromHTTPServerResponse::~WriteBufferFromHTTPServerResponse() @ 0xf8f588d in /usr/bin/clickhouse
2021.06.25 11:51:00.130707 [ 233384 ] {} <Fatal> BaseDaemon: 8. DB::HTTPHandler::handleRequest(DB::HTTPServerRequest&, DB::HTTPServerResponse&) @ 0xf867c96 in /usr/bin/clickhouse
2021.06.25 11:51:00.130727 [ 233384 ] {} <Fatal> BaseDaemon: 9. DB::HTTPServerConnection::run() @ 0xf8ed8af in /usr/bin/clickhouse
2021.06.25 11:51:00.130748 [ 233384 ] {} <Fatal> BaseDaemon: 10. Poco::Net::TCPServerConnection::start() @ 0x11f983bf in /usr/bin/clickhouse
2021.06.25 11:51:00.130767 [ 233384 ] {} <Fatal> BaseDaemon: 11. Poco::Net::TCPServerDispatcher::run() @ 0x11f99dd1 in /usr/bin/clickhouse
2021.06.25 11:51:00.130787 [ 233384 ] {} <Fatal> BaseDaemon: 12. Poco::PooledThread::run() @ 0x120d04f9 in /usr/bin/clickhouse
2021.06.25 11:51:00.130806 [ 233384 ] {} <Fatal> BaseDaemon: 13. Poco::ThreadImpl::runnableEntry(void*) @ 0x120cc35a in /usr/bin/clickhouse
2021.06.25 11:51:00.130831 [ 233384 ] {} <Fatal> BaseDaemon: 14. start_thread @ 0x7ea5 in /usr/lib64/libpthread-2.17.so
2021.06.25 11:51:00.130850 [ 233384 ] {} <Fatal> BaseDaemon: 15. clone @ 0xfe8dd in /usr/lib64/libc-2.17.so -
2021.06.25 11:51:00.272516 [ 233384 ] {} <Fatal> BaseDaemon: Checksum of the binary: 6335512ED027A1EA91E511FEF0C66B68, integrity check passed.
2021.06.25 11:51:21.669021 [ 292154 ] {} <Fatal> Application: Child process was terminated by signal 6.
кто нибудь сталкивался с подобным? -
посмотрите grep -r "69c2b7d9-f866-49ca-99ad-c3b99279300d" /var/log/clickhouse-server/
или в system.query_log поищите что за запрос был
еще попробуйте вот это
https://t.me/clickhouse_ru/215415Denny Crane [Junior support specialist at Altinity (NB,Canada)] in ClickHouse не тормозитпроблема в 21.4 я правильно понял? попробуйте cat /etc/clickhouse-server/users.d/dis_async.xml <?xml version="1.0" ?> <yandex> <profiles> <default> <async_socket_for_remote>0</async_socket_for_remote> <use_hedged_requests>0</use_hedged_requests> </default> </profiles> </yandex> там баг в ядрах ниже 5...чего-то
-
нашёл в query log, запрос select ничем непримечательный от других запросов
-
запрос самостоятельный? или часть distributed запроса? initial_query_id какой?
-
хотя не, это не distributed тогда бы HTTP в stacktrace не было
-
в distributed таблицу запрос выполнялся, у нас запросы по http идут
-
https://t.me/clickhouse_ru/215415
вот из "странного" могу посоветовать включить и посмотреть , но это так, квадратно гнездовым методом...Denny Crane [Junior support specialist at Altinity (NB,Canada)] in ClickHouse не тормозитпроблема в 21.4 я правильно понял? попробуйте cat /etc/clickhouse-server/users.d/dis_async.xml <?xml version="1.0" ?> <yandex> <profiles> <default> <async_socket_for_remote>0</async_socket_for_remote> <use_hedged_requests>0</use_hedged_requests> </default> </profiles> </yandex> там баг в ядрах ниже 5...чего-то
-
-
numbers | Документация ClickHouse
numbers numbers(N) - возвращает таблицу с единственным столбцом number (UInt64), содержащим натуральные числа от 0 до N-
-
Добрый день! Подскажите, для отказоустойчивости кластера из двух реплик есть необходимость ставить Zookeeper, или Ch сам справится?
-
Необходимо. Без него не заведётся репликация и ddl запросы с модификатором on cluster
-
Благодарю!
-
Добрый день! Есть ли функция для нахождения максимума среди сумм. Например есть продажи с датой и временем. И нужен максимум среди суточных сумм
-
вложенным select не то ?
-
так то да, можно вложенным, но мало ли, может функция есть
-
через массивы не получается сделать?
-
это как? каждай строка это дата-время, число. Нужен максимум из сумм за сутки
-
тебе нужна табличка в итоге
в одной колонке даты, в другой - максимальная сумма в этот день? -
табличка суммы за сутки по которой можно взять максимум за выбранный период.
-
-
ну то есть понятно как это сделать с подзапросом. Вопрос можно ли без подзапроса
-
да, и максимум с 20 по 23 - 13000
-
но 13 000 получается как сумма 2020-20-23 - 3000 + 2020-20-23 - 5000 + 2020-20-23 = 5000
-
суммы продаж за сутки и максимум продаж в сутки за период
-
-
Через оконку скорее всего можно
-
да, вопрос из разряда, вдруг замутили функцию о которой не знал 🙂 так то понятно, собрать суточные суммы, а дальше уже брать по ним средние или экстремумы
-
оконка?
-
оконная функция
-
WINDOW functions
-
почти то что нужно)
-
спасибо, поковыряю
-
спасибо! смотрю
-
Нашёл такой баг:
Есть табличка some_data (country, currency, amount_usd)
Хочу сделать на неё rollup по стране:
SELECT currency, 'ALL' as country, sum(amount_usd)
FROM some_data
GROUP BY currency
Так вот, данный SELECT возвращает 0 строк, хотя данные в таблице есть. А вот если изменить алиас country в запросе на любой другой, всё работает.
У нас не самая актуальная версия кх (20 что-то там); подскажите плиз, пофикшено ли в более поздних. -
попробуйте слово country заковычить
-
-
Да даже просто country_ прокатывает)
Хотелось узнать, известная ли это проблема и есть ли фикс - 29 June 2021 (114 messages)
-
Нет неизвестная
-
А покажите show create table?
-
-
-
Вроде бы нет, спрашивайте как есть
-
-
Юз кейс такой: аналитика по потоку ивентов. Заливаю ивенты через Buffer в MT, поверх налепил MV на AggregatingMT.
1. Не совсем понимаю зависимость между cardinality и ORDER BY - влияет ли порядок определения ORDER BY на скорость и стоит ли low cardinality ставить в начале списка?
2. Видел что люди делают PARTITION BY на почасовой основе - насколько это оправдано по сравнению с PARTITION BY toYYYYMMDD (если дано 5К событий в секунду)? -
Залезал, пойду пересмотрю ещё разок
-
Вопросы связаны с теоретическим консёрном по перформансу, в обычном контейнере CH выдаёт ~100ms на квери по вью, выполняющуюся раз в 0,5 секунды по 5М записей, что в принципе неплохо - но предела совершенству ведь нет (без PersistentVolume или прочих клеймов и SSD)
Забыл добавить что имеется TTL на 3 месяца. -
Привет всем. Кто-то сталкивался с апдейтами временной таблицы? Хотел провести манипуляцию с данными в два захода, и промежуточные данные апдейтить во временной таблице. Но оказалось
ALTER TABLE [db.]table UPDATE column1 = expr1 [, ...] WHERE filter_expr
не работает для временной таблицы. Пишет что не может найти такую таблицу. Или я что-то неправильно делаю? -
а как поменять движок database?
-
Всем привет!
Прямо сейчас начинается вебинар Яндекс.Облака "Аналитическая платформа для бизнеса", где наш архитектор рассказывает о платформе данных, основанной на ClickHouse, доступной для использования в нашем облаке: https://www.youtube.com/watch?v=CdmFxw4j_dIАналитическая платформа для бизнесаМногие компании давно используют облако для бизнес-аналитики, ведь это удобно: можно отслеживать любые метрики в режиме реального времени, строить графики и быстро делиться ими с коллегами и партнерами. Для старта достаточно простого дашборда, но со временем можно пойти дальше: комбинировать разные источники данных, хранить и обрабатывать миллионы строк в секунду. Этот вебинар о том, как строить собственное хранилище данных на базе платформы Yandex.Cloud. О чем рассказали: - Как организовать сбор и анализ данных в компании, чтобы создать внешнее хранилище данных и объединить информацию из нескольких источников. - Как загружать обновления в потоковом режиме, чтобы строить витрины и управлять жизненным циклом данных и аналитическими отчетами. - Как определить подходящую архитектуру для корпоративной аналитической системы. Кому это полезно: - Архитекторам данных и техническим директорам — чтобы выбирать подходящие инструменты и технические решения; - Дата-инженерам — чтобы лучше понимать, как реализовать…
-
коллеги доброго времени суток. Подскажите по возможному решению проблемки: Есть табличка в mergeTree, на 16 млрд строк, и мне необходимо оперативно обновить данные в одном столбце( записать одно и то же значение во все строки). update делать тут не вариант, с точки зрения возможной нагрузки на таблицу. я уже начинаю подумывать просто удалить столбец и создать его заново с новым дефолтным значением, по скорости это всяко быстрее будет
-
Создать столбец рядом column_1
Переименовать столбец column в column_old
Переименовать column_1 в column
Все это с минимальным простоем… или вообще без него зависит от нагрузки -
1. меньшую cardinality в начало списка ORDER BY хорошая идея, но не стоит тащить в primary key все подряд
2. нет смысла делать часовые партиции, сжатие упадет, для 5k событый в секунду можно и месячные партиции оставить -
на сколько я знаю в отличие от классических БД столбцевые быстро могут обновить один столбец. И если есть возможность надо тестировать в тестовой среде. А потом применять в продакшене.
-
ну если у вас реально одно значение, то так будет проще всего
будет DEFAULT который для отсуствующих данных будет константно вычисляться при чтении... и константно записываться при записи во время merge ... -
Спасибо за советы 🙏
-
Всем привет.
Кто знает как реализовать запрос WATCH в java? https://clickhouse.tech/docs/ru/sql-reference/statements/watch/WATCH | Документация ClickHouseЗапрос WATCH Важно Это экспериментальная функция. Она может повлечь потерю совместимости в будущих версиях. Чтобы исполь
-
стандартный JDBC драйвер вроде умеет
https://github.com/ClickHouse/clickhouse-jdbc/blob/ba57358766a179c67ac776851e253cd921e56067/clickhouse-jdbc/src/test/java/ru/yandex/clickhouse/jdbc/parser/ClickHouseSqlParserTest.java#L373clickhouse-jdbc/ClickHouseSqlParserTest.java at ba57358766a179c67ac776851e253cd921e56067 · ClickHouse/clickhouse-jdbcJDBC driver for ClickHouse. Contribute to ClickHouse/clickhouse-jdbc development by creating an account on GitHub.
-
Как сделать, чтоб выдавало 0, так как между 1 и 2 есть 3? Хочу сделать строгую последовательность
SELECT sequenceMatch('(?1)(?2)')(time, number = 1, number = 2) FROM t -
-
Точку между событиями сделать или? Не понятно
-
добавить кондишн
number NOT IN (1,2) -
-
Пока можно шифровать отдельные значения
Но в целом планируется и это тоже сделать
https://github.com/ClickHouse/ClickHouse/pull/24206Data encryption on VFS level by alexelex · Pull Request #24206 · ClickHouse/ClickHouseI 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...
-
спасибо
-
Спасибо
-
привет! подскажите, пожалуйста
версия кликхауса 21.2.10.48
запрос на выдачу грантов вида
GRANT ON CLUSTER cluster_name SELECT ON main_db.data TO collector_role
райзит ошибку
n: For a distributed DDL on circular replicated cluster its table name must be qualified by database name
гугление не помогло, сам текст ошибки не слишком информативен: имя бд указано
сама таблица на движке ReplicatedReplacingMergeTree -
> For a distributed DDL on circular replicated cluster
Вы циклическую репликацию используете? -
а зачем вам именно кликом шифровать?
если кто-то получит доступ к серверу, то черт сможет сделать логический дамп
SELECT * FROM db.table FORMAT Native
если же хочется бекапы с помощью каких нибудь файловых снапшотов делать
то и шифровать тогда надо средствами этих снапшотилок.... -
выходит, что так: две ноды, таблица на обеих, данные реплицируются с одной на другую и наоборот
-
А шардов у вас сколько?
-
2, но это не distributed таблица
-
У вас кстати из за этой ерунды, если селекты могут прилетать в разные ноды, то по очереди в пейдж кеш будет подниматся то одна таблица то другая, что не есть эффективно
-
спасибо за информацию. не поделитесь ссылкой в доку (или ещё куда), где про это почитать можно?
-
Да нигде, только сейчас подумал об этом.
Мб это как то хитро обрабатывается, но не уверен.
Надо смотреть как у вас в remote_servers описано это.
И мб попробовать load_balancing=first_or_random -
а как делать sync в MySql Engine?
MaterializeMySQL не предлагать, старая версия клика -
никак.
mysql engine не хранит данные в себе. а делает запрос в mysql каждый раз -
имеется ввиду table ENGINE=MySQL(...)?
если да, то там нет никакого sync, там запрос с WHERE пробрасывается непосредственно на MySQL а GROUP BY и ORDER BY делаются на стороне clickhouse
или MaterializedMySQL() ?
он работает как MySQL slave и данные в него прилетают по replication протоколу
там тоже никакого sync нет, если репликация сломалась, придется заново все данные перекачивать ( удалять и создавать базу данных) -
Спасибо за ответы @BloodJazMan @unamedrus
а если внешний словарь?
Какой-то из вариантов делает возможным реплику (с периодическими апдейтами) и чтобы все последующие операции шли только в кх? -
внешний словарь с ssd_cache layout
у вас какой объем таблицы в MySQL? -
334 мб
-
-
зарезать max_threads
уменьшить max_block_size -
Что за селект то?
-
Привет. Это нормальное поведение?
with cast(null, 'Nullable(Enum8(\'a\' = 1, \'b\' = 0))') as test
select assumeNotNull(toString(test));
┌─assumeNotNull(toString(test))─┐
│ b │
└───────────────────────────────┘
with cast(null, 'Nullable(Enum8(\'a\' = 1))') as test
select assumeNotNull(toString(test));
-- Code: 36. DB::Exception: Unexpected value 0 for type Enum8('a' = 1)
Ожидаю увидеть пустую строку в ответе в обоих случаях.
Воспроизводится в песочнице КХ на любой версии. У нас 21.3.10.1 -
А что имено узнать хотите? Если в краце то вот такой
SELECT
...
FROM
...
JOIN
...
WHERE
...
<if>
</if>
ORDER BY -
Какого размеры таблицы?
-
-
13.01 GiB
-
-
-
Я ваши примеры кстати утащу туда, если вы не против :)
-
materialize?
-
без проблем. Почитаю, спасибо. Там только, когда toTypeName/toColumnTypeName смотрел оно про константы где-то писало, так что может не полностью корректный пример; но на настоящей колонке тоже воспроизводится. Собственно оттуда вопрос и вылез, когда странный ответ запрос выдал.
-
я в строках, каждую, левую и правую в JOIN
-
Ух, а можно какой-нибудь кверик для наглядности ?)
-
ну можно словарь засунуть, но это не real time sync
это периодическая синхронизация -
а как поменять database engine?
-
SELECT count() FROM table и добавить ваши условия WHERE
-
Плюс есть куча движков на словари
-
-
тоже самое. Если имеется в виду assumeNotNull(toString(materialize(test)))
-
Direct можно заюзать как движок для словаря
-
with cast(null, 'Nullable(Enum8(\'a\' = 1, \'b\' = 0))') as test
select assumeNotNull(materialize(toString(test))); -
он нормально применим скорее для REDIS
Для MySQL получится шторм из SQL запросов 1 запрос на 1 dictGet... -
не, тут пустота получается(
хотя, если вы ее и ожидаете, то норм -
-
я ее и ожидаю. Но получаю 'b'.
-
WITH cast(NULL, 'Nullable(Enum8(\'a\' = 1, \'b\' = 0))') AS test
SELECT assumeNotNull(materialize(toString(test)))
┌─assumeNotNull(materialize(toString(test)))─┐
│ │
└────────────────────────────────────────────┘
1 rows in set. Elapsed: 0.001 sec.
оно же, не? -
оно. А версия какая? На 21.3 выдает b. В песочнице (https://play.clickhouse.tech/?file=playground) на 20.8 тоже b, а на 20.3 и 19.14 пустую строку.
-
21.2.9.41 вроде бы
-
-
а зачем вообще assumeNotNull?
-
хм, кстати, да. Конкретно у меня в данном случае enum пустой строкой не бывает, и я лишнюю проверку на пустую строку делаю. Так что да, спасибо за вопрос, лишнее условие уберу и просто на null проверку сделаю. Но если элементом enum бывает пустая строка, то удобнее было бы assumeNotNull(column) = '', а не (column is null or column = '')
-
Но если элементом enum бывает пустая строка,
Ну этой пустой строке можно 0 как значение и сделать -
assumeNotNull вернет "Неспецифицированный результат, зависящий от реализации, если исходное значение — NULL."
на это стоит обратить внимание -
об этом надо думать сильно раньше. А тогда же можно было бы и подумать о том, как не делать nullable вообще. Но что есть. Просто я всегда смело использовал assumeNotNull(), чтобы не заморачиваться, что там в этот раз прислали null или '' (0). А тут нюансы всплыли внезапно.
-
а если словарь из mysql строить так, чтобы ключ словаря в Clickhouse был первичным ключом в таблице mysql? по логике тогда сложность запросов таких будет O(1), не так ли?
-
-
посмотрите в сторону RBAC и roles
-
да, там видел возможность такую. Но пока единственным способом управления доступами для нас является старый добрый users.xml )
-
У вас старая версия?
-
-
Народ как подписаться на обновления LIVE VIEW на java? через clickhouse-client всё работает через джаву нет.
пробую так:
pstmt.execute("SET allow_experimental_live_view = 1");
он мне выдаёт: java.lang.Throwable: Code: 113, e.displayText() = DB::Exception: There is no session or session context has expired (version 21.6.5.37 (official build))
но данные в БД я добавлять могу. -
может документация какая нормальная есть? кроме этой? https://clickhouse.tech/docs/ru/sql-reference/statements/watch/WATCH | Документация ClickHouse
Запрос WATCH Важно Это экспериментальная функция. Она может повлечь потерю совместимости в будущих версиях. Чтобы исполь
-
скорее всего джава просто не умеет в них
-
а что умеет?
-
Всем привет, кто-нибудь забирал данные из кх spark'ом (jdbc)? Какие-то специальные настройки требовались? Ошибка что-то типа
java.sql.SQLException: org.apache.http.ConnectionClosedException: Premature end of chunk coded message body: closing chunk expected
at ru.yandex.clickhouse.response.ClickHouseResultSet.hasNext(ClickHouseResultSet.java:164)
at ru.yandex.clickhouse.response.ClickHouseResultSet.next(ClickHouseResultSet.java:200)
. Если сильно уменьшаю кол-во строк в запросе то всё отрабатывает, а на нужном объеме данных увы ( Может кто-то сталкивался. -
А как забираете?
-
Ничего если скрином?
-
Там удобно использовать метод с callback функцией https://github.com/ClickHouse/clickhouse-jdbc#send-data-in-binary-formatted-with-custom-user-callback
Но тогда чтение будет немного другим ClickHouseStatement -> ClickHouseRowBinaryInputStream executeQueryClickhouseRowBinaryStream(String sql) для Java 🤷♀️ -
Это close before read last data. см. https://stackoverflow.com/questions/33633549/org-apache-http-connectionclosedexception-premature-end-of-chunk-coded-message
А вне spark, на чистом public void static main этот запрос прозходит?org.apache.http.ConnectionClosedException: Premature end of chunk coded message body: closing chunk expectedI am trying out RestAssured & wrote the following statements - String URL = "http://XXXXXXXX"; Response result = given(). header("Authorization","Basic xxxx"). content...
-
добрый вечер, подскажите плз а как при создании таблицы engine=mergeTree указать сортировку ключа .... мне нужно по DESC отсортировать
-
так вроде в клике не работает, да и смысла особого нет. клик использует oreder by для упорядочивания (чтобы лучше сжатие работало) + индекс (минимальной и максимальное значение для пачки). для обоих этих пунктов направление не имеет значения
-
просто у меня таблица 1.3 млрд .... выдергиваю примерно 10000 записей с сортировкой по дате в обратном порядке и оно минуты на 3 высаживается ... а выдергиваю всего 3 столбца
-
а когда по ASC то все очень быстро
-
подобная проблема здесь обсуждалась уже много раз. поиск по "последние записи" выдаст вам кучу релевантных обсуждений. например, одно из них https://t.me/clickhouse_ru/214239
а может пример - и не сильно релевантен :)Lexa M in ClickHouse не тормозитДобрый день, у нас есть такая таблица test, ищем 10 последних записей с определённым id1, всего их ~ 55 млн. судя по всему происходит фулскан всех записей с этим id1, и присутствие в ключе сортировки после id1 поля timestamp не влияет. подскажите, пожалуйста, дело в неправильной структуре таблицы или в запросе, и можно ли избежать фулскана? (необходимо выбирать куски данных с определённым id1, отсортированных по timestamp) CREATE TABLE clickhouse.test ( `id1` String, `timestamp` DateTime, `id2` UInt32, ) ENGINE = ReplacingMergeTree PARTITION BY toYYYYMM(timestamp) ORDER BY (id1, timestamp, id2) SETTINGS index_granularity = 8192 SELECT * FROM test WHERE id1 = 'a27d30b4121232323b4c659f2488d' ORDER BY timestamp DESC LIMIT 10 10 rows in set. Elapsed: 11.991 sec. Processed 55.75 million rows EXPLAIN SELECT * FROM test WHERE id1 = 'a27d30b4121232323b4c659f2488d' ORDER BY timestamp DESC LIMIT 10 ┌─explain ───────────────────────────────────────────────────────────────────────────────┐ │ Expression…
-
-
ну у меня дата стоит на первом месте в сортировке, я в смысле того что подобного рода моменты мы изначально заложили
-
а можно пожалуйста если не затруднит обновить бенчмарк для memsql? тем более, что у него с тех пор появился ColumnStore. (да и memsql теперь называется SingleStore).
UPDATE: просьба снимается, только сейчас заметил, что columnstore был ещё в версии 3.2 и в тестах он уже есть -
Я хотел обновить, но обнаружил, что при скачивании они предлагают согласиться с условиями, которые запрещают бенчмарки (так называемая DeWitt clause).
-
офигеть, но не удивительно. ведь вся поисковая выдача забита только маркетинговым буллщитом, о том что они самые быстрые и всё такое и ни одного реального сравнения, кроме как на https://clickhouse.tech/benchmark/dbms/Performance comparison of database management systems
ClickHouse is a fast open-source column-oriented database management system that allows generating analytical data reports in real-time using SQL queries
-
у mariadb тоже появился columnstore, но уже есть сравнения и не утишительные :)
https://www.percona.com/blog/2017/03/17/column-store-database-benchmarks-mariadb-columnstore-vs-clickhouse-vs-apache-spark/Column Store Database Benchmarks: MariaDB ColumnStore vs. Clickhouse vs. Apache Spark - Percona Database Performance BlogColumn store database benchmark results, comparing the query performance of MariaDB ColumnStore v. 1.0.7 (based on InfiniDB), Clickhouse and Apache Spark.
-
Я бы хотел добавить больше бенчмарков, единственное нужен полный лог всех действий - начиная с того, как скачивали и устанавливали. Чтобы прямо по шагам повторить. По моему опыту, уходит несколько дней, чтобы всё сделать.
Пример:
https://github.com/ClickHouse/ClickHouse/blob/master/benchmark/monetdb/instruction.mdClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Ещё создал таск, чтобы скидывать туда ссылки на любые бенчмарки:
https://github.com/ClickHouse/ClickHouse/issues/22398
Где выигрываем, где проигрываем и вообще всё :)A list of benchmarks · Issue #22398 · ClickHouse/ClickHousePost every link to benchmark here.
-
Ещё бывает полезен "юзабилити-лог". Когда берёшь незнакомую систему, пытаешься с ней работать и записываешь любые грабли и мысли, каждую попытку что-то неправильно сделать. Очень полезно для разработчиков.
-
ёмаё, столько бенчмарков :)
-
-
Нет. Придётся в типах для каждой таблицы указывать. DateTime('Europe/Moscow')
-
Спасибо!
-
Был более новый бенч против клика кстати
https://www.percona.com/blog/2020/07/27/clickhouse-and-columnstore-in-the-star-schema-benchmark/ClickHouse and ColumnStore in the Star Schema Benchmark - Percona Database Performance BlogThere were two new releases in the OpenSource Analytical Databases space, which made me want to evaluate how they perform in the Star Schema Benchmark.
-
спасибо, пора забыть про страхи, что есть что-то настолько же быстрое как кликхаус :)
- 30 June 2021 (160 messages)
-
Всем привет!
Версия 21.6 стейбл
Делаю джойн таблиц через
select *
from table1 t1
left join table2 t2 on t1.t1_id = t2.t2_id
В одном случае получаю на выходе красивые имена полей
В похожей ситуации с другими таблицами получаю имена полей с префиксами из алиасов, указанных в запросе.
В чём разница - непонятно. Имена полей не совпадают совсем. Как избавиться от префиксов в именах полей, если хочешь селектить через * а не выписывать каждую колонку? -
Зачем нужен движок Log? Чтоб писать без очереди, а потом переносить на MergeTree?
-
ну только для DIRECT layout у вас latency на запрос будет нефиговый такой
захотите выбрать допустим 100 тыс dictGet
и получите 100 тыс коротких SQL запросов
которые MySQL даже в несколько десятков коннектов прососет секунд за 5-10 не меньше...
это REDIS может до миллиона запросов через MGET в секунду делать key\value (multi threading имплементации)
хотя кстати с MySQL вроде тоже может быть SQL запрос WHERE id IN (...)
но это не o(1) это o(n) сложность все равно...
и парсер MySQL запроса на MySQL сервере для o(1) будет 90% времени занимать...
вот кстати как вариант можно Oracle MySQL MEMCACHE plugin какой нибудь попробовать использовать ;) Но clickhouse не умеет memcache в качестве источника -
Спасибо большое за пояснение
-
Всем доброго дня. Вопрос следующий:
Установила ClickHouse по инструкциям с официального сайта. На скриншоте видно, что пытаюсь запустить clickhouse-client, но выдаёт ошибку, что не может подключиться к серверу. Искала решение в интернете, не помогло. Может, кто сталкивался с этим и нашел решение?
П.с. запускаю на ubuntu в виртуальной машине. -
systemctl status clickhouse-server
Что показывает? -
-
-
.
-
ss -nltp | grep click
-
Да вы все правильно понимаете
-
-
У меня в команде ошибка, я ее исправила, но тот же результат
-
но если селектить из подзапроса все же норм будет?
-
-
да
-
Ну сильно зависит от объёма данных которые получаются в подзапросе
-
-
Проверьте, настройки <listen_host> и <tcp_port> в файле /etc/clickhouse-server/config.xml.
-
Может вам подйдёт format Vertical?
-
Эта команда выдала пустой ответ, что значит у вас кликхаус почему-то не использует ни одного порта. Возможно 9000 порт занят другим процессом (например php). Попробуйте выполнить команду: ss -nltp | grep 9000
Ну и попробуйте на всякий члучай перезапустит кликхаус:
systemctl restart clickhouse-server
А потом опять systemctl status clickhouse-server -
Ну или выберите тут что-нибудь, что вам больше подходит:
https://clickhouse.tech/docs/ru/interfaces/formats/Форматы входных и выходных данных | Документация ClickHouseФорматы входных и выходных данных ClickHouse может принимать (INSERT) и отдавать (SELECT) данные в различных форматах. П
-
понял, спасибо - пойду изучать
-
Permission denied
-
sudo :)
-
Используйте sudo
-
My bad
-
-
А ss -nltp | grep 9000 что говорит?
-
Ничего не выдает
-
интересно
-
-
-
Да по идее
-
systemctl status clickhouse-server или как он у вас запущен?
-
И так и так запускала
-
Service clickhouse-server start
-
И это было
-
А можно посмотреть на статус?
-
Запрашивает пароль и все, ничего не выдает потом
-
-
А дайте-ка нам выхлоп этих команд:
sudo netstat -tulpn | grep 9000
sudo service clickhouse-server status -
-
Секунду
-
всем привет.
подскажите плз, в какой версии .inner.<tbl-name> заменилось на .inner_id.<uuid>? и можно ли вернуть как было? :) -
-
Ну вот же. Кликхаус не может запуститься.
-
Установка | Документация ClickHouse
Установка Системные требования ClickHouse может работать на любой операционной системе Linux, FreeBSD или Mac OS X с арх
-
journalctl -f -u clickhouse-server
-
Я наверное не тем местом читаю, но что там указывает на "незапуск"? Вроде все enabled
-
-
С 20.10.
можно. Использовать базы ordinary -
-
А попробуйте просто сделать systemctl start clickhouse-server :)
-
Попросил пароль и все, ничего на консоль не выдал
-
-
У вас строка
Active: activating
Когда запустится, должно быть так -
-
Yeap
-
Вот отлично
-
-
-
спасибо
-
Попросил 3 раза пароль, запустила clickhouse-client, опять та же ошибка😅
-
Хотя в статусе running, зелёный
-
А вы пароль от sudo учётки вводите или от root? Или вы на сервер кликхауса пароль поставили?
-
На сервер не ставила
-
А нет, от root, я учетку не делала
-
так не надо никакого пароля
clickhouse-client -u default -
Ну он сам запросил😅
-
Та же ошибка
-
Может ли быть проблема в том, что убунту у меня на виртуальной машине?
-
У меня винда основная, а убунту на виртуалке
-
посмотрите статус сейчас и время запуска
сколько сек прошло после старта -
это не проблема
-
Лучше выполняйте все операции с systemctl от имени sudo. Будет работать
-
То есть
sudo systemctl enable clickhouse-server
sudo systemctl start clickhouse-server -
-
ну он а авторестарте, поэтому не можете и подключиться.
-
ну так, попробуем пальцем в небо =)
сделайте-ка вот что:
clickhouse-client --host 127.0.0.1 -
Вроде запущен же
-
-
-
Та же ошибка)
-
А, значит занят порт
-
sudo lsof -i :9000 | grep LISTEN
sudo lsof -i :8123 | grep LISTEN -
Ну или давайте просто почитаем лог ошибок:
sudo tail -f /var/log/clickhouse-server/clickhouse-server.err.log -
Здравствуйте
А по проблеме загрузки словарей пока нет новостей случаем?
https://github.com/ClickHouse/ClickHouse/issues/21101#issuecomment-865001859clickhouse 20.12.5 restart error: external dictionary not found · Issue #21101 · ClickHouse/ClickHouse(you don't have to strictly follow this form) Describe the bug Reproduce of 12454. When creating a dictionary and a materilized column, after restart we get external dictionary not found Do...
-
Та же ошибка
-
Почему-то не хочет открывать
-
А что говорит-то? Файла такого нет, или просто ничего не отображается и не выводятся никакие строки?
Если что, команда tail -f должна открыть файл, вывести из него последние 10 строк и продолжать выводить новые поступающие туда строки до тех пор, пока не нажмёте Ctrl+C. Лучше всего эту команду запускать в соседнем окне терминала, а уже потом пробовать запустить сервер кликхауса. Так у вас появится возможность отследить, какие ошибки возникают при запуске. -
Да, я знаю, как команда работает, просто терминал как будто завис и не выдает ничего
-
Причем отдельный открыла терминал
-
а ls -l /var/log/clickhouse-server/ что показывает?
-
-
Показывает два файла, один из которых наш err.log как раз
-
а размер их какой?
-
Значит файл просто пустой
-
По нулям
-
Да, увидела
-
Мб тогда кликхаус просто снести и заново поставить?😅
-
Ну ок. Давайте пойдём на совсем хитрые эксперименты, чтобы получить информацию об ошибке =)
Остановите клик
sudo service clickhouse-server stop
А затем запустите его непосредственно в терминале
sudo -u clickhouse /usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml
Там будет куча сообщений, но что-то со статусом <Error> вы наверняка увидите. -
-
Поправил команду для останова, есличто
-
Много что с фаталом
-
Так что именно? На что ругается?
-
У кх немного страшный вывод ошибок, но нужно найти причину из-за чего
-
File access error: no space left on device: /var/lib/clickhouse/preprocessed_configs
-
Одно из
-
-
Так что Вы наверное правы
-
Ну вот и ответ. У вас нет свободного места
-
Что говорит df -h?
-
Так, наверное я мало выделила место на виртуалке. Тогда мне убунту переустановить?
-
Тут уж как вам удобнее. Можно просто добавить места. Можно сжечь и заново построить. Сморя что у вас меньше времени займёт =)
-
Root 100% заполнено, а home всего на 7%
-
Dev при этом вообще не используется
-
Я думаю вы немного с разметкой диска накосячили при создании ВМ
-
Для контекста, я с убунту и виртуалкой только сегодня познакомилась🙃
-
-
Хорошо, учту
-
Всем спасибо за помощь!☺️
-
Здравствуйте
Может, есть новости по проблеме загрузки словарей? https://github.com/ClickHouse/ClickHouse/issues/21101#issuecomment-865001859clickhouse 20.12.5 restart error: external dictionary not found · Issue #21101 · ClickHouse/ClickHouse(you don't have to strictly follow this form) Describe the bug Reproduce of 12454. When creating a dictionary and a materilized column, after restart we get external dictionary not found Do...
-
А есть ли возможность брать из таблицы по несуществующему столбцу дефолтное значение, например, NULL? У меня есть диапазон таблиц, в некоторых из них определенного столбца нет, хочется селектить этот столбец там, где он есть
-
Если вы об этом, то да
select 1 as a, Null as b
union all
select 1 as a, 2 as b; -
Спасибо!
-
Привет, на проекте хотим подключить graphql(hasura) через proxySql к clickhouse. Получаем ошибку:
Code: 81, e.displayText() = DB::Exception: Database INFORMATION_SCHEMA doesn't exist (version 21.6.5.37 (official build))
Сталкивался ли кто-то с таким и есть ли какие-то решения кроме собственно создания этой базы? -
> Сталкивался ли кто-то с таким и есть ли какие-то решения кроме собственно создания этой базы?
Скорее всего нет, но нужна не только эта база но и данные в ней, как по стандарту SQL
https://github.com/ClickHouse/ClickHouse/issues/9770Add INFORMATION_SCHEMA database · Issue #9770 · ClickHouse/ClickHouseto satisfy (at least some) of SQL92 requirements: http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt We can easily fill those from system: 21.2.4 SCHEMATA view 21.2.7 TABLES view 21.2.8 VIEW...
-
ага, спасибо
-
Такой вопрос: возможно ли создать словать с полем типа FixedString(16)? При попытке выдаёт DB::Exception: Unknown type FixedString(16)
Создаю так :
CREATE DICTIONARY mydict
(
`uuid` FixedString(16),
`first_name` String
)
PRIMARY KEY uuid
SOURCE ...
LIFETIME ...
LAYOUT(COMPLEX_KEY_HASHED()) -
Вы graphql через mysql протокол подключаете
Clickhouse он только протокол поддерживает
А не имитирует mysql -
ключ UInt64 нужен
или составной tuple() -
т.е. я не cмогу clickhouse использовать как mysql бд для hasura?
-
у меня LAYOUT=COMPLEX_KEY_HASHED(), так что ключ tuple() получается
-
так он работает с составными ключами, а у вас просто fixedString
-
сделала наоборот ради теста и всё равно выдает DB::Exception: Unknown type FixedString(16)
CREATE DICTIONARY dict.id2uuid_v2
(
`id` UInt64,
`uuid` FixedString(16)
)
PRIMARY KEY id -
извините, запутал
проверил и правда, посмотрите в доке, поддерживает ли справочник тип FixedString? -
Действительно, в типах нет FixedString()
Спасибо! -
-
правильно
-
Спасибо, а есть какие-то хорошие примеры из реальных проектов структур бд? А будет ли лучше связь один ко многим сделать с помощью полей array/map или лучше сделать отдельную таблицу и join соединять? при условии что связанных объектов будет в среднем 20, например
-
самый хороший пример в тьюториале - https://clickhouse.tech/docs/en/getting-started/tutorial/ Как я понимаю по следам Яндекс Метрики.
join надо избегать по мере возможности. Через вложенные таблицы (Nested) и словари (dictGet)Tutorial | ClickHouse DocumentationClickHouse Tutorial What to Expect from This Tutorial? By going through this tutorial, you’ll learn how to set up a simp
-
-
Hasura нет
Но можете другой graphql использовать https://github.com/bitquery/activecube-graphqlGitHub - bitquery/activecube-graphql: GraphQL Interface for Activecube QueriesGraphQL Interface for Activecube Queries. Contribute to bitquery/activecube-graphql development by creating an account on GitHub.
-
понял, спасибо
-
Привет!
Кто-то сталкивался с подобной ошибкой при попытке собрать clickhouse-odbc на apple m1?
https://gist.github.com/Spar9a/29d68496ddb34ec76b81dc716f423130gist:29d68496ddb34ec76b81dc716f423130GitHub Gist: instantly share code, notes, and snippets.
-
как сделать uniq по окну? Например, что по окну длиной три, табличка превращалась в результат?
Табличка:
time, user_id
1 aaa
2 aaa
3 bbb
4 ccc
5 ddd
6 ccc
7 ddd
8 aaa
->
1 1
2 1
3 2
4 3
5 3
6 2
7 2
8 3
? -
Window functions
-
а какую именно применить, можешь подсказать?
-
uniqExact(user_id) OVER (ORDER BY time ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
-
спасибо
-
А если time повторяется?
-
Ну а что вы хотите в таком случае?
-
1 aaa
1 bbb
2 bbb
2 ccc
3 ddd
4 ccc
5 ddd
6 aaa
->
1 2
2 3
3 4
4 2
5 2
6 3 -
То есть просто я хочу уникальных считать в окне
-
uniqExactMerge(uniqExactState(user_id)) OVER (ORDER BY time RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING)
-
спасибо
-
только кажется мой кликхаус еще не умеет order by вместе с range
-
Ну хорошо, используйте ROWS, в этом случае будет одно и то же
-
Вы только должны еще GROUP BY time добавить