- 01 July 2022 (113 messages)
-
Привет 🙂
Начала вылетать ошибка при вставке в Clickhouse "Memory limit (total) exceeded: would use 13.82 GiB (attempt to allocate chunk of 4219444 bytes), maximum: 13.81 GiB (version 21.3.14.1 (official build))"
Причем падает как на таблицах с 800 колонками ReplicatedAggregatingMergeTree, так и на других, где 300 колонок. Т.е. как будто бы не количестве колонок дело.
И всегда нехватает прям чуток, т.е. всегда 13.82 GiB из 13.81 GiB, другие цифры в подобных ошибках не встречаются.
Уже дропнул 100 не очень нужных колонок из 800 на одной таблице - ситуация никак не поменялась.
Уменьшил вставляемые пачки, раньше порядка 10Мб улетало за раз, теперь <1Мб - тоже никакого эффекта.
Не подскажете куда копать? -
а если посмотреть в query_log запрос на вставку, сколько он потребляет памяти ?
-
ух ты, не знал про такой. Гляну.
-
да, нашел свалившийся insert
```
+-------------------+-----------------+------------+-------------+-----------+------------+------------+----------+
|query_start_time |query_duration_ms|written_rows|written_bytes|result_rows|result_bytes|memory_usage|query_kind|
+-------------------+-----------------+------------+-------------+-----------+------------+------------+----------+
|2022-07-01 01:04:08|0 |0 |0 |0 |0 |0 |Insert |
|2022-07-01 01:04:08|688 |17290 |1521520 |17290 |1521520 |1453265509 |Insert |
+-------------------+-----------------+------------+-------------+-----------+------------+------------+----------+
insert into table_xxx (ind1, ind2, ind3, f1, f2, f3, f4, f5) FORMAT RowBinary
```
всего 5 колонок на вставку, кроме 3-х индексных полей -
А MV на таблице есть ?
-
фиг знает, минимальный пример для воспроизведения я привел
вам надо на бинарном уровне проверить что передается в clickhouse-server -
Неа. Но есть аггрегационные функции.
сreate table well_data_504_witsml_sol_1179364155
(
ind1 UUID,
ind2 String,
ind3 DateTime64(3),
created_at SimpleAggregateFunction(anyLast, DateTime64(3)) default now64(),
f1 SimpleAggregateFunction(anyLast, Nullable(Float64)),
f2 SimpleAggregateFunction(anyLast, Nullable(Float64)),
f3 SimpleAggregateFunction(anyLast, Nullable(Float64)),
...
) engine = ReplicatedAggregatingMergeTree('path', 'replica_X')
ORDER BY (ind1, ind2, ind3) -
тут еще надо понимать
что это не конкретно на вашхапрос лимит 13.81Gb
а это на все текущие исполняемые запросы лимит 13.81Gb
и ваш конкретный упавший запрос может просить всего лишь 100Kb
но все равно падать -
говорите там 800 колонок?
но 800 колонок это 2 мегабайта буферов на колонку, 1.6Gb на вставку должно быть + сколько то на построение aggregation State
только anyLast ? больше ничего?
странно что 14 гигов жрет
сам по себе anyLast много памяти жрать не должен -
Памяти же занято не 14гб на запрос, а 1.4гб. Или глаза меня подводят
-
все верно. 1.4гб. Прошелся по всем memory_usage за пару дней. Максимум 3.5гб.
-
Блин точно ... Ну тогда проблема в том, что Clickhouse у вас ещё чем то занят ....
-
да, нолик .лишний у меня, глазазамылиные
-
ок. тогда у вас несколько паралельных запросов... смотрите по пересечениям с запросом который в query_log отваливается по ошибке
-
больше ничего.
Инсерты гребутся из кафки, в несколько потоков. Потоки ещё могу убавить, сейчас 9. Могу до 1 убавить.
А вот с прилетевшими селектами пока наверное ничего не сделаю. -
убавьте до 3
1 мало слишком -
Ааа, вспомнил, что помимо инсертов от приложения в CH пихаются и сторонние логи.
Пасибо большое!
Буду смотреть кто что параллельно вставляет. -
ну там можно посмотреть какие есть группировки и уменьшить
max_bytes_before_external_group_by
https://clickhouse.com/docs/en/operations/settings/query-complexity/#settings-max_bytes_before_external_group_by
и сортировки
max_bytes_before_external_sort
но это может сильно замедлить и будет больше диска жратьRestrictions on Query Complexity | ClickHouse DocsRestrictions on query complexity are part of the settings.
-
ага, ознакомлюсь) Спасибо!
-
Спасибо большое за помощь 🙂
-
ClickHouse. Storage Policies. Do not use Path and Disk's Path in the same directory.
ClickHouse. Using Multiple Block Devices for Data Storage. Do not use Path and Disk's Path in the same directory.
-
Всем привет! Подскажите, пожалуйста, как лучше всего в clickhouse решить следующую задачу:
Есть некая таблица с потреблением ресурса, предположим, электричество.
В столбце value находится кумулятивное значение потребленного ресурса
id | resource | timestamp | value
1 | electricity | 1234 | 10
1 | electricity | 1235 | 14
1 | electricity | 1236 | 16
1 | electricity | 1237 | 17
1 | electricity | 1238 | 21
1 | electricity | 1239 | 22
1 | electricity | 1240 | 25
Нужно получить значения потребленного ресурса в промежуток времени от timestamp в одной строке до timestamp в другой.
То есть, в приведенном примере, между 1234 и 1235, между 1235 и 1236 итд,
Финальная структура должна выглядеть примерно так:
id | resource | timestamp_start | timestamp_end | consumption
1 | electricity | 1234 | 1235 | 4
1 | electricity | 1235 | 1236 | 2
1 | electricity | 1236 | 1237 | 1
1 | electricity | 1237 | 1238 | 4
1 | electricity | 1238 | 1239 | 1
1 | electricity | 1239 | 1240 | 3
1 | electricity | 1240 | null | null
Сейчас в голове только следующий алгоритм:
1) к первой таблице прикрепить row_number() over (partition by (id, resource) order by timestamp) as rn
2) сделать join этой таблицы саму на себя on a.id = b.id and a.resource = b.resource and a.rn = b.rn+1
3) получить consumption
Сама по себе таблица достаточно большая и мне кажется используя данный алгоритм я сделаю clickhouse больно.
Может быть кто-то сталкивался с подобной проблемой и может подсказать в какую сторону копать? -
Через оконные функции LEAD или LAG
-
прям явно таких функций нет. Есть альтернатива в виде форточек
-
Всем привет!
Подскажите, есть ли возможность назначить роль пользователю аутентифицированному через внешний пользовательский каталог?
То есть, есть LDAP-каталог, в котором заведены пользователи, для которых в СН настроен маппинг ролей. Эта часть нормально работает, разрешения для схем корректно работают.
Но возникла необходимость выдать такому пользователю права на определенную схему не через членство в группе, а запросом в самом СН. При этом при выполнении запроса GRANT падает ошибка:
"Cannot update user user_name in ldap because this storage is readonly. (ACCESS_STORAGE_READONLY)". Можно что-то с этим сделать? -
Привет, есть шард с двумя репликами
На репликах есть табличка (называется одинаково и с одинаковой структурой) и реплики объеденные в кластер
на шарде создал Distributed таблицу которая должна ходить по тем табличкам в кластер с репликами.
при запросе к distr таблице получаю данные из одной реплики (по переменно то из первой то из второй)
Подскажите как сделать так чтоб данные были из 2+ реплик?
Спасибо -
увы... только со стороны LDAP править членство в группах...
-
Понял. Спасибо! :)
-
ну так на то и реплики, что предполагаются что внутри шарда данные одинаковые
сделайте точно такой же кластер в remote_server но на два шарда в каждом по одной реплике
ну или если вам не часто надо выбирать SELECT * FROM clusterAllReplicas('cluster_name',db.merge_tree_table_name) -
Идея другая.
Я хочу хранить на каждой из реплик кусок данных а через distr собирать все данные из всех реплик.
Может есть идея как это организовать? -
кусок данных это называется ШАРД
-
Почитайте, что такое Реплиация, что такое Шардирование. И скорей всего вы поймёте, что даже Зукипер под ваши задачи не нужен :)
-
Ребят стоит клик с пандасом скрещивать или не выё - пользоваться запросами?
чот читнул статейку не получил однозначного ответа. -
А что такое скрещивать ?
-
Сортировать, груп бай, фильтровать ... Всё лучше на стороне Clickhouse
-
через юпитер тянуть оттуда данные в датафреймы и по ним отчетность строить.
или лучше запросами аналитику строить -
О! вот это и хотел услышать.
-
Ну если у вас хватит места в оперативной памяти, чтобы получить все требуемые данные из CLickhouse, то может быть можно и в Pandas, но тогда вопрос, зачем вам вообще Clickhouse
-
Спасибо, большое)
-
Спасибо, большое)
-
не не не. у нас жопуа с памятью как раз.
-
-
-
Всем привет, кто-нибудь пытался работать с clickhouse через clickhouse-cpp или какой-нибудь драйвер? типа odbc
Не могу понять, как мне заполнять таблицы данными через код С++
clickhouse-cpp просто не запускается, ошибка с #incude int128.h, хотя в каталоге contrib она есть и в CMake прописано
Помогите плиз, что я делаю не так -
ну они там есть по умолчанию...
если вам их надо материализовать. то просто в MATERIALIZED VIEWS добавляете столбцы с этими именами, должно работать -
ЗК нужен если вы хотите, чтобы несколько КХ имели идентичные данные (репликация), чтобы не так страшно было потерять КХ.
-
нет не позволяет, там таблицы прямо в --task-file перечисляютсся в XML файле
-
не только
если захочется CREATE TABLE .. ON CLUSTER
то тоже ZK нужен -
мммммммм, плохааа((((
но спасиб -
ну вы же можете всегда сгенерировать XML из данных SELECT * FROM system.tables ?
-
да можно...
-
А можно полюбопытствовать, вы в Альтинити используете on cluster для изменений схемы в продакшн?
-
У нас самописная система, которая заставляет ноды дрифтовать к нужной схеме самостоятельно, и мы уже наловили кучу “особенностей” КХ.
-
когда как, но да, используем в некоторых случаях
-
всем привет, такая ситуация - понадобилось переместить данные КХ в 2 разные локации
-
метаданные в 1 место, а store в другое
-
вроде все ок
-
но таблица default теперь пустая, все симлинки переделали
-
куда смотреть?
-
мы используем storage_policy
-
в смылсе вы разнесли path и metadata_path?
что такое "таблица default" в какой базе ? или это база default? -
да, база default
-
/var/lib/clickhouse/store
куда перенесли?
и как это меняли в конфиге?
/var/lib/clickhouse/data
тут симлинки на store должны быть -
/var/lib/clickhouse/metadata/default.sql
куда перенесли? -
перенсли на другой диск, путь прописали на диске в storage_policy
-
перенесли папку store туда
-
/var/lib/clickhouse/metadata/default.sql - остался на месте
-
ну так она на всех дисках должна быть
дефолтный диск тоже поменяли? -
да
-
и пути в конфиге переписали
-
получается, что все кроме store - перенесли на новый дефолтный диск
-
store - на другой диск
-
пути переписали только в storage_policies?
или path тоже поменяли?
ищите
grep -r /var/lib/clickhouse /etc/clickhouse-server/
и сравнивайте что не поменяли еще -
все симлинки поменяли, права выставили
-
все поменяли
-
грепнул - все чисто
-
ну тогда чистите логи ребутайте сервер, и курите логи до просветления
ну и еще
SELECT * FROM system.tables FORMAT Vertical
сделайте
посмотрите куда metadata_path и data_path ведут -
ок, сейчас посмотрю
-
смотреть надо в сторону массивов через group by в подзапросе, а потом развернуть все через array join
select
id, resource,
a_timestamps,
timestamps_end,
consumption
from
(
select
id, resource,
arraySort((x)->x, groupArray(timestamp)) as a_timestamps,
arraySort((x,y)->y, groupArray(value), groupArray(timestamp)) as a_value,
arrayPushBack(arrayMap((x)->a_value[x+1]-a_value[x], arrayPopBack(arrayEnumerate(a_value))),0) as consumption,
arrayPopFront(arrayPushBack(a_timestamps, toDateTime(0))) as timestamps_end
from
test
group by
id, resource
)
array join
a_timestamps, timestamps_end, consumption
; -
надо же, какая сложная реализация any(value) over(partition by id, resource order by timestamp rows between 1 preceding and 1 preceding)
-
както привык в клике массивами пользоваться. Они нагляднее )
-
у нас с вами явно разные понятия о наглядности)
-
Спасибо, потестирую
-
-
SELECT *
FROM system.tables
WHERE database = 'default'
FORMAT Vertical
Query id: 18e5a499-5303-41aa-b885-a9d821be34c0
Ok.
0 rows in set. Elapsed: 0.007 sec. -
-
Благодрю, тоже опробую)
-
он вообще не видет базу default
-
лучше не надо
тут всё есть. можете мою команду взять за образец
https://kb.altinity.com/altinity-kb-queries-and-syntax/lag-lead/ -
разобрались, оказывается внутри store хранятся и метаданные, мы просто перекинули их в store который на дефолтном диске и все завелось
-
Добрый день! Подскажите пожалуйста в какую сторону копать. Есть пользователь у которого установлена настройка профиля max_threads = 16. Я смотрю запросы в query_log и наблюдаю что один из запросов использовал 334 треда length(thread_ids). Почему так может происходить? Ещё такой вопрос: в чем разница между локал тредами и глобальными?
-
почему нет? По ссылке точно такой же пример с массивами есть
-
не знаю как вы, но я не хотел бы, чтобы мне от предыдущего девелопера досталось полотно типа вашего (которое можно заменить одной строчкой стандартного sql кода), при всём уважении. считаю, что лучше человека сразу направить на то, чтобы юзать простые и общепринятые решения
-
хм, странно конечно, по умолчанию путь к метаданным /var/lib/clickhouse/metadata/
он точно не внутри store -
-
Да
-
Кликхаус в душе не знает где что лежит:)
-
клик не совсем общепринятая база. И оконные функции не так давно появились. Но наверно вы правы, стандартные оконные функции в sql знакомы большему количеству людей.
-
только обратите внимание, что старые данные так и останутся лежать, где были
-
понял, спасибо)
-
еще вопрос по шардинг, рядом, если у меня есть две Distributed таблицы с одинаковым распределением данных по sharding_key между ними, и мне нужно сделать join по ним, кликхаусу как-то можно объяснить что можно делать джоины локально в шардах и потом уже объядинять? или это так и работает по умолчанию?
-
Вы доку открывали перед тем, как сюда писать ?
-
хм, да, прошу прощения, перечитал, спасибо!
-
-
clickhouse-copier наверное для больших табличек
-
Всем привет!
Выполняю запрос в клик через clickhouse-jdbc и ловлю ошибку 241 memory_limit_exceeded, но в блоке catch отлавливаю исключение и там код 1002 (unknown exception), а сам код 241 лежит в теле ошибки в cause. Можете подсказать, почему он оборачивает исключение в этот код и можно ли получить реальный код исключения не парся текст исключения? -
Зависит от таблички. Если нужно перенести одну партицию, например, для этого лучше подойдёт REPLACE PARTITION.
Если результат селекта не влезет в память, можно разбить на подгруппы и провести несколькими инсертами.
Ну и хорошо, если есть сортировка по времени, разбивать на временные интервалы. -
Как keeper'у задать listen_ip? А то слушает raft на всех интерфейсах, а это не очень приятно взгляду
-
https://github.com/ClickHouse/ClickHouse/issues/38536
Судя по изменениям моего тикета, они не считают багом игнор листен хостаClickhouse keeper ignores listen_host for port 9234 · Issue #38536 · ClickHouse/ClickHouseClickhouse keeper binding to :::9234 ignores <listen_host> from config How to reproduce Put keeper_config.xml into a local keeper directory and then mount it into a container <...
-
Composable protocols configuration of the server. · Issue #38411 · ClickHouse/ClickHouse
The idea is to make the configuration of the protocols (TCP, HTTP, HTTPS, MySQL, etc) and the ports to listen more flexible. It should be possible to specify a custom list of listen_host and listen...
-
Это хороший и полезный тикет, согласен.
Тем не менее на мой взгляд текущие поведение все таки - баг. Даже если он wont-fix -
я не спорю, это скорее undefined behaviour / usability issue, починят когда-нибудь.
в терминах ClickHouse проекта "баг" это то что делает использование КХ невозможным и нет воркэраунда, т.е. любая проблема с кипером это не баг, потому что кипер это не КХ. -
А, понятно, спасибо за объяснение.
- 02 July 2022 (28 messages)
-
Это должно работать https://github.com/ClickHouse/ClickHouse/blob/c2486f3637a08c582e110a249ac86485ea7499c3/programs/keeper/Keeper.cpp#L350 скорее всего этот listen_host вы положили где-то не там...ClickHouse/Keeper.cpp at c2486f3637a08c582e110a249ac86485ea7499c3 · ClickHouse/ClickHouse
ClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Я специально в тикете сделал не стандартный ip чтобы показать что порт 9181 слушает именно его, а 9234 - всё
-
Добрый день. А не подскажите насколько затратно отправлять в запросе большое количество элементов в WHERE .. IN (X,Y,Z) ? Скажем тысячу элементов. Это больше дефолтных значений max_query_size, max_ast_elements. Я пытаюсь понять насколько это влияет на производительность
-
100 это мало
100 000 можно если пролечите по размеру
Почитайте про external_data в документации
Там очень много значений можно передать -
Спасибо, почитаю. А что значит "пролечить по размеру"?
-
Пролезете по размеру запроса, думаю
-
понял) спасибо. Размер можно и увеличить, как я понимаю
-
-
да, с телефона писал "пролазить"
1000 мало
100 000 id вполне пролезают в дефолтные настройки вроде...
лучше всего использовать https://clickhouse.com/docs/en/engines/table-engines/special/external-data/External Data for Query Processing | ClickHouse DocsClickHouse allows sending a server the data that is needed for processing a query, together with a SELECT query. This data is put in a temporary table (see the section “Temporary tables”) and can be used in the query (for example, in IN operators).
-
Добрый день знатокам :) кто нибудь подскажет как «скрыть» реплицированную таблицу от юзера (приложение) чтобы он видел созданную поверх неё distributed таблицу, но не видел ту, что под ней? Очевидно, что revoke по таблицам снизу не даст делать select из distributed, что плохо. Цель скрыть эти таблицы от приложения и оставить только доступ к distributed таблицам.
-
Я наоборот Timestamp делал
-
Можно сделать реплицированную в другой дб, например
-
Как вариант, да, но требует реорганизации
-
Всем привет. Подскажите, если кто сталкивался, есть ли способ силами Кликхауса сделать либо а) выброс ошибки на весь импорт б) пропуск строк с несуществующей относительно года датой в) приведение даты не увеличивая значение вперёд, а оставляя её валидной для февраля выбранного года
-
Всем привет!
Буду очень признателен за совет. Собираем финансовые показатели акций и рассчитываем по ним различные метрики. Набор рассчитываемых метрик строго определен (около 100), но со временем он может и будет расширяться.
Сейчас думаем сделать такую схему:
Таблица1 - сюда ежедневно складываем финансовые показатели в формате:
id_акции, id_показателя, значение, дата
Таблица2 - материализованное представление с метриками по Таблица1:
id_акции, метрика1, метрика2..., дата
По идее, таким образом мы сможем задать формулы для каждой метрики, тем самым производить вычисления внутри кликхаус.
Но, когда необходимо будет добавить новую метрику, нам придется переделывать материализованное представление, добавляя столбцы. На сколько это хорошая практика? Или сделать хранение всех рассчитываемых метрик в формате:
id_акции, id_метрики, значение, дата
?
Но тогда придется выносить расчет метрик за пределы кликхауса, и просто импортировать в виде значений, чего не хотелось бы. -
Вы не сказали какое у вас железо и сколько данных у вас планируется ?
-
32Гб оперативки, 8 ядер
Планируется собирать данные по 150 тыс. акций. Каждый день около 100 собираемых показателей и столько же расчетных -
-
Как вы уже сами написали, правильно - это рассчитать снаружи и потом уже класть готовое в кликхаус. Но мы оба понимаем, что с вашими нагрузками можно делать как угодно, "и так сойдёт".
-
ок, спасибо
-
Хочу дополнить. "Правильно" - в контексте моего ответа означает "оптимальное хранение в кликхаусе". "Правильно" же в рамках вашей задачи - "потратить минимум времени на разработку и поддержку". Так что матвьюха в данном случае ок.
-
ясно
спасибо за совет! -
и сколько метрик? порядок?
и что метрики их складывают? умножают? или просто хранить? -
норм практика, материализованное представление сделайте только с TO db.table выражением
а то .inner таблицами неудобно управлять..
ну и вы должны помнить что ваш SELECT в матвьюхе работает только с куском данных который приходит через INSERT в source таблицу а не со всей таблицей из SELECT -
-
Вроде бы говорили, о том что пишут новую версию
-
оператор продолжает развиваться, он является основным компонентом Altinity Cloud Anywhere
-
а как-нибудь можно настройку поставить, чтобы реплики участвовали в паралелльном group by , а не просто запрос уходил на одну из реплик полностью? например по месяцам если таблица партицирована, по два месяца на каждом шарде, 3 шарда и чтобы один месяц на каждой реплики процессился
- 03 July 2022 (31 messages)
-
I'm a happy woman today , for being among the trading platform , i Invested $1000 and got $10,500 as my profit back earlier today at the exact time I Invested yesterday , thank you very !! I'm much grateful
👇👇
https://t.me/+xfYRN781ziEyMDZk -
allow_experimental_parallel_reading_from_replicas=true в свойства профила поставьте
и max_parallel_replicas=2 в SETINGS в query
должно сработать
https://github.com/ClickHouse/ClickHouse/pull/29279Parallel reading from replicas by nikitamikhaylov · Pull Request #29279 · 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...
-
Мистери боксы от Binance NFT🎁
300 случайных участников, ответивших верно на вопросы в форме, получат по 1 мистери-боксу от Binance NFT, а это может быть не одна тысяча долларов...❗️
Ответы:
1. June 24
2. TRUE
3.
▪️ Preventing forgery
▪️ Lowers chances of loss or damage
▪️ Reduce costs and faster production
▪️ Ongoing revenue opportunities
4. несколько ответов:
▪️ Evaluate their roadmap
▪️ Check the liquidity
▪️ Research the community and team
5. несколько ответов:
▪️ Complete Identity Verification
▪️ Have at least 5 Followers on your Binance NFT User Profile
▪️ Have Sufficient BNB or ETH in Spot Wallet to cover minting fees
📆Дедлайн: 3 июля | 10:00 (МСК)
Для получения NFT нужно пройти KYC на Binance
БОЛЬШЕ РОЗЫГРЫШЕЙ⤵️
👇Не забудь подписаться👇
✅Связь со мной ✅Telegram канал ✅YouTube ✅AirDrop -
UPD:
Возможно кому-то будет полезно (поиском найдут пост), кто считает ЕМА для торговых графиков.
что бы получить верные значение ЕМА у меня получилось так:
exponentialMovingAverage( n / exp(1) )
или
exponentialTimeDecayedAvg(n/2)
где n желаемая длина ЕМА, почему так пока не понял, но работает в точности, как на индикаторах разнообразных сервисов. -
-
даже интересно стало, в чем она заключается
-
-
Точно обучается
-
-
спасибо, поставил allow_experimental_parallel_reading_from_replicas = 1 и max_parallel_replicas = 2 и почему-то просканило 42 млрд строк вместо 21 млрд из distributed таблички. Хуже стало получается. Как он вообще просканил в 2 раза больше строк, чем есть в таблице всего.
-
а где почитать в коде можно как allow_experimental_parallel_reading_from_replicas делит на чанки по репликам?
-
ну логично что получилось значение помноженное на max parallel replicas
-
я думал что в связке с allow_experimental_parallel_reading_from_replicas оно должно как то по партициям бить на реплики и сканить в сумме один раз. И ускорять запрос, а не замедлять его
-
берегитесь! скам! кошелек создан с multisig , сделано это чтобы человек который захочет перевести бабки со счета, он прежде всего закинет бабки для транзакции. А транзакцию создать не сможет
-
Но как вижу уже один лохонулся )) скинул ему трона на бакс :D
-
аа, так вот в чем схема, теперь ясно, спасибо
-
пойдешь пользоваться ?)
-
нет, мне релаьно было интересно, в чем подвох
-
уловки это ж как фокусы, всегда хочется узнать в чем секрет, в чем прикол
-
Ну это скорее уловка для "жадных", которые захотят своровать чужое и сами в итоге в капкане
-
ну это ясно, но неочевидно, в какой момент теряются деньги
-
теперь ясно 🙂 ty
-
Подскажите, пожалуйста, что это за ошибка в кипере такая возникла?
Code: 999. DB::Exception: Received from 10.121.1.3:9000. DB::Exception: Cannot allocate block number in ZooKeeper: Coordination::Exception: Connection loss. (KEEPER_EXCEPTION)
кластер 22.6, копировал данные в дистрибьютед таблицу. Кипер 22.6 (внутри 22.4) на три ноды -
в смысле clickhouse-keeper вместо zookeeper?
-
Ага
-
отдельно запущен или внутри clickhouse-server?
-
3 отдельные ноды
-
что-то не так с коннектом до этих keeper нод
поищите в логах кипера за то же время ошибки -
Там нет ничего криминального, и ничего связанного с сетью.
Ок, если просто сеть моргнула - послежу.
Спасибо -
У "Дії" почалися перші виплати 6500 грн з "єПідтримки" для тих, хто через війну втратив роботу. Майже один мільйон українців вже отримали кошти – їх можна витрачати без обмежень.
Приват Банк
https://t.me/privatbank_help2 -
/report
- 04 July 2022 (191 messages)
-
Утречко!
Подскажите, пожалуйста, как решить задачу!
Мне нужно взять определённый список таблиц, например с помощью SHOW TABLES и создать из него здоровенный запрос типо
SELECT value
FROM firts_table
UNION ALL
SELECT value
FROM second_table
UNION ALL
SELECT value
FROM third_table
и т.д.
Я могу это сделать только силами SQL?
P.s. список SHOW TABLES постоянно будет меняться. -
Силами SQL-врядли, а вот на баше это будет несколько строчек кода, или на питоне, например
-
Значит так и сделаю. Спасибо!
-
Joined.
-
Всем доброго дня! Подскажите пожалуйста.
Если я не ошибаюсь, лучше избегать JOIN, где правая таблица очень большая. Т.к. она храниться в оперативной памяти.
У меня стоит задача, работаю с сырыми данными из метрики :
Левая таблица это Таблица визитов (300млн. строк), правая это Таблица просмотров (2млрд. строк).
Я отфильтровал правую таблицу(hits) по определённым критериям, чтобы соединить с визитами по WatchID (25млн. строк). Наверное стоит отметить, что фильтрация была в CTE выражение.
Теперь мне нужно сделать INNER JOIN визитов с отфильтрованной таблицей, но всё равно выходит за пределы Memory limit for query.
Как можно провести такое соединение? -
Select... From A where a.key in (select b.key from B)
-
Попытаться оставить в правой таблице, только нужные столбцы, либо через IN и для IN есть такой лайфхак
-
-
Всем привет!
подскажите а Клик с Касанрой совсем не умеет дружить? -
Всем привет, тут произошла у меня небольшая проблема. ClickHouse версия 20.5.4.40, по одной из схем были сделаны следующие шаги:
1) были созданы таблицы ReplicatedMergeTree с суффиксом _replica(test_db.test_table_replica), и были исходные test_db.test_table, откуда данные были перезалиты в test_db.test_table_replica;
2) мной были переименованы таблицы test_db.test_table_replica в test_db.test_table, а test_db.test_table стало test_db.test_table_old.
Репликация успешно работала, пока на утро сегодня не обнаружилась ошибка:
Code: 999, e.displayText() = Coordination::Exception: No node, path: /clickhouse/tables/(cluster_name)/test_db/test_table/log (version 20.5.4.40 (official build))
При проверке на стороне zookeeper при команде
zkCli.sh ls /clickhouse/tables/
(cluster_name)/test_db
отображаются старые названия вида таблиц на движке ReplicatedMergeTree вида test_table_replica. Что делать в таком случае? Версии и конфиги не трогались и не подвергались изменениям. Поступать ли мне так, как описано здесь:
https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/replication/#recovery-after-failuresData Replication | ClickHouse DocsReplication is only supported for tables in the MergeTree family:
-
Joined.
-
Всем привет. Прошу сразу не кидаться тряпками, я только начал изучать Кликхаус, и нет должного опыта.
-У меня проблема, сильно разрослись логи: query_thread_log (254 bg)
query_log (159 gb)
Я прочитал в документации, что нужно настроить TTL для этих логов <ttl>event_date + INTERVAL 30 DAY DELETE</ttl>
Решил, что так будет оптимально.
1) Вопрос: Накопившиеся логи он мне не отчистит?
2) Как отчистить старые логи, место заканчивается? -
-
нет не очистит
ALTER TABLE system.query_thread_log MATERIALIZE TTL
почистит старые принудительно в фоне... -
а старые это какие? как у меня прописан в TTL ?
-
да
статью почитайте по ссылке что вам скинули -
ок спасибо
-
спасибо
-
Joined.
-
Всем привет, а кто то юзал cube js для bi? Он умеет с помощью драг энд дропов json разбирать?
-
Вы точно про Clickhouse ?
-
В связке с КХ просто интересно
-
Я просто ищу какуой то би который для рядового пользователя через драг энд дропы позволит наделать дашбордиков.
-
Есть metabase какой-нибудь
-
Он умеет с json работать?
-
Я думаю, вам придётся самим Json разбивать
-
😔😔 пнл спасибо
-
-
можно через merge функцию: select value from merge('database', 'first_table|second_table|etc')
-
А значения во втором аргументе для merge можно скормить из SHOW TABLES?
-
можешь попробовать, но мне кажется что там константный регексп нужен
-
Понял. Спасибо!
-
А из доки не понятно как работает ? https://clickhouse.com/docs/ru/operations/named-collections/
-
Из доки создаются дикты или таблицы с экзотическими движками для доступа в другие базы.
А как тогда подключаться к самому ch? -
Всмысле сам к себе ?
-
SELECT * FROM remote(named_collections)
-
Или что вы имеете ввиду ?
-
именно, прошу уточнить синтаксис для использования remote и куда там именно подставлять имя коннекшена?
-
-
А что вот просто вместо mysql написать remote и должно работать.
-
спасибо, пробуем
-
Ну так это же просто макрос, который открывается, то есть вам так же нужно указать требуемые данные для подключения в конфиге.
-
host/password/port/address и т.д.
-
Joined.
-
1). Не подскажите как создать колонку с nullable array?
2). При попытке записи массива в колонку Array(string) ругается Array to string conversion хотя скармливаю массив -
Не бывает nullable(arrar). Используется пустой массив - []
Бывает Array ( Nullable(String) ) -
окей а про 2 вопрос не встречалось?
-
пример нужен того что вставляете
-
"objects__life__sports" => array:1 [
0 => "Бег"
] -
вставляю соотвественно значение
-
Это чат про кликхауз. То что привели -- это не SQL.
-
-
Если проверить запущенные процессы, то OPTIMIZE должен продолжать работать, хотя пользовательский запрос и отвалился по таймауту.
-
это клиент отвалился --receive_timeout=3600 скорее всего запрос в system.processes остался и работает
вообще если вам надо регулярно выполнять OPTIMIZE то вы не правильно сделали архитектуру...
в лучшем случае OPTIMIZE надо выполнять на каких то партициях, когда точно знаете что данные туда больше не попадут -
да, так и есть, только на отдельных партициях надо сделать OPTIMIZE DEDUPLICATE т.к. там могли ошибочно задублироваться данные. Новые данные туда уже не попадут
-
Помогите плиз . При удалении system.query_thread_log
Code: 359, e.displayText() = DB::Exception: Table or Partition in system.query_thread_log was not dropped.
Reason:
1. Size (273.98 GB) is greater than max_[table/partition]_size_to_drop (50.00 GB)
2. File '/var/lib/clickhouse/flags/force_drop_table' intended to force DROP doesn't exist
How to fix this:
1. Either increase (or set to zero) max_[table/partition]_size_to_drop in server config -
-
в кликхаусе нет хинтов и из коробки и так всё работает параллельно насколько возможно
-
Типа помочь перевести? Гугл транслейт?
-
мерси
-
Подскажите ПЛЗ. Есть две ноды (22.6) настроенные в репликацию, когда вставляю данные в одну из нод, на другой вместо данных появляется в логах Not found address of host хостнейм первой ноды. Хостнейм непонятно откуда берется - я не могу его найти в preprocessed_configs, в remote_servers он описан (и доступен) по другому хостнейму.
Что делать чтобы хостнейм сервера не фигурировал при репликации? -
Всем привет.
У меня есть Клик непервой свежести (20.5.2.7), но неплохо работающий. В нём понадобилось заменить несколько строк на другие. И оказалось, что старые строки не удаляются.
alter table track delete where te_id=89602012;
select te_id from track where te_id=89602012 format TSV;
89602012
1 rows in set.
Тактическое выжидание, установка mutations_sync=2, OPTIMIZE не помогли.
Поле te_id типа Int64, входит в ключ:
ENGINE = ReplicatedReplacingMergeTree()
PARTITION BY h_month
ORDER BY (p_id, h_at, te_id)
В system.mutations все записи is_done (на обеих репликах):
mutation_id: 0000000011
command: DELETE WHERE te_id = 89602012
create_time: 2022-07-04 10:51:21
block_numbers.partition_id: ['0','1283299200',..,'1680307200','1682899200','1685577600']
block_numbers.number: [12,15,...,18,132,32]
parts_to_do: 0
is_done: 1
latest_fail_time: 0000-00-00 00:00:00
latest_fail_reason:
В system.merges пусто.
В чём может быть дело? -
-
Когда Replicated таблица подключается к Зукиперу, она кладет в Зукипер имя своего хоста или значение настройки interserver_http_host из config.xml
другие реплики этой таблицы ищут ее по тому аннонсированному в зукипере имени.
remote_servers не ИСПОЛЬЗУЕТСЯ в РЕПЛИКАЦИИ -
ClickHouse/utils/antlr at master · ClickHouse/ClickHouse
ClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Спасибо
-
но там может быть не 100% покрытие
-
это баг, и даже хуже, скорее всего alter table портит таблицу. Вам надо апгрейдится хотя бы до 20.8
-
кстати как имена партов выглядели до мутации и после? (mutation_version)?
-
Неожиданно.
Спасибо -
Спасибо!
(Не буду сылаться на "а раньше работало", баг есть баг.) -
Всем привет
Подскажи возможно ли указывать партицию динамические в запросе на оптимизацию
Например: OPTIMIZE TABLE default.table_with_engine_replacing_merge_tree partition toYYYYMM(now()) FINAL
Такой вариант к сожалению не работает, но возможно есть альтернативный? -
Вроде, примерно такие же остались.
Вот было в parts_to_do_names:
'1546300800_251_251_0_256', '1546300800_252_252_0_256', '1546300800_254_254_0_256', ...
Сейчас в system.parts:
1546300800_0_0_0_17469
1546300800_1_252_216_17469
1546300800_254_254_0_258
1546300800_259_259_0
1546300800_260_260_0
1546300800_261_261_0
(и соответствующие data_version: 17469, 17469, 258, 259, 260, 261) -
это Replicated таблица?
вы делали attach partition ? или восстанавливали из бекапа?
странно что разные версии -
Да, таблица ReplicatedReplacingMergeTree. Восстанавливать её приходилось после обнуления Кипера. На одной реплике аттачить все парты, на другой удалять и ждать перезаливки.
Но парты вроде как должны оставаться прежнеми сразу после этого. -
Да, я хотел бы sql показать но я использую библиотеку bavix для laravel там нет к сожалению что-то типа toSql()
Не подскажите а json отдельно нет такого типа данных? в доке не нашел -
Добрый день. В Графане, используя плагин https://grafana.com/grafana/plugins/grafana-clickhouse-datasource/ при фильтрации в TimeRange каким-то образом можно обратиться к полю Date ?
Дефолтно макрос на timestamp и datetimeClickHouseClickHouse datasource plugin for Grafana
-
Поищите сгенерированный вашей библиотекой запрос в system.query_log - возможно, поймёте что с ним не так.
-
при attach не сбрасывается _version в 0 и теперь у вас мутации просто пропускают эти парты потому что mutation_id logpointer меньше чем _version.
типа они заработают после того как вы сделаете alter table delete 17 тыс. раз. (_17469)
https://github.com/ClickHouse/ClickHouse/issues/18804attach part does not reset mutation version on a part. · Issue #18804 · ClickHouse/ClickHouseAttach part does not reset mutation version on attached parts. So mutations (update/delete) do not work against parts restored from a backup, because their version is bigger than the version stored...
-
Хм, а селекты всё равно читают такие парты из будущего?
-
да. Version нужен только мутациям
-
Спасибо.
Значит, всегда остаётся опция перелить в другую таблицу селектом. -
Вручную можно в 0 переименовать до attach
-
добрый день подскажите такой вопрос - есть 3 ноды clickhouse которые используют 1 ноду с zookeeper для синхронизации таблиц - хочу сделать отдельный кластер zookeper из 3 нод и перевести clickhouse на него. Вопрос - возможно при переключении какиелибо проблемы при рестарте сервисов на нодах clickhouse ?
-
Кипер разве умеет одной нодой работать?
-
да
-
Да
-
Ну зависит от того как вы зукипер переделаете.
-
на что обратить внимание нужно ?
-
поделись потом опытом как переедешь на кластер ЗК, в техдолге тоже задача висит
-
У меня есть 8 вариантов как это сделать. Вы примерно хотя бы понимаете как вы зукипер будете мигрировать?
-
Вы две ноды добавляете?
-
Или полностью надо переехать?
-
полностью
-
Доступ у новых нод есть к старой? Или вы файлы будете копировать?
-
копировать
-
вначале почищу до 1 дня для минимизации
-
Выключаете старый зукипер. В этот момент таблицы в кх станут ro. Копируете файлы снепшотов и логов зукипера на новые ноды(дублируете 3 раза). Делаете у всех зк разные id. Запускаете все 3 зукипера новых. Проверяете что один лидер и два фолловера. Проверяете что в зукипере данные на месте. Меняете конфиг зукипера в кх.
-
Так база зукипера крохотная. Какая разница
-
вопрос в том вернутся ли таблицы после этого в rw ?
-
ну смысл есть поскольку после недели работы там 12гб лежит - после очистки 15кб
-
Зависит от версии кх. Новые версии подхватят новые адреса из конфигов. Старые версии кх надо рестартить
-
22.1.3.7
-
Бред какой-то
-
бред в чем ? в размере того чего лежит в зоо или в версии ?
-
Не понимаю как размер может уменьшиться настолько. Вы про какие файлы и что вы чистите?
-
-
Сложности с их самоподписанный сертификатом поначалу были (они снаружи не разрешают без него), но как наладили - нет вопросов. Работает быстрее, чем когда сами настраивали с такой же конфигурацией
-
Отлично. Спасибо. Это и хотелось услышать
-
-
Круто
-
-
всем привет
есть таблица:
CREATE TABLE application_daily_summary_agg
(
app_id UInt32,
type UInt8,
start_date Date,
quantile90 AggregateFunction(quantileIf(0.9), UInt32, UInt8) // <- подобных quantile-колонок в реальной таблице несколько, для простоты оставил одну
// другие простые агрегирующие колонки типа sum, count опущены
)
ENGINE = ReplicatedAggregatingMergeTree('/clickhouse/tables/{shard}/{database}/{table}', '{replica}')
PARTITION BY toYear(start_date)
ORDER BY (app_id, type, start_date);
она заполнятеся с помощью MV из таблицы, в которую вставляется 200m+ в день. Но в самой таблице application_daily_summary_agg всего ~130к строк
CREATE MATERIALIZED VIEW application_daily_summary_mv TO application_daily_summary_agg
(
app_id UInt32,
type UInt8,
start_date Date,
quantile90 AggregateFunction(quantileIf(0.9), UInt32, UInt8)
) AS
SELECT
app_id,
type,
toDate(toStartOfDay(start_date_utc, 'Europe/Moscow')) AS start_date,
quantileIfState(0.9)(duration, is_error = 0) AS quantile90
FROM source_table
GROUP BY app_id, type, start_date;
в какой-то момент мёржи по таблице application_daily_summary_agg стали требовать много ОЗУ (больше чем по большой source_table, да и вообще по всем другим) - делая селект по system.merges можно увидеть, что они требуют по 3Гб+, а в логах встречаются ошибки о нехватке памяти на мёрж. CPU стоит под сотку, память постоянно забита.
Пошёл расследовать, посмотрел по system.columns, получилось, что quantile90 занимает относительно много места: 3.1Gb в несжатом виде и 1.07Gb. Подозреваю конструкцию AggregateFunction(quantileIf(0.9), UInt32, UInt8).
Собственно, вопрос: посоветуйте что-нибудь, чтобы сократить хранимые (и, видимо, сливаемые) объемы для колонки quantile90 (в реальной колонке таких колонок несколько).
По факту данные всегда вставляются для последних 24 часов, всё что глубже можно было бы как-нибудь "схлопнуть". Осталось придумать как. Вокруг TTL что-то ничего пока не придумал. Помогите, пожалуйста, советом -
-
У нас не такие запросы чтобы тюнить, думаю. Мы поставили компрессию дефолтную посильнее и все
-
-
А сколько вы объем данных там держите?
-
-
-
-
-
-
А что подразумевается под тупило? Вставки долгие?
-
Как я помню по аватарке у вас 8гб оперативки или даже меньше, если не путаю ... Может просто увеличить память ?
-
Ну не хватало мощности. Процессоры и память были под 100%
-
Понял, спс
-
-
-
-
-
-
попробовать другой кодек на колонке. правда, это чревато увеличением нагрузки на CPU, с которым у вас и так беда, как вы говорите
-
-
Не слушайте про кодек. Вам надо мержить меньше строк в буфере. Есть mergetree сеттинг mergeblocksize или что-то такое.
-
ребят как правильно запихать в клик поле типа list[json] ?
через мап вроде нельзя так как он строго структурирован. а отдельного типа данных аля json чот не нашел. -
Array(String)
-
Блин )
-
спасибо )
-
Тайлер на больничном был недавно, возможно не добрался ещё, спрошу
-
Есть тип данных конечно Json, но честно не знаю как он работает, из-за это не советую :)
-
а как обработку такой структуры вести? через функции? Будет ли это эффективно если что то оттуда надо будет достать и групернуть?
-
так то я сам не рад такой структуре, но что есть, как говорится )
-
Спасибо
-
Понятное дело, что это будет медленней чем просто колонка с данными.
-
короч попробуем чо получится
-
Конечно, Clickhouse слишком вариативен, и всё чисто тестировать.
-
в нормальном режиме memory used держится в районе 2Гб из 8 на всех трёх нодах кластера. Т.е. как-будто и 8 с большим запасом.
потихоньку течёт на ноде, которая читает из кафки, но это другая история.
просто в какой-то момент одновременно все три ноды сорвались в бешенный режим: памяти стало не хватать, CPU в сотку.
мы уже добавили до 12Гб
две ноды "выздоровели", видимо, "прожевав" тяжёлые мёржи. А одна так остаётся в раше, увеличение ОЗУ ей не помогло
поэтому и стал копать глубже. М.б. ещё партицирование по месяцу сделать для этой таблицы, не знаю. Блин, да в ней всего 130к записей -
когда ноды не находятся в описанном раше и по CPU и по памяти всё спокойно
-
хм, спасибо, почитаю
-
Кхм, может реально ГОД это слишком большой промежуток для партции ... Но по идее MergeTree и без партции должна жить нормально
-
А сколько весит таблица ?
-
я как понял, ему нужно еще и сжать данные на диске. а настройка merge_max_block_size влияет по итогу на количество получаемых партов (и итоговую компрессию), или просто мердж идет "медленнее" с меньшим потребленим ОЗУ и тем же итоговым результатом?
-
/opt/bitnami/zookeeper/bin/zkCleanup.sh -n 10
сейчас сделал - было 12 Гб стало 91 Мб -
всем привет, есть replicatedmergetree с multi-tier стораджем ссд-хдд-с3
после мува партиций из с3 на локальные диски свободного места в с3 больше не становится, т.е. такое ощущение что партиции из с3 не удаляются
подскажите плз:
1. как почистить место в с3 (удалить то, что было смувлено на локальные диски)?
2. как выключить такое поведение? -
По TTL муваете ?
-
-
9Гб не в сжатом, и около 3.2Гб в сжатом виде. Опа, может для мёржа СН приходится всю таблицу в память поднимать?
-
Ну посмотрите сколько партов у таблицы
-
уехало в с3 из-за storage policy когда место стало заканчиваться, столкнулся с неочисткой места в с3 когда мувал нужное назад в быстрое хранлище
-
партов 12 на одну партицию (текущий год)
-
А вы старые данные льёте ?
-
Тот же результат. Не влияет она результат.
-
Так зачем вы мучаетесь. Прочитайте доку кх. Вам надо в зк автопурж настроить
-
1 ссд почистить? Или с3
-
не то чтобы мучаюсь на новом кластере настроил - просто сейчас опасаюсь ноду ЗК перезапускать для применения
-
подскажите сейчс в моей версии 22.1.3.7 настройки в конфиге КХ подхватятся сразу без рестарта сервиса или же нужно будет его рестартовать ?
-
с3
-
Нет, это текущие данные. Забираем из кафки через kafkaengine. Старее суток данных не бывает (стоит ттл на топике в Кафке)
-
Может построить mv поверх этого _agg, которое схлопнет агрегацию квантиля до одного вычисленного значения и поджать ttl для таблицы _agg + партицирование для неё замельчить до месяца...
-
Не нужен рестарт кх.
-
Кстати. А в кх кипере это нужно настраивать?
-
не совсем ясен вопрос - кипер если не настроено пишет снапшоты и логи до упора
-
Да, именно об этом был вопрос. Ясно понятно, настрою. Спасибо
-
Array(IPv4) cannot be inside Nullable type
правильно я понимаю что поле типа Array(чего угодно) не может быть NULL ? -
нет. вместо NULL там пустой массив
-
Не бывает nullable(array). Используется пустой массив - []
Бывает Array ( Nullable(String) ) -
извиняюсь я про определение значения поля в блоке create table
у мен] просто он ругнулся на все поля подобные.
то есть я могу просто не указывать это в определении. Если подам на вход null то оно сохранится как пустой массив в поле. Верно? -
О! Псиб!
-
нет, insert вроде должен будет поругаться, что не сможет Null сконвертить
-
учту. спасибо
-
А как понять трейс. Я чот в юпитере какую то дич получаю
Например
client.execute(f"INSERT INTO DB.TBL FROM INFILE {DATA_DUMP} COMPRESSION BZ2 FORMAT JSONAsString;")
ServerException: Code: 62.
DB::Exception: Syntax error: failed at position 34 ('FROM'): FROM INFILE ..dumps/data_dump. Expected one of: WATCH, OpeningRoundBracket, SELECT, VALUES, FORMAT, WITH, token. Stack trace: -
и чего это значит?
-
Infile это фишка кх клиента. Она больше нигде не работает.
-
тьфу блин тоска печаль
-
руками получается парсить...
-
жээээсть
-
Нет. Просто request засылайте в сервер свои json
-
извиняюсь за занудство, но слово "только" помогло бы понять написанное однозначно )
-
Это автоперевод с китайского
-
-
издеваетесь над маленькими )
- 05 July 2022 (210 messages)
-
-
нет
-
-
Привет! Я борюсь с ошибками Memory limit в version 21.3.14.1 (official build).
Все возможные параллельные вставки зарулил в 1 поток.
Глянул system.query_log, там самый большой insert потребляет 3.5Гб.
Таблиц с движками 'Memory','Set','Join' нет.
```
select metric, formatReadableSize(value) size
from system.asynchronous_metrics
where asynchronous_metrics.metric ilike '%mem%';
+------------------+----------+
|metric |size |
+------------------+----------+
|MemoryVirtual |106.63 GiB|
|MemoryCode |310.66 MiB|
|MemoryResident |11.24 GiB |
|MemoryShared |22.53 MiB |
|MemoryDataAndStack|106.01 GiB|
+------------------+----------+
```
И причем по графикам видно, что память забита постоянно, почти не зависимо от того сколько запросов пришло.
Как узнать, чем забита MemoryResident 11.24 GiB?
Всего на сервере 16Гб. -
-
круть 👍, буду дальше исследовать
-
-
А когда её сломали?
-
к сожалению ни за что не зацепился((
все также, самые тяжелые запросы 3.13Гб, но они последовательные.
А мержи и процессы тоже как будто бы едят не много, минут 5 следил за ними.
```
select (select formatReadableSize(sum(memory_usage)) from system.merges) merges,
(select formatReadableSize(sum(memory_usage)) from system.processes) processes,
(select formatReadableSize(sum(primary_key_bytes_in_memory_allocated)) from system.parts) pkeys,
(select formatReadableSize(sum(total_bytes)) from system.tables WHERE engine IN ('Memory', 'Set', 'Join')) temptabs,
(select formatReadableSize(sum(bytes_allocated)) FROM system.dictionaries) dicts
+--------+---------+---------+--------+------+
|merges |processes|pkeys |temptabs|dicts |
+--------+---------+---------+--------+------+
|2.42 GiB|0.00 B |66.84 MiB|NULL |0.00 B|
+--------+---------+---------+--------+------+
```
А вот MemoryResident постоянно в потолок, 10-11Гб из 13.81Гб.
Есть на что ещё обратить внимание? -
привет!
при попытке заинсертить поле получаю варнинг:
Cannot parse expression of type Array(String) here: , [{'data1’: ‘someData1’, ‘data’2: ‘some’data2, 'status': 'ok', 'warnings': []}, {'data1’: ‘some’Data1, ‘data2’: ‘somedata2’, 'status': 'ok', 'wa (version 21.3.20.1 (official build))
Вроде ни в какие противоречия с форматом не вступаю. Хочу в колонку запихнуть массив json-ов в виде строк.
Их нажеюсь не нужно из json в строки каждую конвертить перед. вставкой? -
Выглядит так, будто вы в Array(String) пытаетесь положить [{...}, {...}, ..., {...}], который нифига не массив строк.
-
все верно. я вчера спрашивал в какой тип данных такое погрузить.
получил ответ что в Array(String) -
так в какой тип данных такое класть, подскажите пожалуйста.
-
Здесь было восстановлено:
https://github.com/ClickHouse/ClickHouse/issues/23907"Unsupported aggregate function argMax" error when using it with SimpleAggregateFunction · Issue #23907 · ClickHouse/ClickHouseDescribe the bug Documentation for function argMax suggest that is it helpful when used with SimpleAggregateFunction: Удобно использовать для работы с SimpleAggregateFunction. However an attempt to...
-
Всем привет!
Начал осваивать MV и возникла следующая проблема: не срабатывает триггер при вставке данных в исходную таблицу с сырыми данными. Попробовал сделать вью на тестовой таблице (сделал аналог исходной таблицы с сырыми данными и заинсертил туда 1 день), вьюха обновилась и на первый взгляд все сработало ок. Подскажите, пожалуйста, в чем может быть проблема? Код таблицы и вьюхи прикладываю ниже:
https://pastebin.com/5hzgti4iclickhouse_mv - 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.
-
Делаем:
INSERT INTO z.t (f)
SELECT randomString(10) FROM numbers(50000200);
INSERT INTO z.t (f)
SELECT randomString(1) FROM numbers(50000200);
Потом делаем:
SELECT * FROM z.t OFFSET 50000000;
Получаем:
Cannot push block to port which already has data. (LOGICAL_ERROR).
Никто не сталкивался с такой ошибкой ? -
Можно и в Array(String), но только класть надо тогда ['{...}', '{...}', ..., '{...}'].
По идее должны завезти ещё тип данных JSON и, наверное, Array(JSON), но я их ещё не щупал. -
в документации не увидел, вот и не трогал
А как без него то завести? конвертить json в строки? люто сильно -
['json','json']
-
Надо чтобы было вот так вот
-
ну эт я понял. чо то жозенько (
-
Вам пример вставки скинуть ?
-
если это не конвертация json в строку переж погрукой то да. был бы благодарен
-
Создаём таблицу
CREATE or Replace TABLE test ( str_array Array(String)) Engine = Memory()
Вставляем данные
INSERT INTO test (str_array) VALUES (['{"asdasd":"1", "ets":"2", "kesas":"79350017"}'])
Получаем
SELECT *
FROM test
Query id: 68ca5466-aab0-437d-ac7a-19e7e7ffd0d8
┌─str_array─────────────────────────────────────────┐
│ ['{"asdasd":"1", "ets":"2", "kesas":"79350017"}'] │
└───────────────────────────────────────────────────┘ -
таблица которая в TO ... для MV
она ReplicatedMergeTree? -
пасибо! понял что придется конвертить перед вставкой.
-
она AggregatingMergeTree, её отдельно создавал перед созданием самой MV
-
посмотрите в SELECT * FROM system.part_log WHERE table='your_aggreated_mergetree_table_name' FORMAT Vertical какие события были по вашей целевой таблице
ну и в логи посмотрите /var/log/clickhouse/clickhouse-server.err.log
может там что нибудь при вставке сконвертироваться не может -
Есть aggregatefunctions и есть simpleagregatefunctions. Первые поддерживают argmax и всегда поддерживали. Вторые нет и не должны.
-
-
Где ?
-
21.3 все.
Memorytracker правильно считает память с 21.9 -
При делении выводит NaN, если было деление на 0
-
-
При делении NULL на 0 будет NULL. При делении NaN будет NaN. Делите Null и будет Null)
-
countState(DISTINCT clientID) count_client
Это не будет работать. Mat.view это триггер. Вам надо использовать uniqState -
Как я могу использовать argMax при создании таблицы AggregatingMergeTree?
-
по запросу результата нет (пустая таблица)
-
AggregatingMergeTree-event-enrichment
AggregatingMergeTree-event-enrichment. GitHub Gist: instantly share code, notes, and snippets.
-
а в логах что? значит MV вставить не смог
уверены что MV правильно объявлена TO aggregating_mergetree_table_name ? -
Offset без limit ? А если с limit? Какая вермия кх?
-
А дело не в limit, а в randomString.
-
А почему вы написали что ошибка после select ?
-
Потому, что она после попытки выполнить select
-
if(isNaN( (x/y) as xy), null, xy)
-
Спасибо, не знал, что такую конструкцию нельзя использовать) Однако все равно непонятно, почему на тестовой таблице триггер сработал (код был одинаковый, за исключением того, что поменял таблицу во FROM)
-
к логам доступа нет, к сожалению
Яндекс нашей компании предоставляет CH как коробку
как пример: скидывал ссылку как формировал таблицу и MV (https://pastebin.com/5hzgti4i) и кажется, что нет ошибкиclickhouse_mv - 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.
-
HIST.visits_raw1 vr
Уберите vr -- алиасы таблиц вообще не работают во вью
а insert в эту таблицу были? -
да, инсерт происходит ежедневно - из метрики по логс апи
-
возможно ли такая история из-за того, что сырые данные заливаются чанками?
-
Возможно что у вас нет инсертов. Данные можно добавлять через attach
-
Всем привет
Подскажи возможно ли указывать партицию динамические в запросе на оптимизацию
Например: OPTIMIZE TABLE default.table_with_engine_replacing_merge_tree partition toYYYYMM(now()) FINAL
Такой вариант к сожалению не работает, но возможно есть альтернативный? -
ПОдскажи пожалуйста в чем разница квотирования?
INSERT INTO test (str_array) VALUES (["{'asdasd':'1', 'ets':'2', 'kesas':'79350018'}", "{'qweqweqwe': 3, 'sec': '3', 'warnings: []'}"])
DB::Exception: Missing columns:
а если
INSERT INTO test (str_array) VALUES (['{"asdasd":"1", "ets":"2", "kesas":"79350017"}'])
то все норм.
Догдался методом тыка. Может я что то не дочитал или это какой то высший пилотаж? ) -
А если так
OPTIMIZE TABLE default.table_with_engine_replacing_merge_tree partition tuple(toYYYYMM(now())) FINAL -
INSERT INTO test (str_array) VALUES (['{"asdasd":"1", "ets":"2", "kesas":"79350017"}','{"asdasd":"1", "ets":"2", "kesas":"79350017"}'])
-
Так работает, большое спасибо
-
не понял
-
да так вставится норм. а если обратное квотирование сделать не вставится. то есть есть принцпиальная разнаци. нохрена она?
-
Я не знаю, у меня просто привычка так делать ковычки 🙃
-
ништяк привычка ) тут тока моё почтение )
-
данные добавляются через инсерты
-
Я думаю, тут проблема в том, что JSON стандарт через эти " ковычки https://ru.wikipedia.org/wiki/JSON
-
но тут фишка в том что мы вставляем массив мать его строк )
и какая ему нахрен разница что там внутри строки погружено. Еслиб это был масси json вопросов бы не возникло. -
Спасибо огромное, все сработало
-
Привет! Кто как удаляет в ReplacingMT, если две записи с одинаковым id, но разными dt, а в order by (id, dt)? Нужно удалить только те строки, где dt максимальна с одинаковыми id.
Пример:
id, dt
1, 2022-01-01 00:00:00
1, 2022-01-02 00:00:00
Нужно удалять вторую строку. Удалить нужно один раз, но несколько сотен тысяч строк. -
22.7.1.1054.
create table t (f String, i UInt64) Engine=MergeTree order by i;
INSERT INTO t (f) SELECT randomString(10) FROM numbers(50000200);
INSERT INTO t (f) SELECT randomString(1) FROM numbers(50000200);
SELECT * FROM t OFFSET 50000000;
Showed first 10000.
50000400 rows in set. Elapsed: 1.424 sec. Processed 100.00 million rows, 2.25 GB (70.24 million rows/s., 1.58 GB/s.) -
не понял
INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...
почему нельзя список кортежей передавать?
сказанож что нужно грузить брльшими кусками по 100к записей не менье. -
> order by (id, dt)
просто order by (id) ? -
да, изначально неправильно сделали order by, и вставили дубликаты с разным dt, они не схлопываются естественно, и хотим удалить такое.
-
[ ] -- это соглашение документации, о том как помечать необязательные параметры
-
я бы выбрал и вставил в другую таблицу то что должно остаться, и потом удалил все из исходной и вставил туда из "другой"
-
а выкинуть из order by на ходу уже нельзя же?
-
нельзя
-
partition BY value_day
так себе идея
лучше
PARTITION BY toYYYYMM(value_day)
и лучше другую функцию
AggregateFunction(uniqExact, UInt64))
и
uniqExactState(clientID) count_client -
Но тогда не будет ускорение, нет ? если исползовать uniqExact
-
ускорения чего?
countState(distinct
надо посмотреть оно трансформируется в uniqExactState или нет... -
Ааа там просто Дени рекомендова uniq :)
-
countState(distinct записывает просто числа, и они конечно неправильные
-
у вас просто структура AggregatingMergeTree и SELECT по структуре немного различаются
countState(DISTINCT ...) и просто count в AggregatingMergeTree -
AggregateFunction(COUNT, UInt64) и countState -- это ОК, просто считает чушь
наличие DISTINCT не влияет -
AggregateFunction(uniqExact, UInt64)) конечно пользоваться невозможно, и медленно и падать по памяти будет
-
client.execute('Create table test (x Int32(), y String) ENGINE=Memory')
client.execute('INSERT INTO test (x, у) VALUES', [{'x': 1, 'y': 'One'}, {'x': 2, 'y': 'Two'}, {'x': 3, 'y': 'Three'}, {'x': 100, 'y': 'Sto'}])
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd1 in position 53: invalid continuation byte -
Да ну хорош блин
-
тут то что не так?
-
тогда совсем непонятно, как можно собрать в MV количество уникальных visit_id в разрезе, например, городов, если та конструкция считает неверно, а uniqExact будет работать медленно
-
Может кто подскажет как пачкой правильно данные клик положить?
чот затрахался с этими капризами. то ему ковычки не те то кодировка не такая... -
можно uniqCombinedState
там меньше памяти считает быстрее...
но точность не 100% -
client.execute('INSERT INTO test_table (log_string) VALUES', ((line,) for line in data)) у меня data это list строк
-
пасиб. щас так попробую
-
я же сказал uniqState
-
Можно прям датафреймами вставлять из Pandas
-
в values можно передать много строк
insert into .... values ( ) ( ) ( ) -- передаем три строки -
не вариант мозгов не хватает на машине.
-
Если выполнять через client:
│ =⚌0⚌A.Ò⚌ │
I4پg │
│ >]Pi⚌C⚌ │
└─────────────────────────┘
Showed first 10000.
50000400 rows in set. Elapsed: 1.224 sec. Processed 100.00 million rows, 1.45 GB (81.68 million rows/s., 1.18 GB/s.)
clickhouse-db :) xterm-256colorxterm-256colorxterm-256colorxterm-256colorxterm-256colorxterm-256...
+DDL такая:
CREATE TABLE z.t
(
f String
)
ENGINE = MergeTree
ORDER BY f
SETTINGS index_granularity = 8192; -
https://clickhouse.com/docs/ru/sql-reference/functions/other-functions/#randomstring
Генерирует бинарную строку заданной длины, заполненную случайными байтами (в том числе нулевыми).
https://clickhouse.com/docs/ru/sql-reference/functions/other-functions/#randomascii
Генерирует строку со случайным набором печатных символов ASCII.
https://clickhouse.com/docs/ru/sql-reference/functions/other-functions/#randomstringutf8
Генерирует строку заданной длины со случайными символами в кодировке UTF-8.Прочие функции | ClickHouse Docsother-functions}
-
Это я видел, когда используешь IDE DBeaver и выполняешь запрос на select получаешь:
'Cannot push block to port which already has data. (LOGICAL_ERROR).' -
там написано DBException и номер?
-
SQL Error [49] [07000]: Code: 49. DB::Exception: Cannot push block to port which already has data. (LOGICAL_ERROR) (version 22.6.1.1985 (official build))
, server ClickHouseNode(addr=http:ip:8123, db=default)@-718568384 -
да баг в КХ
странно но не получается воспроизвести курлом -
а в 22.6.2 воспроизводится?
-
получилось через консоль затолкать вот это
1655672463987, '',
вот сюда
time1 DateTime64(3, "Europe/Moscow") NOT NULL,
time2 DateTime64(3, "Europe/Moscow") NULL,
Легло без проблем
пытюсь сдеать тоже самое через драйвер
получаю AttributeError: 'str' object has no attribute 'tzinfo'
других полей стаймхоной у меня в блоке нет поэтому предполагаю что агрится на второе значение которуе пустым летит.
Как ему правильно null подать?
"что сюда вернуть?" if data['time2'] is None else data['time2'], -
Да.
SQL Error [49] [07000]: Code: 49. DB::Exception: Cannot push block to port which already has data. (LOGICAL_ERROR) (version 22.6.2.12 (official build))
, server ClickHouseNode(addr=http:ip_new:8123, db=default)@621939104 -
Всем привет! Помогите, пожалуйста, разобраться в обновлении материализованного представления.
Код запроса во вложенном файле.
Ожидание: что при инсерте в HIST.visits_raw1, представление будет обновлено. Но этого не происходит. Почему?
И еще один вопрос: если в таблицу HIST.visits_raw1 инсерт происходит чанками по 100 шт за раз, то как в таком случае должно вести себя представление? Оно будет 100 раз обновляться за одну итерацию? -
вы там скоординируйтесь что бы один и тот же вопрос не задавать @cation73
-
-
забавная ситуация)) спасибо)
-
а как таблица создана? Create table ?
можете ошибку на сервере посмотреть в /var/log/clickhouse-server/clickhouse-server.err.log
нужен запрос (jdbc драйвер может запрашивать в разных форматах TSV/RowBinary) и стектрейс -
CREATE TABLE z.t
(
f String
)
ENGINE = MergeTree
ORDER BY f
SETTINGS index_granularity = 8192; -
-
-
нету.
делаете POC на 5% данных экстраполируете.
У КХ очень много usecase. Можно использовать очень по разному. -
типа линейно можно экстраполировать?
-
ну теоритически КХ может линейно масштабироваться (мне например понятно как этого добиться).
-
Stack trace (when copying this message, always include the lines below):
0. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, bool) @ 0xb8a143a in /usr/bin/clickhouse
1. DB::OffsetTransform::preparePair(DB::OffsetTransform::PortsData&) @ 0x17496b2a in /usr/bin/clickhouse
2. ? @ 0x17495329 in /usr/bin/clickhouse
3. DB::OffsetTransform::prepare(std::__1::vector<unsigned long, std::__1::allocator<unsigned long> > const&, std::__1::vector<unsigned long, std::__1::allocator<unsigned long> > const&) @ 0x1749526b in /usr/bin/clickhouse
4. DB::ExecutingGraph::updateNode(unsigned long, std::__1::queue<DB::ExecutingGraph::Node*, std::__1::deque<DB::ExecutingGraph::Node*, std::__1::allocator<DB::ExecutingGraph::Node*> > >&, std::__1::queue<DB::ExecutingGraph::Node*, std::__1::deque<DB::ExecutingGraph::Node*, std::__1::allocator<DB::ExecutingGraph::Node*> > >&) @ 0x171a9a39 in /usr/bin/clickhouse
5. DB::PipelineExecutor::executeStepImpl(unsigned long, std::__1::atomic<bool>*) @ 0x171a42eb in /usr/bin/clickhouse
6. ? @ 0x171a60c4 in /usr/bin/clickhouse
7. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0xb94d077 in /usr/bin/clickhouse
8. ? @ 0xb95049d in /usr/bin/clickhouse
9. start_thread @ 0x7ea5 in /usr/lib64/libpthread-2.17.so
10. __clone @ 0xfeb0d in /usr/lib64/libc-2.17.so -
в запросе в конце JDBC дравер дописывает TabSeparatedWithNamesAndTypes или RowBinaryWithNamesAndTypes
Т.е. интересно у вас кидает ошибку
select * from z.t offset 50000000 format TabSeparatedWithNamesAndTypes
или
select * from z.t offset 50000000 format RowBinaryWithNamesAndTypes -
Ребят, недавно стал работать с CH и есть таблица, в которой есть какие-то данные по продажам и колонка version, которая datetime. Задача - выбрать данные по с самой свежей версией
Сейчас запрос типа такого
SELECT col1, col2, col3
FROM db.table_name
WHERE (date, version) IN (
SELECT date, MAX(version)
FROM db.table_name
GROUP BY date
)
AND some other conds
Проблема: если добавляю больше колонок, то время выполнения запроса начинает сильно расти. Может есть какие-то рекомендации, как это лучше делается?
Версия CH: 18.10.3 -
Наваривать таблицу с актуальными версиями каждый день, и ней писать селекты?
-
не помню про 18.10 уже
сейчас можно сделать order by date, version desc limit 1 by date -
В обоих случаях скорей всего
-
у меня даже вопрос больше, почему такое может происходить, что время увеличивается? Так как я думал, что он должен брать маску фильтрации и применять ее к колонке или как-то это по-другому происходит?
-
Скорее всего читаются все запрашиваемые колонки ещё до фильтрации.
-
Всем привет , кто то делал мат вьюхи с джойном таблицы на саму себя ?
Вроде как нашёл странное поведение при таком кейсе.
При инсерте строчек в таблицу payments , лефт джойн обращается не ко всей таблице payments(чтобы найти время первой транзакции и поставить соответствующий флаг) , а к только что вставленному бакету , и при каждой транзакции юзера ft_flag будет равен 1 , ибо база считает что других строчек нет и не было
Как можно это обойти ? -
Так всю жизнь было. Если очень надо, то например оберните таблицу в обычную вьюху и джойните уже её.
-
Обычная вьюха это CREATE VIEW ?
-
Ну да
-
Спасибо
-
привет. Кто-нибудь сталкивался с такое ошибкой при создании view?
/var/lib/clickhouse/store/c42/c42812b4-0aca-46a6-8428-12b40aca56a6/TABLE_NAME.sql.tmp, errno: 17, strerror: File exists. (CANNOT_OPEN_FILE) (version 21.12.2.17 (official build)) -
Привет.
Буду очень благодарен, если кто-нибудь подскажет, можно ли каким-то образом в запросе подключиться подключиться по HTTP(s) к источнику, для которого нужен header?
Без header'а для этого достаточно табличной функции url. -
словари умеют.
вам надо запрос выполнить против данных которые в http или там справочник который надо приджойнить? -
а хотя и url тоже уже умеет
https://github.com/ClickHouse/ClickHouse/blob/5c6b84c398017256d47bc381dc7227371a522b6f/tests/config/config.d/named_collection.xml#L17
https://github.com/ClickHouse/ClickHouse/blob/af2150a68d3d80403727b6e3bf35d0a1c7194f04/tests/queries/0_stateless/02244_url_engine_headers_test.sql#L1
https://github.com/ClickHouse/ClickHouse/issues/38311ClickHouse/named_collection.xml at 5c6b84c398017256d47bc381dc7227371a522b6f · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
всем привет!
Это баг или что-то не то делаю?
```select arrayMap(x -> toUUID(x), ['3da1845d-166e-4ef9-bb52-69427858012a']);```
```java.lang.IllegalStateException
at ru.yandex.clickhouse.response.ByteFragmentUtils.parseArray(ByteFragmentUtils.java:301)
at ru.yandex.clickhouse.response.ByteFragmentUtils.parseArray(ByteFragmentUtils.java:156)
at ru.yandex.clickhouse.response.ClickHouseResultSet.getArray(ClickHouseResultSet.java:353)``` -
JDBC не умеет Array(UUID).
-
аа, т.е. проблема локальна и на питонячем драйвере будет ок?
-
Подскажите, удалил большую таблицу, прошло уже больше часа, но место на диске так и не освободилось. В логах ошибок нет. Это нормальное поведение или что-то подвисло? (В документации говориться о 8 минутах, до того как будет физическое удалние)
-
я не знаю.
я обычно в строку конвертирую toString(
SELECT toString(arrayMap(x -> toUUID(x), ['3da1845d-166e-4ef9-bb52-69427858012a'])) -
-
хм.. а потом к массиву?
-
Всем привет! Можно ли поменять SELECT в определнии Materialized View? Сначала делаю DETACH dbname.mvname, потом делаю ATTACH MATERIALIZED VIEW dbname.mvname и далее измененный DDL. Выдаёт ошибку: Code: 80. DB::Exception: Incorrect ATTACH TABLE query for Atomic database engine
Пользовался этой докой Altinity: https://kb.altinity.com/altinity-kb-schema-design/materialized-views/ -
Да, но таблицы как бы уже нет в system.parts, то есть файли на диске есть, но КХ после DROP TABLE ее не видет
-
а если нужно значение в виде UUID'а?
-
https://clickhouse.com/docs/en/sql-reference/statements/alter/view/
mat_view с TO ?
https://den-crane.github.io/Everything_you_should_know_about_materialized_views_commented.pdf https://youtu.be/1LVJ_WcLgF8?list=PLO3lfQbpDVI-hyw4MyqxEk3rDHw95SzxJ&t=7597ALTER TABLE … MODIFY QUERY Statement | ClickHouse DocsYou can modify SELECT query that was specified when a materialized view was created with the ALTER TABLE … MODIFY QUERY statement. Use it when the materialized view was created without the TO [db.]name clause. The allowexperimentalaltermaterializedview_structure setting must be enabled.
-
у вас массив, вам вообще массив нужен?
-
есть массив уидов в виде строки, надо массив, но не строковых типов
-
я использую toString чтобы обойти ограничения java
-
Если я правильно понял, в последней стабильной версии от Altinity этого ещё нет?
-
нет
-
так а потом куда с этой строкой? далее надо эти значения положить в таблицу, например. уиды легче
-
я вам объясняю как решить проблему ```java.lang.IllegalStateException
которая не позволяет увидеть результат запроса SELECT toString(arrayMap(x -> toUUID(x) НА ЭКРАНЕ МОНИТОРА -
без TO с Implicit table, спасибо за материалы!
-
да, не повезло вам.
придется делать как деды делали в 2016, сделать DETACH dbname.mvname , потом отредактировать файл .sql и потом attach table. -
Я пытался подключить источник как внешний словарь, но данные он отдаёт как json, не совпадающий с форматом, описанным в документации CH.
Возможно ли использовать формат JSONEachRow или что бы то ни было ещё, чтобы подключить этот json хотя бы как словарь из одного элемента? -
нет, невозможно
-
спасибо, только не понял почему .sql файл редактировать и почему attach table, а не attach materialize view + измененный запрос создания вьюхи
-
так потому что "Выдаёт ошибку: Code: 80. DB::Exception: Incorrect ATTACH TABLE query for Atomic database engine"
-
-
я не на это напарываюсь? https://github.com/ClickHouse/ClickHouse/issues/37296sequenceMatch() and sequenceCount() return wrong results when run over a distributed table · Issue #37296 · ClickHouse/ClickHouse
Describe what's wrong We have noticed that sequenceCount (and sequenceMatch as further tests have shown) behave in different ways when run against a distributed and local tables. Does it re...
-
Всем привет! В ClickHouse есть оконные функции? Или может посоветуете что-то другое для моего примера, он ниже.
Есть таблица со сменой статусов у задач в YT:
issue_id,
timestamp,
removed_values,
added_values
Мне надо сделать группировку по issue_id, и посчитать сколько времени задача находилась в каждом из статусов. -
есть
-
можно массивами, можно WF
-
Добрый день! Документация сообщает, что рассчитывать на порядок элементов в массиве после groupArray нельзя (что логично, когда выполняем запрос в Distributed таблице). Однако, ручные тесты показывают, что запросы вида SELECT groupArray(t.item) FROM (SELECT item FROM table ORDER BY time) t имеют стабильный порядок (в соотвествии с ORDER BY во вложенном селекте), что, судя по всему, вызвано тем, что Dirtibuted таблица собирает записи в определенном порядке и отправляет в groupArray без какого-либо "перемешивания" – насколько это надежное предположение?
P.S. groupArraySorted возвращаться не планирует? -
А в чём проблема сделать arraySort(x->x.1, groupArray((time,item)))
-
ну вот только если таскать с собой поле для сортировки – а их может быть много, и ввиду специфики задачи хотелось бы этого избежать
-
Ну так не таскайте, оставьте только второй итем
-
на столько, что уже в следующей минорной версии это может поменяться, ведь все предупреждены, что гарантий нет
-
вообще все не так.
никакого отношения к Distributed.
КХ таблица возвращает строки в рандомном порядке, для стабилизации порядка используется order by, подзапросы КХ выдают строки в стабильном порядке, поэтому РЕКОМЕНДУМАЯ конструкция это сюрприз SELECT groupArray(t.item) FROM (SELECT item FROM table ORDER BY time) -
то есть groupArray все же порядок сохраняет, рандомность получается из-за непредсказуемого порядка получения записей в общем случае?
-
рандомность из того что в groupArray строки прилетают в рандомном порядке, подзапросы с order by возвращают строки в стабильном порядке
-
а с чего не должна? Это ж обычный плюсовый вектор под капотом (я подозреваю)
-
а, оказывается, в документации это прям упомянуто явно, каюсь, не дочитал (In some cases, you can still rely on the order of execution. This applies to cases when SELECT comes from a subquery that uses ORDER BY.)
-
спасибо, а что такое WF? Нашла еще такую runningDifference, но пока не поняла подходит ли она мне
-
window function
-
привет! Подскажите хорошие материалы по оптимизации запросов в clickhouse. С чего начать, на что смотреть, за чем следить, на что обращать внимание. Может у кого-то уже есть небольшая библиотека ссылок 🙂
-
Runningdifference и neighbor результат могут давать некорректный результат
-
Привет
Пытаюсь в kafka engine ( по мануалу) https://clickhouse.com/docs/ru/engines/table-engines/integrations/kafka/ , но матвьюха прилетает пустая.
Создаю очередь, и вижу что данные заливаются норм(скрин).
Пересоздаю очередь, создаю еще таблицу +матвью, но матвьюха в конце пуста. Что я делаю не так
CREATE TABLE IF NOT EXISTS metals_queue
(
timestamp String,
metal String,
temp_celcius UInt64
)
ENGINE=Kafka SETTINGS
kafka_broker_list = 'localhost:9092',
kafka_topic_list = 'metals',
kafka_group_name = 'group1',
kafka_num_consumers = '1',
kafka_format = 'JSONEachRow'
CREATE TABLE metals
(
timestamp String,
metal String,
temp_celcius UInt64
)
Engine=ReplacingMergeTree()
ORDER BY (timestamp, metal)
PARTITION BY (toYYYYMMDD(parseDateTime32BestEffort(timestamp)), metal);
CREATE MATERIALIZED VIEW metals_consumer
TO metals
AS SELECT timestamp, metal, temp_celcius
FROM metals_queue;
select * from metals_consumer limit 5; -
Всем привет, подскажите плиз как понять почему CH столько ресурсов тратит, что может он делать в это время? Смотрю через pidstat и периодически ловлю такие пики утилизации ресурсов:
-
Или это нормально и если его никак не ограничивать по числу используемых процессов то он будет кушать много ядер в моменте?
-
select * from system.processes;
там может быть много optimize table запросов например -
https://t.me/clickhouse_ru/275978
Та же ситуация, пробовал по разному, если смотреть в лог - внятной ошибки нет. Я так и не придумал, что с этим делать.Zaur Begiev in ClickHouse не тормозитВсем привет! Пытаюсь настроить тестовую интеграцию Kafka + Clickhouse. Пока не получается (данных в таблице нет). Сможете подсказать, что я делаю не так? Есть топик Kafka с тестовыми данными в виде плоского JSON с 2мя полями вида: {"EUR":0.9529,"RUB":53.844232} Для него создаю по шаблону из документации: CREATE TABLE IF NOT EXISTS currency_kafka ( RUB FLOAT, EUR FLOAT ) ENGINE = Kafka() SETTINGS kafka_broker_list = 'kafka1:19092', kafka_topic_list = 'currency', kafka_group_name = 'group1', kafka_format = 'JSONEachRow'; create table if not exists currency_data ( RUB FLOAT, EUR FLOAT ) ENGINE MergeTree() order by RUB; CREATE MATERIALIZED VIEW if not exists currency TO currency_data (RUB FLOAT, EUR FLOAT) AS SELECT * FROM currency_data; select * from currency Получаю пустой результат
-
Один запрос может использовать до половины всех ресурсов, те два спокойно могут выжрать все цпу, это нормально
-
пасиб. попробую с issue залететь к ним мб
-
Тут пока что толком нет запросов, только чтение данных из Kafka
-
Поэтому спрашиваю, у меня там job раз в час выполняется но это не тот случай.
-
Поэтому да какие то интересные внутренние штуки типо оптимизации таблицы или ее агрегации, но хотелось бы детальнее копнуть и как то это контролировать.
-
И в режиме Kernel иногда прям пугает процент использования процессора
-
У меня был кейс, где я запускал несколько optimize на одну таблицу одновременно, и цпу улетало в небеса
-
SELECT * FROM system.merges
-
Вы изменяли дефолтные настройки кафки таблицы, у вас какой поток данных там?
-
в логи КХ надо смотреть.
кстати селектом из кафка engine вы забираете данные и двигаете офсет, поэтому эти данные во вью уже не попадут -
Да изменял, сейчас скину параметры. Поток примерно 3,5 Mil сообщений в / 1 минуту
-
Спасибо. Селект я в первый раз заюзал в целях дебага. Потом уже убрал его(пересоздал все 3 обьекта). Так и быть, буду копать логи кх
-
в логе КХ с level=trace что пишется в эти моменты?
сколько у вас таблиц? -
2 кафка таблицы. Поток сказал какой.
Настройки такие:
kafka_format = 'Protobuf', kafka_schema = 'logentries_v1:ImpressionLogRecord', kafka_max_block_size = 1048576, kafka_thread_per_consumer = 1, kafka_num_consumers = 5 -
У меня 1 шард и две реплики, в одной 5 консюмеров в другой 4. Чтения хватает, Лаг маленький при такой записи.
-
не, я про кол-во mergeTree таблиц
-
там очевидная ошибка
MATERIALIZED VIEW читает из неправильной таблицы
CREATE MATERIALIZED VIEW if not exists currency
TO currency_data
(RUB FLOAT, EUR FLOAT)
AS
SELECT *
FROM currency_data;
должно быть from currency_kafka -
7 таблиц c движком ReplicatedSummingMergeTree и такого объема они
-
проверьте в такой момент
select table, elapsed*(1/progress)-elapsed ,elapsed, progress, is_mutation,(total_size_bytes_compressed) size, formatReadableSize(memory_usage) mem
from system.merges order by progress desc -
-
Есть там таблица одна из перечисленных
-
elapsed - небольшой, значит периодически делается Merge данных? И это нормально типо?
-
Я понимаю, не суть, эта ошибка была исправлена чуть ниже в сообщениях)
-
1 мерж может загрузить 1 cpu максимум.
т.е. у вас это не мержи, это что-то другое -
Есть варианты понять что может быть?
-
в логе КХ что?
что в system.processes ? -
1. DB::ReadBufferFromPocoSocket::nextImpl() @ 0x1319839a in /usr/bin/clickhouse
2. DB::TCPHandler::runImpl() @ 0x147efac2 in /usr/bin/clickhouse
3. DB::TCPHandler::run() @ 0x14804259 in /usr/bin/clickhouse
4. Poco::Net::TCPServerConnection::start() @ 0x1745e52f in /usr/bin/clickhouse
5. Poco::Net::TCPServerDispatcher::run() @ 0x17460981 in /usr/bin/clickhouse
6. Poco::PooledThread::run() @ 0x17611609 in /usr/bin/clickhouse
7. Poco::ThreadImpl::runnableEntry(void*) @ 0x1760ed00 in /usr/bin/clickhouse
8. ? @ 0x7fd863de6609 in ?
9. __clone @ 0x7fd863d0d293 in ?
(version 22.1.3.7 (official build))
Это в логах.
В system.processes -
У нас используются Distributed движок, между двумя кластерами, может он столько кушает CPU?
-
select * from system.distribution_queue
-
подниму еще раз вопрос, может быть кто-то тоже сталкивался с таким поведением
-
Тут тоже все норм и очередь по метрикам у меня тоже сильно не копится
-
- 06 July 2022 (152 messages)
-
mv здесь просто механизм доставки данных из metals_queue в metals
соответственно, надо проверять наличие данные в metals, а не в mv
select * from metals
если данных нет, читайте лог ошибок CH
можно и со стороны кафки посмотреть: подключился ли consumer и читает ли он данные из топика -
логи смотрите, скорее всего распарсить не может что-то
-
смотрите SELECT * system.parts WHERE table='table_name' AND active=0 AND disk_name='s3_disk_name' FORMAT Vertical
если у вас Atomic то чистить будет только через 480 секунд, но я не уверен в ответе -
Доброго дня всем, а есть какой-нибудь аналог такой конструкции?
SELECT ... GROUP_CONCAT(DISTINCT sl.title SEPARATOR ', ')
...
FROM events as e
LEFT JOIN services_list AS sl ON e.services & sl.bin_value
...
GROUP BY
e.services -
arrayStringConcat(arrayUniq(groupArray(sl.title)), ', ') ...
но не факт что у вас получится & сделать в JOIN -
Здравствуйте, а почему group by с инсертом через мат вью может занимать сильно больше времени в aggregatingMergeTree, чем такой же инсерт стейтментом просто из таблицы-источника, на которой мат вьюха? Оно по блокам обрабатывается как то? Из-за этого?
-
aggregatingMergeTree не агрегирует сам по себе. либо когда-нибудь, либо через optimize
-
-
Не, именно вставка в него один-в-один запросом когда мат вьюха срабатывает и просто голый запрос из таблицы на вставку с разными скоростями работают, разница в десятки раз. AggregatingMergeTree одно и то же
-
Всем привет!
У нас есть события, отсортированные по времени. Допустим есть событие "А", событие "Б", а другие события назовем "-".
Внутри сессии события выглядят примерно так (см на картинке)
Мне нужно для каждой сессии посчитать все последовательности событий А, прерываемые другими событиями в этой сессии. Если после А произошло событие Б, то 1, если любое другое, то 0.
По примеру на картинке, я по итогу для этой сессии хочу знать, что всего последовательностей с событиями А было 3, среди которых 2 были прерваны событием Б
Подскажите, пожалуйста, как такое реализовать? -
делюсь проблемой и решением:
у нас была проблема: внезапно встала память под потолок, CPU туда же
по логам: какие-то мержи упираются в нехватку памяти
произошло одновременно на всех трёх нодах кластера.
на двух из трёх нодах кластера помогло добавление памяти, на одном - не помогло
(рядовое потребление памяти в районе 1.5-2Гб на ноде при доступных 12 (до добавления было 8))
больше добавлять не стали, стали искать другие варианты
выяснилось (просмотром system.merges), что на ноде одновременно стартовали два тяжёлых (?) мержа по двум таблицам. Возникала какая-то гонка и оба падали из-за нехватки памяти. Проходил какой-то таймаут, оба опять стартовали и история повторялась. Бесконечно.
починили через:
system stop merges table1;
(подождать пока table2 закончит мёржи)
system start merges table1;
и всё прошло: CPU к нулю, память к 1Гб - обычный уровень
может кому-то сэкономит время в похожей ситуации -
С помощью neighbor должно получиться
-
Спасибо!
Сделал с помощью groupBitOr -
Добрый день! Можно ли через sql посмотреть логи по таблице с движком kafka? Цель - не поступают данные в таблицу, выяснить в чем причина.
-
запрос ничего не возвращает, с момента перемещения из с3 уже прошло пару недель)
-
ATTACH TABLE dbname.mvname также выдал ошибку Atomic. Ещё кликхаус в Яндекс.Облаке и не вижу как поставить эксперементальную опцию редактирования mv. И из видео и мануала в pdf, не понял как редактировать напрямую sql представления, возможно ли это в Облаке? Походу дела надо переходить на Explicit метод создания MV. Спасибо, за помощь!
-
-
Всмысле у вас кластер есть ?
-
Вы указываете кластер и через зуукипер будет выполнять запросы
-
есть 2 сервера КХ, подключенные к кластеру ЗК
-
-
спасибо, хороший кейс
-
CREATE TABLE ... ON CLUSTER 'cluster-name'
почитайте в доке про distributed ddl -
читал, но там небогато: In order to run these queries correctly, each host must have the same cluster definition
в блоке <distributed_ddl> не увидел, как задать cluster-name -
смотрим в доке по Engine=Distributed <remote_servers> и system.clusters
-
посмотрел, настроил, но видимо что-то не так
create database test123 on cluster richy висит:
↖ Progress: 0.00 rows, 0.00 B (0.00 rows/s., 0.00 B/s.) -
проверяем что правильно настроен <remote_servers>
SELECT hostName() h, * FROM clusterAllReplicas('your-cluster-name',system.clusters) FORMAT Vertical
проверяем что правильно настроили zookeeper
SELECT hostName() h, * FROM clusterAllReplicas('your-cluster-name',system.zookeeper) WHERE path='/' FORMAT Vertical -
У вас имена хостов и айпи совпадают между тем что на сервере и тем что в remote_servers?
А то бывает что сервер сам про себя думает одно (localhost 127.0.0.1) а в конфиге он называется по нормальному и айпи у него нормальный. -
-
я балбес. у меня порт не 9000, а в дефолтном конфиге 9000. всё заработало, спасибо
-
надо читать что в логе кх в это время
-
Занимаюсь, спасибо за помощь. Если что то накопаю дам знать.
-
max_insert_threads and materialized views performance degradation · Issue #37900 · ClickHouse/ClickHouse
test DROP TABLE IF EXISTS t; DROP TABLE IF EXISTS t_mv; create table t (a UInt64) Engine = Null; create materialized view t_mv Engine = Null AS select now() as ts, max(a) from t group by ts; insert...
-
на стековерфлоу 500 примеров
это задача gaps and islands, groupArray -> arraySplit -
И ещё раз спрошу про деление работы на репликах. Все что предлагали с опциями не сработало, время наоборот увеличилось вдвое. Можно ли в итоге как то подключить реплики не как раунд Робин, куда уходит запрос полностью и вычисляется на одной, а делить работу между ними, если существует партицирование. И если это возможно, то где можно почитать в коде то, как реплики будут выбирать себе куски для обработки?
-
я не понял как может на s3 быть больше или меньше свободного места?
там всегда бесконечно свободное место -
мечты, мечты.
у вас таблицы replicated? результат вообще правильный получился?
сколько партов процессилось? -
ребят подскажите плиз как правльно итерировать списки строк
В Array(string) запрятаны словари (json)
типа ['{'key1': 1, 'key2': 'asdf'}', '{'key1': 2, 'key2': 'qzxc'}']
Как правльно с этим работать?
Нужно например выбрать 'key1' где длина массива > 1
Вот запрос
select field from table where length(field) > 1
а как из field вычленивать key?
ну и сотвественно как правильно агрегировать такие словари? -
Не сверял правильность, таблицы реплекейтед, да, одна реплика, просканило в два раза больше строк с опцией allow_allow_experimental_parallel_reading_from_replicas
-
а зачем вы json положили в КХ? может предварительно распарсить и тогда все будет быстрее и проще?
-
я тут спрашивал как это сделать ) ничего умнее массива. строк не предложили )
-
ну т.е. вообще непонятно КХ понял что это реплики или нет. ОК
версия-то какая у КХ ? -
22.2
-
вы спрашивали как JSON положить, все поняли что у вас в JSON может быть что угодно, а не данные с регулярной структурой.
-
у нас ceph, по графикам размера бакета вижу что место не освобождается
-
ну что то может структурировано, что то не может. сейчас вопрос о том как со стуктурированными даными работать ) Да и в целом какая разница?
-
Добрый день. Подскажите, какой путь в zookeeper предпочтительнее для Replicated*Tree?
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/{database}/{uuid}', '{replica}')
или
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/{database}/{table}', '{replica}')
Насколько я понял из документации, первый вариант позволит переименовывать таблицы не ломая репликацию -
sequenceCount
-
сейчас попробовал на 1м шарде с двумя репликами.
короче в такой конфигурации всегда читает с локальной реплики, потому что все данные есть локально.
работает если prefer_localhost_replica=0;
set allow_experimental_parallel_reading_from_replicas=1, max_parallel_replicas=2, prefer_localhost_replica=0; -
с этим проблема, вообще непонятно может ли КХ что-то удалять вообще в этом случае. Там используется специфический AWS функционал.
-
arrayMap(x->visitParamExcractString(x,'key_1'),array_json)
-
Да давай
-
первый.
она в любом случае не ломается. Вы неправильно что-то поняли.
(просто путь остается в ЗК как был и в таблице тоже) -
А у вас как таблица партицирована? По 500к с каждой реплики прочитало?
-
Я про этот фрагмент
The path in ClickHouse Keeper cannot be changed, and when the table is renamed, the macros will expand into a different path, the table will refer to a path that does not exist in ClickHouse Keeper, and will go into read-only mode. -
-
понятно, спасибо, про это поподробнее где-то кроме исходников можно почитать?
-
в общем все там кривое и результаты кажется кривые
-
Жалко, ну видимо не зря экспериментал
-
в общем разработчики были в курсе, просто не доделано
-
это странная фраза.
потому что macros раскрывается в момент create table (раньше было в момент attach) -
долнжо, у вас свежий clickhouse-backup ?
-
show create table показывает макросы
совсем недавно видела, но не помню, в какой версии
видимо, фраза про attach как раз -
-
table и database уже пару лет как раскрываются в create
-
Похоже нашли проблему в разности шардов на кластерах, сейчас выравниваю, проверяю. Спасибо
-
и в Atomic и в Ordinary?
-
да
-
а вы понимаете под "раскрывается" что происходит подстановка? потому что у меня такое не происходит на 22.3.3.44-1 на проде, я вот недавно создавал таблицу на этой версии и у меня в metadata/база/таблица.sql все так же макросы
-
-
-
Всем привет!
В официальном докер образе (version 22.6.3) и на mac os, запущенного по инструкции с сайта (version 22.7.1), нет hive engine и hive function. Это действительно так или их как-то надо дополнительно включить?
DB::Exception: Unknown table engine Hive. Maybe you meant: ['File']. (UNKNOWN_STORAGE)
DB::Exception: Unknown table function hive. Maybe you meant: ['file']. (UNKNOWN_FUNCTION) -
Всем привет. У меня кластер из 3х реплик. И сегодня они все вместе упали. В логах ошибка со скрина. Этого файла действительно нет, но не было и до этого. В чем может быть проблема и как ее можно определить кроме логов?
-
одна реплика
select count() from rep_test1 prewhere S='a';
0 rows in set. Elapsed: 19.412 sec. Processed 68.16 million rows, 70.17 GB (3.51 million rows/s., 3.61 GB/s.)
8 реплик
set allow_experimental_parallel_reading_from_replicas=1, max_parallel_replicas=8, prefer_localhost_replica=0, use_hedged_requests=0;
select count() from rep_test1 prewhere S='a';
0 rows in set. Elapsed: 3.988 sec. Processed 68.16 million rows, 70.17 GB (17.09 million rows/s., 17.60 GB/s.) -
ну в 6 раз меньше время. но тут prewhere. интересно какой там алгоритм разбиения работы по рекликам и откуда оно знает что результат независим от кусков
-
Parallel processing on replicas, reworked. · Issue #26748 · ClickHouse/ClickHouse
We want to parallelize data processing using multiple replicas of single shard. Every replica should process some split of data. There are the following considerations that makes the task non-trivi...
-
похоже что реплика проверяет выполняет кто-то работу с этим куском или нет, т.е. скорее всего одна реплика может всю работу забрать себе и 7 будут делать ничего.
вот без prewhere
select uniqHLL12(S) from rep_test1_d;
1 rows in set. Elapsed: 24.430 sec. Processed 68.16 million rows, 70.17 GB (2.79 million rows/s., 2.87 GB/s.)
set allow_experimental_parallel_reading_from_replicas=1, max_parallel_replicas=8, prefer_localhost_replica=0, use_hedged_requests=0;
select uniqHLL12(S) from rep_test1_d;
1 rows in set. Elapsed: 4.720 sec. Processed 68.16 million rows, 70.17 GB (14.44 million rows/s., 14.86 GB/s.)
это искусственно созданная идеальная таблица для allow_experimental_parallel_reading_from_replicas, в реальной жизни конечно это работать будет раз в году, при солнечной погоде. -
хотя казалось бы group by по партицированной таблице идеально ложится в кейс. Даже не надо заморачиваться с тем что считать кол-во работы, просто тупо считать что в партициях равное кол-во работы и уже норм будет на большинстве кейсов
-
в реальной жизни финализация результата с шардов на инициаторе занимает примерно половину времени.
-
странно, если на входе сотни миллионов строк , а на выходе десятки тысяч
-
client.execute("""select arrayMap(x->visitParamExtractString(x,'key_1'),['{"key1": "1", "key2": 12}','{"key1": "2", "key2": 13}'])""")
[(['', ''],)]
чет не прокатило ( -
у вас другая реальность, у меня по жизни инициатор самое проблемное место.
-
видимо такое распределение данных, что дистрибьютед таблица дает ускорение в n раз, где n -кол-во шардов. Но я не замерял конечно сильно детально , на глаз)
-
key_1 на key1 заменить ?
-
сорян но тож самое
-
в общем оно работает только если prefer_localhost_replica=0, use_hedged_requests=0;
-
select arrayMap(x->visitParamExtractString(x,'key1'),array('{"key1":"1","key2": 12}','{"key1":"2","key2":13}'))
-
Пробелы после : надо убирать
-
Я посмотрел кластер
Выглядит он не очень... Примерно понятно что произошло: на серверах в 2 часа утра начала кончаться память и ядро раз за разом убивало процесс clickhouse, он восстанавливался и в 15.39 в результате очередного раунда побились данные.
Не очень понятно: в нём или в его части которая эмулирует zookeep.
Кто-то сталкивался с такой проблемой? Выживут данные? -
ошибка в другом сообщении, до этого.
-
если keeper данные побились, то да, данные хранятся в другом месте
-
интересно увидеть ошибки кипера и версию кипера. По идее кипер должен быть надежнее чем КХ, потому что он синкает свои данные на диск (в журнал).
-
Версия кипера встроенная в КХ
А КХ 22.22.22.1 -
Какой-то replicated совсем экспериментальный, или это ожидаемое поведение?
Создал базу на двух хостах, создал таблицу (T1), дропнул базу.
Создал базу, попытался снова создать таблицу T1, получил Replica /clickhouse/tables/s1/DBNAME/T1/replicas/r2 already exists
show tables естественно девственно чист -
Drop table/database sync
-
Без sync удаляется через 8 минут
-
8 минут вроде прошло конечно, table грохнуть уже не даёт т.к. его "нет", сейчас попробую базу ещё раз стукнуть
-
22.2 ? Это уже история. После этого исправляли что то подобное в кипере
-
drop database sync не помог, +прошло уже с пол часа.
Где должна хранится эта асинхронная задача? Статус её посмотреть мб какой-то -
спасибо за наводку.
но чо то мне все шаблоны порвало
select isValidJSON('{"key1": "1","key2": 12}'). -> True
select arrayMap(x->visitParamExtractString(x,'key1'),array('{"key1": "1","key2": 12}')) -> [([''],)]
делаем replace(": ", ":") все работает.
то есть это норм поведение? или я чего то опять не дочилал? -
не очень понятно все же что вы делаете и почему у вас zk путь такой странный
r1 CREATE DATABASE testdb ENGINE = Replicated('/clickhouse/test/x', '1', 'r1');
r2 CREATE DATABASE testdb ENGINE = Replicated('/clickhouse/test/x', '1', 'r2');
create table testdb.t1(A Int64) Engine=ReplicatedMergeTree() order by A;
┌─host─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ 1|r1 │ 0 │ │ 1 │ 1 │
└──────┴────────┴───────┴─────────────────────┴──────────────────┘
┌─host─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ 1|r2 │ 0 │ │ 0 │ 0 │
└──────┴────────┴───────┴─────────────────────┴──────────────────┘
r2 drop database testdb sync;
r2 CREATE DATABASE testdb ENGINE = Replicated('/clickhouse/test/x', '1', 'r2');
r2 show tables from testdb;
┌─name─┐
│ t1 │
└──────┘ -
Вот так и с пробелами работает
select arrayMap(x->JSONExtractString(x,'key1'),array('{"key1": "1","key2": 12}','{"key1": "2","key2": 13}')) -
А можете подсказать какого-то специалиста который может помочь решить эту задачу?
-
Я думаю, он вам и отвечает :)
-
А типа особенность функции. понял, спасибо!
-
Так как перед вставкой мы все данные читаем и заливаем ... Мы решили заменять пробел
-
подскажи пожалуйста а не сильно повлияет на агрегацию данных мой корявый формат погрузки array(String/json)?
-
а то может пока еще не поздно переделать как то нормально
-
Какие у вас планируемые столбцы ?
-
прям много столбцов формата
Array(Json)
Возможно (не успел исследовать но вроде да) вложенные json нормальные (с одинаковым кол-во полей) -
а может было бы нормально расскрыть эти массивы в доп строчки ?
-
А что вы положили в ORDER BY ?
-
привет
стоит задача изменить тип столбца AggregateFunction(countIf, UInt8) -> AggregateFunction(countIf, UInt64)
пытался добавлять новый столбец и модифицировать существующий, оба раза получал ошибку
Illegal type UInt64 of last argument for aggregate function with If suffix
что можно с этим сделать? -
не знаю таких. Мы в Альтинити помогаем только бесплатно и публично.
-
у вас опечатка
AggregateFunction(countIf, UInt8)
AggregateFunction(countIf, UInt8) -
поправил, в синтаксисе запроса всё ок
-
Там сейчас проблема в том, что не запускается КХ и интегрированный зукипер
Можете подсказать как попробовать решить этот вопрос? Может как-то отключить встроенный зукипер -
так погодите
desc ( select countIfState(x) from (select 1 x));
AggregateFunction(countIf, UInt8)
UInt8 -- это про If
desc ( select countState() from (select 1 x));
AggregateFunction(count)
count хранится как LEB128 в AggregateFunction -
в партицию таблицы дату метрик. по дням (на проде по месяцам сделаю как положено)
ну и ордер по ней -
Ну и как вам помочь, вы ничего не говорите .... Ну у нас короче будет много массивов и время
-
?
уберите из конфига КХ его описание
ошибка какая? с незапуском?
https://pastila.nl/ -- расшарьте логи -
хммммм, точно
запутался немного, спасибо -
Да я прсто не понимаю что конкретно нужно сказать )
вот например таблица
CREATE TABLE data
(
id FixedString(36) NOT NULL,
another_id FixedString(36) NOT NULL,
time DateTime64(3, "Europe/Moscow") NOT NULL,
sec_time DateTime64(3, "Europe/Moscow") NULL,
canonical_id FixedString(264) NULL,
old_ids Array(String),
other_id FixedString(264) NULL,
ips Array(IPv4),
more_ips Array(IPv4),
params Array(String),
ip_data Array(String),
urls Array(String),
ips2 Array(String),
score_results Array(String),
url_counter Array(String),
users Array(String)
)
ENGINE = MergeTree
PARTITION BY toYYYYMMDD(time) ORDER BY (time)"""
) -
в Array(String) я хапихал массив json-ов
-
допустим каждый json строго типизирован в рамках своего поля.
-
собственно больше нечего скрывать )
-
Дак если строго типизированный, может разложить по колонкам сразу ?
-
ORDER BY time ? Вы просто храните данные и не собираетесь к ним обращаться ? Может ещё какие-нибудь колонки положить туда ?
-
Возможно у вас есть колонки с маленькой кардинальностью ?
-
Так же кликхаус не любит NULL https://gist.github.com/den-crane/e43f8d0ad6f67ab9ffd09ea3e63d98aaNullableVsInt
NullableVsInt. GitHub Gist: instantly share code, notes, and snippets.
-
Добрый день господа. Сегодня заметил странную весчь при мерже конфигурации.
cat /etc/clickhouse-server/users.xml
<?xml version="1.0"?>
<yandex>
<!-- Profiles of settings. -->
<profiles>
<!-- Default settings. -->
<default>
<!-- Maximum memory usage for processing single query, in bytes. -->
<max_memory_usage>32212254720</max_memory_usage>
<max_insert_block_size>5242880</max_insert_block_size>
cat /etc/clickhouse-server/users.d/profile_default.xml
<?xml version="1.0"?>
<yandex>
<clickhouse>
<profiles>
<default>
<max_memory_usage>7212254720</max_memory_usage>
<load_balancing>random</load_balancing>
</default>
</profiles>
</clickhouse>
</yandex>
cat /var/lib/clickhouse/preprocessed_configs/users.xml
<yandex>
<!-- Profiles of settings. -->
<profiles>
<!-- Default settings. -->
<default>
<!-- Maximum memory usage for processing single query, in bytes. -->
<max_memory_usage>32212254720</max_memory_usage>
<max_insert_block_size>5242880</max_insert_block_size>
--------
и
tail -n 20 /var/lib/clickhouse/preprocessed_configs/users.xml
<clickhouse>
<profiles>
<default>
<max_memory_usage>7212254720</max_memory_usage>
<load_balancing>random</load_balancing>
</default>
</profiles>
</clickhouse>
Connected to ClickHouse server version 22.6.2 revision 54455.
Собственно говоря блок с /etc/clickhouse-server/users.d/profile_default.xml не попадает в конфигурацию. Может что то не то делаю. PS изначально сервером рулил не я. PSPS пока просто поменял в users.xml -
что-то вы намудлили
у вас <clickhouse> вложен в <yandex>
а это должен быть корневой тег... -
хз. может и так. Попробую убрать.
-
подумаю над этим просто неудобно конвертировать. счестье из касандры лезет (
а если декомпозировать то кол-во строк сильно возрастет. таблица припухнет. Или это не притично? или декомпозицию можно сделать на сторонние таблицы? Что лучше?
к данным конечно собираюсь обращатсья для построения отчетности
на счет маленькой кардинальности - не могу пока ответить. -
https://pastebin.com/e2hpN5hD
clickhouse-server.err.log
https://pastebin.com/ZULuMqFi
/var/log/clickhouse-server/clickhouse-server.log2022.07.06 20:13:42.897218 [ 2862073 ] {} <Warning> RaftInstance: peer (2) respo - 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.
-
Ну с таким ордер баем будет всегда фулл скан таблицы. Ну у вас и так будет пухнуть, только строка будет больше весить, и возможно плохо сжиматься, и возможно лучше сделать без массивов
-
На лету можете разбивать с помощью MV
-
ОК тогда сделаю декомпозицию структуры
-
просил же pastila.nl там банеров нет
https://kb.altinity.com/altinity-kb-setup-and-maintenance/suspiciously-many-broken-parts/Suspiciously many broken partsSuspiciously many broken parts error during the server startup.
-
Поймите какие вы будете писать запросы, добавьте в ORDER BY те столбцы по которым будете фильтровать данные. И после этого уже выбирайте структуру хранения, с помощью тестов через clickhouse-client с помощью level_log = 'trace' смотря как работают запросы
-
всем привет! а какая пропускная способность у схемы кафка->mv->table? если много событий в кафке будет, как гарантировать, что они появятся не позже 10-60 сек в кликхаусе?
-
Эти столбцы в основном запрятаны в масивах в json. Поэтому, не имея плоской структуры я пока в раздумьях как правильно ее построить.
-
Ну тогда скорей всего выносить из массивов и из json
-
Иначе будет долго
-
Пасиб. Тогда курс на декомпозицию намечен )
-
Вы лучше прочтите документацию, а не просто основываться на мои словах. Хотя бы как устроен доступ к данным MergeTree движке https://clickhouse.com/docs/ru/engines/table-engines/mergetree-family/mergetreeMergeTree | ClickHouse Docs
table_engines-mergetree}
-
Сильно зависит от железа, количества колонок и т.д. серебряной пули нету. Делайте нагрузочное тестирование.
-
Спасибо вам огромное! Все получилось и все заработало!
Спасибо что не оставили 1 на 1 с такой проблемой, а помогли ее решить -
Выполняю запрос alter table drop projection, а диск только растет в объеме. это как?)
-
а долго работает drop projection ?
-
да, вполне
-
Всем привет!
Стояла старая версия CH (точно не помню ~ 2020 года) ошибок не было, после обновы до 22.1.1. Появляются постоянные ошибки на таблице с движком кафка (когда приходят данные) во view соответственно тоже ничего не приходит. Кафка полностью рабочая, топик пробовал пересоздавать.
2022.07.06 16:17:38.484693 [ 14010 ] {} <Error> void DB::StorageKafka::threadFunc(size_t): Code: 32. DB::Exception: Attempt to read after eof: while parsing Kafka message (topic: ifTable, partition: 0, offset: 466482251)': While executing Kafka. (ATTEMPT_TO_READ_AFTER_EOF), Stack trace (when copying this message, always include the lines below):
0. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, bool) @ 0xaebed1a in /usr/bin/clickhouse
1. DB::throwReadAfterEOF() @ 0xaed31bb in /usr/bin/clickhouse
2. ? @ 0xaf0d6d4 in /usr/bin/clickhouse
3. DB::SerializationString::deserializeTextCSV(DB::IColumn&, DB::ReadBuffer&, DB::FormatSettings const&) const @ 0x1445e13b in /usr/bin/clickhouse
4. bool DB::SerializationNullable::deserializeTextCSVImpl<bool>(DB::IColumn&, DB::ReadBuffer&, DB::FormatSettings const&, std::__1::shared_ptr<DB::ISerialization const> const&) @ 0x1444dd76 in /usr/bin/clickhouse
5. DB::RowInputFormatWithNamesAndTypes::readRow(std::__1::vector<COW<DB::IColumn>::mutable_ptr<DB::IColumn>, std::__1::allocator<COW<DB::IColumn>::mutable_ptr<DB::IColumn> > >&, DB::RowReadExtension&) @ 0x15abc285 in /usr/bin/clickhouse
6. DB::IRowInputFormat::generate() @ 0x15aadff0 in /usr/bin/clickhouse
7. DB::ISource::tryGenerate() @ 0x15a40dd5 in /usr/bin/clickhouse
8. DB::ISource::work() @ 0x15a4099a in /usr/bin/clickhouse
9. DB::StreamingFormatExecutor::execute() @ 0x15a69e82 in /usr/bin/clickhouse
10. DB::KafkaSource::generateImpl() @ 0x145010cf in /usr/bin/clickhouse
11. DB::KafkaSource::generate() @ 0x1450374f in /usr/bin/clickhouse
12. DB::ISource::tryGenerate() @ 0x15a40dd5 in /usr/bin/clickhouse
13. DB::ISource::work() @ 0x15a4099a in /usr/bin/clickhouse
14. DB::SourceWithProgress::work() @ 0x15c92a62 in /usr/bin/clickhouse
15. DB::ExecutionThreadContext::executeTask() @ 0x15a60ca3 in /usr/bin/clickhouse
16. DB::PipelineExecutor::executeStepImpl(unsigned long, std::__1::atomic<bool>*) @ 0x15a54b7e in /usr/bin/clickhouse
17. DB::PipelineExecutor::executeImpl(unsigned long) @ 0x15a53ddb in /usr/bin/clickhouse
18. DB::PipelineExecutor::execute(unsigned long) @ 0x15a53718 in /usr/bin/clickhouse
19. DB::CompletedPipelineExecutor::execute() @ 0x15a52244 in /usr/bin/clickhouse
20. DB::StorageKafka::streamToViews() @ 0x144f6a9a in /usr/bin/clickhouse
21. DB::StorageKafka::threadFunc(unsigned long) @ 0x144f49d8 in /usr/bin/clickhouse
22. DB::BackgroundSchedulePoolTaskInfo::execute() @ 0x14147f2e in /usr/bin/clickhouse
23. DB::BackgroundSchedulePool::threadFunction() @ 0x1414a8c7 in /usr/bin/clickhouse
24. ? @ 0x1414b8f0 in /usr/bin/clickhouse
25. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0xaf62837 in /usr/bin/clickhouse
26. ? @ 0xaf662fd in /usr/bin/clickhouse
27. start_thread @ 0x7dc5 in /usr/lib64/libpthread-2.17.so
28. clone @ 0xf6ced in /usr/lib64/libc-2.17.so
(version 22.2.2.1).
Таблица:
CREATE TABLE cs.ifTable_kafka
(
...
)
ENGINE = Kafka
SETTINGS kafka_broker_list = 'localhost:9092',
kafka_topic_list = 'ifTable',
kafka_group_name = 'ifTable',
kafka_format = 'CSV'; - 07 July 2022 (167 messages)
-
лучше хотя бы до 22.3 LTS обновиться
у вас не 22.1 а 22.2 судя по логам -
ку
-
-
Alter table delete where
-
других вариантов нет?
-
-
Дак а какой вариант ещё ?
-
Удалить весь парт и залить его по новой без этих строк
-
Если у вас дубликаты, то можно и по-другому
-
-
для удалений есть CollapsingMergeTree
-
Мое почтени𝚎, гocпода , еcли y вac есть желaние подымaть ноpмальные дeньжата , пишитe мне ⲃ личκу , дам coⲃ𝚎т и бyдeт Baм счастье . oт 10 κ в день р𝚎aльно , нe напpягаясь , тратя 2-3 чaca нa pаботy
-
поясните плиз как правильно сделать с CollapsingMergeTree такую операцию
alter table dwh.sj_billing_hr_bill_ods delete
where id not in (select id from dwh.sj_billing_hr_bill_id)
SETTINGS mutations_sync = 2;
т.е. мне нужно удалить из таблицы определенный список по select id из другой таблицы -
/report
-
Вам один раз надо удалить ?
-
один раз в день для каждой таблицы (всего их 300)
-
АА да
-
Неплохое уточнение
-
-
Просто чтобы использовать collapsing то надо помнить есть ли там данная строка или нет
-
А чтобы это сделать надо делать запрос для каждой строки (наверное)
-
Вообщем вам нужно знать, есть ли там уже строка, которую хотите удалить или нет
-
-
Кхм, а я вот щас подумал, если sign просто отправлять строчки с пометкой -1, и даже если там нету строчки, то что будет.
-
Можете привести пример кода как сделать с CollapsingMergeTree такую операцию
alter table dwh.sj_billing_hr_bill_ods delete
where id not in (select id from dwh.sj_billing_hr_bill_id)
SETTINGS mutations_sync = 2;
т.е. мне нужно удалить из таблицы определенный список по select id из другой таблицы.
я о CollapsingMergeTree вревые сегодня прочитал
нужно делать insert с sign = -1 для моего списка id
а затем optimize table T final;
? -
Добрый день. Данных уж слишком много, сервера не справляются. Подскажите, какие техники используете при прореживании данных ? например: нужна не каждая секунда (строка), а каждая 5-ая / 10-ая / etc. В голову приходит пока что в MV что-то накостылить.
-
Там нужна точная копия строки из ORDER BY
-
Ну вы можете агрегировать на вставке с помощью MV
-
Ну мне не совсем аггрегация нужна. Обсчитывать нечего. нужно взять каждую N-ую строку удовлетворяющих определенным условиям из входных данных. Или я вас неправильно понял?
-
ТИПА ТАКОГО
insert into dwh.sj_billing_hr_bill_ods
select *, -1 from dwh.sj_billing_hr_bill_ods
where id not in (select id from dwh.sj_billing_hr_bill_id)
затем optimize table dwh.sj_billing_hr_bill_ods final; -
У вас что одинаковый order_by у этих таблиц ?
-
Вы просто хотите, чтобы было меньше данных ? Посмотрите на сэмплирование, но я сам не пользовался
-
Вы про dwh.sj_billing_hr_bill_ods И dwh.sj_billing_hr_bill_id
пока допустим да -
Мне кажется, у вас какой то ад в архитектуре.
-
Доброго дня всем.
Есть у меня вопросец по алгоритму:
Выбираю по 1000 записей на таблице примерно в 51кк.
Далее каждой записи обновляю поле уникальным значением через ALTER TABLE UPDATE синхронно.
Сначала все идет хорошо, 10-20к записей, ресурсы сервера забиваются подчистую ( см. скрин ).
Но в какой-то момент происходит высвобождение ресурсов с продолжением работы но запрос в этот момент обновляет одну строку от 13 и выше секунд. -
-
у вас SWAP используется, будет в любом случае медленно. Попробуйте со sudo swapoff -a
-
Я бы посоветовал, сначала разобраться с архитектурой таблиц в Clickhouse .Такое чувство, что у вас каждый человек в отдельной таблице
-
Свап судя по скринам никак не меняется
-
Пока не важна таблица с id
Так я могу сделать ?
insert into dwh.sj_billing_hr_bill_ods
select *, -1 from dwh.sj_billing_hr_bill_ods
where id in (1, 2, 3)
затем optimize table dwh.sj_billing_hr_bill_ods final; -
Есть
массив А = [1, 1, 1, 0, 1, 1, 1, 1, 1, 2, 1, 1, 0]
массив B = [4, 10, 13], где хранятся индексы элементов А != 1
Как с помощью arraySplit разделить массив на подмассивы, которые начинаются с 1 и заканчиваются не 1?
То есть в финале хочется иметь массив [[1, 1, 1, 0], [1, 1, 1, 1, 1, 2], [1, 1, 0]] -
Всем привет!
Получили рестарт сервера с необработанным эксепшеном CANNOT_WRITE_TO_OSTREAM после обычного селекта из DBeaver. Подскажите, куда копать?
Версия: 21.9.5.16
Лог:
2022.07.07 06:45:42.605845 [ 999213 ] {60224a20-da60-4564-9103-7639256ab82b} <Information> executeQuery: Read 5055810389 rows, 94.70 GiB in 556.319322275 sec., 9087964 rows/sec., 174.31 MiB/sec.
2022.07.07 06:45:42.611662 [ 878444 ] {} <Fatal> BaseDaemon: (version 21.9.5.16 (official build), build id: 3F0B96ECD2A2596F770F590C8B21D623BE199371) (from thread 999213) Terminate called for uncaught exception:
2022.07.07 06:45:42.611740 [ 878444 ] {} <Fatal> BaseDaemon: Code: 24. DB::Exception: Cannot write to ostream at offset 212. (CANNOT_WRITE_TO_OSTREAM), Stack trace (when copying this message, always include the lines below):
2022.07.07 06:45:42.611750 [ 878444 ] {} <Fatal> BaseDaemon:
2022.07.07 06:45:42.611770 [ 878444 ] {} <Fatal> BaseDaemon: 0. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, bool) @ 0x93a6a9a in /usr/bin/clickhouse
2022.07.07 06:45:42.611787 [ 878444 ] {} <Fatal> BaseDaemon: 1. DB::WriteBufferFromOStream::nextImpl() @ 0x94a9452 in /usr/bin/clickhouse
2022.07.07 06:45:42.611795 [ 878444 ] {} <Fatal> BaseDaemon: 2. DB::WriteBufferFromHTTPServerResponse::nextImpl() @ 0x1181270d in /usr/bin/clickhouse
2022.07.07 06:45:42.611801 [ 878444 ] {} <Fatal> BaseDaemon: 3. DB::WriteBufferFromHTTPServerResponse::finalize() @ 0x11812d82 in /usr/bin/clickhouse
2022.07.07 06:45:42.611821 [ 878444 ] {} <Fatal> BaseDaemon: 4. DB::WriteBufferFromHTTPServerResponse::~WriteBufferFromHTTPServerResponse() @ 0x11813425 in /usr/bin/clickhouse
2022.07.07 06:45:42.611828 [ 878444 ] {} <Fatal> BaseDaemon: 5. DB::HTTPHandler::handleRequest(DB::HTTPServerRequest&, DB::HTTPServerResponse&) @ 0x11797bec in /usr/bin/clickhouse
2022.07.07 06:45:42.611835 [ 878444 ] {} <Fatal> BaseDaemon: 6. DB::HTTPServerConnection::run() @ 0x1180c130 in /usr/bin/clickhouse
2022.07.07 06:45:42.611842 [ 878444 ] {} <Fatal> BaseDaemon: 7. Poco::Net::TCPServerConnection::start() @ 0x143c2dcf in /usr/bin/clickhouse
2022.07.07 06:45:42.611850 [ 878444 ] {} <Fatal> BaseDaemon: 8. Poco::Net::TCPServerDispatcher::run() @ 0x143c485a in /usr/bin/clickhouse
2022.07.07 06:45:42.611856 [ 878444 ] {} <Fatal> BaseDaemon: 9. Poco::PooledThread::run() @ 0x144f6ad9 in /usr/bin/clickhouse
2022.07.07 06:45:42.611863 [ 878444 ] {} <Fatal> BaseDaemon: 10. Poco::ThreadImpl::runnableEntry(void*) @ 0x144f2d6a in /usr/bin/clickhouse
2022.07.07 06:45:42.611870 [ 878444 ] {} <Fatal> BaseDaemon: 11. start_thread @ 0x9609 in /usr/lib/x86_64-linux-gnu/libpthread-2.31.so
2022.07.07 06:45:42.611877 [ 878444 ] {} <Fatal> BaseDaemon: 12. __clone @ 0x122263 in /usr/lib/x86_64-linux-gnu/libc-2.31.so
2022.07.07 06:45:42.611884 [ 878444 ] {} <Fatal> BaseDaemon: (version 21.9.5.16 (official build))
2022.07.07 06:45:42.612177 [ 1002284 ] {} <Fatal> BaseDaemon: ########################################
2022.07.07 06:45:42.612238 [ 1002284 ] {} <Fatal> BaseDaemon: (version 21.9.5.16 (official build), build id: 3F0B96ECD2A2596F770F590C8B21D623BE199371) (from thread 999213) (query_id: 60224a20-da60-4564-9103-7639256ab82b) Received signal Aborted (6)
2022.07.07 06:45:42.612259 [ 1002284 ] {} <Fatal> BaseDaemon:
2022.07.07 06:45:42.612300 [ 1002284 ] {} <Fatal> BaseDaemon: Stack trace: 0x7f370ea1b15b 0x7f370e9fa859 0x10109448 0x1657c4c3 0x1657c42c 0x93a1e6b 0x1181357a 0x11797bec 0x1180c130 0x143c2dcf 0x143c485a 0x144f6ad9 0x144f2d6a 0x7f370ebe1609 0x7f370eaf7263
2022.07.07 06:45:42.612341 [ 1002284 ] {} <Fatal> BaseDaemon: 1. raise @ 0x4615b in /usr/lib/x86_64-linux-gnu/libc-2.31.so
2022.07.07 06:45:42.612357 [ 1002284 ] {} <Fatal> BaseDaemon: 2. abort @ 0x25859 in /usr/lib/x86_64-linux-gnu/libc-2.31.so
2022.07.07 06:45:42.612384 [ 1002284 ] {} <Fatal> BaseDaemon: 3. ? @ 0x10109448 in /usr/bin/clickhouse
2022.07.07 06:45:42.612400 [ 1002284 ] {} <Fatal> BaseDaemon: 4. ? @ 0x1657c4c3 in ? -
2022.07.07 06:45:42.612428 [ 1002284 ] {} <Fatal> BaseDaemon: 5. std::terminate() @ 0x1657c42c in ?
2022.07.07 06:45:42.612442 [ 1002284 ] {} <Fatal> BaseDaemon: 6. ? @ 0x93a1e6b in /usr/bin/clickhouse
2022.07.07 06:45:42.612455 [ 1002284 ] {} <Fatal> BaseDaemon: 7. ? @ 0x1181357a in /usr/bin/clickhouse
2022.07.07 06:45:42.612475 [ 1002284 ] {} <Fatal> BaseDaemon: 8. DB::HTTPHandler::handleRequest(DB::HTTPServerRequest&, DB::HTTPServerResponse&) @ 0x11797bec in /usr/bin/clickhouse
2022.07.07 06:45:42.612489 [ 1002284 ] {} <Fatal> BaseDaemon: 9. DB::HTTPServerConnection::run() @ 0x1180c130 in /usr/bin/clickhouse
2022.07.07 06:45:42.612503 [ 1002284 ] {} <Fatal> BaseDaemon: 10. Poco::Net::TCPServerConnection::start() @ 0x143c2dcf in /usr/bin/clickhouse
2022.07.07 06:45:42.612514 [ 1002284 ] {} <Fatal> BaseDaemon: 11. Poco::Net::TCPServerDispatcher::run() @ 0x143c485a in /usr/bin/clickhouse
2022.07.07 06:45:42.612527 [ 1002284 ] {} <Fatal> BaseDaemon: 12. Poco::PooledThread::run() @ 0x144f6ad9 in /usr/bin/clickhouse
2022.07.07 06:45:42.612540 [ 1002284 ] {} <Fatal> BaseDaemon: 13. Poco::ThreadImpl::runnableEntry(void*) @ 0x144f2d6a in /usr/bin/clickhouse
2022.07.07 06:45:42.612556 [ 1002284 ] {} <Fatal> BaseDaemon: 14. start_thread @ 0x9609 in /usr/lib/x86_64-linux-gnu/libpthread-2.31.so
2022.07.07 06:45:42.612568 [ 1002284 ] {} <Fatal> BaseDaemon: 15. __clone @ 0x122263 in /usr/lib/x86_64-linux-gnu/libc-2.31.so
2022.07.07 06:45:42.872116 [ 1002284 ] {} <Fatal> BaseDaemon: Checksum of the binary: 43D25E0A3B86069D3EC976E7031988C0, integrity check passed.
2022.07.07 06:45:42.872160 [ 1002284 ] {} <Information> SentryWriter: Not sending crash report -
WITH
[1, 1, 1, 0, 1, 1, 1, 1, 1, 2, 1, 1, 0] AS a,
arrayEnumerate(a) AS enum,
[4, 10, 13] AS b
SELECT arrayReverseSplit((x, y) -> has(b, y), a, enum)
┌─arrayReverseSplit(lambda(tuple(x, y), has(b, y)), a, enum)─┐
│ [[1,1,1,0],[1,1,1,1,1,2],[1,1,0]] │
└────────────────────────────────────────────────────────────┘ -
Моe почтение, господа , еcли y вaс ecть ж𝚎лание пoдымaть ноpмaльны𝚎 дeньжата , пишит𝚎 мне в личⲕy , дaм coв𝚎т и будет Вам счастьe . от 10 к ⲃ день peально , не напpягaясь , тpатя 2-3 чacа на pабoту
-
Добрый день коллеги! Как можно сделать так чтобы LIVE VIEW не обновлялся при вставке данных в таблицу, а обновлялся только по таймауту. (Понимаю что функционал экспериментальный)
-
https://pastila.nl/ можно туда лог свой скидывать
-
спасибо!
-
Как то очень странно звучит, впервые за год здесь слышу о таком, может быть это просто совпадение ?
-
это уже третий раз за месяц, не уверен что просто совпадение
-
Мне почему то кажется, что этот запрос требовательный и у вас возможно техническая проблема на сервере ? Или сервер падает только при запросе из DBeaver ?
-
Если запрос требовательный может ООМ приходит и убивает Clickhouse ?
-
А что то пишется в crash_log ?
-
Два раза был убит DBeaver, еще один раз JDBC клиентом. В логах никаких признаков OOM нет, но есть подозрение что нам поможет фикс https://github.com/ClickHouse/ClickHouse/pull/28604Proper buffer flush while handling HTTP queries (avoids std::terminate) by azat · Pull Request #28604 · ClickHouse/ClickHouse
Changelog category (leave one): Not for changelog Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md): Proper buffer flush while handling HTTP queries (av...
-
такой таблицы нет, похоже что не была создана
-
Привет ребята)
как можно получить номер строки в группе, не прибегая к оконкам? (наша версия клика не поддерживает их)
Нашёл что функция rowNumberInAllBlocks() даёт номер строки, но она делает это по всему массиву данных, без привязки к группе.
Мне нужно условно говоря такое:
x 0
x 1
y 0
z 0
a 0
a 1
a 2Прочие функции | ClickHouse Docsother-functions}
-
Советую обновить версию клика, у меня был рестарт сервера при запросе в случае агрегата по drcimal
Возможно у вас что-то схожее -
Нашел настройку ограничения в документации, но вопрос всё ещё актуален, можно ли отключить совсем?
-
-
Юзайте гугл. Читайте документацию. Смотрите kb.
clickhouse ttl group by
https://kb.altinity.com/altinity-kb-queries-and-syntax/ttl/ttl-group-by-examples/ -
Можно попробовать две папки с данными и структурой скопировать прям на диске.
-
с новым движком не получится
-
select col1, rn-1 from (select col1, groupArray(col1) g, arrayEnumerate(g) n from (select arrayJoin(['x','x', 'y', 'z', 'a','a','a']) col1) group by col1) array join g as col1, n as rn;
┌─col1─┬─minus(rn, 1)─┐
│ a │ 0 │
│ a │ 1 │
│ a │ 2 │
│ z │ 0 │
│ y │ 0 │
│ x │ 0 │
│ x │ 1 │
└──────┴──────────────┘ -
аггрегация != прореживание
-
Это одно и тоже. Есть аггрегирующая функция any
-
Ну вы можете использовать функцию https://clickhouse.com/docs/ru/sql-reference/aggregate-functions/reference/argmax , any , anyLast, argmin, anyHeavy и тогда реально получится прореживаниеargMax | ClickHouse Docs
agg-function-argmax}
-
Возможно вам подойдёт движок graphiteMT
-
А я и не писал про аггрегацию. Я писал про группировку. Группировка != аггрегация. Но как вам выше уже написали в данном контексте это один хрен.
-
Здравствуйте, можете подсказать, у меня есть подзапрос, который возвращает array, но он может быть пустым, соответственно возникает ошибка Scalar subquery returned empty result of type Array, можно как то в таком случае сделать, чтобы subquery возвращало пустой массив?
-
Всем, привет! Посоветуйте, пожалуйста, дашбоард в Grafana для мониторинга производительности ClickHouse
-
подзапрос в секции select или в where ... in ...(подзапрос) ?
-
-
не понял
в смысле у вас всегда константа получается? в КХ нет коррелированных подзапросов. -
если в кратце сам запрос заходит в таблицу, там есть столбец с массивами, по условию берет из нужной строки данные с этого столбца, но не всегда условие проходит, то есть запрос ничего не возвращает, откуда в последствии и берется ошибка с Scalar subquery returned empty result of type Array. То есть когда условие не проходит, нужно чтобы возвращалось не ничего, а пустой массив
-
типа у вас
select * where ['a'] = (select [''] where 0);
DB::Exception: Scalar subquery returned empty result of type Array(String) which cannot be Nullable
?
думаю либо select * where ['a'] = (select [''] where 0 union all select []);
либо select * where toString(['a']) = (select toString(['a']) where 1); -
-
думаю либо select * where ['a'] = (select [''] where 0 union all select []);
либо select * where toString(['a']) = (select toString(['a']) where 1); -
-
огонь спасибо!
-
Господа, добрый день! Подскажите, пожалуйста, кто уже в проде использует clickhouse-keeper. Насколько он production-ready? Есть какие- то проблемы критичные?
-
-
Received exception from server (version 22.3.6):
Code: 289. DB::Exception: Received from 127.0.0.1:9000. DB::Exception: Replica doesn't have part 20220620_34356_34356_0 which was successfully written to quorum of other replicas
вот только на этой таблице утановлено TTL event_date + toIntervalDay(5)
естественно партиции почти месячной давности нигде нет, это бага в select_sequential_consistency или я чето делаю не так ? -
ALTER TABLE xxx DROP PARTITION ID '20220620'
-
сейчас в system.parts нет тагкого id (partition_id = '20220620')
-
суть не про system.parts а про состояние в ZK
-
нудопустим, одну грохнул, но их там за каждый день меясца походу ,
-
а ClickHouse Keeper тут вообще ни при чем.
базы и таблицы в sql файлах в /metadata -
-
-
так что это бага ? неуж то я первый кто ttl + select_sequential_consistency
использует -
Бага,
Бывает похожее, ток без select_sequential_consistency
Просто парты в system.replication_queue висят вечно -
replication_queue сейчас пустая
-
что запрос возвращает https://kb.altinity.com/altinity-kb-useful-queries/parts-consistency/#compare-the-list-of-parts-in-zookeeper-with-the-list-of-parts-on-diskParts consistency
Check if there are blocks missing SELECT database, table, partition_id, ranges.1 AS previous_part, ranges.2 AS next_part, ranges.3 AS previous_block_number, ranges.4 AS next_block_number, range(toUInt64(previous_block_number + 1), toUInt64(next_block_number)) AS missing_block_numbers FROM ( WITH arrayPopFront(groupArray(min_block_number) AS min) AS min_adj, arrayPopBack(groupArray(max_block_number) AS max) AS max_adj, arrayFilter((x, y, z) -> (y != (z + 1)), arrayZip(arrayPopBack(groupArray(name) AS name_arr), arrayPopFront(name_arr), max_adj, min_adj), min_adj, max_adj) AS missing_ranges SELECT database, table, partition_id, missing_ranges FROM ( SELECT * FROM system.
-
0 rows in set.
на обоих репликах -
и это странно , сейчас запрос из таблицы все равно валится , но на очередной случайно партиции котооую я не удалил руками, я шутк 7 удалил, но там еще с десяток примерно должно остатсья по моим прикидкам
-
т.е. в system.parts таких партиций нет и в зукипере их тоже нет в replica_path,'/parts/' ?
-
я пытаюсь понять, может этот запрос почему то в моей конифгурации не подходит , сейчяас подумаю
-
select concat(path,'/',name) as p_path, ctime, mtime
from system.zookeeper where path in (XXXX)
говорит что последняя партиция от 20220703 , сегодя 7 число , 7 -5 ~ 3 (5 ttl ) -
Подскажите, пожалуйста, как реализовать сумму по такому условию.
Есть ряд недель и атрибут, который определяет было на этой неделе событие или не было (1 или 0).
Так вот для каждой недели нужно посчитать как долго (т.е. сколько недель подряд) продолжается это событие. Этакая нарастающая сумма, с условием прерывания.
На скрине немного понятнее отобразил.
Смотрю в сторону функций работающих с array, но пока ничего работающего не обнаружил.
Может кто-то уже решал подобную задачу?) решить нужно без использования оконок, наш клик их не поддерживает -
все четко , записи полностью совпадают после дние две
20220703_0_12328_3946
20220703_12329_19516_1861
в обоих источниках -
пока падает вот от такого запроса
DROP DATABASE IF EXISTS zookeeper_bench SYNC;
CREATE DATABASE zookeeper_bench;
CREATE TABLE zookeeper_bench.zookeeper_bench (p UInt64, x UInt64)
ENGINE=ReplicatedSummingMergeTree('/clickhouse/tables/{database}/{table}', '{replica}' )
ORDER BY tuple()
PARTITION BY p
SETTINGS in_memory_parts_enable_wal=0,
min_bytes_for_wide_part=104857600,
min_bytes_for_compact_part=10485760,
parts_to_delay_insert=1000000,
parts_to_throw_insert=1000000,
max_parts_in_total=1000000;
INSERT INTO zookeeper_bench.zookeeper_bench SELECT rand(1)%100, rand(2) FROM numbers(100000)
SETTINGS max_block_size=1,
min_insert_block_size_bytes=1,
min_insert_block_size_rows=1,
insert_deduplicate=0,
max_threads=128,
max_insert_threads=128;
но я последний 22.6 не пробовал еще... -
известно, с чем связано?
-
нет, надеюсь разберусь на следующей неделе
-
Выглядит как классическая задача для оконной функции.
-
Да, кстати, забыл сказать, что это нужно решить без оконной функции) наша версия клика не поддерживает их
-
-
там еще /quorum есть
-
чуть поясни
-
ну тут получается что нигде нету информации про 20220620_34356_34356_0
откуда КХ берет это?
так вот в zk у таблицы есть подраздел /quorum и возможно там есть про 20220620_34356_34356_0 или в /replica/queueu -
да , нашел упоминание в одном месте,
-
это я загнал зукипер в файл и поискал по тексту
SELECT * FROM system.zookeeper INTO OUTFILE '/var/log/clickhouse-server/zz.json' FORMAT JSON SETTINGS allow_unrestricted_reads_from_keeper=1 -
Удачи)
-
Всем привет!
У меня кластер из 3 х узлов. Каждая нода начала падать и снова запускаться из-за нехватки оперативной памяти, скорее всего это вызвано мутациями одной из таблиц. Пытался пофиксить такой командой: KILL MUTATION WHERE database = 'default' AND table = 'adv_company_stat', но запрос просто зависал, после нода крашилась.
Еще утром удалили партицию в одной таблице, это вызвало ошибку(на срине), из-за нее ноды перестали запускаться.
Эту ошибку пытался пофиксить по этому гайду: https://kb.altinity.com/altinity-kb-setup-and-maintenance/x-rows-of-y-total-rows-in-filesystem-are-suspicious/
Первый шаг гайда при старте вызывал еще ошибки(один, два)
Как можно восстановить кластер? -
-
друзья есть вопрос . вот у меня приходят логи от разных пользователей с датой мне надо получить только тех кто был за определенное время например за последние 7 дней
SELECT me1.device_id AS device_id
FROM ms_etl.log me1
WHERE me1.created >= toDateTime('2022-06-30 00:00:00')
AND me1.created < toDateTime('2022-07-07 00:00:00')
GROUP BY me1.device_id
LIMIT 10000;
но мне надо еще отфильтровать тех кого небыло до этого времени и получить только новеньких, только тех кто первый раз за нужную неделю прислал лог
как это правильно сделать ? -
AND me1.device_id not in (SELECT me1.device_id FROM WHERE DATE(me1.created) < '2022-06-30' GROUP BY me1.device_id)
-
-
Пасибо большое , идею я понял
-
-
-
мержи, мутации. словари
primary.idx в памяти
system.* таблички флашатся (но тут не много памяти) раз в 7.5 секунд
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-who-ate-my-memory/ -
@konnectrl
Привет!
а чего мне никто не ткнул в Nested ?
Этож по идее и есть решение с массивами json
просто берем описываем JSONы как Nested структуры и парсим туда данные.
А то я уже решил бить каждый json как отдельную таблицу и связывать все данные между собой сквозным идентификатором.
Это тоже как бы решение, но можно все в одну таблицу запихать, откуда выборки будут дешевле стоить из-за отсуствия JOIN -
А может кто встречал клиент под golang, который умеет в mTLS?
-
Nested это синтаксический сахар над массивами
-
IMHO mTLS это обычный TLS клиент просто с сертификатами и custom CA
смотрим clickhouse-go tls настройки как прописываются -
Стандартный клиент в хендшейке передает логин и пассворд, из-за этого авторизация фейлится
-
странно... вы хотели авторизоваться чреез <ssl_certificate> в <users> ?
-
Ага
-
а пустой логин и пароль пустой нельзя передать чтоли?
-
Можно, но не работает. Пробовали
-
тогда задайте вопрос к clickhouse-go
покажите что стандартный clickhouse-client коннектится
а сниппет golang кода нет
там сейчас clickhouse.inc поддерживает этот клиент официально и есть мантейнер, так что должны ответить -
Понял, так и сделаю
-
Ожидалось, что все кто здесь задаёт вопросы в документации прочитали хотя бы какие типы есть в кликхаусе и есть хотя бы базовое знание sql.
-
ну в моем случае это было бы решением ) просто не обратил внимание на этот тип сразу ( моя вина конечно
-
Я все таки решаю, это не решение вопроса
-
ClickHouse/ClickHouse tagged: v22.3.8.39-lts
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v22.3.8.39-lts
Release notes:
Release v22.3.8.39-lts -
-
А когда презентация будет 8 версии?
-
Блин, это 3.8
-
это в кафке делается. гуглите kafka move offset
-
а еще и тип Map есть, туда можно key/value сложить
-
Добрый день. Проблема с макросом,
select getMacro('s3_store'); —-> minio-01:9000
но после выполнения след. DDL:
CREATE TABLE IF NOT EXISTS dwh.s3_raw_events
(
json String
) ENGINE = S3('http://{s3_store}/events/*.gz', 'JSONAsString', 'gz');
почему то этот адрес не провайдит и при вызове
select * from dwh.s3_raw_events ;
выдает
SQL Error [499] [07000]: Code: 499. DB::Exception: Could not list objects in bucket 'events' with prefix '',
S3 exception: ``, message: 'Invalid DNS Label found in URI host'. (S3_ERROR) (version 22.2.2.1)
, server ClickHouseNode(addr=http:localhost:8123, db=default)@1720913860
DOCKER image clickhouse/clickhouse-server:22.2.2.1
macros.xml:
<clickhouse>
<macros>
<s3_store from_env="S3_STORE_HOST_PORT"/>
<replica from_env="REPLICA"/>
<shard from_env="SHARD"/>
</macros>
</clickhouse>
Благодарен всем за любые идеи куда копать. -
там макросы не работают.
в 22.6 можно сделать такой фокус через named_collections -
не работают в s3 ?
странно, в Kafka движке я такой фокус уже 2 года (наверно я тут наврал, скорее около года, раньше хардкод был) как использую. -
Storing details for connecting to external sources in configuration files | ClickHouse Docs
Details for connecting to external sources (dictionaries, tables, table functions) can be saved
-
про кафку это странно
-
спасибо большое.
-
Уже заюзал, нашел подходящие данные чтобы туда засыпать. Спасибо )
-
Ребята! Подскажите, пожалуйста, EXPLAIN ESTIMATE почему может не работать?
Code: 62. DB::Exception: Syntax error: failed at position 25 ('TabSeparatedWithNamesAndTypes') (line 2, col 8): TabSeparatedWithNamesAndTypes. Expected one of: token, Dot, Equals. (SYNTAX_ERROR) (version 22.3.7.28 (official build)) -
из какого приложения?
-
-
Он работает через JDBC
-
такой запрос тоже ? EXPLAIN ESTIMATE select 1
похоже что оно испортило запрос -
Хм. А все остальные EXPLAIN при этом отрабатывают нормально...
-
Простой запрос проходит - EXPLAIN ESTIMATE select 1
-
-
-
-
возможно это баг в старом jdbc драйвере.
-
Ребят а можно чуть подробностей что за экспериментальный формат? Вроде ничего криминального не прошу сделать.
ServerException: Code: 44.
DB::Exception: Cannot create table with column 'some_dict_field' which type is 'Map(String,Nullable(UInt32))' because experimental Map type is not allowed. Set 'allow_experimental_map_type = 1' setting to enable. Stack trace: -
select version();
-
'21.3.20.1'
-
Старовата кляча, нужно новую запрягать :)
-
неужто бедовый контейнер подняли (
ОК завтра переделаем.
Этот норм? 22.3.2.2 (17 марта 2022) -
это глюкодром, берите 22.3.8.39
-
благодарю
-
Не смог разобраться, как обновить версию драйвера в DataGrip, который используется в мой IDE. Придется жить со старой версией.
- 08 July 2022 (185 messages)
-
👩🏽💻МОМЕНТАЛЬНОE ТPУДOУСТPОЙCТВО👨🏽💻
💢PАБOТA C ЛУЧШИМИ 💢
⭕️Рабoтaя c нaми Вы полyчaетe:
🔴Зapплaтa oт 50 000p в недeлю
🔴Выплaты paз в 3 дня
🔴Кaрьepный pocт
🔴Индивидyaльный гpaфик
🔴Бecплaтнoе обучeниe
🔴Oплaчиваeмaя стaжиpoвкa
🔴Помoщь с перeeздoм еcли нyждаeтеcь
🔴Пoддeржка 24/7
⭕️Тpебoвaния:
🔴Жeлание зapaбaтывать бoльшие дeньги
🔴Имeть смapтфон для paботы
ПOДРOБНEЕ ЛC или контакты смoтрите в моём прoфилe. -
Забыли написать что зароботок в интрнете и картинку выслать с отрывными листами
-
👩🏽💻МOМЕНТAЛЬНОE ТPУДOУCТРОЙCТВО👨🏽💻
💢PAБOТА C ЛУЧШИМИ 💢
⭕️Рaбoтая с нaми Вы полyчaетe:
🔴Зapплaтa oт 50 000p в недeлю
🔴Выплaты рaз в 3 дня
🔴Кapьеpный pоcт
🔴Индивидуaльный грaфик
🔴Бeсплaтнoе обучeниe
🔴Оплaчиваемaя стaжирoвка
🔴Пoмoщь c пеpеeздoм еcли нyждaетеcь
🔴Пoддepжкa 24/7
⭕️Трeбoвания:
🔴Желaние зapaбатывaть бoльшие дeньги
🔴Имeть cмapтфoн для рaбoты
ПOДРOБНЕE ЛС или контaкты смотрите в моём профилe. -
это бот, лочьте его
-
Подскажите, пожалуйста
Если мне одну и ту же таблицу нужно приджойнить два раза по разным ключам, то я просто делаю два джойна? Нету никакого трюка для оптимизации памяти и времени? -
Ну наверное можно сделать, это как-нибудь через массивы, но это не точно
-
А можно пример или намного раскрыть идею? Не совсем понял
-
Ну как я понял вы хотите с помощью разных выборок убрать данные
-
Вы можете это сделать собрав требуемые столбцы в массив тюплов groupArray((column_1,column_2, и т.д.)) и затем сделать на массив arraySort(x->x.1 = 10 , array)
-
А потом полученый результат массива, обратно превратить строчки через arrayJoin
-
Есть две таблица, первый раз я к t1 джойню t2 по col1, и в селект вывожу col2, а потом к полученному делать ещё раз джойн t2 по col3, и добавляю в селект col4
-
SELECT * FROM t2 WHERE t2.id not in (select t1.id FROM t1)
AND t2.id_2 not in (select t2.id_2 from t2) -
Вот так примерно, как я понял можно сделать
-
Мы не поняли друг друга, моя цель не фильтрация.
Стандартно мой запрос выглядит так:
select
t1.*,
t2_1.col_1,
t2_2.col_2
from
table1 as t1
left join
table2 as t2_1
on
t1.a = t2_1.a
left join
table2 as t2_2
on
t1.b = t2_2.b
Вопрос лишь в том, можно ли это оптимизировать? -
Всем привет!
У меня кластер из 3 х узлов. Каждая нода начала падать и снова запускаться из-за нехватки оперативной памяти, скорее всего это вызвано мутациями одной из таблиц. Пытался пофиксить такой командой: KILL MUTATION WHERE database = 'default' AND table = 'adv_company_stat', но запрос просто зависал, после нода крашилась.
Еще утром удалили партицию в одной таблице, это вызвало ошибку(на срине), из-за нее ноды перестали запускаться.
Эту ошибку пытался пофиксить по этому гайду: https://kb.altinity.com/altinity-kb-setup-and-maintenance/x-rows-of-y-total-rows-in-filesystem-are-suspicious/
Первый шаг гайда при старте вызывал еще ошибки(один, два)
Как можно восстановить кластер? -
Для начала вернуть к жизни киперы
Потому что согласно вашим логам, они у вас не работают -
А как это можно сделать?
-
There is no life that does not progress, only people who do not make progress!
-
-
/report
-
Я обычно делаю просто cluster([название кластера], system.*). Но это для разовых операций хорошо, на постоянное пользование в графане может не подойти.
Если у вас кластер с репликацией, то для использования в энжине дистрибутед надо будет создать рядышком конфигурацию кластера без репликации, чтобы КХ правильно собирал данные. -
Кластер с репликацией, но system таблицы без. Для чего нужен будет кластер без репликации?
А за cluster(..., ...) спасибо, поиграюсь -
Если кому интересно, нашёл решение без оконок
with t as (
select 202151 as yyyyww, 1 as foo
union all select 202152 as yyyyww, 1 as foo
union all select 202153 as yyyyww, 1 as foo
union all select 202201 as yyyyww, 1 as foo
union all select 202202 as yyyyww, 0 as foo
union all select 202203 as yyyyww, 0 as foo
union all select 202150 as yyyyww, 0 as foo
)
,t1 as (
select *, toInt64(rowNumberInAllBlocks())+1 as row_num
from (select * from t order by yyyyww) tt
order by yyyyww
)
select m.yyyyww, m.foo
, if(m.foo = 1, max(case when t_min.foo = 1 then t_min.row_num else 0 end)- max(case when t_min.foo = 0 then t_min.row_num else 0 end) - 1, 0) as t
from t1 as m
, t1 as t_min
where t_min.row_num <= m.row_num
group by m.yyyyww, m.foo
order by m.yyyyww -
cluster суть то же, что distributed, просто коннекты могут неоптимально открываться.
Если делать запросы к системным таблицам (которые не реплицированы, и на каждой ноде существуют в единственном экземпляре) с параметрами реплицированного кластера, то КХ будет путаться и выдавать нестабильные результаты, считая, что данные пришедшие с сервера-1 являются сразу же и зеркалом данных сервера-2 и ждать отклика уже не нужно.
Т.к. уже есть конфиг реплицированного кластера, можно это самому увидеть, передав в параметры cluster и позапускав один и тот же какой-нибудь простой запрос несколько раз (10-20-30). -
Ага, ну так есть clusterAllReplicas, он вроде путаться не должен.
-
Да, я про то, какой кластер использовать в энжине дистрибутед таблицы.
-
Ребят, привет! Возможно, вопрос лёгкий, но как мне в ClickHouse:
Array(Array(String)) -> arrayConcat(Array(Array(String))) -> Array(String) -
arrayFlatten ?
-
спасибо, извиняюсь, проглядел в доках
-
Коллеги, добрый день. Использую engine = Kafka. Хочу получить виртуальные поля _offset , _partition, _timestamp_ms. Без проблем получил _offset , _partition, а вот с , _timestamp_ms проблема- поле null. Думал не правильный тип, пробовал загружать в DateTime, DateTime64, DateTime64(3), DateTime64(6), DateTime64(9), UInt64, всегда null. Прошу подсказать, куда смотреть, где искать. Спасибо
-
-
-
splitbychar(' ','2020-01-01 23:59:59')[-1] ?
-
-
-
Привет! подскажите плиз, после удаления колонки на кластерном кх получил ошибку
SQL Error [1002]: ClickHouse exception, code: 1002, host: 10.8.2.222, port: 8123; Code: 517. DB::Exception: Metadata on replica is not up to date with common metadata in Zookeeper. It means that this replica still not applied some of previous alters. Probably too many alters executing concurrently (highly not recommended). You can retry this error. (CANNOT_ASSIGN_ALTER) (version 22.3.4.20 (official build))
нужно править данные в зк? -
для этого обычно используют formatDateTime
-
Хотитe пoлучить новую профeссию?
Стaнь дизaйнeрoм интеpьера c нуля дo экспepтa зa 7-12 мecяцeв и нaчни зapaбaтывaть oт 100.000₽!
Наша Акaдeмия дизайна интеpьерa "MARSO ACADEMY" открывает запись нa бесплaтную пеpcoнaльную консультацию o пpoфеcсии👩🏻💻
Этo будeт 100% пoлeзнo, ecли вы:
→ xотитe освоить востребованную профессию и зарабатывать на ней
→ будущий дизайнep интеpьeра, котoрый мeчтaет о твoрчecкoй каpьере, но cомнeваетcя в своих cилаx и не знает с чем начать
→ давно мечтаетe рaскрыть свой пoтенциал в дpугой cферe
→ хотите заниматься любимым делом и зарабатывать на этом
Какoй рeзультат вы пoлучите?
- отвeты на интepесующие вопpoсы o профeсcии, oбучении и пeрспективaх
- поймете с чего начать и как реализовываться
- поймете подходит ли вам эта профессия
⏳ Количеcтво меcт oгрaничeно! Зaпишитесь нa конcультaцию пpямo ceйчac и зaдайтe интересующие вопpocы o пpoфeссии ↓
https://marsoclub.ru/ -
спасибо!
-
Всем привет!
у меня такая же ошибка выходит, у вас получилось это решить? -
Да
-
здравствуйте.
есть коллекция, в нее идут вставки,
используя smi2/phpclickhouse
и метод insertAssocBulk.
примерно такой структуры:
[
{"data_id": 1, "sensor_a": 10, "sensor_b": 12},
{"data_id": 2, "sensor_a": 14, "sensor_c": 87}
]
обе строки вставляются, но приходит сообщение, что
Fields not match: data_id,sensor_a,sensor_b and data_id,sensor_a,sensor_c on element 1
все sensors_* - описаны Nullable(UInt8)
все строки что, должны быть одинаковой структуры?.. -
Apache Superset BI
Apache Superset BI - это современное корпоративное веб-приложение для бизнес-аналитики. Это быстрое, легкое, интуитивно понятное приложение с множеством опций, позволяющих пользователям с любым набором навыков легко исследовать и визуализировать данные.
-
Добрый день! Подскажите пожалуйста, можно ли в моем случае обойтись без вложенных подзапросов? (Понимаю, что нет, но вдруг есть какая специфическая Кликовая фича, потому и беспокою)
select
column1,
sum(column2) as smm2, max(smm2) / smm2 as result
from
table1
group by
column1;
Спасибо заранее за ответ... -
-
возможно ваш брокер такие сообщения создает, можно из кафки посмотреть
-
formatDateTime
-
Спасибо!
-
иногда помогает detach / attach table
-
а где тут подзапрос?
-
там типа нужен max(smm2)
-
так это всего лишь моя "хотелка", так оно естественно не работает
-
select g, sum(number) sm, max(sm) over () mx, max(sm) over() / sm res from (select number%5 g, number from numbers(10)) group by g;
┌─g─┬─sm─┬─mx─┬────────────────res─┐
│ 0 │ 5 │ 13 │ 2.6 │
│ 1 │ 7 │ 13 │ 1.8571428571428572 │
│ 2 │ 9 │ 13 │ 1.4444444444444444 │
│ 3 │ 11 │ 13 │ 1.1818181818181819 │
│ 4 │ 13 │ 13 │ 1 │
└───┴────┴────┴────────────────────┘
проверял в суперсвежем КХ
похоже будет 20 июля доступно -
на моем version 20.3.10.75 Syntax error: failed at position...
-
Судя по коду класса, берется список полей из первой строки, а затем собирается массив строк со значениями. Поэтому нет, не получится так сделать
-
ну естественно, у вас вообще нет window functions, они появились в 21.4, вам можно через массивы сделать
запрос в таком виде как я написал будет работать только в 22.7 -
Понял, теперь все ясно :( Спасибо!!!
-
select g, sm, mx, res from (select groupArray( (g, sm) ) ga, max(sm) mx, arrayMap( i-> mx/i.2, ga) r from(select g, sum(number) sm from (select number%5 g, number from numbers(10)) group by g)) array Join ga.1 as g, ga.2 as sm, r as res;
┌─g─┬─sm─┬─mx─┬────────────────res─┐
│ 0 │ 5 │ 13 │ 2.6 │
│ 1 │ 7 │ 13 │ 1.8571428571428572 │
│ 2 │ 9 │ 13 │ 1.4444444444444444 │
│ 3 │ 11 │ 13 │ 1.1818181818181819 │
│ 4 │ 13 │ 13 │ 1 │
└───┴────┴────┴────────────────────┘ -
Спасибо.
-
Извините чот не пойму что за галюцинации при вставке Nested?
client.execute(
"""CREATE TABLE test(
id FixedString(36) NOT NULL,
time DateTime64(3, "Europe/Moscow") NOT NULL,
data Nested(
ip IPv4,
name_en String,
code String)
)
ENGINE = Memory
"""
)
client.execute("""
Insert into test (id,
time,
data.ip,
data.name_en,
data.code)
format Values""",
('00f0d86e-1234-12ed-1d11-40feb884ac00',
1655672463987,
['192.168.0.1', 'Some name', 'KK', 999999, 'QWEEW'])
)
ValueError: Expected 5 columns, got 36
Где оно 36 видит? -
Попробуйте на примере из документации либо из тестов в GitHub
-
каждое поле nested задается как массив
['192.168.0.1', 'Some name', 'KK', 999999, 'QWEEW'] -- это неправильно
36 это скорее всего питон во что-то странное все преобразовал -
что то я не понимаю с джоинами, подскажите что не так, порядок id совподает в 2 таблицах, но при соединение всем строкам кроме 1 добавляется группа new
-
-
-
-
Insert into test Values
('00f0d86e-1234-12ed-1d11-40feb884ac00',
1655672463987,
['192.168.0.1'], ['Some name'], ['KK'])
select * from test;
┌─id───────────────────────────────────┬────────────────────time─┬─data.ip─────────┬─data.name_en──┬─data.code─┐
│ 00f0d86e-1234-12ed-1d11-40feb884ac00 │ 2022-06-19 21:01:03.987 │ ['192.168.0.1'] │ ['Some name'] │ ['KK'] │
└──────────────────────────────────────┴─────────────────────────┴─────────────────┴───────────────┴───────────┘ -
-
-
Трудно понять, что вы хотели получить и что получили.
-
Я хочу соединить 2 таблицы, по Id, в первой таблице информация по платежам, во второй инфа по группам Id
-
-
-
почем должно так? у вас на 1 ключ много записей, как понять какую запись выбрать? никак. Приджойнилась первая попавшаяся, new
-
-
any присоединяет любую
-
-
any убрать?
-
Тож самое
-
-
-
-
Вот этот ответ мне помог
-
-
А any от декартов нас избавляет
-
Ок, а то я пример какой то нашел и там пихали массив как набор данных для нестед полей. Ок, щас попробуем
-
-
Вопрос отпал, я ошибся количеством порядков, в количестве записей всего
-
-
у mergetree таблиц select запоминает список партов (снепшот) которые надо обработать до выполнения запроса, и новые парты select не видит во время выполнения
у других движков все иначе -
ну это как раз replacingMergeTree, так что спасибо за ответ
-
Всем доброго дня!
Сломал всю голову. Хочу создать материализованное представление на движке CollapsedMergeTree поверх запроса к реплике pg таблицы (MaterializedPostgreSQL). Как только создаю представление, кликхаус начинает падать.
Реализовать такую задумку вообще реально? Мотивировано тем, что:
1) MaterializedPostgreSQL создает таблицы на движке ReplacingMergeTree и при удалении строк на источнике (в постгресе) они не "схлопываются" в реплике;
2) Хочется "переложить" данные на сущность с другой метой - поменять order by и, возможно, добавить партиционирование - на реплике ничего не сделать кроме attach/detach.
Если кто может подсказать что-то по теме, заранее благодарю! -
MaterializedPostgreSQL вроде автоматически дописывает final и where not deleted и вы не должны видеть удаленных строк
-
Допустим (почему-то сейчас не работает - версия CH 22.1.3.7).
Но если все равно требуется переложить данные в материализованное представление, применив другой движок/сортировку/расчет агрегата. Возможно ли тогда создать материализованное представление поверх MaterializedPostgreSQL? Есть ли какие-то требования для этого, может есть какая-то отдельная документация? -
народ, помогите понять
в ReplicatedMergeTree таблице на несколько миллиардов строк есть test lowCardinality(String) колонка, у нее всего около 40 уникальных значений
как быстро получить все ее уникальные значения?
select distinct test from table перелопачивает все строки, хотя логика подсказывает, что при запросе достаточно вернуть все содержимое lowCardinality словаря -
Всем привет. Подскажите пжл. по аномалии, которую я наблюдаю.
Есть тестовый кластер из 3 нод. shard1(node1, node2), shard2(node3)
На каждой ноде есть distributed таблица (все настроены одинаково) и шардированные с replicatedMergeTree
Закидываю данные напрямую в шардированную таблицу (к примеру в node2)
Произвожу select в distrbuted таблицу из разных node и получаю следующее:
console_node_1: никогда не возвращаются данные. (может быть отставание по репликации??)
console_node_2: всегда возвращаются данные. (наверное потому что хранятся на этой ноде)
console_node_3: иногда возвращаются данные. (скорее всего потому что распределенный запрос попадает либо на 1, на 2-ую ноду, поэтому данные либо есть, либо нет)
Как можно отследить/исправить подобного рода проблемы? -
без понятния. Все эти Materialized движки -- это чемонад без ручки, никому не нужны (в смысле вам нужен чемодан, но вы просто еще не знаете что он без ручки и пользоваться им невозможно).
-
никак.
можно получить некорое ускорение сделав `select test from table group by test`
но просто в словарь заглянуть нельзя (я просил такое сделать, но не сделали, потому что это будет работать только для запросов без where) -
спасибо!
а какой правильный способ иметь актуальный список этих уникальных значений где-то сбоку?
matview с map колонкой? -
а где проблема-то?
что всегда ходит в реплику на node2 если делать запросы с node2 ? так это специально сделано, чтобы экономить сеть, можно отключить -
я ожидаю всегда получать данные со всех nodes
ну т.е. созданная вставка должна же засинкаться с node1. А тут почему-то этого не происходит, раз данные недоступны -
так у вас 2 шарда. shard1(node1, node2)
вы получаете данные с 2х шардов. -
разберитесь сначала что репликация работает. Делайте запросы / проверяйте консистетность напрямую в replicatedMergeTree, отложите пока distrbuted
-
да. верно. Но при SELECT в распределенную таблицу, которая находится на node1 я ведь тоже должен получить результат, хоть изначально данные были записаны в node2?
Я понимаю, что клик предпочитает ходить в локальный шард для экономии, но все равно. -
отложите пока distrbuted
-
да. я опытным путем и пришел к тому, что поведение не то, что я ожидаю.
Если делать запросы в шардированные таблицы, то на node2 данные есть, а на node1 их нет. Стало быть эти ноды в шарде не засинкались. -
-
Делайте запросы / проверяйте консистетность напрямую в replicatedMergeTree,
-
-
а подскажите подалуйста вот такой момент
если nested это как бы таблица внутри таблицы, то по идее в один поток можно класть в нее несколько значений. Или я не прав?
Если прав то подскажите плиз как это сделать. -
у вас есть shard1(node1, node2) -- т.е. данные в replicatedMergeTree должны быть абсолютно одинаковые,
ну сделайте select count() from вашаreplicatedMergeTreeтаблица на node1 и node2 -
так я и сделал)))
на node1 данных нет, на node2 есть. -
Insert into test Values
('00f0d86e-1234-12ed-1d11-40feb884ac00',
1655672463987,
['192.168.0.1', '192.168.0.2', '192.168.0.3'], ['Some name', 'Some name1', 'Some name2'], ['KK', 'KK1', 'KK2']) -
а где посмотреть? Нужны примеры по Nested таблицам ( очень (
-
вот, уже понятнее становится.
select * from system.replication_queue на node1 и node2 -
ух ё моё.... конвертер лютый будет ) Спасибо
-
и там и там пусто.
-
вот, еще лучше, продвигаемся.
теперь покажите zk путь который вы использовали в replicatedMergeTree -
ReplicatedMergeTree('/clickhouse/tables/ddb6fcd0-dd77-40e4-9aa7-88573355e067/{shard}', '{replica}')
-
ок
теперь
select * from system.macros с обеих нод -
node1:
cluster: metrics
replica: stgch-1-local.ru
shard: shard1
node2
cluster: metrics
replica: stgch-2-local.ru
shard: shard1 -
интересно, а zk путь одинаковый на нодах в таблицах?
/clickhouse/tables/ddb6fcd0-dd77-40e4-9aa7-88573355e067/{shard}
? -
хм... нет. разные почему-то.
uuid разные -
дропните таблицу на node1 и создайте также как на node2
-
Подскажите, как правильно сконфигурировать кликхаус под максимально агрессивное сжатие данных.
Производительность запросов не так важна, как занимаемый объем, данные пишем через очередь (NATS, bulk insert).
Кроме того, поддерживает ли клик хаус возможность хранить данные с разной степенью компрессии на разных серверах (где-то быстрые ссд, где-то медленные винчестеры)
Если кто уже тестировал/есть бенчмарк, интересует сравнение с tdengine -
да. думаю что в этом и есть проблема. определенно. Спасибо за наводку.
А как можно умудриться так сделать? Всмысле что именно повлияло на то, что создались 2 разные таблицы.
Обычно я создаю таблицы и не указываю параметры пути zk. Оставляю стандартно, а оно там по макросам само генерит где нужно.
+ использую конструкцию on cluster. -
сложно сказать.
возможно надо искать в system.query_log на всех нодах как делали create.
как это вообще работает:
вы пишете create table .... on cluster ... Engine=Replicated() ....
on cluster генерит uuid и на ноды отсылает запрос create table .... UUID=xxxxx ... Engine=Replicated() .... , т.е. uuid не может быть разным.
значит кто-то создал таблицу 2мя разными запросами -
понял. спасибо большое.
-
-
думаю, если в system.merges всё это время есть записи для этой таблицы, то не стоит
-
-
Привет! в named_collections можно несколько добавлять? А то виден только один.
<clickhouse>
<named_collections>
<tz_db6_master>
<host>192.168.0.80</host>
<port>6432</port>
<database>maindb</database>
<user>user_jenkins</user>
<password>1</password>
</tz_db6_master>
<tz_db4_slave>
<host>192.168.0.10</host>
<port>6432</port>
<database>maindb</database>
<user>user_jenkins</user>
<password>1</password>
</tz_db4_slave>
<anl_ch_main_72>
<host>192.168.0.72</host>
<port>8123</port>
<user>ro</user>
<password>1</password>
</anl_ch_main_72>
</named_collections>
</clickhouse> -
где-то чем-то - это типа скачать в питон, сделать трансформ и потом инсерт?
-
ну да, но джавой
-
-
Всем привет, у меня проблема. Не могу остановить выполнение мутаций, kill mutation не помогает сервер не отвечает, перезапуск сервера тоже не помогает, после него операции с мутациями снова начинают выполняться. И все падает из-за того, что заканчивается ОП. Кто-нибудь сталкивался с такой проблемой?
-
ни при каком раскладе это не может быть быстрее. Сеть, сериализация, десериализация - дикий оверхед
-
спасибо
-
а зачем true or false? Разве t.id IN () выдаст не тот же результат?
-
Не совсем понял вопроса. Нужно выбрать из большой таблицы t только те строки где колонка id имеет значения возвращаемые в первой позиции в тупле (Int, Bool) из CTE
-
tuple.1
-
И выдаст вам первый элемент в тюпле
-
WITH tuples AS (
select (1, true)
union all
select (2, false)
)
SELECT t.*
FROM (
select 1 as id
union all
select 2 as id
union all
select 3 as id
) AS t
WHERE (t.id, true) IN tuples
OR (t.id, false) IN tuples
Пример понятное дело условный, но суть вопроса должен передавать. В результате надо увидеть 2 строки (1 и 2) -
WHERE t.id IN (SELECT col.1 FROM tuples)
-
где col — это имя колонки в cte
-
👍
-
а почему вы сразу в cte не вытащите только айдишники?
-
@den_crane
Подскажи плиз, При вставке во вложенную структуру вложенной структуры, структура второго уровня воспринимается как целое поле а не набор.
Нужны какие то спец указатели для субструктур?
в синтетике вообще вылетел ValuesBlockInputFormat
client.execute('DROP TABLE test')
client.execute(
"""CREATE TABLE test(
id FixedString(36) NOT NULL,
time DateTime64(3, "Europe/Moscow") NOT NULL,
data Nested(
ip IPv4,
name_en String,
code String,
subsrtuct Nested(
sub_id UInt8,
sub_string String
))
)
ENGINE = Memory
"""
)
client.execute("""Insert into test Values
('00f0d86e-1234-12ed-1d11-40feb884ac00',
1655672463987,
['192.168.0.1', '192.168.0.2', '192.168.0.3'], ['Some name', 'Some name1', 'Some name2'], ['KK', 'KK1', 'KK2'],
[12, 13, 14], ['Sub_string_value1', 'Sub_string_value2', 'Sub_string_value'])""")
DB::Exception: Cannot parse expression of type Array(Nested(sub_id UInt8, sub_string String)) here: [12, 13, 14], ['Sub_string_value1', 'Sub_string_value2', 'Sub_string_value3']): While executing ValuesBlockInputFormat. Stack trace: -
По второму элементу тупла есть аггрегация sumIf
-
[12, 13, 14], ['Sub_string_value1', 'Sub_string_value2', 'Sub_string_value'] -- Это что такое? у вас в таблице нету
-
типа вот эти поля хочу вставить
subsrtuct Nested(
sub_id UInt8,
sub_string String
)) -
@den_crane
Добрый вечер, подскажите, пожалуйста, с такой проблемой. Не могу остановить выполнение мутаций, kill mutation не помогает сервер не отвечает, перезапуск сервера тоже не помогает, после него операции с мутациями снова начинают выполняться. И все падает из-за того, что заканчивается ОП. Можно ли как-то убить эти мутации? -
Здравствуйте, а как узнать на какой шард попадет запись , если знаешь sharding_key и кол-во нод? я думал остаток берется, но тут как-то хитрее
create table test.test_month_distrib on cluster cluster (day_dt Date) engine = Distributed(cluster, test, test_month, (toMonth(day_dt) % 3 + 1));
select day_dt, toMonth(day_dt) % 3 + 1, shardNum() from test.test_month_distrib;
SELECT
day_dt,
(toMonth(day_dt) % 3) + 1,
shardNum()
FROM test.test_month_distrib
Query id: 357835ab-90d7-40ae-99ea-7f117a1efafd
┌─────day_dt─┬─plus(modulo(toMonth(day_dt), 3), 1)─┬─shardNum()─┐
│ 2022-05-01 │ 3 │ 1 │
└────────────┴─────────────────────────────────────┴────────────┘
┌─────day_dt─┬─plus(modulo(toMonth(day_dt), 3), 1)─┬─shardNum()─┐
│ 2022-06-01 │ 1 │ 2 │
└────────────┴─────────────────────────────────────┴────────────┘
┌─────day_dt─┬─plus(modulo(toMonth(day_dt), 3), 1)─┬─shardNum()─┐
│ 2022-07-02 │ 2 │ 3 │
└────────────┴─────────────────────────────────────┴────────────┘
┌─────day_dt─┬─plus(modulo(toMonth(day_dt), 3), 1)─┬─shardNum()─┐
│ 2022-07-01 │ 2 │ 3 │
└────────────┴─────────────────────────────────────┴────────────┘
4 rows in set. Elapsed: 0.048 sec. -
Insert into test Values
('00f0d86e-1234-12ed-1d11-40feb884ac00',
1655672463987,
['192.168.0.1', '192.168.0.2', '192.168.0.3'], ['Some name', 'Some name1', 'Some name2'], ['KK', 'KK1', 'KK2'],
[[(12,'Sub_string_value1')],[(13,'Sub_string_value2')],[(14,'Sub_string_value3')]] )
но тут есть проблема, из питона на самом деле надо делать инсерты по-другому -
replicated таблицы?
-
Да
-
вручную удаляйте из зукипера мутации
-
а есть ли мануал какой покурить?
-
А где они лежат?
-
Подскажите, а можно ли такой запрос как-то превратить в AggregatingMergeTree мат вью? Мне нужно чтобы при вставке в table1 пересчитывались оконные функции и distinct.
select
distinct
date(TIMESTAMP) as date,
hour(TIMESTAMP) as hour,
KEY,
first_value(<фнкуция1 от TIMESTAMP>) over
(partition by date, hour, KEY order by (<фнкуция1 от TIMESTAMP>)) as fnc1,
first_value(<фнкуция2 от TIMESTAMP>) over
(partition by date, hour, KEY order by (<фнкуция1 от TIMESTAMP>, <фнкуция2 от TIMESTAMP>)) as fnc2
from table1 -
Дока от кликзауса + kb от алтинити
-
Ну в доке явно нет про инсерты вложенных структур на питоне ) а что такое kb? Можно ссылку?
-
спросите в гитхабе у них
-
Гугл в помощь :)
-
Ладно посмотрим там )
-
-
clickhouse-driver/test_nested.py at 9a8b4a0706d78ee9952737a9b277f448acf3eaf0 · mymarilyn/clickhouse-driver
ClickHouse Python Driver with native interface support - clickhouse-driver/test_nested.py at 9a8b4a0706d78ee9952737a9b277f448acf3eaf0 · mymarilyn/clickhouse-driver
-
-
Подскажите, пожалуйста, по ситуации:
Кластер, 1 шард, 3 ноды. Есть табличка с DDL вида
CREATE TABLE mydb.mytable (
`eventDate` DateTime64(3),
`field1` String)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/mydb/mytable_NEW', '{replica}')
PARTITION BY toYYYYMM(eventDate)
ORDER BY (field1, eventDate)
SETTINGS index_granularity = 8192;
Т.е. её раньше переименовывали и в БД она mytable, а в Zookeeeper видимо mytable_NEW.
Вылезло это, когда не прошел ALTER TABLE ADD COLUMN ON CLUSTER.
Как теперь это починить? -
как подключится к зукиперу знаете?
типа zk-shell localhost
потом команды ls , cd , находите свою таблицу, шард, там есть mutations
cd mutations
ls
rmr
в zk-cli кажется deleteall вместо rmr -
>CREATE TABLE mydb.mytable
> /clickhouse/tables/{shard}/mydb/mytable_NEW'
это абсолютно нормально!!!!!!
> Т.е. её раньше переименовывали и в БД она mytable, а в Zookeeeper видимо mytable_NEW.
это абсолютно нормально!!!!!!
>Вылезло это, когда не прошел ALTER TABLE ADD COLUMN ON CLUSTER.
куда вылезло, ошибка какая ? copy/paste пожалуйста -
Мы используем Clickhouse keeper. Что в этом случае можно сделать?
-
так же. Никакой разницы, утилиты zk-shell ZkCli работают точно также как и с Zookeeper
а кипер тоже лежит у вас? -
Кипер поднимается вместе с кх, доходит до предела памяти и убивается
-
это скрипты на питоне https://www.google.com/search?client=firefox-b-d&q=zkshell+download
надо запустить кипер без КХ sudo -u clickhouse clickhouse-keeper -c config.xml -
Большое спасибо! попробуем
-
Прошу прощения, не все указала. Есть ещё view:
CREATE VIEW mydb.mytable_last ON CLUSTER '{cluster}' AS
SELECT
max_eventDate AS eventDate,
field1 AS field1
FROM
(SELECT
max(eventDate) AS max_eventDate,
field1
FROM mydb.mytable
GROUP BY field1);
Надо было добавить колонку и в таблицу, и в эту view:
ALTER TABLE mydb.mytable ON CLUSTER '{cluster}' ADD COLUMN IF NOT EXISTS field2 Nullable(DateTime64(3)) AFTER field1;
CREATE OR REPLACE VIEW mydb.mytable_last ON CLUSTER perftest_1shards_3replicas AS
SELECT
max_eventDate AS eventDate,
field1 AS field1,
field2 AS field2
FROM
(SELECT
max(eventDate) AS max_eventDate,
field1,
argMax(field2, eventDate) AS field2
FROM mydb.mytable
GROUP BY field1);
При запуске скрипта с добавление колонки и вью (и ещё там были операции между ними) вылезла ругачка:
[root@u00clickhouse01 ~]# cat update.sql | clickhouse-client --multiline -n
u00clickhouse02 9000 0 2 2
u00clickhouse03 9000 0 1 1
u00clickhouse01 9000 0 0 0
u00clickhouse01 9000 0 2 2
u00clickhouse02 9000 0 1 1
u00clickhouse03 9000 0 0 0
u00clickhouse01 9000 0 2 0
u00clickhouse02 9000 0 1 0
u00clickhouse03 9000 0 0 0
u00clickhouse01 9000 0 2 1
u00clickhouse02 9000 0 1 1
u00clickhouse03 9000 47 Code: 47, e.displayText() = DB::Exception: Missing columns: \'field2\' while processing query: \'SELECT max(eventDate) AS max_eventDate, field1, argMax(field2, eventDate) AS field2 FROM mydb.mytable GROUP BY field1\', required columns: \'eventDate\'
\'field1\' \'field2\', source columns: \'field1\' \'eventDate\' (version 20.9.2.20 (official build)) 0 0
Received exception from server (version 20.9.2) -
Теперь если смотреть по нодам, то колонка field2 на всех нодах добавилась, а вью поменялась на двух нодах, а на третьей нет
Также не выполнилась операция, которая была перед сменой вью на всех нодах, причем в
select * from system.zookeeper z where path = '/clickhouse/task_queue/ddl/query-0000000226/finished';
она стоит как finished на всех трех нодах. Но по факту изменений нет
Там был detach table для materialized_view и attach view - вот он стоит как прошедший, но вроде бы и не прошел -
Если запускать скрипт, то порядок выполнения операций на нодах будет как они попали в clickhouse/task_queue или может быть произвольным?
-
у вас CREATE OR REPLACE VIEW выполнилось до того как ALTER TABLE mydb.mytable случился на реплике
-
--replication_alter_partitions_sync arg Wait for actions to manipulate the partitions. 0 - do not wait, 1 - wait for execution only of itself, 2 - wait for everyone.
--mutations_sync arg Wait for synchronous execution of ALTER TABLE UPDATE/DELETE queries (mutations). 0 - execute asynchronously. 1 - wait current server. 2 - wait all replicas if they exist. -
я бы просто select sleep(3) format Null вставил перед CREATE OR REPLACE VIEW
-
Хорошо, спасибо! Узнаю настройки на всякий случай и попробуем со sleep 🙂
-
в смысле
clickhouse-client --multiline -n --mutations_sync=2
но это не дает 100% гарантии -
в теории в этом случае ADD COLUMN должен возращать управление когда все реплики добавили столбец, на практике это не так (не всегда).
- 09 July 2022 (2 messages)
-
Joined.
-
Joined.
- 10 July 2022 (18 messages)
-
Joined.
-
Joined.
-
Подскажите, как из КХ в YDB (яндексДБ) данные перегонять?
-
Возможно вопрос тривиальный, но ....
Цель - замена всех шардов (3шт) одной из реплик на новые (апгрейд железа).
Идея - "оффлайновое" копирование data/metadata со старого шарда на новый, останов старого, досинхронизация. Замена имен в ДНС на адреса нового (все только на днс-именах). Старт нового. (непродолжительный даунтайм шардов не критичен).
Вопросы: можно так? не сломает ли это что-нибудь в зукипере? Не покарраптятся ли данные? Возможно это "плохой" способ и есть "более правильный" способ замены железяк на новые ? -
Кстати, а почему бы просто реплику не делать? Добавили новую реплику, "восстановилось", удалили старую реплику.
Получается, только метадату надо самому копировать, если не атомик конечно (при условии что я верно понял). И оффлайна не будет -
-
Добрый день!
Предлагаю продвижение
чатов и групп
детали тут -
Зачем все шарды? Добавляете новую реплику для 1 шарда, репликация все накатывает сама, тушите старую реплику 1 шарда. Повторяете для остальных шардов. Или я что-то не понял
-
-
А писатели, читатели из старой реплики ? Ходить во все сервисы и менять настройки придется.
Перефразирую тогда. Как грамотно заменить шард. -
Вы накопили данных на новом шарде, что мешает потом все настройки сети поменять на новом шарде ?
-
вот, уже ближе... при смене "новых" настроек, на "старые" например
interserver_http_host зукиперу нормально будет? Как потом зукипер заставить "забыть" о перименованном?
Давайте абстрагируемся и рассмотрим случай:
1) Сервер умер, закали другой, новое железо, новые IP -
-
Толи лыжи толи я
Версия 22.3.8.39
UnknownTypeError: Code: 50. Unknown type Nested(name String, version UInt32)
пример тупо с дукументации по драйверу.
lient.execute('DROP TABLE default.test')
client.execute("SET flatten_nested = 0")
client.execute("""
CREATE TABLE default.test
(
col Nested(name String, version UInt32)
)
ENGINE = Memory
""")
client.execute(
'INSERT INTO default.test VALUES', [
{'col': [
{'name': 'a', 'version': 100},
{'name': 'b', 'version': 200},
{'name': 'c', 'version': 300}
]}
])
Некоторые вариации вгоняют клик в ступор (не возвращает ничего тупо висит)
типа вот
client.execute("""Create table default.test (
x Int32,
y String,
n Nested(
id Int32,
name String
)
) ENGINE=Memory""")
data = {'x': 1, 'y': 'asdasd', 'n': [{'id': 0, 'name': 'zero'},{'id': 1, 'name': 'one'}]}
client.execute('INSERT INTO test VALUES',data)
client.execute("Select * from default.test") -
попробуйте напрямую без драйвера. если всё ок, то заводите баг в репе драйвера
-
Понял, опись протокол завтра составлю и отправлю.
-
скорее всего у вас просто старый драйвер
-
- 11 July 2022 (185 messages)
-
Неа, не существует, как и поисковых систем, в которых его можно было бы найти.
-
Идите на хуй, если не собираетесь помогать другим. Лицемер, ебучий, который когда-то пришёл в этот чат с таким же вопросом.
-
-
бгг. грубо, громко, и, что самое главное, неправда, что легко проверяется поиском, который есть и в телеге тоже.
-
Всем привет. Подскажите как можно бороться с конкурентным доступом к таблице?
WRITE locking attempt on "*****" has timed out! (120000ms) Possible deadlock avoided. Client should retry. (DEADLOCK_AVOIDED)
Там ситуация в том, что клиенты селектят из таблицы, а я пытаюсь её пересоздать. Можно как-то через права мб сделать идли через настройки, чтобы клиенты отваливались, а я получал приоритетный доступ? -
вы делаете exchange tables?
-
там работает DBT и пересоздаёт таблицу. Как я понимаю это exchange tables
-
Что? То есть ни один человек тут не задавал того вопроса, которого нет в гугле? Ты такой же дурачок, как и он
-
-
Сорян за шакальную картинку, но вопрос, почему при наличии фсинков у меня брокенпарты в таком количестве ?
-
ClickHouse server version 21.9.2.1.
-
официальный https://clickhouse.com/docs/ru гайд подойдёт?Что такое ClickHouse | ClickHouse Docs
what-is-clickhouse}
-
это нормально, что бульк инсертом в кликхаус базу данных 10к колонок из двух маленьких строк добавляются 8 секунд, а 1 миллион я так и не могу дождаться?)
по мануалам делаю -
там еще батч сайз указать можно при бульк инсерте, он в мануале был 10к, а размер вставки 1кк
-
кликхаус в докере десктоп на винде, обращаюсь к нему через clickhous.client из дотнета
-
Кажется, у вас что то не так ... Я спокойно разгонял вставку в кликхаус до 400 тысяч строк в секунду
-
На стандартных настройках, только с добавлением оперативной памяти
-
ну это обычная скорость для всех бд
-
А так очень мало вводных данных, чтобы вам что то сказать
-
как озу добавить?
-
докер и так 3гб жрет
-
Всё ок. Кликхаус уже начали юзать даже домохозяйки, которые ещё не научились гуглить, но им уже надо.
-
max_memory_usage настройка в user.xml вроде добавляется
-
Посоветуйте что-нибудь, пожалуйста 😢
-
Всем привет. Подскажите как можно бороться с конкурентным доступом к таблице?
WRITE locking attempt on "*****" has timed out! (120000ms) Possible deadlock avoided. Client should retry. (DEADLOCK_AVOIDED)
Там ситуация в том, что клиенты селектят из таблицы, а я пытаюсь её пересоздать. Можно как-то через права мб сделать идли через настройки, чтобы клиенты отваливались, а я получал приоритетный доступ? -
там работает DBT и пересоздаёт таблицу. Как я понимаю это exchange tables
-
Подпишусь под вашим вопросом
-
Для начала я бы убедился через query_log, что ваша версия DBT действительно использует exchange tables. Но более интересно другое - а что это за такой рутинный процесс, в котором вы пересоздаете таблицы? Может как-то по другому? alter table? attach/detach?
-
Мб я тогда не до конца понимаю понятие exchange table. Dbt насколько я знаю всегда создаёт новую таблицу и удаляет старую (только если это не инкремантальная материализация)
-
exchange tables почти атомарно меняет имена для двух существующих таблиц. создали новую и одним движением поменяли. потом старую (но уже с другим именем) через некоторое время можно удалить.
-
Где почитать?
-
так это - поиск в документации худо бедно но работает - https://clickhouse.com/docs/en/sql-reference/statements/exchange/EXCHANGE Statement | ClickHouse Docs
Exchanges the names of two tables or dictionaries atomically.
-
Добрый день!
Нужен совет. Есть база на postgre, пока не очень большая, но быстро растет. Центральная таблица около 10гб. Первисный ключ - строка из 21 цифры.
85 процентов запросов - селекты. Индекс по первичному ключу весит 4гб.
Очень много выборок where in (...) по этому ключу -
-
-
"Например старые данные, которые не изменяются сгружать в кликхауз или что то еще."
Я так понимаю, эта таблица по сути представляет из себя справочник. В этом случае не лучше ли её оставить в постгри? В противном случае придется заморачиваться апгрейдами изменяемых данных, что в КХ достаточно дорого и неудобно. -
-
при чем тут выборка? с селектами, которых у вас 85% все будет хорошо, вопрос же про остальные 15%, которые вероятно update/upsert. Если вы пришли сюда, то про них и надо думать - как вы будете работать с изменяемыми данными. Поможет ли вам простой ReplacingMT with select final, или нужно что-то похитрее.
-
И второй вопрос - точечные запросы. Если ваши селекты спрашивают 100 строк за раз, и их 100 в секунду, то лучше не уходить с постгреса.
-
понял. буду дальше изучать. спасибо
-
Коллеги, привет. Подскажите пожалуйста правильный путь для бэкапа пользователей через clickhouse-backup? Я что то в доке этот момент не нашел, и не могу понять это надо делать руками отдельно или я что то не увидел
-
Clickhouse-backup - создан для того чтобы создавать бэкапы и отсылать на другие сервера , в чём проблема ?
-
Судя по всему у вас ключ это какое-то представление алгоритмов распределенного ключа. Как пример, есть алгоритм Snowflake ID, который хранит распределенный ключ в 64 битах (unsigned версия позволяет хранить 2^64-1 значения максимум, что приводит к 20 символам в числе). В данном алгоритме несколько бит отвечают за timestamp, то есть вы можете в итоге применить партицирование по датам
-
но по идее если вы строковый ключ замените на битовое представление, то мне кажется что вам станет жить проще
-
Не обязательно на сервера же, он еще и в какой-нибкдь s3 его может положить. И из этого бэкапа потом хочется просто восстановить полный бэкап на свежий сервер включая всех пользователей и их настройки
-
ну а 21 символ в ключе у вас наверное из-за того, что в строке последний символ - это символ конца строки
-
Тут же ключ 21 символ
-
Нет. Все числа. Шаблона нет
-
то есть ключи рандомно у вас генерируются?
-
Не у меня. Приходит снаружи.
-
-
Там вроде ключ есть для того чтобы пользователей сохранить, rbac кажется
-
Да, спасибо, кажется что оно, я даже не попробовал потому что в хелпе написано:
Backup RBAC related objects only -
Если не рбак, то /etc/clickhouse-server/users* наверное
-
-
https://t.me/dbt_users сюда обратитесьdbt_users
DBT users group Взаимное уважение и без спама. Для вакансий тег #job Dual language: russian/english
-
Ребят направьте плиз в нужную сторону )
У меня на вход колонки типа DateTime64 в некоторых случаях летит строка.
можно как то преде вставкой (без написания доп парсера)
прокручивать данные через toDateTime64(str) ?
Можно конечно засосать строкой и потом постобработку сделать, но блин. Где то в доках вроде это видел. -
там проблема в том что это вложенная структура 2го уровня )
-
Type Conversion Functions | ClickHouse Docs
Common Issues of Numeric Conversions
-
input | ClickHouse Docs
input(structure) - table function that allows effectively convert and insert data sent to the
-
Спасибо
-
не вариант.
Поле:
n_field Nested (
id FixedString(64),
date1 DateTime64(3, "Europe/Moscow"),
date2 DateTime64(3, "Europe/Moscow")
)
на вход подается
[{n_field: [{‘id’: ‘dasd23eqadasdas’, ‘date1’ 1655672446520
, ‘date2’: ‘2022-06-19 20:59:53.040000
’ }]}]
Оно конечно не войдет ибо не совпадение типов.
нужно как то в инсерте указать чтобы значение date2 приводить к DateTime64
(функции приведения я знаю, вопрос в том можно ли так изъебнуться или парсер писать для входящего блока) -
Попробуй поставить настройку
date_time_input_format='best_effort' -
ок!
-
хочу выполнить:
insert into t1 select * from t2
where toMonth(some_date_field) = 1; // <- условие, которое на все записи из одной партиции
таблицы с одинаковой структурой, но разными order by
падает с сообщением о нехватке памяти
можно как-то узнать, сколько надо памяти надо на такой insert?
нельзя ли как-нибудь провернуть, не поднимая всю таблицу t2 в память? -
не прокатило
AttributeError: 'str' object has no attribute 'tzinfo' -
а полную ошибку?
-
это и есть она или прям весь трейс кинуть?
-
Привет, ребят
а есть для out формата TabSeparatedRawWithNames
возможность указать quote для String полей ? -
А как по дефолту скормить пустой словарь? Можно ли )
Nullable нельзя на мап накладывать как и на массив.
create table test (dict_field MAP(String, Int8) DEFAULT {}) -
парсер, примерно как csv: https://clickhouse-driver.readthedocs.io/en/latest/misc.html#inserting-data-from-csv-file
строки не поддерживаются: https://clickhouse-driver.readthedocs.io/en/latest/types.html#datetime-timezone-datetime64-timezone -
да все норм. на первоисточнике преределаем нормаьно.
не хочу парсить ) -
Всем привет в mysql базе есть дата '1965-05-09' хочу забрать ее в кх и хранить в типе datetime64, кверю
select date,
toDateTime64(date, 3)
from mysql()
settings mysql_datatypes_support_level = 'datetime64';
получаю даты 2144-10-13 2008-09-05 17:31:44, как можно получить верную 1965 год? -
select toDateTime64('1965-05-09', 3, 'Europe/Moscow')
оно? -
Добрый, есть простой вопрос
при селкте получается 10 000 записей
есть ли в клике какая то функция чтоб можно было получить ограниченное количество записей в зависимости от каунта в 1 запрос
типа если я хочу 2 записи то он отдаст только 0 и 5000
если хочу 10 то 0 1000 2000 итд?
сейчас это делается в 2 запроса
1. получаем каунт
2. считаем с него шаг прореживая
3. запрашиваем с с шагом -
я еще думал чт овот так прокатит
time DEFAULT toDateTime64(time, 3, 'Europe/Moscow')
но не прокатило -
DEFAULT вроде работает когда значения нет?
-
ну типа да но ктож знает на ввернякак как он тут работает )))
-
Так я же хочу из mysql базы в кх достать столбец с датой, а не константную дату в кх сделать)
-
Вместо '1965-05-09' подставить date )
-
Добрый день! В таблице system.query_log есть столбец thread_ids. Подскажите пожалуйста, потоки которые там указаны это все потоки который использовались для обработки запроса в части фильтрации, группировки и так далее, а также для выполнения распределённых запросов?
-
ну доставай и преобразовывай ) я просто показал что она конвертится нормально в 64
-
Подскажите можно ли дефолтные поля типа MAP дефолтом обработать?
пробую ругается Expected one of: token, Comma. Stack trace:
data Map(String, Nullable(String)) DEFAULT {},
вроде ничего криминального -
-
Помогите понять, что значит такая ошибка
Это баг?) -
Всмысле, он говорит что такой таблицы нет
-
ServerException: Code: 62.
DB::Exception: Syntax error: failed at position 723 ('DEFAULT') (line 20, col 45): DEFAULT Map('0', 0), -
insert into article_stocks select * from _dev_article_stocks where date(dateTime) >= '2022-07-06';
-
DB::Exception: Table prod.article_stocks_test doesn't exist.
-
я не запрашиваю таблицу с _test в конце))
-
А селект откуда идёт ? Не из view ?
-
нет, это обычный MT
-
-
А если указать БД, то он вставляет ?
-
нет
-
А если SHOW TABLES
-
то там есть таблица test ?
-
если поменять таблицы местами, то запрос выполняется
-
Ну скорей всего баг какой то
-
варик не прокатывает в Nested структуре (
-
Вы должны указать Defaul для всей Nested структуры наверное
-
хм... щас попробую но это не очень хорошая затея )
-
mat view не висит на вставляемой таблице?
-
Да, висел mv, который при инсерте вставлял в несуществующую таблицу
отсюда и ошибка -
Это работет только если вся нестед сруктура прилетит как None
Для внутренних полей это правило не распространяется.
вылетает
TypeError: object of type 'NoneType' has no len() -
Получается совсем не то
в mysql базе есть дата '1965-05-09' хочу забрать ее в кх и хранить в типе datetime64, кверю
select date,
toDateTime64(date, 3)
from mysql()
settings mysql_datatypes_support_level = 'datetime64';
получаю даты 2144-10-13 2008-09-05 17:31:44, как можно получить верную 1965 год? -
так 1970 год минимальный
1965 год = максимальный год - 5 => 2144 -
выглядит так, что у тебя тип переполняется
но клик все косячные даты приводит к ближайшему крайнему значению, то есть 1965 приведется к 1970, может где-то на стороне есть еще логика? -
Здравствуйте, а можно ручками удалить данные покоцанные из /var/lib/clickhouse/data и перезапустить кликхаус?
Просто тут проблема на версии 20.5.4.40: после восстановления метаданных по Зукипер и попытке рестартануть на второй машине из кластера КХ, кликхаус не может стартануть. Окей, пришлось ручками перезаписать метаданные с ReplicatedMergeTree на MergeTree, но теперь КХ говорит о том, что не может ATTACH TABLE произвести, пишет примерно следующее:
Application: DB::Exception: With extended storage definition syntax storage ReplicatedMergeTree requires 2 parameters:
path in ZooKeeper,
replica name
Syntax for the MergeTree table engine:
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2],
...
INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1,
INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2
) ENGINE = MergeTree()
ORDER BY expr
[PARTITION BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[TTL expr [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'], ...]
[SETTINGS name=value, ...] -
а, все, починил...
-
Всем привет.
Пришел спросить совета мудрых.
Делаю пейджинг по неключевому полю.
Пробовал добавлять skipping index, но это не сильно помогло.
Схема и запрос ниже.
Предполагается, что строк будет 500млн.
CREATE TABLE IF NOT EXISTS my_table_raw
(
id String,
balance Decimal128(18),
version UInt32
)
ENGINE = MergeTree
ORDER BY (id)
SETTINGS index_granularity = 8193;
CREATE TABLE IF NOT EXISTS my_table
(
id String,
balance Decimal128(18),
version UInt32
)
ENGINE = ReplacingMergeTree(version)
ORDER BY (id)
SETTINGS index_granularity = 8193;
CREATE MATERIALIZED VIEW IF NOT EXISTS my_table_mv
TO my_table
AS
SELECT id AS id,
argMax(sp.balance, sp.version) AS balance,
max(version) AS version
FROM my_table_raw
GROUP BY id;
SELECT *
FROM my_table
WHERE balance > 10000
--AND spp.settled_balance < 11000
ORDER BY balance
LIMIT 100 --OFFSET
10000
;
``` -
Забыл добавить. Запрос отрабатывает, но долго.
-
Что-то подсказывает мне, что проще поместить результат в какую-то временную таблицу и уже к ней обращаться, чем делать пейджинг сразу с агрегацией
-
1. запрос возвращает неправильный результат
правильный запрос
SELECT id, argMax(sp.balance, sp.version) balance, max(version) AS version
FROM my_table
group by id
Having balance > 10000
ORDER BY balance
LIMIT 100 --OFFSET
10000
2. магии не существует -
а зачем вообще order by на таком огромном массиве данных?
-
toDateTime64 умеет даты от 1925
-
1. да, Вы правильно подправили.
2. думал, может кто-то догадался, как индекс на костылях замутить -
тут не сделать индекс
по той же самой причине что и 1. -
задача такая, но возможно ее можно переиграть на блок where...
-
У нас есть тяжелые отчеты (не в КХ, но не суть). Мы результаты сохраняем во временные таблицы, а уже по ним делаем пейджинг
-
у нас часто меняются данные и пейджинг едет сразу на фронт
-
ну вы выводите полмиллиарда строк, и пытаетесь их отсортировать. Конечно, долго будет запрос выполняться. Если убрать order by, заметно ускорится?
-
Аналогично. Но все равно ведь существует некоторый лаг. Допустим, 1 час. Или как-то так
-
у нас допустимый лаг - 5 сек
-
Тогда ой
-
а без ордера оно и не нужно =)
-
Мне вот просто интересно, а есть необходимость смотреть данные именно на 578 странице?
-
Ну это просто пейджинг.
По возрастанию, по убыванию кусочками. -
Я к тому, что можно ведь просто ограничить количество выводимых строк. И уже по ним гонять лимитом. Может быть, это уменьшит время
-
да, Это одна из возможных оптимизаций.
-
КХ не преспособлен для таких реалтайм запросов (быстро+пейджинг, это не ОЛАП), это надо где-нибудь в PG делать.
-
Привет. Столкнулся с неожиданным для себя поведением при использовании WITH. Версия КХ 21.2.5.5 , мб дело в этом, конечно.
1. Делаю: SELECT date FROM stats1.events6621 LIMIT 1; - получаю строку данных из своей таблицы, всё ок.
2. Заворачиваю это в WITH: WITH q1 AS ( SELECT date FROM stats1.events6621 LIMIT 1 ) SELECT * FROM q1; - результат идентичен пункту 1, всё ок.
3. Упрощаю WITH ещё больше, вообще убирая оттуда БД - WITH q1 AS ( SELECT 1 ) SELECT * FROM q1;- ловлю "1", всё ок.
4. В WITH оставляю простой SELECT 1, а нужный мне запрос выношу наружу - WITH q1 AS ( SELECT 1 ) SELECT date FROM stats1.events6621 LIMIT 1; - и получаю:
SQL Error [62]: ClickHouse exception, code: 62, host: <ip>, port: <port>; Code: 62, e.displayText() = DB::Exception: Received from <ip>:<port>. DB::Exception: Syntax error: failed at position 12: (SELECT 1) SELECT date FROM stats1.events6621 LIMIT 1. Expected identifier. (version 21.2.5.5 (official build))
Эти запросы - это наиболее упрощённый вариант проявления проблемы, который я смог подобрать. Это "норма", что наличие подзапроса забирает у меня возможность делать запросы к БД? Или где именно у меня там ошибка в синтаксисе? -
возможно из-за версии, на 22.2 все ок работает
-
в 21.2.5.5 with не доделан, ну и она уже год как не поддерживается.
-
грусть-печаль. спасибо @mordschlag @den_crane
-
show create database (у базы движок Atomic или Ordinary?)
-
Ordinary
-
а как перечитывать серты openssl в кх?
версия 22.3.3.44
в конфиге сервера, с обоих сторон
<openSSL>
<server>
<certificateFile>серт</certificateFile>
<privateKeyFile>ключ</privateKeyFile>
<caConfig>ца</caConfig>
<verificationMode>strict</verificationMode>
<loadDefaultCAFile>true</loadDefaultCAFile>
<cacheSessions>true</cacheSessions>
<disableProtocols>sslv2,sslv3</disableProtocols>
<preferServerCiphers>true</preferServerCiphers>
</server>
<client> то же самое что и в server </client>
</openSSL>
и в конфиге словаря
<source>
<clickhouse>
... теги host,port,user,password,db,table...
<secure>1</secure>
</clickhouse>
</source>
и я получаю в system.dictionaries в поле last_exception такую красоту:
last_exception: Code: 279. DB::NetException: All connection tries failed. Log:
Code: 210. DB::NetException: SSL Exception: error:10000415:SSL routines:OPENSSL_internal:SSLV3_ALERT_CERTIFICATE_EXPIRED, while reading from socket (хост:порт). (NETWORK_ERROR) (version 22.3.3.44 (official build))
Code: 210. DB::NetException: SSL Exception: error:10000415:SSL routines:OPENSSL_internal:SSLV3_ALERT_CERTIFICATE_EXPIRED, while reading from socket (хост:порт). (NETWORK_ERROR) (version 22.3.3.44 (official build))
Code: 210. DB::NetException: SSL Exception: error:10000415:SSL routines:OPENSSL_internal:SSLV3_ALERT_CERTIFICATE_EXPIRED, while reading from socket (хост:порт). (NETWORK_ERROR) (version 22.3.3.44 (official build))
: While executing Remote. (ALL_CONNECTION_TRIES_FAILED) (version 22.3.3.44 (official build))
я попробовал дать HUP кх-серверу, не помогло. дал рестарт заработало -
добрый вечер!
создаю materialized view в котором в select другой materialized view
пытаюсь в AS SELECT сделать GROUP BY, но группировки не происходит, хотя при создании таблицы кх требует чтобы я сагрегировал все поля, то есть он понимает что будет группировка, а на выходе ее нет
это связано с этим? текст из доки: For example, if GROUP BY is set, data is aggregated during insertion, but only within a single packet of inserted data. The data won’t be further aggregated. -
-
в atomic такой проблемы не будет.
Ordinary уже все, его диприкейтяд
https://kb.altinity.com/engines/altinity-kb-atomic-database-engine/ -
Да, всё именно так. А чтобы группировка была дешевле, можно в MV взять в качестве ENGINE таблицы какой нибудь AggregatingMergeTree или может Summing, что вам больше подходит в вашем случае.
-
да, сменил на AggregatingMergeTree уже минут 5 назад, ничего не поменялось)) усердно думаю дальше
-
должно работать https://github.com/ClickHouse/ClickHouse/pull/31257
видимо для словарей не доделали, я бы issue завелMerge #15765 by FArthur-cmd · Pull Request #31257 · ClickHouse/ClickHouseChangelog category (leave one): Improvement Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md): Merge #15765 (Dynamic reload of server TLS certificates o...
-
materialized view группирует то что было в инсерте (буффер инсерта (может даже часть инсерта))
дальше начинает работать engine -> summing/aggregating который в мержах тоже группирует
и да финально надо группировать в select -
AggregatingMergeTree не мержит до упора, нету такой цели.
-
-
"Dynamic reload of server TLS certificates on config reload" ...
а config reload в КХ делается как везде, HUP сигналом? -
это лучше до заливки в КХ решпть
-
КХ следит за xml/yaml файлами и каталогами своих конфигов через inotify, и моментально перегружает когда файлы меняются
HUP он НЕ слушает.
есть system reload config -- на случай debug или если inotify не работает -
-
Да
-
-
спасибо
-
-
Так тут вообще все просто. Сделайте пример из пары строк
-
Кх умеет grouping sets
-
-
-
-
-
-
-
-
-
не понял, а зачем вам нужен correlated subquery, если для того, чтобы подсчитать Select visitDate, sum(errors) from <ваш запрос> group by visitDate вполне хватает обычного subquery
-
-
-
так сделайте max(error) as errors
будет одна строчка со значением 1 для сессии, если хотя бы одна ошибка была, и неважно сколько их было -
-
какие два поля? у вас же во внешнем запросе будет group by по полю, вычисляемому в подзапросе
select visitDate, sum(errors) from (select min(createdAt) as visitDate, ... group by session_id) group by visitDate -
-
-
-
в синтаксисе
-
-
по логике да, движок просто подставит код CTE вместо него в основной select
для всего остального есть ESTIMATE и query_log ) -
-
я извиняюсь за нескромный вопрос, вы же поняли, что CliсkHouse не поддерживает только correlated subquery, а обычные подзапросы вполне поддерживает.
просто вы что-то неочевидным путем изначально пошли в ситуации "надо сделать запрос поверх результатов другого запроса" -
да, конечно, спасибо, изначально я проигнорировал слово correlated
-
отлично )
-
<default>
<volumes>
<hot_volume>
<disk>fast_1</disk>
<disk>fast_2</disk>
</hot_volume>
<cold_volume>
<disk>slow_1</disk>
<disk>slow_Х</disk>
<disk>slow_6</disk>
</cold_volume>
</volumes>
<move_factor>0.2</move_factor>
</default>
Начал заполнять данными
Итого: диски в hot_volume заполнены на 100%, вставка даёт ошибки а-ля:
Code: 1001. DB::Exception: Received from localhost:9000. DB::Exception: std::1::fs::filesystem::filesystem_error: filesystem error: in create_directory: No such file or directory ["/srv/slow-2/store/c98/c98021f1-cc27-48bd-94ae-4693697ccdc8/shard1_replica2"]. (STD_EXCEPTION)
Часть данных уехала в процессе наполнения данными на cold_volume, но собственно на сей момент стоит колом с забитыми hot_volume дисками и ничего не делает.
Это ок? -
-
Вам вместо пейджинга нужно офсетный подход. Загуглите что-то типа paging vs offset. Ну и применительно к SQL нужно отказаться от OFFSET, а запоминать максимальное значение баланса и подставлять его на следующей странице в WHERE тогда при ORDER BY не будут дополнительно сортироваться строки с предыдущих страниц.
-
При желании можно и в кликхаус конечно запихнуть, но наверное только в embedded rocksdb.
- 12 July 2022 (103 messages)
-
Всем, привет! Сходу не гуглится. Посоветуйте, пожалуйста, где можно почитать про блокировку select запросов на таблицу, во время выполнения insert в неё и т.п. ...
Кейс такой:
1. Рассчитываю данные во временную таблицу (temp)
2. Очищаю основную (truncate main)
3. Вставляю из временной в основную (temp -> main)
Вставка ~3min. В это время не хочу, чтобы возможно было SELECT FROM main.
Или это и не особо нужно? -
Нету блокировок. Вам надо просто местами менять твблицы. Exchange tables a and b. И тогда не надо вставлять в main. Или attach/replace partition.
-
Спасибо
-
Всем привет, а можно КХ полностью ин мемори держать только?
-
-
Привет, начал использовать Clickhouse вместе со Спрингом, есть вопросы
1) Как выделять подключения/клиентов
2) Нужен ли пул подключений
3) Как управлять многопоточкой при нагрузке
4) Надо ли проставлять @Transactional или там под капотом всё работает норм -
Привет! Подскажите есть ли возможность колонку с каунтером aggregateFunction альтернуть чтоб их количество уменьшилось в два раза?
-
1) не понятно что имеется ввиду
вы https://github.com/ClickHouse/clickhouse-jdbc доку читали ?
2) IMHO не особо нужен, под капотом JDBC драйвера- обычный HTTP протокол и JDBC драйвер вроде имеет свой threadPool
3) нагрузка на чтение или запись? что под "управлением" подразумевается? является ли JDBC драйвер thread safe? да...
4) в clickhouse нет транзакций. так что аннотации про транзакции. роли не будут особо играть, вм это надо учитывать при написании кодаGitHub - ClickHouse/clickhouse-jdbc: JDBC driver for ClickHouseJDBC driver for ClickHouse. Contribute to ClickHouse/clickhouse-jdbc development by creating an account on GitHub.
-
количество чего должно уменьшиться в два раза?
количество колонок?
если да
ALTER TABLE ... DROP COLUMN ... -
Значение какнтера в колонке в два раза. Переезжали на новые таблицы и задублировали вставку, думаем как порезать в два раза статистику обратно
-
ну попробовать сделать мутацию
ALTER TABLE ... UPDATE column=column / 2 -
Оно разве сработает? Там же countState хранится
-
да, не сработает
ну тогда только новая таблица
INSERT INTO ... SELECT из исходной -
я надеялся что вот так сработает
CREATE TABLE t1 (name String, cnt AggregateFunction(count, UInt64))
ENGINE AggregatingMergeTree() ORDER BY name;
INSERT INTO t1 SELECT concat('name', toString(number % 10)) name, countState(number) FROM numbers(1000) GROUP BY name;
SELECT name, countMerge(cnt) FROM t1 GROUP BY name;
SET mutations_sync=2;
ALTER TABLE t1 UPDATE cnt = countState(countMerge(cnt) / 2) WHERE 1=1;
SELECT name, countMerge(cnt) FROM t1 GROUP BY name;
но нет =( -
Я вот о том же думал. Жжжаль
-
Всем привет, такой вопрос, пытаюсь сделать пользователя с ограниченными правами для определенной таблицы как тут
https://clickhouse.com/docs/en/operations/settings/settings-users/#user-namedatabases
<users>
<user1>
<password>pass</password>
<networks incl="networks">
<ip>127.0.0.1</ip>
</networks>
<profile>user1</profile>
<quota>user1</quota>
<default_database>prod</default_database>
<databases>
<prod>
<logs_real_raw>
<filter>id != 0</filter>
</logs_real_raw>
</prod>
</databases>
</user1>
</users>
но почему то он все равно может делать выборку по всем таблицам, подскажите, пожалуйста, что не так?) -
это не ограничивает доступ к другим таблицам
просто задает условие выборки из таблицы logs_read_raw
чтобы ограничить доступ только к одной базе надо
<users>
<user1>
<allow_databases>
<database>my_database</database>
</allow_databases>
</user1>
</users>
но тут аккуратнее, всякие clickhouse-client или datagrip хотят еще system базу чтобы метаданные собирать -
-
гхм. ну вы посмотрите конечно =) allow_databases просто хуже документирована
но да, стандартный RBAC это более современный метод работы с правами пользователей чем XML -
попробуйте замонтировать кусок памяти в /var/lib/clickhouse
-
если бы вы использовали SimpleAggregateFunction, то скорее всего проблем бы не возникло
-
ALTER TABLE t1 UPDATE cnt = initializeAggregation('countState',finalizeAggregation(cnt) / 2) WHERE 1=1;
-
@Makasinov ^
-
о. круто
-
и конечно это не работает
select finalizeAggregation(initializeAggregation('countState', 13));
--
1
и что самое плохое -- не должно -
select finalizeAggregation(arrayReduce('countState', range(113)));
--
113 -
но вообще не надо просто использовать countState -- потому что это почти тоже самое что sum(1) + codec T64
(countState хранится как LEB128) -
Да, забыл. count у нас же особенный.
-
народ, подскажите, пожалуйста, как можно протестить другой кодек сжатия для колонки, которая попадает в ORDER BY
делаю, как в инструкции на Altinity, когда прописываю команду ALTER TABLE test_table UPDATE column_a=column_a, column_new=column_new WHERE 1; для своей таблицы и для своего столбца появляется ошибка Code: 420, e.displayText() = DB::Exception: Cannot UPDATE key column -
OPTIMIZE TABLE xxx FINAL, больше никак
-
-
При интенсивной вставке вываливаются запросы
<Error> executeQuery: std::exception. Code: 1001, type: std::__1::__fs::filesystem::filesystem_error, e.wh
at() = filesystem error: in create_directory: No such file or directory ["/srv/slow-6/store/c98/c98021f1-cc27-48bd-94ae-4693697ccdc8/shard1_replica2"]
Собственно, это всё что есть в логе в момент их выпадения.
Куда смотреть? -
как смонтирован /srv/slow-6 ?
какое окружение? какая OS? -
Oracle Linux 8
clickhouse-server-22.6.2.12
2 сервера (реплики, ReplicatedMergeTree), данные проходят через distributed таблицу, 3 штуки киперов
Как смонтирован - вопрос не до конца понятный, но попробую ответить, вдруг отгадаю
/dev/nvme0n1p6 /srv/fast-1 ext4 defaults
/dev/sdf /srv/slow-6 ext4 defaults
Это всё потом в
<volumes>
<hot_volume>
<disk>fast_1</disk>
<disk>fast_2</disk>
</hot_volume>
<cold_volume>
<disk>slow_1</disk>
<disk>slow_х</disk>
<disk>slow_6</disk>
</cold_volume>
</volumes>
<move_factor>0.2</move_factor> -
без всяких там виртуалок и т.п.?
-
Без всяких виртуалок.
-
это точно не все, там как минимум еще stacktrace есть ... и возможно query_id в логе...
-
-
SELECT * FROM system.query_log WHERE query_id='2c056c2d-531e-4414-83dd-8478df111340' FORMAT Vertical
судя по стектрейсу
DB::DistributedSink::writeAsyncImpl
вставляете вы в Distributed таблицу...
SHOW CREATE TABLE actions_index_test
ls -la /srv/slow-6/
какой owner и group ? -
типа у Distributed таблицы указан storage ?
или вы нахимичили с default storage policy ?
но похоже на баг -
Replcated, поверх него replicatedmergetree, поверх него distributed.
И да, в дефолт сторедж полиси именно те волюмы что я выше писал -
В дефолт сторедж нельзя указывать несколько дисков? То, что использует оно только первый волюм для большинства родных таблиц я знаю
-
покажите весь конфиг со storage
-
можно, просто видимо вы наступили на баг
-
Если что - стреляет не очень часто, но бесит:)
-
>то, что использует оно только первый волюм для большинства родных таблиц я знаю
какие-то новости, никогда такого не было -
Подмена памяти :) Взглядом пробежался по логу, куском зрения зацепил пачку таких сообщений и подумал что там несколько таблиц, а там все условно одни и те же Distributed
StorageDistributed (tablename): Storage policy for Distributed table has multiple volumes. Only hot_volume volume will be used to store data. Other will be ignored. -
-
Должно работать
-
Ну оно как бы работает, но если запустить генератор по ~70 столбцам из numbers(1000000000) то иногда (не всегда) выбивает его посреди наполнения с той ошибкой что уже скидывал
-
Ну про Distributed таблицы, мб можете сделать issue на гитхае
-
вообще конечно мультидиск волумы это извращение если есть возможность сделать софтверный рейд, это просто жечь деньги.
ну я бы создал волум из одного диска и пересоздал все distributed таблицы используя этот волум. -
и заведите гитхаб issue со ссылками на pastila
-
>вообще конечно мультидиск волумы это извращение если есть возможность сделать софтверный рейд
Частично потрогав их склонен согласится - уж очень косо данные распределяет. На одном 50 гб, на другом 500гб.
Но очень подкупало отсутствие необходимости делать raid0 на инсталяциях в 20+ дисков, ибо весь сервер переливать потом с потерей одного диска :) -
ну там новая policy есть -- писать инсерты на менее заполненный диск
-
@unamedrus @den_crane @konnectrl - Ребят спасибо вам большое за помощь! Получилось затолкать данные во вложенные структуры. И это слоило того. Объём уменьшился более чем в 2 раза (по сравнению с укладкой json в виде строки) и не пришлось плодить доп сущности.
Осталось научиться теперь правильно запросы строить, так что я вернусь )))) -
А тут уже вопрос в "втором" волюме, холодный который у меня. На первом распределение +- ок, а как переносить начало - то беда
-
я не уверен, может least_used и в этом случае работает
https://github.com/ClickHouse/ClickHouse/pull/36686Implement least_used load balancing algorithm for disks inside volume by azat · Pull Request #36686 · ClickHouse/ClickHouseChangelog category (leave one): Improvement Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md): Implement least_used load balancing algorithm for disks i...
-
Спасибо, а можно эту ошибку обойти каким то образом? Такое случается если использовать initializeAggregation
Conversion from AggregateFunction(count, Float64) to AggregateFunction(count) is not supported -
вы читайте чат дальше, это вообще неправильно все
(ниже обсудили) -
какие-то несексуальные бёдра, к тому же мужские
-
-
Всем привет, я уже раньше обращался с подобным вопросом и даже создал тут issue - https://github.com/ClickHouse/ClickHouse/issues/38270, но что-то до конца я так и не понял верный алгоритм в моем кейсе.
Кейс такой, изначально есть 4 clickhouse ноды (2 shard x 2 replica), на 3ех из них рядом с clickhouse работает clickhouse-keeper.
Предположим, что по какой-то причине одна нода временно умерла (нода, где так же работал clickhouse keeper), кластер продолжает работать (2 кипера по прежнему живут).
Дальше я хочу включить потухшую ноду в clickhouse cluster, а так же обратно добавить эту ноду в clickhouse keeper кластер. Предположим, нода после восстановления имеет новый ip адрес, соответственно мне нужно обновить конфигурацию у всех участников: <keeper_server>, <zookeeper>, <remote_servers> секции.
Дальше пробую стартовать (clickhouse restart/start) на всех нодах:
1. В логах вижу в целом причину, ноды стучаться в старый ip адрес, не могу понять почему не учитываются обновленные конфиги, где указал новый ip адрес?
2. Так же нашел лог, который отчасти поясняет ситуацию
Config will be ignored because a server with ID 1 is already present in the cluster on a different endpoint (old_instance_ip:9444). The endpoint of the current servers should not be changed. For servers on a new endpoint, please use a new ID.
Выходит, если я хочу добавить нового участника с новым ip я должен так же изменить server_id в
<clickhouse>
<keeper_server>
<server_id>new_server_id</server_id>
</keeper_server>
</clickhouse>?Clickhouse doesn't use actual clickhouse-keeper configuration · Issue #38270 · ClickHouse/ClickHouseHey, guys At the moment I am setting up a CH cluster via clickhouse-keeper. Cluster consists of 4 nodes (EC2): 2 shards x 2 replicas. Thus, in general, I have 4 nodes, on 3 of which I also launch c...
-
> не могу понять почему не учитываются обновленные конфиги, где указал новый ip адрес?
структура ансамбля хранится в базе кипера
>Выходит, если я хочу добавить нового участника с новым ip я должен так же изменить server_id в
кажется да @salttan ? -
> конфиги, где указал новый ip адрес?
да, конфиги с обновленным ip подкинул всем участникам, старый больше нигде не фигурирует с точки зрения настроек -
-
-
Спасибо @salttan, @den_crane
Попробую просто новый ID подкидывать тогда. -
всем привет, есть clickhouse (22.1.3.7) из 3 реплик, zookeper кластер стоит отдельно и состоит из 3 серверов.
на одной из реплик кх ночью отвалилась сессия с zk -
last_queue_update_exception: Code: 999. Coordination::Exception: Session expired (Session expired). (KEEPER_EXCEPTION) (version 22.1.3.7 (official build))
лог с zk -
2022-07-11 22:54:03,374 [myid:2] - INFO [SessionTracker:ZooKeeperServer@398] - Expiring session 0x300000016650005, timeout of 30000ms exceeded
2022-07-11 22:54:03,374 [myid:2] - INFO [SessionTracker:QuorumZooKeeperServer@157] - Submitting global closeSession request for session 0x300000016650005
дальше сделал на ноде кх рестарт реплики таблицы (движок таблицы - ReplicatedCollapsingMergeTree) -
system restart replica database.table;
и вот уже 6 с половиной часов этот запрос выполняется, в system.replication_queue есть 12 строк с
type: MERGE_PARTS
которые не меняются все 6 часов.
по запросу
SELECT
database,
table,
type,
max(last_exception),
max(postpone_reason),
min(create_time),
max(last_attempt_time),
max(last_postpone_time),
max(num_postponed) AS max_postponed,
max(num_tries) AS max_tries,
min(num_tries) AS min_tries,
countIf(last_exception != '') AS count_err,
countIf(num_postponed > 0) AS count_postponed,
countIf(is_currently_executing) AS count_executing,
count() AS count_all
FROM system.replication_queue
GROUP BY
database,
table,
type
ORDER BY count_all DESC
FORMAT Vertical
ответ такой -
Row 1:
──────
database: database
table: table
type: MERGE_PARTS
max(last_exception):
max(postpone_reason):
min(create_time): 2022-03-25 11:50:15
max(last_attempt_time): 2022-06-13 17:53:20
max(last_postpone_time): 1970-01-01 03:00:00
max_postponed: 0
max_tries: 1
min_tries: 1
count_err: 0
count_postponed: 0
count_executing: 12
count_all: 12
мне дальше ждать или предпринимать какие-то действия? -
а progress меняется ?
select * from system.merges -
я бы перезрузил КХ
и я бы обновился до 22.3.8 -
зафиксировал текущие значения progress , проверю через несколько минут
-
перезагрузка на всех нодах? эта очередь в replication_queue на всех трёх одинаковая
-
select * from system.replication_queue
-
12 строк такого вида -
database: database
table: table
replica_name: node1
position: 11
node_name: queue-0027499653
type: MERGE_PARTS
create_time: 2022-06-13 17:53:20
required_quorum: 0
source_replica: node3
new_part_name: 202112_0_420933_299_530665
parts_to_merge: ['202112_0_38524_157_530665','202112_38525_141124_203_530665','202112_141125_200161_179_530665','202112_200162_420933_298_530665']
is_detach: 0
is_currently_executing: 1
num_tries: 1
last_exception:
last_attempt_time: 2022-06-13 17:53:20
num_postponed: 0
postpone_reason:
last_postpone_time: 1970-01-01 03:00:00
merge_type: REGULAR -
прошло 25 минут, progress не изменился ни у кого
-
-
рестартуйте КХ
-
спасибо, пойду пробовать
-
в смысле в виндоус ?
https://github.com/ClickHouse/ClickHouse/issues/35501CLI is broken starting with v22.3 · Issue #35501 · ClickHouse/ClickHouseCli is broken starting with v22.3-lts: When I try to copy-paste multiline sql query, clickhouse-client (launched with -m flag ofc) goes insane and breaks query: CREATE TABLE test ( Date Date, user_...
-
помогло, реплика теперь в строю, но в system.merges
остались те же записи, с теми же progress.
Но видно что у таблицы ещё много дел для репликации -
queue_size: 77
inserts_in_queue: 65
merges_in_queue: 12 -
https://pastila.nl/ надо со всех серверов merges и replication_queueu --> format Vertical
-
Поправил <prompt_by_server_display_name> в конфиге клинта, все заработало. Видимо как-то криво интерпретировались спец символы.
-
-
т.е. мержи висят на 100% и не могут завершиться, грепайте лог КХ, я не видел/не понмю такого, скорее всего там ошибки про зукипер
-
Всем привет, подскажите, а когда будет поддержка синтаксиса рекурсии при подключении через драйвер MySQL
-
И планируется ли, такой функционал?
-
так нет такого синтаксиса. Про что вообще вопрос? recursive cte?
-
Wuth recurcive as cteTree
-
К примеру
-
планируется в далеком будущем, смысла <0 для OLAP
-
Понял, спасибо большое за ответ)
-
спасибо, после нескольких рестартов очередь пришла в прошлое состояние и реплика стала актуальной по данным.
а те мержи, которые не могут завершиться, видимо, были ещё до поломки с зк -
Добрый вечер! Подскажите, хочу материализовать колонку в таблице на основе другой колонки
Хочу использовать конструкцию ALTER TABLE table MATERIALIZE COLUMN col;
Вопрос в том как написать выражение, чтобы из колонки в которой хранится url вида
'api.service.ru/operations/sync?endpointId=project&operation=Offline.Authorize'
В новую колонку хочу чтобы записалось Offline.Authorize
С помощью функции extractURLParameters(url) получил
['endpointId=project','operation=Offline.Authorize']
Но как написать конечную функцию? -
колонка уже col уже есть?
как она описана? -
-
-
есть только колонка url которая содержит строку вида 'api.service.ru/operations/sync?endpointId=project&operation=Offline.Authorize'
-
типа надо
SELECT
'api.service.ru/operations/sync?endpointId=project&operation=Offline.Authorize' AS url,
extract(extractURLParameters(url)[2], '.*=(.*)') AS x
Query id: c1dc099e-a46d-4115-a77d-6776bb00e9b9
Row 1:
──────
url: api.service.ru/operations/sync?endpointId=project&operation=Offline.Authorize
x: Offline.Authorize -
-
Наверное, лучше смазать arrayFilter/arrayFirst по имени параметра, ведь поменяться порядок в урле может теоритически в новых записях
-
extractURLParameter(url, 'operation')
-
Супер! Спасибо!
- 13 July 2022 (252 messages)
-
🤩 New #listing
✨ $FOF(Future of Fintech) will be listed on LBank!
@FOFCoin on Twitter
FOF Coin by Ngel Partners Pte. Ltd., will be one of the most versatile cryptocurrency tokens.
👉 Details: https://bit.ly/3IuWh8E
📌 Twitter: https://twitter.com/LBank_Exchange/status/1545286581686345730?s=20&t=FaQauEIPNtqrSu1dYLHtaw
💻 Registration: https://bit.ly/3wTznCx
📱Android Mobile: https://bit.ly/LBankGooglePlay
📱IOS Mobile: https://bit.ly/LBankappstoreLink🤩 New #listing ✨ $FOF(Future of Fintech) will be listed on LBank! @FOFCoin FOF Coin by Ngel Partners Pte. Ltd., will be one of the most versatile cryptocurrency tokens. 👉 Details: https://t.co/J3ujbyBrqj
-
Всем здравствуйте, а подскажите мануал по смене движка бд с ordinary на atomic?
-
На сайте altinity есть
-
-
спасибо =)
-
-
Проблема:
Не записывается часть кликов
В сервис летят клики
Используем async_insert
На входе в сервис и графиках количество кликов правильное
Специально даже паралельно сохраняю в postgres клики и туда все долетает
Запрос в логи показывает тоже правильные цифры, что все клики прилетели
SELECT count(*)
FROM system.query_log
WHERE type = 'QueryFinish'
AND query_kind = 'Insert'
AND tables = ['clicks']
AND query_start_time > '2022-07-13 09:00:00';
Но в таблице часть кликов не доехала
Подскажите можно ли в где то посмотреть логи вставок в таблицу?
Может в чем то другом дело? -
Ребят, подскажите норм IDE под мак ? Чтоб можно было планы смотреть, тестить селектики и тп. Запарился в VS code на голимых расширениях.
-
Datagrip
-
DataGrip, dbeaver
-
Попробуй
-
норм, datagrip попробую. Спосебо)
-
Всем привет! Имеется мини-кластер ClickHouse в Kubernetes - 2 реплики и 2 шарда. У одного шарда (у обоих реплик) полностью потерялись данные на дисках. Теперь не могу вернуть их в строй: при попытке восстановить данные через SYSTEM SYNC REPLICA test_table получаю ошибку, что таблицы не существует. и это правда. А при попытке создать эту таблицу получаю ошибку Cannot enqueue query on this replica, because it has replication lag of 60 queries. Try other replica.. (NOT_A_LEADER), причём ошибка одинаковая на обоих репликах, если пробую создать эти таблицы на "живых" хостах через ON CLUSTER, то получаю ошибку DB::Exception: There are two exactly the same ClickHouse instances test.local in cluster public. (INCONSISTENT_CLUSTER_DEFINITION). Подскажите, кто что знает.. Может есть какая-то развёрнутая инструкция..
version 22.3.3.44 (official build) -
Привет Егор ! Датагрип - норм. У дибивера есть проблемы с отображением массивов и кортежей. Ну и с таймзоной он как-то странно работает. Приходится конфиг самого дибивера править )))
-
Здравствуйте, подскажите, как отследить Async Inserts. Как будто не работает
Включил настройку, но кликхаус все равно пестрит
<Error> AsynchronousInsertQueue: Failed insertion for query 'INSERT INTO rtb.request FORMAT JSONEachRow': Code: 252. DB::Exception: Too many parts (903). Merges are processing significantly slower than inserts. (TOO_MANY_PARTS), Stack trace (when copying this message, always include the lines below):
executeQuery: Code: 252. DB::Exception: Too many parts (903). Merges are processing significantly slower than inserts: While executing WaitForAsyncInsert. (TOO_MANY_PARTS) (version 22.5.2.53 (official build))
Настроил так:
<async_insert>1</async_insert>
<wait_for_async_insert>1</wait_for_async_insert>
<async_insert_max_data_size>2000000</async_insert_max_data_size>
<async_insert_busy_timeout_ms>4000</async_insert_busy_timeout_ms>
На сколько понимаю асинхронная вставка должна была решить проблему.
Или я во что то другое упираюсь -
Приветствую, через clickhouse_dirver для Python'a хотим 900 тысяч значений положить в IN это возможно ? Просто у нас лимит в 15 тысяч значений
-
How about different columns of mergeState
-
ClickHouse
ClickHouse DBMS discuss and help
-
-
Спасибо, что то забыл про такой механизм в КХ
-
так раньше их вообще не было.
это из-за/для фичи, которая выключена по умолчанию, поэтому они 00000
фича экспериментальная -- сделанная наполовину, позволяет перемещать парты между шардами. -
а по какому протоколу вставляете то ?
и где настроили в default профиле или еще в каком то месте? -
Вставляю по http
Настроил да, в default.
В таблице settings вижу настройки -
<async_insert_busy_timeout_ms>4000</async_insert_busy_timeout_ms>
а чего таймаут большой?
хотите много коротких query чтобы 4 секунды ждали и типа побольше накопилось?
проверьте насколько большими парты создаются
SELECT quantiles(0.5,0.9)(rows), count() new_parts FROM system.part_log WHERE event_date=today() AND table='your_db.your_table' AND event_type='NEW_PART'; -
Спасибо большое за ответ!
-
есть такая штука как дедупликация вставки
https://kb.altinity.com/altinity-kb-schema-design/insert_deduplication/Insert Deduplication / Insert idempotencyInsert Deduplication / Insert idempotency , insert_deduplicate setting.
-
похоже диски потерялись?
кубер или кубер + operator ? -
половина этих настроек нуждается в рестарте КХ
-
Привет. Подскажите, какой есть воркэраунд для nth_value (это оконная функция)? Джойны таблицы самой с собой - не проходят, уже пробовала
-
Спасибо, но нашел проблему, спец символ попадал в строку
(Code: 62. DB::Exception: Cannot parse expression of type LowCardinality(String) here: 'd'Azur')
Но все равно вопрос, как смотреть такие логи для асинхронных вставок?
Поменял в приложении запись построчно без async и эта ошибка записалась в system.query_log
А вот при async_insert, не могу найти где такие ошибки пишутся -
Так есть такая в кх
-
Да, данные на дисках двух нод потерялись.
Кубер. -
так не должен такой инсерт проходить даже асинхронный
или у вас fire and forget ? -
system.asynchronous_inserts ?
-
fire and forget нет
Я про то что хочу видеть логи ошибок при асинхронной вставке -
Там пусто, но наверное как то можно включить логи туда?
-
Было 2000, ошибки так и сыпали, поставил 4000, ничего не изменилось.
По поводу, part_log только включил, спустя 10 мин, вижу такой результат
"[9113,17839]",17 -
Ага, перезагружал. Все равно
-
ну вроде не по одной записи вставляете...
непонятно почему мержиться не успевает... -
ну вы по system.parts посмотрите сколько у вас сейчас партов
и по part_log гляньте вообще сколько событий и какие event_type для таблицы регистрируются... может так проще будет -
не воспроизводится
echo "insert into insert_test values (1, 'aaa'a')"|curl 'http://localhost:8123?async_insert=1' --data-binary @-
Code: 62. DB::Exception: Cannot parse expression of type LowCardinality(String) here: 'aaa'a')
: While executing WaitForAsyncInsert. (SYNTAX_ERROR) (version 22.7.1.1054)
echo "insert into insert_test values (1, 'aaa'a')"|curl 'http://localhost:8123?async_insert=1&wait_for_async_insert=0' --data-binary @- -
как будто после обновления такое произошло, но не уверен
-
ок
-
-
А почему они съедают? Как правило, неоптимальные запросы лопают очень много, ну и join часто )
-
а чем инсерты делаете?
-
нету такой фичи, в разработке
-
сегодня приходится делать тяжелые запросы с внешним групбаем и распределением, но стоит какому-то скрипту отработать и сделать запрос, то все падает
-
в php через Curl, там тоже немного буфферизирую запросы
-
будем надеяться: скоро выйдут
-
большие таблицы с сырыми данными, которые агрегируются
-
а инсерты зависают на 4 сек?
JSONEachRow -- у вас набор полей в json одинаковые? Если разные, то такие инсерты не будут объединяться -
У меня просто на днях был случай, когда arrayFilter над arrayMap отъедал 80 Гигов. Переделал на arrayFilter без arrayMap - перестал кушать память. Поэтому и спросил, действительно ли запросы тщательно оптимизированы.
-
ну по скриншоту выше я показал что запросы хоть и тяжелые, но память не жрут, потому как стоят ограничения. Но стоит прилететь какому-то запросу (какой-нибудь коллега зашел в DataLens, запустил "тяжелый график") и все падает
-
Denny, можно ссылочку на pr или на какое-то обсуждение, если не сложно?
-
Memory overcommit: continue query execution if memory is available by novikd · Pull Request #35637 · ClickHouse/ClickHouse
Changelog category (leave one): Improvement Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md): If the required amount of memory is available before the ...
-
Наверно эта
-
уже есть вот такое https://youtu.be/jkXmXrmjaKQ?t=1866
насколько я понял это только начало -
Удивительно, у меня все также не выдается
Я пробую
CREATE TABLE IF NOT EXISTS tests
(
id String,
value LowCardinality(String),
sign Int8,
version UInt64
)
ENGINE = VersionedCollapsingMergeTree(sign, version)
ORDER BY (id);
echo "insert into tests values ('id1', 'aaa'a', 1, 443443)"|curl 'http://localhost:8123?async_insert=1&wait_for_async_insert=0' --data-binary @- -
wait_for_async_insert=0 --- ?
-
Да, но сейчас пробую на самой свежей версии
Была 22.3 -
нет, это так и задумано, чего вы хотите от wait_for_async_insert=0
он сразу возвращает управление
любой мусор можно инсертить -
If true wait for processing of asynchronous insertion
Ааа, получается надо наоборот 1 ставить -
-
Всем привет! Возможно, немного странный вопрос. У нас используется 3 реплики, и когда я создаю таблицу с движком ReplicatedMergeTree, должен ли я создавать таблицу отдельно на каждой из реплик?
-
если не используется create table .. on cluster или replicated движок таблицы, то придётся на каждой реплике отдельно
-
Да сейчас показывает, спасибо
-
подскажите плиз
как обойти ошибку (Missing columns: 'object.test1') в Object('json')?
create table events (
object JSON
)
insert into events (object) format TSV {"test":"test"};
select * from events
where object.test1 = 'test'; -- mismatch (test1 -> test) or absent
select * from events
where object.test = 'test'; -- ok -
Спасибо!
-
Мы обновили бенчмарки для баз данных, теперь намного больше информации, и интересно исследовать разные результаты: https://benchmark.clickhouse.com/
-
None
-
-
прям EPYCчный бенчмарк получился )
-
with data as (
Select
'id' as id,
123 as count1,
321 as count2
)
select
field1,
count(field2) as cnt,
(select count1 from data),
(select count2 from data)
where id = (select id from data)
Ребт можно ли в таком запросе на лету склеить в словарь все значения
map(field1, count(field2) as cnt)
чтобы на выходе мне 1 строка вернулась со все разблюдовкой. -
круть. даже SingleStore добавили
-
Парни привет, подскажите пожалуйста, может есть под рукой clickhouse_remote_server.xml с настройкой перекрёстного кластера 2 шарда 2 реплики.
-
можно в 3 местах, прямо в запросе например дописав settings allow_experimental_nlp_functions=1 в конце
-
никак. Нету такой субколонки.
-
не бывает перекрёстного кластера, мы такое не одобряем
-
типа из
'id' AS id, 123 AS count1, 321 AS count2
надо получить?
id 123 1
id 321 1
WITH data AS
(
SELECT
'id' AS id,
123 AS count1,
321 AS count2
)
SELECT
id,
arrayJoin([count1, count2]) AS c,
count()
FROM data
GROUP BY
1,
2
┌─id─┬───c─┬─count()─┐
│ id │ 123 │ 1 │
│ id │ 321 │ 1 │
└────┴─────┴─────────┘ -
Ещё недавно у SingleStore была позорная ремарка о том, что делать бенчмарки нельзя. Но они её убрали недавно, и результаты получаются очень даже приличные.
-
Из вендоров с позорными ремарками есть Vertica, Bigquery. Так что я их тоже добавил в сравнение, когда подготавливал результаты, но перед публикацией приходится убирать.
-
Я поэтому и обратил внимание. Тем не менее результаты у них хоть и хуже раз в 5, но всё же не настолько плохо, как можно было себе нафантазировать.
-
а можно опубликовать на стороннем ресурсе? Очень глянуть хочется в сравнении с вертикой )
-
Страшно представить, что там у вертики :)
-
Они всё-таки запрещают публикацию бенчмарков. Если честно, там результат не особо интересный. Всё на уровне, все запросы успешно выполнились... но кажется, хуже SingleStore.
-
Больше поводом для беспокойства является то, что Vertica сейчас принадлежит компании Microfocus - то есть, если даже будет развиваться, то только мелкими поползновениями. То же самое касается и всего от Cloudera. И туда же, к сожалению, идёт Greenplum.
-
И на этом спасибо)
-
а databricks тоже запрещают? есть какие-то результаты?
-
Город и адрес офиса: Москва, МГУ
Формат работы: возможна удаленка
Занятость: полная или частичная (не менее 50% времени)
#вакансия #fulltime #parttime #москва
Описание вакансии: Администратор баз данных в научный проект МГУ.
Поддержание и развитие высокопроизводительной платформы для агрегации результатов полногеномных исследований (GWAS-MAP).
Платформа реализована на основе СУБД Clickhouse и PSQL на своих серверах.
Основная таблица в Clickhouse занимает 8 Tb.
PSQL используется как справочная БД.
Задачи:
- оптимизация процессов хранения и обработки информации
- создание ТЗ на ПО для новых задач
- внедрение ПО
- консультации по работе с БД
- координация и/или осуществление загрузки новых данных в БД
Пожелания к кандидатам:
- Опыт администрирования СУБД PostgreSQL и Clickhouse.
- Навык оптимизации производительности СУБД.
- Знания языка запросов SQL, опыт оптимизации SQL запросов.
- Опыт администрирования ОС Linux.
- Желательно знание языка программирования Python.
Описание вакансии https://blastim.ru/job/4180/
Контакт https://t.me/tatyana_rumАдминистратор баз данных Clickhouse и Postgresql - БластимБластим HR помогает найти грамотного и опытного администратора баз данных, который знает СУБД Clickhouse и Postgresql, для команды молодых, целеустремленных научных сотрудников и разработчиков. Один из текущих проектов – создание, развитие и наполнение высокопроизводительной платформы GWAS-MAP для сбора, хранения, анализа, визуализации и доступа к базе данных суммарных статистик полногеномных исследований ассоциаций. База данных на текущей
-
Databricks не запрещают. Её я не успел проверить. Надо добавить, и кстати, с этим можно помочь - надо просто сделать по аналогии с другими системами и добавить в репозиторий https://github.com/ClickHouse/ClickBenchGitHub - ClickHouse/ClickBench: ClickBench: a Benchmark For Analytical Databases
ClickBench: a Benchmark For Analytical Databases. Contribute to ClickHouse/ClickBench development by creating an account on GitHub.
-
Датабрикс интересно проверить Photon
-
не. Вот так хочу: в одну строку
{field1,count(field2) as cnt } - тут все значения в кучу
,(select count1 from data), (select count2 from data) -
-
Ещё не готов, хотя можно пробовать clickhouse-local поверх кучи файлов parquet на s3. А вот Iceberg и Hudi не поддерживаются.
-
надо получить?
id 123 1
id 321 1 -
Посмотрел на роадмап YDB на год и пустил слезу. В кликхаусе в одном релизе больше фичей чем у них на год планируется. Очень медленная разработка и мало уделяется внимания скорости.
Возьмите их под своё крыло и сделайте Single House :) денег у вас вроде хватает, а так будет куда расти. -
Да я бы так не сказал, у них довольно много крупных задач там на самом деле.
-
К Roadmap надо относиться аккуратно, он может быть более или менее оптимистичным, а самые крутые фичи можно держать в рукаве. Нам удаётся выполнять свой собственный roadmap процентов на 70%.
-
В общем я понял, что singleHouse мне не видать. Пойду ещё раз пощупаю singleStore
-
А что из себя должен представлять singleHouse? Гибрид OLTP и OLAP? Такое уже есть, в каком-то виде, MariaDB ColumnStore есть в бенчмарках
-
Есть, но у неё слишком хреновые характеристики. Хочется лучшее из обоих миров и в одной коробке :)
-
MariaDB ColumnStore - это не гибрид OLAP и OLTP. Это OLAP.
А если в MariaDB создать две таблицы, одну ColumnStore, другую InnoDB, то будет не гибрид, а либо одно, либо другое. -
Да, согласен. Однако такая возможность есть в рамках одной СУБД. Возможно даже с транзакциями между ними, я кстати не пробовал
-
Так а как это будет работать? Это тоже будет максимум просто два отдельных движка, которые может быть шарят между собой планировщик запросов (и то не факт) и хранилище
-
Ну SingleStore вот пытаются идти по этому пути емнип, можно почитать.
-
Ну и модель работы в кластере у YDB (ну и вообще у распределенных OLTP ACID баз) и у ClickHouse тоже сильно отличаются, ибо требования совершенно разные. А синхронизировать таблицы с мускулем и постгресом итак сейчас можно через MaterializedMySQL (если не ошибаюсь) таблицы
-
Ну MySQL - это не YDB, а поддержки ydb в кликхаусе нет. Как и YDB нет поддержки законектиться через mysql/postgres драйвер.
-
Есть что-то лучше, чем такие статьи :)? https://www.singlestore.com/blog/table-range-partitioning-is-a-crutch-heres-why-singlestore-doesnt-need-it/
Здесь не описано даже примерно за счет чего у них такой быстрый DELETE, например, и как они без range partitioning могут быстро OLTP запросы выполнять, когда нужно дешево найти, на каких серверах находятся нужные строчкиTable Range Partitioning Is a Crutch. Here’s Why SingleStore Doesn’t Need ItTable range partitioning is a crutch used by legacy databases — one SingleStore doesn’t need. Read about our database features that speed up data lifecycles.
-
Нет. Яж нарисовал ) field1 и cnt это key:value для словаря. На выходе должна быть одна строка со значениями, одно из которых типа MAP
-
В этом плане согласен, но опять же, распределенные ACID базы данных устроены сильно сложнее традиционных СУБД, и у них вдобавок обычно есть тонны ограничений, которые делают задачи вроде change data capture сильно более сложными, если нет соответствующей функциональности встроенной в саму СУБД (возможно кстати в YDB оно есть)
-
А фиг знает, можно попробовать поискать статьи по memsql (они потом в singlestore переименовались)
https://www.vldb.org/pvldb/vol9/p1401-chen.pdf -
Ну у них и не опенсурс. Они держат свою магию в секрете :)
-
Ну здесь написано, что тоже два типа таблиц:
MemSQL can store data in two formats: an in-memory row-oriented store and a disk-backed column-oriented store. Tables can be created in either rowstore or columnstore format, and queries can involve any combination of both types of tables. -
Я так понял они хранят в ОЗУ данных по строкам, отсюда такая фича.
Скорее всего алгоритм что-то вроде
1) взять чанк/гранулу
2) разжать
3) сделать изменение
4) обратно сжать
5) записать на диск
Интересно как там с рандомным чтением по диску и сжатием -
Да, кажется так и есть, исходя из статьи выше
-
Подскажите, стоит ли ожидать от кликхауса полнотекстовый поиск
-
Вопрос касательно рандомного доступа к диску остаётся открытым
-
Да, но оно снаружи это выглядит как одна таблица, те не нужно думать над типом таблицы.
А хотя похоже вру, они так не умеют -
В английской версии документации уже давно есть об этом статья.
-
Вы имеете в виду полнотекстовый индекс, как ElasticSearch? Если именно это нужно, то, насколько я знаю, только n-gram индексы есть
-
А, хорошо, спасибо
-
Посмотрю, спасибо.
Сейчас выбор стоит между Manticore Columnar Storage и CH, сравниваем варианты -
Насколько я могу судить, это все равно внешний полнотекстовый индекс получится: https://clickhouse.com/docs/en/guides/developer/full-text-search/Full-text search with ClickHouse and Quickwit | ClickHouse Docs
If you are using ClickHouse and you end up in a situation wishing you had full
-
Лично я вот так запилил, только ещё фильтр Блума надо прикрутить, но руки не доходят.
https://t.me/clickhouse_ru/277186Vladimir Goncharov in ClickHouse не тормозитпо колонке с массивом делать индекс можно. вай нот то? полнотекст реализуется добавлением новой колонки например: words Array(String) DEFAULT arrayDistinct(arraySort(arrayMap(x -> stem('ru', x), arrayMap(x -> stem('en', x), splitByRegexp('[^a-zA-ZА-Яа-я0-9]+', lowerUTF8(message)))))) ну и потом в селекте просто указываем: WHERE hasAll(words, arrayMap(x -> stem('ru', x), arrayMap(x -> stem('en', x), splitByRegexp('[^a-zA-ZА-Яа-я0-9]+', lowerUTF8( :q ))))) по идее всю эту длинную строку можно запихнуть в UDF, чтобы запросы компакнее выглядели ну и добавить на массив words индекс, чтобы поиск быстрее работал. как-то так. если нужны подробности, какой индекс более оптимален, насколько быстрее ищет и т.д., то я с радостью вам предоставлю готовую информацию после небольшого, но не бесплатного ресёрча. в общем 500 евро и я сделаю всё за вас.
-
Другого нет
-
Чего другого нет? Извините не понял ваше сообщение.
-
Вообще тема инвертированных индексов начала активно подниматся, так что мб увидим их в будущем.
https://github.com/ClickHouse/ClickHouse/issues/37216
https://github.com/ClickHouse/ClickHouse/pull/38667Inverted Indices (RFC) · Issue #37216 · ClickHouse/ClickHouseWe already have "data skipping" indices in ClickHouse. Data skipping index is a data structure (aggregation, data sketch, etc) that is created for every data granule (or every n g...
-
Варианта полнотекстового поиска.
Есть ngram, про которые уже сказали, есть like, ilike если устраивает юзайте, нет ищите что-то другое, типа elasticsearch. -
Слишком разные свойства у колоночного и у строчного хранения. В колоночные таблицы лучше вставлять сразу миллион строк, тогда как в строчные лучше относительно небольшими пачками (по крайней мере если есть индексы, которые нужно обновлять при вставке), и т.д.
-
Ааа, вы наверное промахнулись ответом и не смотрели мою ссылку про стеммеры в кликхаусе.
-
Ну так это никак не мешает держать недавние вставки в строчном хранилище а потом записывать их в колоночном.
-
Да, вы правы, пардон.
-
Ну так и в MariaDB наверняка можно триггер на вставку в ColumnStore таблицу сделать :)
-
И много ещё чего запилить. Но суть останется, это две разные системы
-
Я уже сижу такой и думаю, вот это я гениальное решение придумал, что других вариантов и нет :) но не тут-то было :)
-
😄 вот оно так всегда))
-
Ну так суть, что бы снаружи это выглядело и работало как одна таблица из коробки, а не навешивать десяток триггеров что бы поддержать все апдейты-делиты-инсерты.
-
Есть ещё моя статья на Хабре, где лично Алексей Миловидов пришел в комментарии и подсказал, что ClickHouse довольно быстр для того, чтобы по логам искать просто через like или регулярки
-
-
Интересно, а сравнивал ли кто CH с TDEngine для time-series данных
-
Мне кажется, как только будет нужна хорошая производительность OLAP, все равно захочется потюнить это всё, и привет, всё равно нужно лезть внутрь, как это всё там устроено.
А если не нужна, то и MySQL подойдет :) -
ReplacingMergeTree же есть
-
Конечно, между MySQL и ClickHouse в плане производительности OLAP пропасть в 3 порядка по скорости, но это не так важно :))
-
И CollapsingMergeTree есть, а толку?))
-
С помощью ReplacingMergeTree можно обновлять данные без особой потери производительности
-
С другой стороны, текст логов обычно не меняется :)
-
Тока вчера на неё натыкался уже десятый раз наверное. Но зато в этот раз в выдаче была ещё и ссылка и английскую документацию, где прикрутили quickwit и ещё ссылка на гитхаб, где предлагают разные варианты понотекста и лёха отвечает, что они запилят всё с нуля. И английская версия документации, где я узнаю, что hasAll может использовать фильтр блума, чего я не нашёл в русской и пошёл создал пуллреквест :)
-
А если речь не про логи, то зачем ClickHouse тогда
-
У нас поток ивентов, и помимо данных для графиков, иногда нуждаемся в толковом полнотексте
-
Мутации которые порождаются в результате операций update накапливаются и начинают очень сильно влиять на производительность, просто кардинально.
Да и если говорить про скорость то при HDD дисках выход только использовать движок memory. -
Интересно, спасибо за ссылки
-
Так я же говорю, для мелких апдейтов предназначены движки вроде ReplacingMergeTree, которые превращают апдейты в инсерты по сути.
ALTER TABLE ... UPDATE предназначены для массового обновления отдельных колонок, например если нужно исправить данные за целый день сразу -
Для этого нужно всю строку перечитывать, а это неудобно. Приходится использовать Aggregation с nullable полями.
-
А зачем держать горячий кластер на хдд
Вроде кликхаус умеет раскидывать данные по разным серверам по сроку давности записей -
> Вроде кликхаус умеет раскидывать данные по разным серверам по сроку давности записей
Вот чего нет, того нет -
Не люблю эту фразу произносить, но Вы кажется просто что-то не то с ClickHouse пытаетесь делать :)
-
Хм, странно
-
Вроде только по разным дискам?
-
Мог с этим спутать, не уверен
-
Всё просто есть ивенты, а есть пользователи. Ивенты не изменяемый, пользователи - постоянно. Чтобы смотреть аналитику нужно джойнить ивенты на пользователей. Поэтому хранить пользователей в другой бд нельзя.
-
Ну а что делать если есть необходимость и быстро искать и быстро менять данные?
-
Мне кажется, Вы как раз идеальный сценарий для MaterializedMySQL таблиц описали, и там вроде как раз либо CollapsingMergeTree, либо ReplacingMergeTree и используется по умолчанию
-
Используйте ReplacingMergeTree и делайте GROUP BY при выборке, чтобы отсеять более старые записи, которые еще не схлопнулись (ну или использовать SELECT ... FINAL, но оно раньше было медленней чем ручной GROUP BY)
-
WITH data AS
(
SELECT
'id' AS id,
123 AS count1,
321 AS count2
)
SELECT
id,
count(),
sumMap(map('count1', count1, 'count2', count2)) AS r
FROM data
GROUP BY id
Query id: d688c8a4-e785-4097-9e34-493dfa88acf3
┌─id─┬─count()─┬─r───────────────────────────┐
│ id │ 1 │ {'count1':123,'count2':321} │
└────┴─────────┴─────────────────────────────┘ -
И как это поможет?)
-
идеальный сценарий если бы не было AggregationMT + anyLast() :)
а так всё и без mysql работает и нет рассинхрона между бд и т.д. и т.п. -
Будет быстро и то и другое
-
Вы это сами пробовали где-то?
Не поделитесь в какой задаче? -
Я пробовал для реализации heartbeat от серверов в kittenhouse (серверов десятки тысяч, хартбиты раз в несколько секунд). Но мне достаточно было производительности SELECT ... FINAL. Работало очень хорошо.
-
Обновлялись все строки в таблице раз в несколько секунд по сути
-
Там недавно SELECT FINAL сделали параллельным в пределах партиции, так что x3-x4 от старой скорости можно сейчас легко иметь
-
-
Конкретно в моей задаче нет, не очень большие. Но зато самих апдейтов много
-
Это просто пример того, что оно реально работает так, как заявлено :)
-
-
Прикольно, не знал
-
Это не соревнование :). Вставляйте 350 полей
-
Суть не меняется от этого
-
More parallel execution for queries with `FINAL` by nickitat · Pull Request #36396 · ClickHouse/ClickHouse
Changelog category (leave one): Performance Improvement Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md): Now we split data parts into layers and distr...
-
Выглядит, что и правда стало сильно быстрее
311.49 billion rows, 13.44 TB (33.43 billion rows/s., 1.44 TB/s.) -
Это я к тому, что тесты которые проводились (не помню на какой версии) с ReplacingMergeTree показывали реальную просадку по скорости уже на 10 запросе.
-
Покажите код или не было
-
(Я шучу. Наверное есть случаи, когда это не подходит, но всегда есть вариант разбить на две таблицы и делать JOIN, например)
-
-
Не в смысле Join движок, можно джойнить данные из ReplacingMergeTree движка тоже
-
Я об этом же, это дорого
-
Можно использовать словари
-
-
Я не знаю, что у Вас за задача, но полагаю, что как и у всех, есть какие-то события и есть данные пользователей, которые меняются
-
И Вы хотите их менять в материализованной таблице (что кстати идея так себе, ну да ладно)
-
Для такой задачи есть например возможность подключить тот же MySQL как внешний словарь с большим кешом, и забирать данные оттуда
-
В общем, есть много способов решить похожую проблему, но нет универсального ответа на все случаи жизни, к сожалению
-
-
-
вот же фантазеры, половиной функциональности невозможно пользоваться, core команда занимается построением облачного кх который вам не дадут, половина клиентов не может на 22 перейти из-за багов, а оне фантазируют. Закат КХ 2022.
-
В ClickHouse можно творить даже совершенно лютую дичь по меркам того же MySQL. Например, сделать таблицу с пользователями как MaterializedMySQL и делать запросы вида
SELECT ... FROM events
WHERE date = ... AND user_id IN (SELECT id FROM users FINAL WHERE age = 18 AND country = 'UK') -
Не хватает таблички sarcasm
-
Впрочем, кто знает...
-
Не очень понимаю, что Вы все-таки понимаете под UPDATE
-
Багов в CH действительно много, я сильно выше писал об одном более подробно.
-
Да не работает он. И Алексей собирается его выпилить.
-
Да всё просто, есть данные их вставили в таблицу.
Затем хотят изменить, эту операцию я и называю update'ом. -
Когда ClickHouse только зарелизили, там было действительно очень много багов, впрочем ничего прямо совсем критичного
-
Вы не троль случаем?)
-
Так а как Вы данные меняете? По одной строчке вставляете в ReplacingMergeTree? ALTER UPDATE?
-
Я действительно использовал ClickHouse с первых версий :)
-
И да, я тролль немного
-
Но не больше тролль, чем Denny Crane, который по слухам вообще в Яндексе ClickHouse лично разрабатывал, но никому не признается
-
А вы за один update сразу вносите все изменения?)
-
Прям ножом режет. Я 30 лет мечтаю стать программистом. Не берут, даже жнуном. Приходится заниматься говном.
-
а зачем тут FINAL если для этого типа движка он на автомате подставляется?
и кстати а если использовать JOIN users, то для этого движка тоже FINAL будет автоматом? но ведь FINAL в JOIN не работает... @den_crane -
Движок для users будет ReplacingMergeTree или схожий
-
ненене, там же MaterializedMySQL
-
When working with the MaterializedMySQL database engine, ReplacingMergeTree tables are used with virtual _sign and _version columns.
https://clickhouse.com/docs/en/engines/database-engines/materialized-mysql/ReplacingMergeTree | ClickHouse DocsThe engine differs from MergeTree in that it removes duplicate entries with the same sorting key value (ORDER BY table section, not PRIMARY KEY).
-
ненене
>If _version is not specified in the SELECT query, the FINAL modifier is used -
Понял :). Этого не знал, спасибо
-
Все работает. Просто запросы надо писать правильно.
-
век живи - век ничего не знай :)
-
Ну просто это не update. В ClickHouse нет UPDATE как в MySQL.
В ReplacingMergeTree тоже нужно вставлять большими батчами, в этом и суть -
супер, была бы ещё такая опция для обычной ReplacingMT , чтобы авто финализировалсь данные по дефолту.
-
Как говорится, исходники открыты :))
-
Да бога ради, допустим были бы подготовлены пачки, и ?
-
я пхпешник :(
-
Звучит как простая фича для хактоберфеста
-
Я тоже на PHP 10 лет разрабатывал. Потом одумался все-таки
-
я писал экстеншен для пхп на си для работы с opencv и проклял всё на белом свете, не хочу одумываться :)
-
И тогда становится всё хорошо и быстро, и ничего не тормозит :)
-
Точно! (Нет)
-
Код ClickHouse на самом деле весьма легко читается, он не как исходники расширений PHP :). Да, там C++, но с хорошо продуманной архитектурой. Я как бывший пхпшник (и не C++ программист) говорю
-
используйте AggregationMT + anyLast() + Nullable() поля и тогда для апдейта не нужна вся строка, достаточно инсертить изменяемые данные
-
Ну, как говорится, сдуру можно и велосипед сломать :)
-
А вот это проверю, спасибо!
-
Словари тоже можете попробовать
-
У вас как-то словами не очень получается объяснять, попробуйте кодом)
-
я пока только пуллреквесты в доку отправляю, мне хватает :) всё остальное не так сильно мешает жить, чтобы прикладывать столько усилий.
кстати мой одинадцатый пуллреквест пока не пролезает :) чувствую, что без дена как обычно не обойдётсяDocumentation: Functions hasAny and hasAll also can use a Bloom filter. by morozovsk · Pull Request #39188 · ClickHouse/ClickHouseChangelog category (leave one): Documentation (changelog entry is not required) Information about CI checks: https://clickhouse.com/docs/en/development/continuous-integration/
-
Можно сделать словарь с нужными колонками и с кешом из любого источника, например из MySQL
https://clickhouse.com/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-layout/#cacheStoring Dictionaries in Memory | ClickHouse DocsThere are a variety of ways to store dictionaries in memory.
-
И использовать для выборки данных пользователей по user_id
-
Или использовать тот запрос, что я выше писал
-
мне в данном случае не нравится слово "кеш", хотелось бы, чтобы все данные были уже в кликхаусе. к тому же менеджеры постоянно строят аналитику и по самим пользователям.
-
Ну попробуйте также вариант с MaterializedMySQL движком, и запросом с user_id IN(...) или JOIN
-
По идее они должны быть эквивалентны, но я не уверен
-
меня пока всё устраивает со схемой AggregationMT + anyLast() + Nullable(). человека выше уже вроде тоже :)
видимо мне пора ещё статьи на kb писать. интересно это могут делать не сотрудники altinity? -
(Есть минусы, что даже для маленьких запросов будет вычитываться вся таблица юзеров, но обычно их немного, меньше миллиарда, и ClickHouse это быстро фильтрует)
-
Ну у человека аж целых 350 колонок и у него апдейты тормозят, так что может быть с AggregatingMergeTree будут те же проблемы
-
у него вроде тормоза из-за того что он делает ALTER UPDATE
-
На самом деле конечно печально всё это. Люди слышат маркетинг, что ClickHouse не тормозит, по бенчмаркам всё просто летает, и потом думают, что это означает, что можно из ClickHouse делать вообще что угодно и оно будет быстро :). Key-Value сторадж, полнотекстовый поиск, замену MySQL для одиночных строчек (впрочем, я так действительно делал, но там было типа миллион строк в секунду вставка и 1000 запросов в секунду на чтение по 5-10 строк, так можно делать).
-
Хотя всего-то нужно понять, что ClickHouse колоночный, поэтому вставлять надо побольше и пореже, и обновлять данные можно только путём вставки и повторного слияния колонок.
-
И что благодаря поколоночному и поблочному хранению ClickHouse может читать данные во много потоков и фильтровать и агрегировать их с применением векторных инструкций
-
Ну и хэш-таблицы быстрые. И это всё, достаточно эти вещи понять и сразу станет легко понять, когда ClickHouse подходит, а когда нет, и как его готовить.
-
Ну и очень много матана и мат статистики для быстрого приближенного вычисления всяких перцентилей, уников и прочего
-
это всё понятно. но в основном проблемы не из-за того что юзаешь кликхаус не для тех целей, для которых он не предназначен, а то когда для этих кривых целей пытаешься юзать кликхаус в лоб. вот тогда он начинает тормозить, а ты начинаешь жаловаться. но чуть копнуть и есть оказывается обходной путь и вуаля кликхауз не тормозит даже для твоих кривых целей :)
- 14 July 2022 (150 messages)
-
Да. Обычный pr в гитхаб. Также как в кх. Пишут люди.
-
крутяк. спасибо. не знал
-
Ключ-значение на кх это вообще как такое могло случиться
Тем не менее, мы рассмотриваем кх с использованием полнотекстового поиска, и мы не видим здесь чего-то скверного -
что такое "перекрестный кластер"?
в смысле два сервера
на каждом сервере по одной реплике из каждого шарда?
<remote_servers>
<circular_shards>
<shard>
<internal_replication>true</internal_replication>
<replica><host>host1</host></replica>
<replica><host>host2</host></replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica><host>host2</host></replica>
<replica><host>host1</host></replica>
</shard>
</circular_shards>
</remote_servers>
но это все особого смысла не имеет для двух нод
потому что если под капотом ReplicatedMergeTree
то вы все равно будете иметь две реплики в ZK на двух нодах...
вот тут почитайте
https://altinity.com/blog/2018/5/10/circular-replication-cluster-topology-in-clickhouse
это не очень рекомендуемый подход
манагерить сложноCircular Replication Cluster Topology in ClickHouseIn some cases, there is a need to configure a distributed cluster with replication but there are not enough servers in order to place every replica on a separate node. It is better to have multiple replicas at the same nodes configured in a special way, that allows to continue executing queries even in the case of a node failure. Such replication configuration can be found in different distributed systems, it is often referred to as ‘circular’ or ‘ring’ replication. In this article, we will discuss how to set up circular replication in ClickHouse.
-
-
Набор полей разный, сейчас группирую по другому, пока ошибок нет, спасибо
-
Спасибо. Теперь знаю за что цепляться
-
Загружайте вместе с дагом clickhouse_driver и работайте
-
спасибо большое за ответ!
-
Я конкретно с амазон не работал, но там где не было поддержки из коробки делал именно так
-
Добрый день! Подскажите, сталкивался ли кто-то с подобным поведением: кластер из одного хоста, все максимально просто. 8гб оперативки, нагрузки большой нет. Версия 22.3
На хосте потребляемая память монотонно увеличивается до предела и перезапускает хост – цикл между перезагрузками около 3 часов. Что может влиять на такой паттернт потребления памяти? -
Мержи посмотри
-
-
а оконных функций совсем нет?
-
neighbor
-
https://clickhouse.com/docs/en/sql-reference/window-functions/
Некоторую поддержку ещё добавить в 22.7Window Functions | ClickHouse DocsClickHouse supports the standard grammar for defining windows and window functions. The following features are currently supported:
-
да что то похожее но как так ловко данные из запроса в мап передать ?
select
map(nested.id, count(nested.id))
from data
ARRAY JOIN nested.id
group by nested.id
На выходе список кортежей со словарями
хочу тполучить один единый словарь
sumMap тут не прокатит. -
ну я слепил sumMap из подзапроса.
просто думал что можно как то за один запрос это красиво сделать -
еще при склейке порядок сорторовки сбивается (
-
Добрый день. Подскажите пожалуйста. Есть 2 таблицы:
payment_schedule на 200млн строк
pay_fact на 63млн строк
Обе отсортированы ORDER BY policy_id
И есть запрос к ним:
SELECT PAYMENT_DATE, CURRENCY, PLAN_SUM, SUM(FACT_PAY_SUM) as FACT_SUM
FROM (SELECT PAYMENT_DATE, CURRENCY, PAY_SUM as PLAN_SUM, pf.paym_amnt as FACT_PAY_SUM
FROM (
SELECT PAYMENT_DATE, CURRENCY, PAY_SUM FROM payment_schedule pay_sched
WHERE (endr_id, DDATE)
IN (select top 1 endr_id, DDATE from payment_schedule ps where policy_id = 234765897 order by endr_id desc )
) ps
LEFT OUTER JOIN
(
select distinct ppf.paym_amnt as paym_amnt, ppf.plan_dt as plan_dt, ppf.guid from
(select guid, MAX(tech$load_id) as tech$load_id from pay_fact where policy_id = 135652768
group by guid) pp,
pay_fact ppf
where ppf.tech$load_id = pp.tech$load_id
and ppf.policy_id = 135652768
and pp.guid=ppf.guid
) pf ON ps.PAYMENT_DATE = pf.plan_dt)
GROUP BY PAYMENT_DATE, CURRENCY, PLAN_SUM order by PAYMENT_DATE
Который сканирует при выполнении 63 млн строк из 263 но выполняется очень долго (больше 10 сек). Как можно его попробовать ускорить? По какому полю таблицы отсортировать или на что повесить индекс? Или тут вообще код переписывать? -
У вас идёт join таблицы на 64 млн записей, то есть вся таблица разворачивается в оперативке плюс кучка order by. Попробуйте оптимизировать эти моменты.
-
Может вы имели ввиду group by? Не совсем понял про "кучка order by"
-
у вас в подзапросах ненужный order by
-
подскажите а именованный подзапрос (в секции) 1 раз вычисляется?
-
в секции это что? если WITH то каждый раз вычисляется
-
да речь про WITH
-
Почему? Их тут всего 2 и оба нужны, как мне кажется
-
если алиас то да, везде подставляется, но если это CTE то один раз вроде же?
-
order by в подзапросе не гарантирует порядок в финальной выборке... так что неважно есть он или нет
-
может в каких-то 22 версиях и так(но я такого не видел не слышал), но в 21.11 CTE каждый раз вычисляется
-
убрал "order by endr_id desc" - никак не повлияло на скорость
-
with (SELECT id FROM table LIMIT 1) as var_id , тоже будет каждый раз вычисляться ?
-
судя по логу 1 раз если скалярная величина
-
А как это понять ?
-
Ну точней где это можно посмотреть
-
в trace_log ?
-
че серьёзно? ) Так считается или нет? )
у меня просто в нем возввращаются значения для запроса
обсчет верзнего уровня и параметры для переваривания nested значений.
Просто если каждый раз при обращении к поздапросу идет пересчет то это хрень какая то )
WITH data as (
Select field1, fild2 from table)
Select
(select field1 from data) as f1,
field3
from table where id = (select field2 from data) -
set send_logs_level = 'trace'
я так смотрю всегда
пример накидал https://pastila.nl/?099543f0/7b4bcbdd4a72f8063616ecd20fe8c57e -
Спасибо
-
2 раза выполнится Select field1, fild2 from table
-
а можно как то в 1 раз это все затолкать? )
-
Ну наверное в массив, а потом array join
WITH (SELECT groupArray((number,number10))
FROM (
SELECT number, number / 10 as number10 FROM numbers(10)
)) as tb1
SELECT arrayJoin(tb1);
Ну как тот так я думаю -
а этот запрос у вас 1 строчку возвращает?
Select field1, fild2 from table -
да. наборр параметров для дальнейшено запроса
-
тогда вовращайте тупл, примерно так
WITH (
Select tuple(field1, fild2) from table
) AS data
Select
data.1 as f1,
field3
from table where id = data.2 -
я сразу так хотел сделать но мне ругается
Missing columns: 'data.1' while processing query: -
Должно работать, так всё ок, какая версия?
WITH (
SELECT (user_id, app_id)
FROM dashboard_stats_shard
LIMIT 1
) AS users
SELECT
app_id,
user_id,
users.1 AS x
FROM impressions_log_shard_v1
WHERE user_id = (users.1) -
[('22.3.8.39',)]
-
Основной тормоз, скорее всего - это left join. Выполните все подзапросы отдельно друг от друга и посмотрите на скорость отбора. Потом начните по 1 соединять подзапросы (проще всего в блок With вынести каждый подзапрос, так будет проще ими манипулировать), и выясните этап, где начинаются самые тормоза. От этого уже можно будет плясать.
-
на 22.3.4 всё ок, видимо с запросом у вас что-то не так
-
Спасибо
-
Также обязательно сравнивайте время выборки подзапросов с order by и без
-
понял.
есть 2 момента
1) Обращение не именованое а по нумерации
2) Есть разница в написании
WITH data AS () - так не катит
WITH () as data -
Привет, а правильно ли я понимаю (потому что мне приходилось так делать), что для обновления доступов для пользователя в кх (версия 20.5.4.40) придется пересоздавать пользователя? То есть нет никакой возможности по типу чтобы была black magic внутри для автоматического обновления прав доступа?
так-то сделано предоставление прав непосредственно пользователю, но хотелось бы иметь возможность, чтобы при обновлении прав доступа относительно ролей пользователь также обновлялся... -
1) можно сделать, но не особо красиво выглядит)
select (1, 2)::Tuple(user_id UInt64, app_id UInt64) x, tupleElement(x, 'user_id')
2) WITH data AS () - 2 запроса будет
WITH () as data - 1 запрос -
Народ, всем привет
не могу разобраться, что не так делаю
поднимаю кластер из контейнеров при помощи docker-compose: 1 ЗК, 2 КХ.
создаю табличку на каждом КХ
CREATE TABLE default.test_rep1
(
a UInt32,
b UInt32,
c UInt32
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/test_replicas/test_rep1', '{replica}')
ORDER BY a;
закидываю данные, репликация работает
хочу также сделать, но при помощи команды ON CLUSTER, запускаю такой скрипт создания таблицы
CREATE TABLE default.test_rep2 ON CLUSTER test_replicas
(
a UInt32,
b UInt32,
c UInt32
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/test_replicas/test_rep2', '{replica}')
ORDER BY a;
получаю такую ошибку
Code: 159. DB::Exception: Received from localhost:9000. DB::Exception: Watching task /clickhouse/task_queue/ddl/query-0000000000 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.
смотрел в таблицу system.clusters, обе реплики имеют 0 в столбце is_local, создается впечатление, что проблема именно в этом, не понимаю, как это можно поправить -
Не берите мантикюру. Их кластер (на момент года назад) все ещё был неюзабельный
-
Всем привет!
У меня есть события, отсортированные по времени.
Такой вопрос, как мне для каждого события PRODUCT_IMPRESSION поставить напротив событие SUGGEST_SELECTED ?
Грубо говоря, мне нужно просимулировать работу функции LagInFrame(), но по всей цепочке событий -
Добрый день, спасибо, да я видел эту статью, ещё была вот здесь https://medium.com/@merticariug/distributed-clickhouse-configuration-d412c211687c, по ней и настраивал. Почему выбран такой экстравагантный вариант - у заказчика есть прод, тест на них 4 сервера, все, как надо, но для дева выделено всего 2 и нужно на них реализовать схему четырёх. Добавить ещё 2 они не хотят. После всех изысканий сталкиваюсь с проблемой репликации. на первом сервере создаются данные 1 и второй шард, но они как-то криво реплицируются. Их нет на втором сервере, если пойти посмотреть таблицу shard.test (там пусто), как и в таблицу replica.test, а дистрибъют таблица на втором отдаёт всё, как надо. Но, если подать select *, hostName() from default.test; получаю данные только из первого сервера.Distributed and Replicated Clickhouse Configuration
How to configure a distributed and replicated Clickhouse cluster.
-
вы в таблицу с каким движком вставляете?
SHOW CREATE TABLE shard.test;
SHOW CREATE TABLE replica.test; -
То есть вы хотите чтобы оно стояло у каждого ?
-
Да, если событиям PRODUCT_IMPRESSION предшествовало событие SUGGEST_SELECTED
-
-
В какой движок вставляете ?
-
-
А разве это нельзя сделать с помощью оконных функций ?
-
дубли не вставляете?
-
-
а чё в логах говорит?
-
Пока не могу понять как
-
А где можно это посмотреть?
-
в гугле
-
-
Действительно, в ключе был дубль, и ANY строгость, спс
-
не, гугл что-то дал сбой. сходу не находит то что нужно. к слову в доке почему-то тоже поиск не фонтан.
в общем в в таблицу system.query_log и на диске /var/log/clickhouse-server -
-
Ничего такого нет. возможно в 20.5 был бвг.
-
Шағын
-
Виртуалки или докеры. Просто запустите 4 кх хот на одном сервере.
-
ладно, спасибо, буду тогда предоставление прав доступа писать непосредственно для пользователя, не проблема, чисто любопытство съело :)
-
anyLastIf(query, event_type = 'SUGGEST_SELECTED') OVER (ORDER BY logged_at ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-
Ребята
хотел уточнить, кто-нибудь устанаваливал провайдер для airflow?
выходит данная ошибка, данные для подключения проверял -
В distributed у вас сервер описан как-то. И сам этот сервер не понимает что он это он.
-
мы порт 8123 использовали
-
кто подскажет, почему КХ создает новые таблицы query_log_XXX каждые примерно 10 сек?
их так копится целая куча
может у него где-то произошел сбой, и он постоянно думает, что существующая таблица какой-то старой версии, и создает новую?
может ли это быть от того, что я в секцию конфига прописал
<engine>ENGINE = MergeTree PARTITION BY (event_date)
ORDER BY (event_time)
TTL event_date + INTERVAL 10 day DELETE
SETTINGS ttl_only_drop_parts=1
</engine> -
Бага, обновитесь
-
-
берите стандартный
-
MT/ReplicatedMT
-
MergeTree Engine Family | ClickHouse Docs
Table engines from the MergeTree family are the core of ClickHouse data storage capabilities. They provide most features for resilience and high-performance data retrieval: columnar storage, custom partitioning, sparse primary index, secondary data-skipping indexes, etc.
-
-
Successful ClickHouse deployment plan
Successful ClickHouse deployment plan.
-
исправлен этот баг уже, из-за ttl_only_drop_parts
-
много миллионов? 3 миллиона это одно, 933 миллиона это другое, я бы советовал разные движки и подходы.
-
до лярда можно не париться :)
-
Десятки миллионов
-
ну если 900 млн. и один сервер и ширина таблицы 500 полей (суммарно 2-3 кб), то я бы не советовал ReplacingMT, и надеятся на схлапывание дубликатов
-
>хочу использовать кликхаус для статистики (типа яндекс метрики)
ReplacingMT здесь вроде не в тему. ну только если имеется ввиду что будут там хранить ивенты и пользователей, но тогда пользователей при лярде событий будет всего миллионы и тогда и ReplacingMT справится. и это всё на виртуалке в хецнере. -
да тут у половины чатика мечта, досылать обновления ивентов через час, типа мы хотим репортить в риалтайме, но вот эти атрибуты прилетают с опозданием на 3 часа из другого источника и мы хотим что бы ....
и в общем они бесконечно воюют с ReplacingMT -
не знал, что так яндекс метрика умеет, но да ладно...
хз зачем так делают :) просто новые ивенты шлёшь, обновляешь только пользователей, которых на несколько порядков меньше. -
я честно говоря не знаю что делает метрика, я про нее знаю что там КХ.
Просто я сам работаю в ад. компании с кликстримом, и у меня 4-6 млрд. широких ивентов в день и примерно представляю все проблемы и возможные подходы. -
подскажите, как атрибуцируете? вне КХ
-
там обычная, базовая аналитика. я поэтому и говорю, что до лярда можно вообще не париться. это вообще песочница. у взрослых дядей нагрузки в тысячи раз выше.
-
вот да, я смотрю в /etc/hosts там у localhost совсем другой ip, а как можно изменить этот ip, чтобы использовался именно тот ip, который сообщается в docker-compose?
-
-
Кластер Кассандры в 6 раз больше чем кх. Плюс постгре и миллион строк на джава
-
зачем им IP в docker-compose указывать?
есть же dns
services:
clickhouse1:
image: clickhouse/clickhouse-server:latest
links:
- clickhouse2
clickhouse2:
image: clickhouse/clickhouse-server:latest
links:
- clickhouse1
ну и дальше
<remote_servers>
<cluster_name>
<shard>
<replica>clickhouse1</replica>
<replica>clickhouse2</replica>
</shard>
</cluster_name>
</remote_servers> -
ERROR: Circular dependency пишет, когда пытаюсь поднять
-
-
так я так и делаю, но у меня айпишники не присваиваются почему-то серверам и из-за этого не работает команда ON CLUSTER
вот такой docker-compose.yml
version: "3"
networks:
chcluster:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.18.1.0/16
services:
chserver1:
image: yandex/clickhouse-server:21.3
hostname: ch1
volumes:
- .\chserver1\config.xml:/etc/clickhouse-server/config.xml
ports:
- "8001:8123"
- "9001:9000"
networks:
chcluster:
ipv4_address: 172.18.1.1
depends_on:
- "zookeeper"
chserver2:
image: yandex/clickhouse-server:21.3
hostname: ch2
volumes:
- .\chserver2\config.xml:/etc/clickhouse-server/config.xml
ports:
- "8002:8123"
- "9002:9000"
networks:
chcluster:
ipv4_address: 172.18.1.2
depends_on:
- "zookeeper"
zookeeper:
image: zookeeper:3.5
hostname: zk
volumes:
- .\zk\zoo.cfg:/conf/zoo.cfg
networks:
chcluster:
ipv4_address: 172.18.1.3 -
Всем привет!,
а
кто-нибудь можем помочь с выгрузкой
данных их Я. Метрики в Кликхаус ? 🙏
и показать как это делается)
за плату конечно) -
вы бы примеры делали, create table / insert -> что должно быть на выходе.
вообще ни черта не понять что вы пишете словами, хотя я понимаю получше многих, и занимаюсь подобной херней 24*7, и термины вы используете от потолка.
" список кортежей со словарями" -- это просто набор букв. Никто в чатике этого понять не может. -
-
-
-
в 20 лет назад, когда я использовал erwin, там было две слоя абстракции, логическая модель и физическая.
сначала рисуешь логическую, и там отношения, кортежи, атрибуты, потом от нее переходишь в физическую модель и там отношения представлены одной или более таблицей, атрибуты становятся полями. -
а я бы сказал, что кортеж это tuple, а словарь - Dictionary... Так что да, понять сложно )
-
-
в общем случаях никак. В частных случаях можно.
проще всего просто выгружать одним куском, хоть 10млрд.
или разбивать на дни / часы. -
это удивительно, у меня такой же конфиг работает. а какая версия докера и композа?
-
дневные записи тоже большие. поэтому хочу их разбить
-
-
большие для чего? почему?
можно жать на ходу и лить в файл или в s3 -
-
-
-
Если докер десктоп, то, вероятно, винда. Я знаю что внутри оно работает с изысками.
А какие IP присвоились контейнерам в итоге? -
Коллеги, добрый день! Подскажите, пожалуйста, есть ли в клике штатный способ подавить при установке ввод пароля для дефолтного пользователя? Пишу скрипт автоматической установки и настройки и не хочу юзать всякие expect-подобные решения. Варианты с докером не подходят
-
а в чём сложность вводить в конфиг ?
-
DEBIAN_FRONTEND=noninteractive apt-get install
-
я не уверен, что он к этому моменту появляется. это же сразу после apt install запрашивается
-
DEBIAN_FRONTEND=noninteractive уважается большинством deb пакетов, в том числе и КХ
(это стандартный путь)
https://github.com/ClickHouse/ClickHouse/search?q=DEBIAN_FRONTEND -
супер! спасибо большое)
-
Аа я не так понял
-
добрый день, коллеги, возникла проблема с развертыванием кликхауса в кубер на EFS, ничего лучше не придумал, чем задать в рамках одного диска каждому инстансу отдельную папку через конфиг, в итоге указал в config.xml атрибут from_env вида <path from_env="DATA_PATH"></path> и указал соответствующую энв переменную в манифесте
но по непонятной мне причине исходя из логов данные из энв не берутся, но энв точно передается, он есть в поде, но не подставляется, либо иная причина, которая мне не ясна
если зайти в под и вызвать clickhouse extract-from-config --key=path, то он отдает правильное значение для path, но вот непосредственно при запуске КХ значение path оказывается пустым
возможно есть иной подход с решением проблемы использования EFS или быть может подскажете почему не работает from_env как ожидается? -
потому что from_env сделан только для части настроек
-
гхм... разоритесь вы на EFS..
-
ясно, спасибо
-
EFS будет тормозом, зачем вам костыли вместо ног?
-
гиперскорости не требуются, а вот HIPAA compliance, который из коробки обеспечивает fargate нода требуется
-
а зачем один EFS На все инстансы кликхауса?
не проще https://docs.aws.amazon.com/eks/latest/userguide/efs-csi.html
и просто определить в chi.spec.templates.volumeClaimTemplates[]
соответствующий storageClass ?
и потом назначить этот темплейт name
через chi.spec.defaults.templates.dataVolumeClaimTemplate ?Amazon EFS CSI driver - Amazon EKSThe Amazon EFS Container Storage Interface (CSI) driver provides a CSI interface that allows Kubernetes clusters running on AWS to manage the lifecycle of Amazon EFS file systems.
-
еще и fargate ;)
у вас видимо очень много денег
с другой стороны у "цифровой медицины" , сейчас действительно денег дофига... -
звучит очень странно, как связаны fargate и EFS ?
-
если я все правильно понял, то fargate только efs и поддерживает в рамках EKS
-
-
ребят а можно как то внутри результата функции sumMap() сделать сортировку по Value ?
-
ok, судя по всему нет... рафт все дела, порты другие и внутренние протоколы тоже
-
А зачем? Вроде от перемены мест слагаемых сумма не меняется.
-
вообще не работают, у кипера свой протокол между нодами кипера
-
Приветствую!
Подскажите, пожалуйста, кто в курсе, насколько плохая идея читать из кх большой объем детальных данных без применения агрегаций? Например, 10ТБ и более?
Есть ли рекомендуемый лимит на объем данных/кол-во строк который не стоит превышать при условном:
SELECT column1, column2, column3 FROM large_table ?
Из инфы нашел похожий вопрос с ответом от Den Crane, но вроде резкого мнения о том что так делать не стоит там не увидел, но очень сильно это подозреваю.
https://stackoverflow.com/questions/59420334/is-that-possible-to-query-millions-of-row-back-with-clickhouse
Заранее благодарю!Is that possible to query millions of row back with ClickHouseI know ClickHouse may be not the proper database to get millions of row (only a few columns) back with SQL like below: select col1, col2, .., date from table where col0='a1' and date >= 'start_...
- 15 July 2022 (221 messages)
-
Ну это просто не цель кликхауса, а так я не вижу проблем
-
Я много лет использую кх как даталейк и храню/ читаю строки с json-ми просто с фильтрацией по индексу и без фильтрации, читаю правда по 10-20 гб, но много в параллель. Никогда не пробовал читать тб за запрос, сеть нужна быстрая и надежная.
Почему не s3 и не просто файлы? -
если нет ORDER BY и GROUP BY
то аллоцироваться будут только буфера на чтение и декомпрессию колонок
и результат будет стримиться в клиента
и соответственно ваш клиент должен поддерживать стриминг результата, а не аллоцировать под него память
ну и да, хочется заметить что clickhouse это некоторый final storage
вы что потом с этими данными будете делать? в какую то другую систему положите?
а для чего? может для этого usecase и ClickHouse сгодится? -
-
-
-
О каких командах речь тогда речь?
-
-
В консоле, если открыть список, представлено большое колво команд, чем на сайте
По этому понял что надо найти документацию для нормального использования, но сколько не искал найти не удалось. Потому и решил задать вопрос знающим людям -
Каких команд ?
-
Консольные в маке для работы с кликхаусом
-
-
До сих пор ничего не понятно. Какую задачу вы хотите решить?
-
Всем привет!
-
Кто-нибудь сталкивался со следующим?
когда подключаюсь через clickhouse-client
Warnings:
* Linux is not using a fast TSC clock source. Performance can be degraded. Check /sys/devices/system/clocksource/clocksource0/current_clocksource
* Maximum number of threads is lower than 30000. There could be problems with handling a lot of simultaneous queries.
Первый warning решил. А вот второй даже не понимаю где искать, в гугле ничего полезного.
cat /proc/sys/kernel/threads-max
30818
Операционка Ubuntu через KVM -
sumMap() отлично лепт данные но можно ли как то None в нем заменить на 0 нормальные?
это надо в исходных данных сразу None как 0 записывать или можо как то изловчится? -
Если честно, банально найти документацию, что бы досконально разобраться как работать с clickhouse client
-
Какую документацию? О чем вы вообще? Вы запускаете клиент и дальше у ваc sql
-
Кхм, а там внутри ничем не отличается от linux скорей всего.
-
-
Command-line Client | ClickHouse Docs
clickhouse-client
-
-
Наверное в distributed указать статический ключ шардирования
-
Статический ключ значит что данные будут всегда только на 1 шард вставляться , наверное не лучший вариант)
-
Подождите, вам не нужно это ? Ну тогда сделайте в ключ функцию rand() и всё
-
Запрос выполняет селект с С3 на каждом шарде. 6 шардов - данные задублируются 6 раз
-
Предлагаем следующие услуги для продвижения ваших ресурсов:
1. Накрутка подписчиков, просмотров, лайков, комментариев, опросов во все Соц. Сети и сервисы. Цена от 18 руб / 1000 ш.
2. Рассылка в Телеграм и ВК. Стоимость от 3000 руб.
3. Комбайн для продвижения в Телеграм. Имеет полный спектр возможностей. Видео работы по запросу. Стоимость 3400 руб – навсегда + обновления
4. База чатов телеграм. Сортирована на категории. Всего более 14000. Все чаты живые. Стоимость базы 1950 руб.
По всем вопросам обращаться сюда: https://vk.cc/cez3BQ -
-
Подскажите, а можно как-то сложить массивы при аггрегации по столбику?
Предположим, что у меня есть столбец идентификаторов сессий sessionId и столбец с json'ами logs и я хочу что-то вроде такого
WITH
JSONExtract(logs, 'Array(Tuple(message String, timestamp Int64))') AS events,
SELECT
sessionId,
sum(events)
FROM myTable
WHERE Date >= today()-7
GROUP BY sessionId -
groupArray(events) чтобы аггрегировать в массив
-
Предлагаем следующие услуги для продвижения ваших ресурсов:
1. Накрутка подписчиков, просмотров, лайков, комментариев, опросов во все Соц. Сети и сервисы. Цена от 18 руб / 1000 ш.
2. Рассылка в Телеграм и ВК. Стоимость от 3000 руб.
3. Комбайн для продвижения в Телеграм. Имеет полный спектр возможностей. Видео работы по запросу. Стоимость 3400 руб – навсегда + обновления
4. База чатов телеграм. Сортирована на категории. Всего более 14000. Все чаты живые. Стоимость базы 1950 руб.
По всем вопросам обращаться сюда: https://vk.cc/cez3BQ -
Аналогичный семантически запрос, который можно на system.tables прогонять - собрать пути с данными в разбивке по базам
SELECT database, sum(data_paths)
FROM system.tables
GROUP BY database -
Это не совсем то, но спасибо
Оно собирает список списков, а мне бы все в однин сложить, чтобы потом можно было обходить. Попробую сейчас накинуть сверху какой-нибудь sumArray -
если плоский надо -> groupArrayArray
-
Предлагаем следующие услуги для продвижения ваших ресурсов:
1. Накрутка подписчиков, просмотров, лайков, комментариев, опросов во все Соц. Сети и сервисы. Цена от 18 руб / 1000 ш.
2. Рассылка в Телеграм и ВК. Стоимость от 3000 руб.
3. Комбайн для продвижения в Телеграм. Имеет полный спектр возможностей. Видео работы по запросу. Стоимость 3400 руб – навсегда + обновления
4. База чатов телеграм. Сортирована на категории. Всего более 14000. Все чаты живые. Стоимость базы 1950 руб.
По всем вопросам обращаться сюда: https://vk.cc/cez3BQ -
Спасибо большое
-
можно ещё groupUniqArrayArray если дубли надо убрать
-
а присвоились на самом деле те, которые я и указывал в docker-compose
-
-
-
-
Ну если присвоились те что нужно, тогда проблемы нет, получается?
-
-
агась, спасибо, потом может пригодиться
-
Посмотрите логи кх, какие там ошибки? Попробуйте изнутри контейнеров по описанным хостам:портам телнетом постучаться
-
-
-
-
Это не так работает
-
Логи посмотрите. Что там?
-
-
хм
сразу при запуске контейнера такие сообщения
2022.07.15 08:42:12.771200 [ 51 ] {} <Warning> Access(local directory): File /var/lib/clickhouse/access/users.list doesn't exist
2022.07.15 08:42:12.771271 [ 51 ] {} <Warning> Access(local directory): Recovering lists in directory /var/lib/clickhouse/access/
2022.07.15 08:42:12.795561 [ 51 ] {} <Warning> Application: Listen [::]:8123 failed: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = DNS error: EAI: Address family for hostname not supported (version 21.3.20.1 (official build)). If it is an IPv6 or IPv4 address and your host has disabled IPv6 or IPv4, then consider to specify not disabled IPv4 or IPv6 address to listen in <listen_host> element of configuration file. Example for disabled IPv6: <listen_host>0.0.0.0</listen_host> . Example for disabled IPv4: <listen_host>::</listen_host>
2022.07.15 08:42:12.795739 [ 51 ] {} <Warning> Application: Listen [::]:9000 failed: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = DNS error: EAI: Address family for hostname not supported (version 21.3.20.1 (official build)). If it is an IPv6 or IPv4 address and your host has disabled IPv6 or IPv4, then consider to specify not disabled IPv4 or IPv6 address to listen in <listen_host> element of configuration file. Example for disabled IPv6: <listen_host>0.0.0.0</listen_host> . Example for disabled IPv4: <listen_host>::</listen_host>
2022.07.15 08:42:12.795860 [ 51 ] {} <Warning> Application: Listen [::]:9009 failed: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = DNS error: EAI: Address family for hostname not supported (version 21.3.20.1 (official build)). If it is an IPv6 or IPv4 address and your host has disabled IPv6 or IPv4, then consider to specify not disabled IPv4 or IPv6 address to listen in <listen_host> element of configuration file. Example for disabled IPv6: <listen_host>0.0.0.0</listen_host> . Example for disabled IPv4: <listen_host>::</listen_host>
2022.07.15 08:42:12.796522 [ 51 ] {} <Warning> Application: Listen [::]:9004 failed: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = DNS error: EAI: Address family for hostname not supported (version 21.3.20.1 (official build)). If it is an IPv6 or IPv4 address and your host has disabled IPv6 or IPv4, then consider to specify not disabled IPv4 or IPv6 address to listen in <listen_host> element of configuration file. Example for disabled IPv6: <listen_host>0.0.0.0</listen_host> . Example for disabled IPv4: <listen_host>::</listen_host>
2022.07.15 08:42:12.899097 [ 88 ] {} <Error> virtual bool DB::DDLWorker::initializeMainThread(): Code: 999, e.displayText() = Coordination::Exception: All connection tries failed while connecting to ZooKeeper. nodes: 172.18.1.3:2181
Poco::Exception. Code: 1000, e.code() = 111, e.displayText() = Connection refused (version 21.3.20.1 (official build)), 172.18.1.3:2181
Poco::Exception. Code: 1000, e.code() = 111, e.displayText() = Connection refused (version 21.3.20.1 (official build)), 172.18.1.3:2181
Poco::Exception. Code: 1000, e.code() = 111, e.displayText() = Connection refused (version 21.3.20.1 (official build)), 172.18.1.3:2181
(Connection loss), Stack trace (when copying this message, always include the lines below): -
0. Coordination::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, Coordination::Error, int) @ 0xfa0a963 in /usr/bin/clickhouse
1. Coordination::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, Coordination::Error) @ 0xfa0abe2 in /usr/bin/clickhouse
2. Coordination::ZooKeeper::connect(std::__1::vector<Coordination::ZooKeeper::Node, std::__1::allocator<Coordination::ZooKeeper::Node> > const&, Poco::Timespan) @ 0xfa4afc1 in /usr/bin/clickhouse
3. Coordination::ZooKeeper::ZooKeeper(std::__1::vector<Coordination::ZooKeeper::Node, std::__1::allocator<Coordination::ZooKeeper::Node> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, Poco::Timespan, Poco::Timespan, Poco::Timespan) @ 0xfa49892 in /usr/bin/clickhouse
4. zkutil::ZooKeeper::init(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) @ 0xfa0cfa6 in /usr/bin/clickhouse
5. zkutil::ZooKeeper::ZooKeeper(Poco::Util::AbstractConfiguration const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) @ 0xfa0f546 in /usr/bin/clickhouse
6. void std::__1::allocator_traits<std::__1::allocator<zkutil::ZooKeeper> >::__construct<zkutil::ZooKeeper, Poco::Util::AbstractConfiguration const&, char const (&) [10]>(std::__1::integral_constant<bool, true>, std::__1::allocator<zkutil::ZooKeeper>&, zkutil::ZooKeeper*, Poco::Util::AbstractConfiguration const&, char const (&) [10]) @ 0xe8c3a87 in /usr/bin/clickhouse
7. DB::Context::getZooKeeper() const @ 0xe8a08d0 in /usr/bin/clickhouse
8. DB::DDLWorker::getAndSetZooKeeper() @ 0xe8e3979 in /usr/bin/clickhouse
9. DB::DDLWorker::initializeMainThread() @ 0xe8f7482 in /usr/bin/clickhouse
10. DB::DDLWorker::runMainThread() @ 0xe8e1461 in /usr/bin/clickhouse
11. ThreadFromGlobalPool::ThreadFromGlobalPool<void (DB::DDLWorker::*)(), DB::DDLWorker*>(void (DB::DDLWorker::*&&)(), DB::DDLWorker*&&)::'lambda'()::operator()() @ 0xe8f8601 in /usr/bin/clickhouse
12. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0x854aa1f in /usr/bin/clickhouse
13. ? @ 0x854de93 in /usr/bin/clickhouse
14. start_thread @ 0x9609 in /usr/lib/x86_64-linux-gnu/libpthread-2.31.so
15. __clone @ 0x122293 in /usr/lib/x86_64-linux-gnu/libc-2.31.so
(version 21.3.20.1 (official build)) -
-
поменял на listen_host 127.0.0.1, эти ошибки сыпаться перестали, но проблема осталась, при вызове ON CLUSTER вот такое в логах было
2022.07.15 09:11:05.834138 [ 54 ] {1473480c-df9b-4337-8a6d-0a4eccfc8e70} <Error> TCPHandler: Code: 159, e.displayText() = DB::Exception: Watching task /clickhouse/task_queue/ddl/query-0000000000 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:
0. DB::Exception::Exception<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, long&, unsigned long&, unsigned long&>(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, long&, unsigned long&, unsigned long&) @ 0xef2e172 in /usr/bin/clickhouse
1. DB::DDLQueryStatusInputStream::readImpl() @ 0xef2d8f6 in /usr/bin/clickhouse
2. DB::IBlockInputStream::read() @ 0xe6a1e25 in /usr/bin/clickhouse
3. DB::AsynchronousBlockInputStream::calculate() @ 0xe69e191 in /usr/bin/clickhouse
4. ? @ 0xe69ea07 in /usr/bin/clickhouse
5. ThreadPoolImpl<ThreadFromGlobalPool>::worker(std::__1::__list_iterator<ThreadFromGlobalPool, void*>) @ 0x854d3c8 in /usr/bin/clickhouse
6. ThreadFromGlobalPool::ThreadFromGlobalPool<void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda1'()>(void&&, void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda1'()&&...)::'lambda'()::operator()() @ 0x854eddf in /usr/bin/clickhouse
7. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0x854aa1f in /usr/bin/clickhouse
8. ? @ 0x854de93 in /usr/bin/clickhouse
9. start_thread @ 0x9609 in /usr/lib/x86_64-linux-gnu/libpthread-2.31.so
10. __clone @ 0x122293 in /usr/lib/x86_64-linux-gnu/libc-2.31.so -
-
-
было так, поменял на ip из комоуза, ничего не изменилось
-
смотрите, у вас проблема в том, что у вас нет связности между контейнерами внутри сети. К сожалению, я не знаю точно как работает докер на винде, единственное что я знаю это только факт что это всё сделано через жопу.
Вам нужна ситуация когда Ip который слушает CH в контейнере доступен снаружи. Обычно для этого нужно 0.0.0.0, но в винде это видимо не работает. Давайте так - по одному контейнеру будем приводить в корректное состояние. -
-
надо контейнеры в одну докерную сеть положить и обращаться к ним по именам
-
-
вот его композ. судя по логам теперь проблема в listen_host
-
все процессы должны слушать нули
-
-
в смысле на каждом КХ установить этот тэг?
-
-
-
-
-
а почему бы им нули не слушать?
-
Он выше выкладывал логи с ошибками что не получается
-
-
-
Добрый день. Подскажите пожалуйста - впервые хочу использовать функционал UDF в клике. Использую пример из доки. Не очень понятно куда класть xml файл. Питоновский скрипт в папку user_scripts если я правильно понял, а xml?
-
-
Добрый день. Подскажите, пожалуйста - есть ли возможность переименовать реплицируемую таблицу?
Вижу что сама таблица переименовывается на всех репликах, но в зукипере ничего не происходит - остаётся старое название и нового не создаётся.
А при попытке создать новую таблицу с именем переименованной, вываливается ошибка Existing table metadata in ZooKeeper differs in ... -
судя по логам у вас было и 0/0/0/0 и [::]:9000
-
-
-
привет : ) вопрос по DNS-кэшу.
ошибся в remote-запросе с именами хостов (указал несуществующие). но сервер как будто занес их в свой dns-кэш и пытается регулярно резолвить.
ошибками спамит в журнал:
<Error> DNSResolver: Cannot resolve host (clickhouse2), error 0: Temporary DNS error while resolving: clickhouse2.
есть штатный способ почистить кэш? или время жизни как-то настроить?
про настройку dns_cache_update_period знаю, но это тот самый интервал резолва.
версия 21.11.3.6 -
2022.07.15 09:56:55.572409 [ 52 ] {} <Warning> Access(local directory): File /var/lib/clickhouse/access/users.list doesn't exist
2022.07.15 09:56:55.572448 [ 52 ] {} <Warning> Access(local directory): Recovering lists in directory /var/lib/clickhouse/access/
2022.07.15 09:56:55.585133 [ 52 ] {} <Warning> Application: Listen [::]:8123 failed: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = DNS error: EAI: Address family for hostname not supported (version 21.3.20.1 (official build)). If it is an IPv6 or IPv4 address and your host has disabled IPv6 or IPv4, then consider to specify not disabled IPv4 or IPv6 address to listen in <listen_host> element of configuration file. Example for disabled IPv6: <listen_host>0.0.0.0</listen_host> . Example for disabled IPv4: <listen_host>::</listen_host>
2022.07.15 09:56:55.585291 [ 52 ] {} <Warning> Application: Listen [::]:9000 failed: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = DNS error: EAI: Address family for hostname not supported (version 21.3.20.1 (official build)). If it is an IPv6 or IPv4 address and your host has disabled IPv6 or IPv4, then consider to specify not disabled IPv4 or IPv6 address to listen in <listen_host> element of configuration file. Example for disabled IPv6: <listen_host>0.0.0.0</listen_host> . Example for disabled IPv4: <listen_host>::</listen_host>
2022.07.15 09:56:55.585434 [ 52 ] {} <Warning> Application: Listen [::]:9009 failed: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = DNS error: EAI: Address family for hostname not supported (version 21.3.20.1 (official build)). If it is an IPv6 or IPv4 address and your host has disabled IPv6 or IPv4, then consider to specify not disabled IPv4 or IPv6 address to listen in <listen_host> element of configuration file. Example for disabled IPv6: <listen_host>0.0.0.0</listen_host> . Example for disabled IPv4: <listen_host>::</listen_host>
2022.07.15 09:56:55.585555 [ 52 ] {} <Warning> Application: Listen [::]:9004 failed: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = DNS error: EAI: Address family for hostname not supported (version 21.3.20.1 (official build)). If it is an IPv6 or IPv4 address and your host has disabled IPv6 or IPv4, then consider to specify not disabled IPv4 or IPv6 address to listen in <listen_host> element of configuration file. Example for disabled IPv6: <listen_host>0.0.0.0</listen_host> . Example for disabled IPv4: <listen_host>::</listen_host>
2022.07.15 10:00:39.118020 [ 54 ] {4f40b662-bf11-4d4d-8349-8d65fb537b72} <Error> executeQuery: Code: 159, e.displayText() = DB::Exception: Watching task /clickhouse/task_queue/ddl/query-0000000000 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 (version 21.3.20.1 (official build)) (from 127.0.0.1:45296) (in query: CREATE TABLE default.test_rep2 ON CLUSTER test_replicas ( a UInt32, b UInt32, c UInt32 ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/test_replicas1/test_rep1', '{replica}') ORDER BY a;), Stack trace (when copying this message, always include the lines below): -
0. DB::Exception::Exception<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, long&, unsigned long&, unsigned long&>(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, long&, unsigned long&, unsigned long&) @ 0xef2e172 in /usr/bin/clickhouse
1. DB::DDLQueryStatusInputStream::readImpl() @ 0xef2d8f6 in /usr/bin/clickhouse
2. DB::IBlockInputStream::read() @ 0xe6a1e25 in /usr/bin/clickhouse
3. DB::AsynchronousBlockInputStream::calculate() @ 0xe69e191 in /usr/bin/clickhouse
4. ? @ 0xe69ea07 in /usr/bin/clickhouse
5. ThreadPoolImpl<ThreadFromGlobalPool>::worker(std::__1::__list_iterator<ThreadFromGlobalPool, void*>) @ 0x854d3c8 in /usr/bin/clickhouse
6. ThreadFromGlobalPool::ThreadFromGlobalPool<void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda1'()>(void&&, void ThreadPoolImpl<ThreadFromGlobalPool>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>)::'lambda1'()&&...)::'lambda'()::operator()() @ 0x854eddf in /usr/bin/clickhouse
7. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0x854aa1f in /usr/bin/clickhouse
8. ? @ 0x854de93 in /usr/bin/clickhouse
9. start_thread @ 0x9609 in /usr/lib/x86_64-linux-gnu/libpthread-2.31.so
10. __clone @ 0x122293 in /usr/lib/x86_64-linux-gnu/libc-2.31.so -
SYSTEM DROP DNS CACHE;
-
Вот суть: There are 2 unfinished hosts (0 of them are currently active)
-
flatten(groupArray(massive)) - сделает 1 плоский массив из всех подмассивов
-
Вы пробуете с нуля поднять?
-
-
-
-
да, хорошо, а то я что-то мусорить логами начал)
-
то, что надо! спасибо! 👌
-
удалил вольюмы, удалил сети
https://pastila.nl/?00358cd4/036ec3e7f8639df348b426ce21ace679 -
А у вас совпадают хостнеймы в конфиге и в композе?
-
-
-
-
-
ладно.... я не вижу очевидных на мой взгляд косяков. Вы проверяли связность между контейнерами по указанным портам? Может вам на версию 22.3 подняться?
-
вот эти
clickhouse clickhouse-client clickhouse-copier clickhouse-format clickhouse-keeper clickhouse-library-bridge clickhouse-obfuscator clickhouse-report
clickhouse-benchmark clickhouse-compressor clickhouse-extract-from-config clickhouse-git-import clickhouse-keeper-converter clickhouse-local clickhouse-odbc-bridge clickhouse-server
?
или
clickhouse
Use one of the following commands:
clickhouse local [args]
clickhouse client [args]
clickhouse benchmark [args]
clickhouse server [args]
clickhouse extract-from-config [args]
clickhouse compressor [args]
clickhouse format [args]
clickhouse copier [args]
clickhouse obfuscator [args]
clickhouse git-import [args]
clickhouse keeper [args]
clickhouse keeper-converter [args]
clickhouse install [args]
clickhouse start [args]
clickhouse stop [args]
clickhouse status [args]
clickhouse restart [args]
clickhouse static-files-disk-uploader [args]
clickhouse hash-binary [args] -
😜wNC My strategy for dealing with the crypto bear market - how a millionaire is made! https://t.me/agykr1Crypto Arbitrage Tutorial
Spread Arbitrage 3%-5% profit per transaction Profit of 300+ dollars a day Safe and reliable, legal transactions
-
Вторые
Как я понимаю, первый блок для линукса, а вот в тех что для мака(второй блок), в поле args я не понял что прописывать -
через ping ch2 и через ping zk есть ответы
-
-
-
30818 как-то мало
они проверяют RLIMIT_NPROC
и сообщение неправильное, это limit доступных процессов/тредов на всех, не на КХ -
создал https://github.com/ClickHouse/ClickHouse/issues/39260
надо увеличить
echo 300000 > /proc/sys/kernel/threads-maxMaximum number of threads is lower than 30000 is incorrect message · Issue #39260 · ClickHouse/ClickHouse* Maximum number of threads is lower than 30000. There could be problems with handling a lot of simultaneous queries. cat /proc/sys/kernel/threads-max 30818 Probably it should be "a number...
-
Потом окажется, что выключил какой то сетевой адаптер :)
-
нет, это оба сообщения из линукса.
это просто аргументы программы clickhouse
clickhouse -- это single binary и если его запускать с разными аргументами, он делает разное
clickhouse-client это симлинк на clickhouse
т.е. без раницы как запускать clickhouse client или clickhouse-client
clickhouse compressor == clickhouse_compressor и т.д.
все команды вам не нужны, половина нужна только админам и разработчикам КХ.
вам полезны только client и local -
on cluster просто запускает то что просите на каждой ноде КХ
и каждая нода создает distributed таблицу и выполняет insert select и естественно все дублируется многократно.
вам надо создать таблицу без as select
и затем запустить на одной ноде insert into ... select .... from s3cluster тогда все ноды разделят работу и вставят свой кусочек, на сайте altinity ищите по слову s3cluster -
так понятно что можно сделать
ctas генерит dbt, думал можно как-то это обойти -
zookeeper znode нельзя переименовать.
поэтому надо либо использовать версионирование, типа добавлять что то в путь _1 , _2 _3
либо использовать atomic и создавать таблицы on cluster c генерацией uuid и тогда пути зукипера будут бессмысленные уникальные uuid и будет пофиг на переменование -
нельзя
это не починить в КХ, это такой дизайн distributed, это надо добавлять какие-то другие движки. -
В zk node случаем порт не нужно открыть? - 2181
https://pastila.nl/?002f787e/dac50d0283fa7f32e3366f9911e482f0 -
можно, переделайте то как генерится в dbt
-
что может означать ошибка ?
<Error> Application: DB::Exception: No key in S3 uri: http://try1-minio.test.svc:9000/ss-cold-storage/
https://github.com/ClickHouse/ClickHouse/blame/00dedc4e0053cb704df4e96bbd16b95852545c09/src/Disks/ObjectStorages/S3/registerDiskS3.cpp#L84
UPD , оказывается просто в бакет нельзя указать путь, нужно добаить еще чтото типа /ss-cold-storage/data/ -
Спасибо большое, так получилось, добавил в путь в зу к новым таблицам версию
-
Спасибо
-
-
Если зайти в контейнер с кх, какой там ip и hostname и что в distributed для этого хоста
-
я правильно понимаю что с версии 22.7.1 будет нормально работать и будет create table empty as select + insert?
https://github.com/ClickHouse/dbt-clickhouse/blob/ff72032e87ebb7624374fb0bb7b42d61dfd8c031/dbt/include/clickhouse/macros/adapters.sql#L74dbt-clickhouse/adapters.sql at ff72032e87ebb7624374fb0bb7b42d61dfd8c031 · ClickHouse/dbt-clickhouseThe Clickhouse plugin for dbt (data build tool). Contribute to ClickHouse/dbt-clickhouse development by creating an account on GitHub.
-
-
в docker-compose можно hostname прописать
clickhouse1:
hostname: clickhouse1
links:
- clickhouse2
clickhouse2:
hostname: clickhouse2 -
В remote_servers
-
не факт... смотря как create_table_empty реализован
ройте исходники дальше -
@BloodJazMan пока ты тут я спрошу тебя кое чего по новому релизу оператора , может ты в курсе зачем это сделали
меня оно шокировало немного
Now 'clickhouse-operator' user is restricted to an IP address of the pod where clickhouse-operator is running. It can not be used from anywhere else. -
Кстати, и в remote_servers секциях какой порт должен быть указан? не 9000 в общем случае?
Может тут не прав, поправьте если что
https://pastila.nl/?002f787e/dac50d0283fa7f32e3366f9911e482f0 -
В современных кх 9000 можно не указывать.
-
А хотя там почему-то 8123, good catch
-
Забавно, два дня из за такой фигни обсуждаем
-
-
да. КХ сервер проверяет что он это он, по паре ip:tcp_port , у вас remote 8123 а оно <> 9000
-
Ну получается так
-
обычно вы бы сразу это заметили, потому что не работают distributed запросы, но вы их не выполняли, потому что у вас 1 шард.
-
-
и вы зря кладете весь config.xml , можно передавать только измененные кусочки конфига.
https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-server-config-files/Server config filesHow to manage server config files in Clickhouse
-
-
-
-
-
Это норма, если ch грузит цп перманентно под максимум? Или стоит задуматься об увеличении цп?
-
сделали потому что люди начинали юзать clickhouse_operator юзера для коннекта из приложений
а это вообще не правильно
если вы так делаете. вы стреляете себе в ногу
clickhouse_operator пользователь он только для того чтобы мониторить инстансы и накатывать схему -
clickchouse старается сожрать CPU по максимуму
график без отрыва сколько у вас запросов в секунду и сколько они читают строк \ сколько отдают клиенте...
не дает четкой картины
смотрите в system.query_log -
я так не делаю)
вообще у меня сперва негодование возникло из из того что я знаю что ip оператора это не стабильная вещь, но я вижу что он вроде как всем пытается перегенерить конфиг при смене ip,
но мне это не кажется надежным и совместимымрешением -
Всем привет, подскажите, есть ли возможность проверить разом все атрибуты таблицы на NULL?
Какая-нибудь аналогия ручному перебору:
select count(a1) as amount, 'a1' as atribute from table_ where a1 is null
union all select count(a2) as amount, 'a2' as atribute from table_ where a2 is null
union all select count(a3) as amount, 'a3' as atribute from table_ where a3 is null
... -
в чем выражается "ненадежность"?
механизмы оновления configmap в кубере достаточно протестированы...
механизмы config reload в clickhouse тоже работают...
что не так тогда? -
совместимым с чем?
-
часто бывает так что cm напрямую не монтируют, а прогоняют через init контейнер и шаблонизируют, мы раньше так делали активно, сейчас оператор поумнел и в этом нет необходимости , но ктото может продолать так делать,
-
-
в том то и дело, что у нас не 100% времени кверится что-то из базы. Есть простой и его много
-
гхм =) ну то что вы делали кастомную логику на init Container ;) для чего кстати?
мы у себя только один Use case видели
всякие миграции прогонять ... -
select * apply(x -> countIf(isNull(x))) from ...
-
> для чего кстати?
кажется пароли создавали или типа того, я когда то созадвал тикет , его сделали и теперь в этом нет необходимости
UPD: вспомнил, установка паролей из секретов, мы монтировали секреты в init и генерили xml в котором они лежат , потому что до этого пароли вообще явно в конфиге только прописать можно было в открытом виде -
ну смотрите всякие бекграунд процессы
https://clickhouse.com/docs/en/operations/system-tables/stack_trace/
смотрите system.stack_trace
Там можно понять чем треды занимаются и сколько ихstack_trace | ClickHouse DocsContains stack traces of all server threads. Allows developers to introspect the server state.
-
почему-то с ошибкой отваливается на оператор ->:
DB::Exception: Syntax error: failed at position 195 ('->')
Может ли версия клика быть как-то в этом замешена? У меня (version 21.3.11.5 (official build))Функции | ClickHouse Docsfunktsii}
-
да, старая версия
-
😞, а есть варианты решения без обновления версии?)
-
-
создать policy, volume, включить туда disk который вам нужно и использовать эту полиси для вашей таблицы
тут хорошо расписано
https://altinity.com/blog/2019/11/27/amplifying-clickhouse-capacity-with-multi-volume-storage-part-1Amplifying ClickHouse Capacity with Multi-Volume Storage (Part 1)As longtime users know well, ClickHouse has traditionally had a basic storage model. Each ClickHouse server is a single process that accesses data located on a single storage device. The design offers operational simplicity--a great virtue--but restricts users to a single class of storage for all data. The downside is difficult cost/performance choices, especially for large clusters.
-
Спасибо!
-
Всем привет!
Есть очень большой и тяжелый SQL запрос. Можно ли создать табличку на основе этого запроса, не выполняя его?
Делаю CREATE TABLE my_table ON CLUSTER my_cluster AS {my_big_sql_query} LIMIT 0 — он начинает нагружать все ноды, а мне нужно только создать табличку, а не наполнить её. Можно ли как-то обойти выполнение всего запроса и ускорить процесс? -
Коллеги, подскажите, CLEAR COLUMN in partition помогает освободить дисковое пространство?
-
-
Where 1=0
-
SELECT * FROM ({‘my_big_sql_query’}) WHERE 1=0 ?
-
А можно небольшой ликбез почему так быстрее? Оптимизатор понесёт глубже это условие внутрь квери?
-
Добрый день)
1) настраивал реплику.. использовал встроенный keeper - вроде бы как заработало, ошибок нету.. но бд на реплике не создалась и не реплицируется
2) прервалась связь с репликой и основная бд встала колом, при перезапуске открывала только порт реплики и в логе писала что не может достучаться до реплики. когда связь восстановилось - все взлетело.. в документации написало, что при потери реплики бд становится ридонли.. а это обойти никак? -
-
да просто в where допишите and 1=0
-
быстрее чем что?
-
принял, буду пробовать
Спасибо -
Всем добрый вечер!
Только начинаю пользоваться кликхаусом, установил на мак, пытаюсь работать через консоль. Пытаюсь загрузить БД, но вылетает такая ошибка:
errno: 24, strerror: Too many open files: data for INSERT was parsed from file. (CANNOT_OPEN_FILE)
Гуглил, пишут что надо расширить лимит файловых дескрипторов, но это не помогает.
Возможно тут кто то знает что делать с этой проблемой? -
у зукипера есть /zookeeper ветка, у кипера нет
select * from system.zookeeper where path='/';
┌─name───────┬─
│ test │
│ zookeeper │ ---------<<<<<<<<<<<<<<<<<<<<<<<<--
│ clickhouse │
└────────────┴─
select * from system.zookeeper where path='/';
┌─name───────┬─value─┬─path─┐
│ clickhouse │ │ / │
└────────────┴───────┴──────┘ -
1) бд и не должна создаваться на реплике. Это не так работает.
2) да, и это специально сделано. Если между ДВУМЯ репликами разорвалась связь, то как они узнают об этом? как избежать split brain? -
Чем limit 0
-
да просто он не понимает что с limit 0 можно не делать ничего
-
Ребят, а где можно почитать рекомендации по мощностям для КХ ?
Тестовые прогонки прошли успешно, будет собирать рабочие стенды и собственно нужно с чем то прийти к инженерам.
Пока у меня из требований 3 машины с кликом на каждой будет квартал теплых данных размером. 200 - 250гигов. Данные доливаются раз в сутки, раз в 30 дней отрезаем хвост в 30 дней. и так ползём дальше.
Объёмы для клика смешные и потому думаю что можно не заморачиваться на шардирование и прочую распределёнку. Но могу быть не прав. В общем помогите заложить мощщей. -
Сколько полей и строк в таблицах? 1 таблица на 250 гигов это совсем не то, что 50 таблиц по 5 гигов )
-
А включите реакции в группе?
-
они выключены, потому что все проголосовали что бы их выключить.
потому что боты приходили и ставили миллионы реакшинов -
-
Точно, вспомнил про ботов
-
на вскидку 35 полей
из низ штук 12 Nesed типа
максимальная ыложенность 4 (скорее всего не больше 3)
есть желание таких 3 тбалиы рядом иметь для разных источников. -
Ну то есть 3 таблицы по 80 гигов примерно? То есть десятки миллиардов записей будет в каждой?
-
3 по 250
-
Просто надо же еще понимать, что вы хотите с этими данными делать, какие отборы проводить. Если просто count() по полям, то и 1 сервер справится, если что посложнее - уже думать надо.
-
думаю витрины запилим на одной такой сборке и клиенты будут запросы гонять - запросы по проще но частые
аналитики будут ковыряться на другом изолированном инстансе - тут будут посложней запросы -
-
-
Ну и опять же - есть ли у вас какие то агрегаторы уже над витринами? Какие-нибудь отдельные сущности c движками агрегации (Summing, Aggregate и т.п.)? Или все тупо в первоисточник лезть будут и uniqExact'ы считать ?
-
ничего замороченного пока. тупо запросы с агрегациями.
Если что мат вьюхи запилим чтобы еще быстрей результаты получали. -
В любом случае - просите как можно больше оперативки, клик ее очень любит. Я так понимаю, тестовая прогонка уже была с таблицей полного размера и все устроило?
-
был взят недельный объём и на нем проверена его погрузка и скорость построения отчестности. Секунды на отчетность. Загрузка тоже весьма-весьма.
Оперативки конечно надо, но нуджно в граммах )
Вот на мои игрушки сколько нужно на вскидку? -
Возьмите недельный объём, продублируйте 3 раза и сравните по скорости выбора. Время запросов может увеличиться заметно.
-
Просто 2 раза insert into tbl select * from tbl
-
Подскажите, пожалуйста, какая конфигурация предпочтительнее: 3 сервера по 2 инстанса кликхауса (шард и круговая репликация на каждом) или 3 сервера, на них все обернуто в кубер, внутри кликхаус оператор?
-
3 железки - 6 кх серверов?
-
Да
-
золотое правило, 1 железка - 1 КХ, круговая репликация это костылестроение в КХ
-
тогда без разницы, Кубер или не кубер.
-
сказано что not ready for production
при этом включено подефолту
и похоже что не работает , копии файлов в s3 остаются и не ужадяются -
-
-
это для s3 работает, а s3 путь одинаковый ?
т.е. копии не могут оставаться, они просто не могут появиться -
все одинаковое, на скрине видно что одинаковые файлы в одну кучу свалило,
сценарий был такой,
я заливаю сразу данные котыре под ttl move попадают,
все льюется прямо в s3 и в моменте 6G все занимало, но через какотое время партиции вроде схлопнулись, может сами а может потому что я OPTIMIZE запускал
и вот все остановилось в таком виде как на скринах -
вот что в zk , что бы это ни значило оно так сейчас выглядит
-
запускал запрос на вставку дважды, примерно такое INSERT INTO FUNCTION remote('x4-clickhouse:9000' ... SELECT * FROM ... SETTINGS insert_distributed_sync=1, insert_quorum=2
-
Привет. Подскажите, пожалуйста, дату в таком формате '2022-07-11T17:07:54.336111-0400', ClickHouse распарсить не умеет?
select toDateTime64('2022-07-11T17:07:54.336111-0400', 6);
не работает к сожалению. -
Если там лишние -0400, то можно, наверное, их просто отрезать?
-
https://clickhouse.com/docs/ru/sql-reference/functions/type-conversion-functions/#parsedatetime64besteffort Пробуйте эту функциюФункции преобразования типов | ClickHouse Docs
type-conversion-functions}
-
работает. спасибо
-
Можно ли в прагме в теле запроса переопределить max_query_size? как?
-
есть system.remote_data_paths там смотрите это файл с одной реплики или двух, может у вас optimize файлов наделал