- 01 February 2021 (117 messages)
-
Привет, настраиваю tls c сертификатом Lets encrypt
При подключении через клиента получаю такую ошибку
Code: 210. DB::NetException: SSL Exception: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILEDКонфиг
<openSSL>
<server>
<certificateFile>/etc/clickhouse-server/server.crt</certificateFile>
<privateKeyFile>/etc/clickhouse-server/server.key</privateKeyFile>
<dhParamsFile>/etc/clickhouse-server/dhparam.pem</dhParamsFile>
<verificationMode>none</verificationMode>
<loadDefaultCAFile>true</loadDefaultCAFile>
<caConfig>/etc/clickhouse-server/certs/chain.pem</caConfig>
<cacheSessions>true</cacheSessions>
<disableProtocols>sslv2,sslv3</disableProtocols>
<preferServerCiphers>true</preferServerCiphers>
</server>
</openSSL>Сертификат верифицируется если проверять через openssl
```openssl verify -CAfile ca.cer server.crt```Версия клика clickhouse:21.1.2.15
Что может быть не так? -
на клиенте тоже должна быть цепочка сертификатов в CA от let's encrypt
-
> Code: 210. DB::NetException: SSL Exception: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED
`
вы эту ошибку где получаете?
в clickhouse-client ? -
да в clickhouse-client
это значит мне в конфиге клиента указать caConfig с ca.cer от let's encrypt ? -
ну да, там параметры есть
ну еще можно попробовать ca-certificates проапгрейдить попробовать возможно у вас просто нет корневого сертификата Let's encrypt в OS в /etc/ папке -
Понял, спасибо
Буду пробовать -
-
это хардлинки? они могут быть при FREEZE
который обычно делается для backup -
Data Backup | ClickHouse Documentation
Data Backup While replication provides protection from hardware failures, it does not protect against human errors: acci
-
-
-
он сам не занимает места
если вы du -s -h делаете hardlink
то это он ссылается на старые партиции
которые возможно кто-то удалил -
-
Если добавить колонку с MATERIALIZED expr, то значение будет вычисляться при каждом SELECT ?
-
-
если я правильно всё понял при инсерте будет вычисляться expr и сохраняться.
старые данные будут вычисляться при каждом SELECT пока не произейдет merge этого PART -
Тогда в чем отличие от DEFAULT, он вроде тоже вычисляется при INSERT если не указан
-
как лучше сделать?
Пишутся события, домен отдельно не пишется. Фильтр по домену часто используется. Хочу сделать колонку c выражением domainWithoutWWW(page_url), по логике это должно ускорить запросы.
Идеально конечно при записи сразу слать домен отдельно, но если ограничиться только возможностями CH -
выше писали что отличие от дефолт только в том что дефолт выбирается по SELECT * и можно явно вставлять значение
-
-
Он исторические данные при мердже также дозаполнит?
-
вот
-
если верить @den_crane - то да
-
-
спасибо, вроде все ясно
-
Помогите, пожалуйста, с этим вопросом.
-
Joined.
-
партиционирвание сделано не для ускорения запросов в первую очередь, а для манипуляций
-
Понять что хардлинки не занимают место нелегко. Надо слелать du -sh на все каталоги кх, du учитывает что этот inode уже был и не включает в сумму второй раз. Ну и парты которые помержены будут занимать место конечно.
-
Опыты с составными ключами в partition by, подобные
PARTITION BY (toYYYYMMDD(event_date), event_type, event_region)
у меня ни к чему хорошему не привели. Во первых сильно стала проседать скорость, когда обьём данных накопился более-менее приличный, несколько лет. Партиций стало слишком много. И во вторых, пришлось увеличивать max_partitions_per_insert_block со 100 до 1000+, иначе при вставке репликация ставала колом, реплики просто не принимали такие запросы, и пока я не заметил, их в буфере Distributed накопилось уже приличное количество, и они бесконечно пытались раскидаться по шардам.
После увеличения max_partitions_per_insert_block оно, конечно, рассосалось, но деградация скорости стала такой, что просто перелили с простым партицированием по месяцам.
А дневные юзаются для кеш-таблиц, в которые триггером копируется из основных таблиц. Дневные - чтобы по крону раз в сутки можно было чистить кеш.
Вот такой опыт получился. -
Все правильно вы поняли.
Обычно невозможно напихать столько полей в partition by потому что будет очень много партов и замедляются инсетры. Чаще всего удается добавить в partitiin by какое-то одно низкокардинальное поле которое не хочется класть в order by -
storage-ch]# du -sh clickhouse/
14T clickhouse/
storage-ch]# du -sh clickhouse/shadow/
3.3T clickhouse/shadow/
правильно я понимаю, что в shadow что-то потярялось? -
Спасибо за ваш опыт, учту.
У меня просто есть таблицы, созданные с кривыми ключами сортировки, и там добавление условия по полю из ключа партиционирования ускоряет запросы иногда в десятки раз.
И есть много однотипных таблиц, которые хочу схлопнуть без потери скорости работы с ними. -
Денис, спасибо.
-
Joined.
-
Добрый день!
Удалось разобраться в чем проблема?
Мы как раз сейчас интегрируем catboost и ловим такую ошибку -
-
Неа, так и работало на файликах которые из тутора выкачал
-
Хех)
Ничего нового за два года
Спасибо! -
Господа, подскажите, что будет происходить, когда количество свободного места на диске упрётся в параметр keep_free_space_bytes, и перемещать с него данные уже некуда, ибо это последний диск в очереди storage_policy? Будут дропаться старые данные или всё станет колом и база станет read only?
-
Либо я не умею гуглить, либо документация тактично отмалчивается по этому поводу. Фраза keep_free_space_bytes — размер зарезервированного свободного места на диске. как-то не очень подробно раскрывает суть параметра.
-
du -sh clickhouse/*
-
Всем привет, подскажите плз
arrayFirstIndex будет пробегать по всему массиву или остановит итерации на первом элементе, который удовлетворяет условию функции ? -
ну так arrayFirstIndex же
-
с точки зрения кода функции - останавливает
-
Спасибо
-
-
кто-нибудь сетапил суперсет для кх ?
-
Ребят, всем привет!
Кто-то может посоветовать сис.админа, который развернет КХ на чистом серваке и настроит его оптимально под используемое железо? На серваке кроме КХ ничего не будет.
Возмездно конечно) -
Altinity же как раз для этого вроде
-
Подскажите пожалуйста, как правильно отследить какие запросы в CH отъедают проц? Перезагружаешь CH все работает нормально, потом через какое то время проц отъедается на 100 процентов. Версия 21.1.2.15
-
select * from system.merges
select * from system.mutations where not is_done
select * from system.processes -
Спасибо! Пока кого-то из РФ ищу)
-
альтинити работает РФ, но вроде такого не делает, вообще разовых задач не делает, только годовые контракты
-
Понял, спасибо
-
Парни, добрый день,
Альтер мат вью сумминг мерж еще нет такого, да? -
ручками надо, да?
-
Да ваще несложно это сделать, только вот серверов надо бы как минимум два.
-
А два зачем?
-
Сравнивать тюнинг, нет же абсолютных истин
-
да вроде и процессов 2-3 и там селекты в основном не большие. есть ли какие рекомендации по тюнингу для ускорения СН?
-
я в видео про MV показывал варианты кажется
-
Варианты, я помню и использую. Но там был намек что один чел делает "альтер"
-
Вот не сделал еще, да?
-
в смысле результат показал только запрос select * from system.processes ?
или что? -
да, именно так, только мой запущенный запрос select * from system.processes
-
Напишу в личку
-
он в тикете сказал что не будет. Им не нужно MV, у них только MV to, поэтому он запилит возможно совсем нечто иное
-
а cpu используется в этот момент?
что в логе КХ ? -
в логах ероров нет (
-
почему ероров ?
что кх пишет в лог в момент нагрузки на cpu ? -
Привет.
Подскажите, пожалуйста, как на практике реализуется работа с CollapsingMergeTree ? Меня смущает тот момент, что для затирания старой записи нужно вставлять её копию, но с другим знаком. Это значит, что данную копию нужно сначала залочить, потом прочитать, потом записать, потом снять блокировку. Это хорошо работает, когда подобные запросы льются через одного демона. Но как быть, если один демон не справляется и их нужно несколько пишут они одни и те же данные? -
1. залочить? в КХ нет локов.
2. не нужно копию, нужна запись с таким же ключом и -1 в sign
3. таких вопросов не должно быть, если вы не помните вне КХ был такой ключ или нет и вам надо выбирать, то вам не подходит CollapsingMergeTree, берите Replacing -
-
Ребята, привет.
Есть здесь Clickhouse девы из Украины? Может кому-то интересно будет рассмотреть предложение? -
Гениально
-
Всю базу тоже скиньте пожалуйста
-
) случайно вставил
-
гитхаб аккаунт есть?
там можно gist-ы cоздавать https://gist.github.com/den-crane/35c4a488f06ec29293d096970ef21693 -
спасибо за подсказку
-
Joined.
-
Вечер добрый!
Подскажите пожалуйста, как решить проблему с ALTER TABLE ... UPDATE ...
Отправляю запрос (реакция и на другие запросы такая же):
ALTER TABLE s_ko.funnel_crm
UPDATE
utm_source='test', utm_medium='test'
WHERE
projects_id=123
AND key IN ('crmLeads')
AND leads_id=1
В system.mutations.command:
UPDATE utm_source = 'test', utm_medium = 'test' WHERE (projects_id = 123) AND (key IN ('crmLeads')) AND (leads_id = 1)
А latest_fail_reason:
Code: 60, e.displayText() = DB::Exception: Table s_ko.crmLeads doesn't exist. (version 20.6.4.44 (official build))
В чем может быть проблема? -
Подскажите, пожалуйста, есть playground , который позволяет создавать свои таблицы? Тут https://play.clickhouse.tech/ пишет
DB::Exception: playground: Not enough privileges. To execute this query it's necessary to have the grant CREATE TABLE ON datasets.posts (version 20.8.12.2 (official build)) -
Подскажите почему agregationFunction sum и simpleagregationfunction sum выдают разные результаты?
-
ну баг ,
напишите AND key = 'crmLeads' -
ну ошибка в 6й строке, вы опечатались, у вас переполнение из-за неверного типа данных
В КХ все ОК, я проверял (правда я проверял не все типы данных) -
Пробовал, выдает такой же результат.
Также, пробовал ставить "key", key, key. Не помогает. -
Вопрос. А чем вызано наличие настройки max_table_size_to_drop равным по дефолту 50GB?
-
не верю, покажите AND key = 'crmLeads' ошибку и что в system.mutations
-
ничем, просто Алексей любит все обкладывать safe-limiter-ами, и 50ГБ просто довольно большая величина, выше которой ему некомфортно терять данные при случайном drop table
-
Ааа, я просто думал что там какие-то хитрые логики есть за этим, тогда окей
-
Был такой command, ошибка та же.
UPDATE utm_content = 'test', utm_term = 'test' WHERE (projects_id = 123) AND (key = 'crmLeads') AND (leads_id = 1)
В списке mutations было множество ошибок таких, начал их чистить и при повторной отправке этот запрос сработал.
Проверю остальные запросы.
Спасибо. -
`key`?
-
в любой вариации
-
да тут дело явно в IN ('crmLeads')
-
я проверю починено это или нет
-
20.6.4.44 естественно out of support уже давно
-
и кстати есть 20.6.11.1
-
не воспроизводится в свежих кх
https://gist.github.com/den-crane/47809d29e4850b9eb6c12add0d90c221 -
Запрос с IN тоже прошел.
Правда clickhouse обновил до 21.1.2.15, пока ковырялся.
Было похоже на то, что одна ошибка с IN не давала выполниться и остальным запросам. -
мм, смело. Я тестирую 6 месяцев перед апргейдом.
-
-
-
Joined.
-
Ребята, а не подскажите, что нужно в clickhouse отправлять в бинарном виде на порт 9000, чтобы провести корректный healthcheck ?
Надоела ошибка в логах.
<Warning> TCPHandler: Client has not sent any data. -
Например для FPM приводится пример проверки такого рода:
backend be_phpfpm
# ...
option tcp-check
# FCGI_BEGIN_REQUEST
tcp-check send-binary 01 # version
tcp-check send-binary 01 # FCGI_BEGIN_REQUEST
tcp-check send-binary 0001 # request id
….. -
Впрочем у меня нету полной уверенности, что это из-за tcp проверок.
Пардон, вопрос следует более детального изучения. -
Возможно поможет /replicas_status урл. Она 500 отдает в случае ошибок
-
Joined.
-
-
curl localhost:9000
Port 9000 is for clickhouse-client program.
You must use port 8123 for HTTP.
в логе
<Trace> TCPHandlerFactory: TCP Request. Address: [::1]:54946
<Debug> TCPHandler: Client has connected to wrong port.
<Debug> TCPHandler: Done processing connection. -
можно на go написать маленьку софтину, чтобы по 9000 select 1 (с пользователем и паролем) делать
-
(без пароля)
curl localhost:8123/ping
Ok. -
-
Смержиться если строки повторяются а за буфером replacingmergetree например
-
да у меня движок ReplacingMergeTree
данные разные но почему то он их схлопывает(( -
спасибо огромное, поменял движок
все начало писаться - 02 February 2021 (152 messages)
-
Привет, коллеги. Создал таблицу для вычитки из Кафки:
CREATE TABLE t ( message String )
ENGINE = Kafka
SETTINGS
kafka_broker_list = 'xxx:9092',
kafka_topic_list = 'xxx',
kafka_group_name = 'xxx',
kafka_format = 'JSONAsString'
После первого чтения (например так: select * from t), перестаёт читать, в логах ошибка:
<Fatal> BaseDaemon: (version 20.12.5.14 (official build), no build id) (from thread 2806) (query_id: 2d2d8a45-a70e-4947-9ea8-a1df253e6ef6) Received signal Segmentation fault (11)
<Fatal> BaseDaemon: Address: NULL pointer. Access: read. Address not mapped to object.
Вроде в более старых версиях была схожая проблема, но её устранили(?). Кто-нибудь сможет подсказать возможное решение? Заранее спасибо) -
Joined.
-
а разве эта таблица предназначена для чтения напрямую? materialized view к ней обычно прикручивают
-
Прикручивал, результат тот же(
-
-
в любом случае segfault быть не должно
-
Читал селектом, чтобы проверить, когда начинается проблема. Матвью тоже ведь читает из неё, только по тригеру.
Вообще сначала делал по инструкции из документации, но получал одну и ту же ошибку. -
Кстати, первый селект отрабатывает и отдаёт верный результат
-
это как раз не удивительно)
-
-
это не hard limit
база в readonly встанет тогда когда место реально кончится -
К кафке к тому же топику подключено много консьюмеров, сомнений в её работоспособности нет. Не может же из-за Кафки быть segfault?
-
segfsult не должен быть в любом случае
-
-
Joined.
-
-
кто-то сказал snowflake? :)
-
а, автоинкремент...
-
Joined.
-
Друзья, подскажите, пожалуйста, почему ReplacingMergeTree не склеивает записи.
Может ли это быть связано с тем, что в таблице есть поле DateTime Default Now()
? -
Это поле является частью Order By?
-
Нет, order by другое поле
-
CREATE TABLE oferta_test
(
idItem Int64,
sellerId Int32,
idCategory Int32,
offerName Nullable(String),
price Decimal(10, 2),
updated_at DateTime DEFAULT NOW('Europe/Berlin'),
INDEX idItem idItem TYPE set(0) GRANULARITY 4,
INDEX idCategory idCategory TYPE set(0) GRANULARITY 4,
INDEX sellerId sellerId TYPE set(0) GRANULARITY 4
)
ENGINE = ReplacingMergeTree()
ORDER BY idItem
SETTINGS index_granularity = 8192 -
Вот структура таблицы
-
Должно клеить по idItem, но нет..
-
Ну не должно, а может. Когда решит, что надо
-
Уже неделю жду ((
Optimize table тоже не помогает -
А в system.merges не висит?
-
Нет. system.merges пустая
-
Получилось побороть?
Тоже сыпет сотни логов. Бесят ) -
неа... но уверен что проблема решится если приложения будут обращаться к серверу по порту 9000 )
-
Добрый день! Подскажите, насколько правильно использовать не временные поля при партиционировании, а какие-нибудь относительно низкокардинальные поля? При том, что это низкокардинальное поле уже часть ключа сортировки. Чувствую, что здесь что-то неправильно, но не могу аргументировать в споре.
-
Неудобно удалять старые данные (если это вообще требуется)
-
ну это через TTL можно решить, не обязательно DROP PARTITION делать
-
главное чтобы ВСЕ запросы в КХ выбирались по этому ключу.
-
Зависит от задачи
главная цель партиций в том, чтобы у вас были разнесенные на диске наборы данных "не пересекающиеся"
и чтобы в каждой партиции данные из PK были размазаны равномерно
и чтобы куски данных внутри партиций (system.parts) имели на диске нормальный размер чтобы их быстро можно было full scan сделать если что...
то есть определение партиций для сканирования это первый этап
если партиций слишком много (десятки тысяч) а данные вы вставляете все равно "по времени"
то при вставке можете получить ошибку что слишком много мелких партов надо вставить в слишком большое кол-во партиций -
-
в рамках партиции
-
"full scan сделать если что" - это если вдруг надо сделать запрос мимо ключа сортировки? Или в каких случаях это ещё надо?
-
ну вот вы делаете запрос по полю которого нет ни в PRIMARY KEY ни в ORDER BY ни в PARTITION BY ...
будут паралельно тогда сканироваться все файлы <имя_колонки.bin> с распаковкой
и с применением SECONDARY INDEX data skip алгоритмом если вдруг вы CREATE INDEX сделали -
Да, это понимаю. Уточнил просто, вдруг есть ещё какие подводные камни.
Спасибо. -
Joined.
-
Привет ребят,
Я создал таблицу, в которой у меня есть столбцы с некоторыми идентификаторами.
Эти идентификаторы могут быть удалены в основной базе данных mysql, и я должен добавить их для каждого запроса CH в качестве фильтра (предложение NOT IN).
Что я могу использовать для этого хранилища удаленных идентификаторов?
Раз в неделю или месяц я хочу обновить эти удаленные идентификаторы в CH и удалить записи из основной таблицы CH.
признателен за любую помощь, спасибо! -
-
ну на стороне MySQL сделайте отдельную таблицу с этими идентификаторами типа (id, delete_date)
и сделайте на стороне ClickHouse
словарь CREATE DICIONARY с SOURCE MySQL
и выбирайте
SELECT ... FROM db.clickhouse_table WHERE dictGetOrDefault('db.dictionary','delete_date', tuple(id),toDate('0000-00-00')) = toDate('0000-00-00')
а потом через TTL или через мутации удаляйте
ALTER TABLE db.clickhouse_table DELETE WHERE dictGetOrDefault('db.dictionary','delete_date', tuple(id),toDate('0000-00-00')) != toDate('0000-00-00') -
тоже хороший вариант, можно collapsingMergeTree только
-
а потом через TTL удаляйте? должен быть калонка с настроенным TTL? или на любую калонку можно присвоить TTL ?
-
ALTER TABLE ... MODIFY TTL
-
Всем привет, есть какое-то решение?
было переименование таблицы
rename table table_name to table_name_old;
запрос упал из-за нехватки на сервере дискового пространства.
теперь получилось так, что файлы в дериктории для таблицы table_name_old есть, а самой таблицы нет.
DB::Exception: Target path already exists: /var/lib/clickhouse/data/db/table_name_old/
нагуглил решение с attach table, но оно не помогло, ошибка
DB::Exception: Table table_name_old doesn't exist
Буду рад любым подсказкам
version 20.4.7.67 (official build) -
можно на всю таблицу, также дополнительно можно на любые колонки
-
коллеги, такой вопрос, есть таблица, в ней есть парты, я хочу получить размер на диске только метаданных, т.е. размер парта минус размер всех bin файлов, есть такая возможность?
-
DESCIBE system.parts;
если там нет, то нет -
SELECT formatReadableSize(sum(bytes_on_disk)-sum(data_compressed_bytes)) FROM system.parts GROUP BY database, table, partitions
но что вы подразумеваете под "метаданными"?
mrk + secondary индексы? -
ATTACH table делал сокращенным образом - без определения полей
все решилось, когда в attach сделал определение всей структуры таблицы -
в принципе да, марки и индексы
сеичас попытаюсь проверить... -
-
-
Пойдет
PARTITION BY toStartOfHour(ts) -
спасибо, на это и смотрел.
листал историю чата, и часто упоминают, что в ЗК будет проблема при часовых партициях. в чем будет проблема? и будет ли она при хранении 3-х дней, потом удаление партици и заново. -
сколько данных
миллиадр строк в день? -
в ZK проблема не в том что партиции почасовые
а в том что партов может быть СЛИШКОМ много для синхронизации
когда делают почасовые партиции а данные вставляют каждый раз "за последний день"
и соответсвенно новые куски данных появляются в слишком большом кол-ве партиций...
ZK не любит когда кол-во транзакций очень большое...
но это крайние кейсы редко встречаемые -
в зависимости от того сколько у вас данных и как вы их вставляете, проблем c ZK у вас быть не должно
-
На самом деле с zookeeper и часовые партиции видимо проблема в этом
https://github.com/ClickHouse/ClickHouse/issues/3322znodes under /block_numbers seem to grow infinitely · Issue #3322 · ClickHouse/ClickHouseIn our cluster, we regularly dropping old partitions out of the table. However, today i check some of Clickhouse's znodes and look like things under /block_numbers dont seem to be removed. ...
-
от 30 до 100млн в сутки
-
Наверное тогда не стоит мучатся с часовыми
PARTITION BY toDate(ts)
ORDER BY (toStartOfHour(ts),...) -
Будет аналогично +-
-
IMHO тогда особого смысла делать почасовые партиции нет
если дата есть в ORDER BY
тогда оно равномерно по mrk файлам засечки сделает, и спокойно их фильтровать будет -
подневные партиции+в ключе сортировки на 1 месте?
-
Да, ну точнее даже вопрос, вы как фильтруете по дате в запросе?
-
да, дата есть в ключе сортировки
-
да, будет фильтр по датам
-
По датам только, по часам нет? (тогда toStartOfHour вам вообще не нужен)
-
-
по часам тоже фильтруем, но думаю будет реже чем просто запрос за последний день/два дня.
-
-
MergeTree(date-column [, sampling_expression], (primary, key), index_granularity)
Старый
https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/mergetree/#mergetree-query-clauses
Deprecated Method for Creating a TableMergeTree | ClickHouse DocumentationMergeTree The MergeTree engine and other engines of this family (*MergeTree) are the most robust ClickHouse table engine
-
вроде логично то что этот запрос выдает. спасибо
-
в ключе сортировки если указать id+toStartOfHour(ts) это будет лучше?
-
все запросы всегда идут с id и toStartOfHour(ts) ?
-
нет
id/toStartOfHour(ts) - 90/10 -
вообще ORDER BY поля лучше всего в таблице указывать от МЕНЬШЕЙ кардинальности к большей
то есть
toStartOfHours явно меньшую кардинальность имеет чем id
поэтому ее лучше сначала поместить
Данные лучше сжиматься будут в остальных полях -
Добрый день!
Подскажите по восстановлению бекапа в кластере
бекап делаю так alter table db.table freeze
рестор ALTER TABLE db.table ATTACH PARTITION ’11’
бекап из shadow/{{ increment }} кладу сюда /var/lib/clickhouse/data/db/table/detached/{{ increment }}
далее создаю бд и создаю 3 таблицы на каждой ноде clickhouse и после этого рестор
рестор отрабатывает со статусом - ok, но данных нет.
может еще что-то надо сделать? -
https://github.com/AlexAkulov/clickhouse-backup
посмотрите как тут сделаноGitHub - AlexAkulov/clickhouse-backup: Tool for easy ClickHouse backup and restore with cloud storages supportTool for easy ClickHouse backup and restore with cloud storages support - GitHub - AlexAkulov/clickhouse-backup: Tool for easy ClickHouse backup and restore with cloud storages support
-
если правильно понял на новых версиях кх движок атомик и там симлинки поэтому clickhouse-backup не работает на новых версиях
-
опс, да извините, вы правильно поняли
-
Подскажите, пожалуйста.
Есть кластер, состоящий из двух шардов. Над этим кластером создана схема, в которой лежит основная таблица, которая, соответственно, шардируется.
Хочется добавить в ту же схему ещё одну доп таблицу, но чтобы она не шардировалась, а просто реплицировалась на все ноды.
Такого эффекта можно вроде бы достичь, если при создании этой новой реплицируемой таблицы указать путь в зукипере, не содержащий имени шарда.
Это, вообще, рабочее решение или костыль? Может быть, есть другие способы? -
Спасибо.
Подобрал правильные параметры генерации и заработало отлично! -
Рабочее, мы используем - проблем нет
-
добрый день! А есть ли готовый мониторинг с аналитикой запросов в кликхаус, который метрики из query_log/query_thread_log сам заберет и разложит по полочкам, как сделано для постгреса в pgwatch2/powa4 или для MySQL в PMM?
-
-
а какую именно либу используете? я для Go нашёл такое: https://github.com/beinan/fastidGitHub - beinan/fastid: Snowflake ID generating in Go
Snowflake ID generating in Go. Contribute to beinan/fastid development by creating an account on GitHub.
-
Я про таблицу во всех шардах отвечал, про ID ничего подсказать не могу.
-
всем привет, а подскажите как лучше прочитать всю таблицу
Есть таблица
create table solder
(
id String,
number String,
cost Int32,
currency Nullable(String),
prize Nullable(Int32),
date_sold DateTime,
date Date,
game_id Int32,
user_id Int32,
session_guid Nullable(String),
session_id Nullable(String),
session_balance Nullable(Int32),
g_count Nullable(Int8),
is_free Nullable(Int8),
is_refund Nullable(Int8),
roundnum Nullable(String),
ip Nullable(String),
ua Nullable(String),
platform Nullable(String),
date_updated Nullable(DateTime),
is_real Nullable(Int8),
is_gt_max Nullable(Int8) default CAST(0, 'Nullable(Int8)'),
promotion_id Nullable(Int32) default CAST(0, 'Nullable(Int32)'),
is_suspicious_activities Nullable(Int8) default CAST(0, 'Nullable(Int8)')
)
engine = MergeTree() PARTITION BY toYYYYMMDD(date) ORDER BY (id, date, date_sold, game_id, user_id) SETTINGS index_granularity = 8192
как только делаю в запросе CASE, пишет Read Time out
select tx.user_id, sum(ts.cost-ts.prize), sum(ts.cost), count(ts.id), sum(case when ts.date between today() - 7 and today() then ts.cost - ts.prize else 0 end)
from solder ts
group by ts.user_id
Что в таком случае делать, спасибо ( -
-
потеряются некоторые последние инсерты
-
А сама БД не попортится?
-
нет
-
-
да с вероятностью 99.99999%
-
-
Вопрос про мутации
1) Были сделаные 225 мутаций вида update set cola = 2 where colb = 30;
2) Данных порядка 2.5 млрд
3) В system.mutations мутаций которые в процессе — нет, то есть все завершены
4) При этом select показывает еще старые данные
В чем может быть дело? Кроме того что я не правильно сделал select -
есть 38 багов на эту тему. Давайте начнем с версии КХ. И вы когда-нибудь делали рестор базы? Испольуете clickhouse-backup ?
-
1) 20.12.3.3
2) Не делал через clickhouse-backup, есть просто в tar.gz копии некоторых партов (нужных)
И в догонку еще, — это вот второй шард, а первый шард на нем так же порядка 2.5млрд но там все мутации висят в статусе что они "в процессе", уже минут 25, можно как либо понять может быть косвенно что процесс вообще идёт, ясно что реврайт партов не быстрый процесс -
На втором шарде селект стал показывать то что нужно !
-
Успех
-
>просто в tar.gz копии
рестор был? -
Рестора не было
-
В общем на втором шарде всё ок, на первом тупо висят как "в процессе" все мутации :(
-
таблица replicated?
все я запутался.
В system.mutations мутаций которые в процессе — нет, то есть все завершены
При этом select показывает еще старые данные
На втором шарде селект стал показывать то что нужно -
Таблица не replicated но на неё смотрит Distributed. Всего 2 шарда на каждому запущено было 225 мутаций. На одном - всё окей, на втором они висят в процессе выполнения. Я думаю что я просто зря сотрясаю воздух и надо подождать, там всё таки 1.2Тб данных
-
в system.merges видно мутации и %
-
% выполнения ??
-
да
-
А какая колонка?
-
progress
-
Нет такой у меня :(
-
describe table system.mutations;
database,String
table,String
mutation_id,String
command,String
create_time,DateTime
block_numbers.partition_id,Array(String)
block_numbers.number,Array(Int64)
parts_to_do_names,Array(String)
parts_to_do,Int64
is_done,UInt8
latest_failed_part,String
latest_fail_time,DateTime
latest_fail_reason,String -
Все закончилось успешно !
-
Я раньше времени начал волноваться :)
-
Но progress конечно был бы полезен, видимо это в более новой версии, либо я что-то не осиливаю
-
Есть довольно удобный гуёвый клиент heidisql.com . Но он не может подключиться с драйвером MySQL, ибо пытается выполнить несуществующую функцию CONNECTION_ID() .
Если есть пара секунд, полайкайте, пожалуйста, поддержку ClickHouse в этом клиенте: https://github.com/HeidiSQL/HeidiSQL/issues/135Clickhouse support · Issue #135 · HeidiSQL/HeidiSQLhttps://clickhouse.yandex/ https://github.com/yandex/clickhouse-odbc
-
ну вы и читатель епт
> в system.merges видно мутации и % -
Сорри :(
-
@den_crane может вы подскажите? версия кх 21.1.2.15
-
??????????
detached/{{ increment }}
?????? {{ increment }} ?????????
этот {{ increment }} это индефикатор бекапа. Его не должно быть в detached -
Должна быть папка store?
-
Или то что в store?
-
что за бред, откуда store ?
-
давайте по шагам на конкретных примерах
-
-
что вы понимаете под рестором? attach нужен
-
вот пример, то что в shadow
-
сейчас сделаю пример
-
ALTER TABLE db.table ATTACH PARTITION ’{{ increment }}’ - вот что для меня рестор)
-
вот тренируйтесь на этом примере
https://gist.github.com/den-crane/5ae44ec04961ec62286835c8798e2728atomic-backupatomic-backup. GitHub Gist: instantly share code, notes, and snippets.
-
понял свою ошибку, спасибо большое!
-
Joined.
-
а разморозить?
-
что? о чем вы ? unfreeze ? зачем это ?
это флаги -r-rw-- на файлах/партах.
Они не нужны не для чего. Яндекс облако кажется использует эту фичу чтобы не вести реестр партов которые забекаплены. -
A.s осталась без слияний
-
это не тоже самое, что SYSTEM STOP MERGES A.s?
-
да ща. нет конечно
-
вообще никакой связи. freeze просто создает хардинки, на мержи вообще не влияет
-
то есть новые куски будут появляться
-
но не в shadow
-
фриз создает моментальный снепшот партции или таблицы в shadow используя хардлинки
-
аааа, не очевидно про freeze, спасиб
-
контр-интуитивно
-
привет, как получить первый элемнт массива?
SELECT a FROM ... >>> ['aa', 'bb']...
SELECT a.1 FROM .. >>> Code: 43, e.displayText() = DB::Exception: First argument for function tupleElement must be tuple or array of tuple.:
в чем проблема? -
a[1]
-
a.1 это для туплов синтаксис
-
аааа! понял, спасибо! работает!
- 03 February 2021 (87 messages)
-
пока такого нет
-
если хотите, можете помочь улучшить
https://github.com/Altinity/clickhouse-operator/blob/master/grafana-dashboard/ClickHouse_Queries_dashboard.jsonAltinity/clickhouse-operatorThe ClickHouse Operator creates, configures and manages ClickHouse clusters running on Kubernetes - Altinity/clickhouse-operator
-
спасибо)
-
судя по названию, он только для кликхауса в кубернетисе?
-
Joined.
-
Joined.
-
какая из функций поиска подстроки самая легкая для CPU, если это корректный вопрос.
Второй вопрос имеет ли значение длина строки ? -
И третий вопрос, если сделать колонку с Materialized, сложить туда Категории (строки) и уже по ним делать выборку, они будут просто короче и меньше различных вариантов, это ускорит запрос ?
-
сейчас есть поиск подстроки в url для понимания что за категория страницы. И я думаю как это можно оптимиизровать
-
-
ну там можно взять JSON
и заменить
cluster('all-sharded',system.query_log)
на просто
system.query_log
или на
cluster('your_cluster_name_from_remote_servers_config_xml_section',system.query_log)
и можно без kubernetes использовать
только clickhouse-grafana плагин в grafana поставьте -
спасибо, попробую
-
не совсем понял про нарезает, складываете в массив что ли?
-
нет, беру первую часть урла и складываю в отдельное поле
ну типа
https://github.com/minio/minio/tree/master/docs/erasure/storage-class
раскладываю в колонки
minio minio tree master docs …minio/docs/erasure/storage-class at master · minio/minioHigh Performance, Kubernetes Native Object Storage - minio/docs/erasure/storage-class at master · minio/minio
-
-
ну на самом деле там под капотом ОЧЕНЬ много оптимизаций
если данные по system.parts распределены равномерно
тогда самый простой вариант это создать еще одну колонку у которой DEFAULT extract(URL, pattern) или extractURLParameter(URL, param_name) -
и еще урлы нормализую - переменные оттуда убираю. тоже индивидуально для проектов
-
просто extract(URL, pattern)
-
Спасибо, пойду тестировать
-
добавляю данные через http используя драйвер https://github.com/mailru/go-clickhouse:
Code: 164, Message: default: Cannot execute query in readonly mode. For queries over HTTP
подскажите что делать?GitHub - mailru/go-clickhouse: Golang SQL database driver for Yandex ClickHouseGolang SQL database driver for Yandex ClickHouse. Contribute to mailru/go-clickhouse development by creating an account on GitHub.
-
ClickHouse/ClickHouse tagged: v21.1.3.32-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.1.3.32-stable
Release notes:
ClickHouse stable release v21.1.3.32-stableRelease v21.1.3.32-stable · ClickHouse/ClickHouseClickHouse stable release v21.1.3.32-stable
-
Joined.
-
query - ro, exec -rw в этом драйвере
-
-
SELECT create_table_query FROM system.tables;
-
Спасибо!
-
что может ограничвать потребление опертивки при условии что CH в докер контейнере, смотрю по docker stats
Ситуация
- один сервак: контейнеру выделен лимит 64 гига оперативки, он использует 2, в простое и при запросах.
- другой сервак: конктенеру выделено 24 гига он использует 12 в простое -
Может и не надо больше?
-
не пойму почему на серваке где выдано меньше гигов, и база почти всегда в простое стоит, жрет оперативы больше чем база в которую регулярно идет запись и запросы
-
может и не надо больше, но почему то есть подозрение что ее что то ограничивает
-
Всем привет.
С чем может быть связана проблема, при которой запрос вида
select
main.value_1 as value_1,
main.value_2 as value_2,
main.value_1 as v1,
main.value_2 as v2
from (подзапрос as main)
выдаёт разные, отличающиеся на порядки и никак не связанные результаты в колонках value_1 и v1 ? -
dictionary по моему для этой задачи походят
-
Привет ребят, нашел странности в логах КХ
2021.01.18 22:54:34.868742 [ 19518 ] {} <Error> InterserverIOHTTPHandler: Code: 24, e.displayText() = DB::Exception: Cannot write to ostream at offset 4195414, Stack trace (when copying this message, always include the lines below):
0. DB::WriteBufferFromOStream::nextImpl() @ 0x9a4b360 in /usr/bin/clickhouse
1. DB::WriteBufferFromHTTPServerResponse::nextImpl() @ 0xe4aaca7 in /usr/bin/clickhouse
2. DB::HashingWriteBuffer::nextImpl() @ 0xe22227d in /usr/bin/clickhouse
3. DB::DataPartsExchange::Service::sendPartFromDisk(std::__1::shared_ptr<DB::IMergeTreeDataPart const> const&, DB::WriteBuffer&, bool) @ 0xe21c543 in /usr/bin/clickhouse
4. DB::DataPartsExchange::Service::processQuery(Poco::Net::HTMLForm const&, DB::ReadBuffer&, DB::WriteBuffer&, Poco::Net::HTTPServerResponse&) @ 0xe21b46a in /usr/bin/clickhouse
5. DB::InterserverIOHTTPHandler::processQuery(Poco::Net::HTTPServerRequest&, Poco::Net::HTTPServerResponse&, DB::InterserverIOHTTPHandler::Output&) @ 0xe4ae339 in /usr/bin/clickhouse
6. DB::InterserverIOHTTPHandler::handleRequest(Poco::Net::HTTPServerRequest&, Poco::Net::HTTPServerResponse&) @ 0xe4aea64 in /usr/bin/clickhouse
7. Poco::Net::HTTPServerConnection::run() @ 0x10c9c915 in /usr/bin/clickhouse
8. Poco::Net::TCPServerConnection::start() @ 0x10cd40df in /usr/bin/clickhouse
9. Poco::Net::TCPServerDispatcher::run() @ 0x10cd5af1 in /usr/bin/clickhouse
10. Poco::PooledThread::run() @ 0x10e06c99 in /usr/bin/clickhouse
11. Poco::ThreadImpl::runnableEntry(void*) @ 0x10e02bca in /usr/bin/clickhouse
12. start_thread @ 0x7ea5 in /usr/lib64/libpthread-2.17.so
13. __clone @ 0xfe96d in /usr/lib64/libc-2.17.so
(version 20.10.6.27 (official build))
2021.01.18 22:54:34.869191 [ 19518 ] {} <Error> ServerErrorHandler: Poco::Exception. Code: 1000, e.code() = 32, e.displayText() = I/O error: Broken pipe, Stack trace (when copying this message, always include the lines below):
0. Poco::Net::SocketImpl::error(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) @ 0x10cccd8d in /usr/bin/clickhouse
1. Poco::Net::SocketImpl::sendBytes(void const*, int, int) @ 0x10cce3e7 in /usr/bin/clickhouse
2. Poco::Net::StreamSocketImpl::sendBytes(void const*, int, int) @ 0x10cd3176 in /usr/bin/clickhouse
3. Poco::Net::HTTPSession::write(char const*, long) @ 0x10ca0233 in /usr/bin/clickhouse
4. Poco::Net::HTTPChunkedStreamBuf::writeToDevice(char const*, long) @ 0x10c8e15d in /usr/bin/clickhouse
5. Poco::BasicBufferedStreamBuf<char, std::__1::char_traits<char>, Poco::Net::HTTPBufferAllocator>::sync() @ 0x10c8f0b9 in /usr/bin/clickhouse
6. Poco::Net::HTTPChunkedIOS::~HTTPChunkedIOS() @ 0x10c8e3ac in /usr/bin/clickhouse
7. non-virtual thunk to Poco::Net::HTTPChunkedOutputStream::~HTTPChunkedOutputStream() @ 0x10c8ef2b in /usr/bin/clickhouse
8. Poco::Net::HTTPServerResponseImpl::~HTTPServerResponseImpl() @ 0x10c9e06f in /usr/bin/clickhouse
9. Poco::Net::HTTPServerConnection::run() @ 0x10c9c969 in /usr/bin/clickhouse
10. Poco::Net::TCPServerConnection::start() @ 0x10cd40df in /usr/bin/clickhouse
11. Poco::Net::TCPServerDispatcher::run() @ 0x10cd5af1 in /usr/bin/clickhouse
12. Poco::PooledThread::run() @ 0x10e06c99 in /usr/bin/clickhouse
13. Poco::ThreadImpl::runnableEntry(void*) @ 0x10e02bca in /usr/bin/clickhouse
14. start_thread @ 0x7ea5 in /usr/lib64/libpthread-2.17.so
15. __clone @ 0xfe96d in /usr/lib64/libc-2.17.so
(version 20.10.6.27 (official build))
Это может означать только одно - беды с диском? -
Всем привет! Есть тут эксперты по odbc-драйверу? Нормальная ли производительность, фулскан с винды через odbc-драйвер таблицы 1 млн строк и 472 столбца, занимает 1 минуту в формате RowBinaryWithNamesAndTypes? При этом пробовали через нативный clickhouse-client, там скорость в таком же формате около 12 сек. Упора в сетку/цп/озу нигде нет, ни на сервере ни на клиенте. Пробовали как с одной ноды дергать, так и с кластера в 2 и 5 нод, используя distributed таблицу, результаты примерно одинаковые +- 1-2сек, что наверное погрешность. Как-то ещё можно ускорить или всё-таки упор уже в драйвер ? В таблице в основном числовые значения
-
Коллеги SELECT timezone() выдает Europe/Berlin, сменил зону в конфигах и на самом сервере, однако ничего не поменялось, подскажите как поправить?
-
Рестарт нужен
-
CH перезапустил, сам сервак только не перезапускал
-
как менял таймзону на сервере? =)
-
timedatectl set-timezone UTC
-
В общем после рестарта сервера все работает
-
Всем привет. Подскажите, пожалуйста, а можно ли как-то сделать одну вьюху и для вставки и для выборки из существующей таблицы? (некий аналог переименования таблицы, что ли)
-
Joined.
-
-
что-то типа distributed engine?
-
-
Добрый вечер. Подскажите, почему такой запрос не выполняется? Просто висит в процессах и все? Пинг ходит с локал ну удаленный, бд/таблицы есть. Куда можно взглянуть?
Сервера должны быть прописаны в remote_server?
select * from remote('192.168.XXX.XXX:8123', default.test_tab2, 'XXX’, 'XXX’); -
Я думаю так нельзя делать
-
ну так не бывает ведь (надеюсь :)), возможность явно необходимая и как минимум через insert ...select создавая новую таблицу можно. Но довольно коряво выглядит, помню где то попадалось через правки метаданных, но не могу найти. Попытался в zookeeper индексы поудалять на стенде но толку нет.
-
Ну только если так
Вы спросили конкретно про альтер
Альтерить колонки из ключа сортировки нельзя -
А так создавайте новую таблицу и переливайте туда данные
-
порт 9000 должен быть
-
мда, попробую до утра подождать, может будут идеи у кого, как то печально выглядит, десятки gb туда сюда катать не очень хочется.
-
Да. Только не хочется создавать на всех шардах кластеры размером в один шард
-
десятки ГБ это 10-20 минут на все про все)
-
Это меньше часа работы
-
-
Боюсь приаттачить не получится, если структура таблицы изменится. Как себя должен повести кх когда увидит отсутствующую или, наоборот, дополнительную колонку?
-
да тут я явно не подумал... но в принципе можно попробовать перелить в какой -то Memory, удалить поле и уже залить в Distributed :) хотя тут конечно все плюсы сразу теряются.
-
Можно ли сделать MATERIALIZED VIEW которая будет обновлятся по заданаму периоду времени (например каждые 10 мин)?
-
средаствами КХ - нет, только кроном
если МВ маленькая в результате можно попробовать сделать вью и на нее повесить словарь но это так себе решение
ещё есть live view, но я про него не знаю -
привет! как вернуть null вместо 0 если элемента не существует в массиве?
a=[1,2,3]
SELECT arr[4] >> 0 NULL? -
SELECT [1,2,3][4];
-
Если в массиве не будет нулей то можно:
nullIf(arr[4],0)
иначе придется городить логику if(length(arr) >= x, arr[x], NULL) -
Oh nullif supported in CH! отлично, спасибо, нулей нет
-
было бы неплохо если добавить дефолт в arrayElement(arr, n, default)
-
CH не смог клиенту по http поток отдать, потому что клиент ушел
-
Что значит "обновляться"? MV обрабатывает только вставляемые в таблицу данные.
Можно сделать MV, которая будет писать в буфер, имеющий период вставки в следующую таблицу - 10 минут. Тогда результат обработки MV в результирующей таблице будет появляться раз в 10 минут. -
а curl через http с RowBinaryWithNamesAndTypes сколько дает?
-
можно переопределять
cat /etc/default/clickhouse
export TZ=Europe/Berlin
тогда нужен рестарт только КХ -
никак
-
8123 это нет тот порт. remote умеет только 9000 tcp, 8123 = http
-
нельзя
-
нет
-
спс, я уже понял, там ниже ответил сам себе)
-
пока тут, можно спросить.
Есть таблица, в ключе сортировки на первом месте id.
Выполняются регулярно запросы select * from tab where id in( и тут большой список id).
Как можно ускорить, если можно конечно? -
надо смотреть используется индекс или нет.
я бы просто запустил select * from tab where identity(id) in( и тут большой список id)
и посмотрел есть разница или нет в статистике запроса -
значительно хуже
set force_primary_key=1;
говорит не могу выполнять запрос( -
значительно хуже с identity ?
-
да
-
значит используется primary_key и уже ничего больше не выжать, ну или index_granularity но надо смотреть внимаетльно что за таблица и что вообще за воркфлоу.
-
правильно ли я понимаю, если ставлю такую настройку (set force_primary_key=1;), то запрещает выполнять если не используется ПК?
Нужно использовать весь ПК или можно только его часть? -
вы чето брешите
create table xxx( A Int64) Engine MergeTree order by A;
set force_primary_key=1;
select * from xxx where A in (1,2,3)
Ok.
select * from xxx where identity(A) in (1,2,3) ;
DB::Exception: Primary key (A) is not used and setting 'force_primary_key' is set.. -
sorry, неправильно выполнил последовательность команд
все как у вас, да -
Joined.
-
Подскажите пожалуйста, можно ли при создании базы данных указать ей место для хранения данных в соответствии с какой-то политикой хранения?
Хочу создать MaterializedMySQL на другом диске -
Joined.
-
Joined.
- 04 February 2021 (164 messages)
-
Есть несколко вопросов по Buffer таблице:
> Заметим, что даже для таблиц типа Buffer не имеет смысла вставлять данные по одной строке, так как таким образом будет достигнута скорость всего лишь в несколько тысяч строк в секунду…
Понимаю что это довольно условно, но имеется ввиду запись в одну таблицу или в общем по кластеру.
Сейчас есть одна табличка, в нее идет порядка 4k одиночных записей в секунду, можно ли обойтись Buffer?
Так же несовсем понятен смысл этого
> Если таблица назначения является реплицируемой, то при записи в таблицу Buffer будут потеряны некоторые ожидаемые свойства реплицируемых таблиц.
Может кто-то расшифровать? -
В конфигурации есть system.storage_policies
-
1 можно
2 у replicated таблиц есть фича -- дедупликация инсертов. Если инсерт совпадает до бита с одним из предыдущих, он будет пропущен.
буферная таблица склеивает инсерты, поэтому они не совпадают до бита, поэтому дедупликация инсертов не работает -
-
да
-
Благодарю .
-
например https://github.com/ClickHouse/ClickHouse/issues/17775#issuecomment-738880540 SimpleAggregateFunction(sum, UInt64) CODEC(T64, LZ4)
-
создать новую таблицу с новой структурой и сделать INSERT INTO ... SELECT...
проверить запросы
потом удалить старую таблицу
новую переименовать если надо -
Joined.
-
-
16 сек) и с него сетка до 2гбит нагружается. А когда odbc драйвер, то 1 минута и сетка примерно до 500мбит нагружается
-
odbc драйвер как измеряли? на каком то языке? или time isql ?
-
У нас есть bi, который умеет через odbc подключаться. Смотрел по логам время которое тратится на сам запрос, без учёта отрисовки данных. А что, через curl производительность должна быть такая же как и через odbc драйвер?
-
нет, производительность BI может быть не той что вы ожидаете и узким местом может быть не драйвер, а то, как BI его использует
time isql ...
что говорит? -
Это не смотрели. У нас все клиенты виндовые. Я так понимаю isql надо с линуха ?
-
Год назад были похожие проблемы с производительностью при выборе большого кол-ва строк из ClickHouse при помощи виндового odbc драйвера. Дамп трафика показал что используются очень маленькие пакеты для пересылки данных. В итоге просто написали кастомный коннектор для своего BI, обращающийся к ClickHouse по http. Это позволило значительно ускорить процесс получения данных.
-
Симптомы были похожие. Ни где затыка вроде нет, а запрос выполняется оочень медленно при большом кол-ве строк в результатах запроса.
-
А что у вас за bi, если не секрет? Я ещё хочу покопаться и выяснить, может действительно наш bi не очень хорошо работает с драйвером и из за него проблемы
-
QlikView
-
ой точно
под винду компилируется вот это
https://crates.io/crates/odbc-tools
могу собранные .exe положить куда нибудь -
Буду благодарен)
-
Joined.
-
/report
-
https://mega.nz/file/LUw0DZAB#1H7raEbeDno7jZjIMaV6zGQU9Z4-fNNTzzCh1BXXtRE
драйвер ставил последнюю версию с github
советую поставить какой нибудь cygwin или git-bash
и в нем запускать как
time odbc-query.exe "DSN=clickhouse_dsn" vertical "SELECT number FROM numbers(1000000)" > /dev/null -
драйвер 64bit ставил
clickhouse у меня поднят в docker + wsl2 с пробросом портов
поэтому localhost -
-
Joined.
-
получилось что нибудь замерять?
-
Друзья, подскажите пожалуйста. Есть такого вида запрос SELECT port_id,
ip_address,
count(*)
FROM external_ips
WHERE (sample_time >= '2020-12-06 00:00:00' AND sample_time <= '2020-12-06 23:59:59')
GROUP BY port_id, ip_address;
Запрос просто делает аггрегацию на определённые сутки. А если я хочу допустим сделать за месяц выборку, с аггрегацией по суткам, можно как-то кликхаус заставить выдать мне данные сразу аггрегированные по суткам за каждый день месяца? Не могу что-то собразить. Цель вообще сделать materialized_view -
Ну если есть колонка с днями, используйте её. Если нет, то можно взять toDate(sample_time)
-
SELECT toDate(sample_time) as date,
port_id,
ip_address,
count(*)
FROM external_ips
WHERE /* период */
GROUP BY date, port_id, ip_address; -
Спасибо огромное
-
в группировку можно свой аггрегат передать
-
Добрый день. Подскажите, пожалуйста, можно подключить базы из примонтированных устройств (разные диски одного сервера)? Можно ли их примонтировать в /var/lib/clickhouse/...?
-
-
Запрос в MV выполняется не над всей таблицей, а только над вставляемым куском данных. Но да, каждый раз.
-
MV это AFTER INSERT TRIGGER
который вещается на "таблицы"
таблицы которые ты указываешь как SELECT ... FROM ... в SELECT для MV
там будет браться не все данные всех таблиц, а только какая то одна в которую пришел INSERT
и работать этот SELECT будет только с куском данных а не со всей таблицей
то есть делать MV в котором JOIN и куча других тоже изменяющихся таблиц, так себе идея
делать MV над 1й таблицей + dictGet из словарей, уже лучше
делать MV + JOIN на неизменяемые таблицы, тоже норм. но сильно зависит от скорости JOIN -
Вообще идея в том что у нас сейчас есть таблицы, куда семплы пишутся каждую минуту. Хотел просто аггрегацию семплов по суткам сделать и писать в отдельную таблицу, что бы потом оттуда данные брать по датам быстренько, а не шерстить 1440*30*N записей когда нужно за месяц данные собрать. Получается всё равно проще раз в сутки по расписанию делать чтение и запись в эту таблицу данных за последние сутки чем делать MV =\
-
Можете с помощью MV копировать данные в другую таблицу с движком AggregationMergeTree, где они фоном будут агрегироваться по дате, например.
-
Звучит как план. Если MV будет туда только новые данные докидывать, то прям супер
-
нет 1 в 1 нормально сделайте MV, он для даунсемлинга вполне норм подходит
сделайте таблицу T2 Engine=AggregationMergeTree (читайте в доке как)
сделайте CREATE MATERIALIZED VIEW MV TO T2 ... SELECT ... FROM T1 ... GROUP BY ...
получите искомый даунсемлинг
но запросы из таблицы T2 все равно делайте с GROUP BY -
Спасибо большое!
-
господа инженеры, подскажите, пожалуйста, я чет даже не пойму с какой стороны подступиться
есть у меня запрос, который возвращает что-то подобное
┌──────time───────────┬──qpm─┬──m─┐
│ 2021-02-04 12:31:00 │ v1 │ m1 │
│ 2021-02-04 12:31:00 │ v2 │ m2 │
│ 2021-02-04 12:31:00 │ v3 │ m2 │
└─────────────────────┴──────┴────┘
и хотелось бы как-то, гм, транспонировать эту таблицу в вот такое:
┌──────time───────────┬──m1─┬──m2─┬─m3──┐
│ 2021-02-04 12:31:00 │ v1 │ v2 │ v3 │
└─────────────────────┴─────┴─────┴─────┘
(число этих измерений m1, m2, … mN в идеале произвольное, но сойдет и фиксированное N)
сам запрос https://pastebin.com/tQaD5StdSELECT toStartOfMinute(ts) AS time, count(query_time) AS qpm, que - 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.
-
select groupArray(n) arr_n, arr_n[1], arr_n[2], arr_n[3] from (
select number n from numbers(3)
) -
-
Да, я сразу на своей таблице пытаюсь проверить, но результат вообще не радует уже пару минут крутится, сетка всего на 30 мбит грузится, без vertical можно ? Как сделать вид «как есть»? Просто у меня куча столбцов и при вертикале он каждый столбик в строку записывает видимо
-
никак... значит rust еще тупее чем остальное =) извините что не в ту стороне отправил
есть еще
https://github.com/microsoft/ODBCTest
он вроде в комплекте MDAC поставлялся
но я что-то не могу найти MDAC на мракософтmicrosoft/ODBCTestApplication for testing ODBC Drivers and ODBC Driver Manager - microsoft/ODBCTest
-
Печаль) попробовал ещё json-array, сетку уже получше до 150-170 мбит грузит, но все равно слабовато выходит, нужен формат как есть )
-
гм, но это вытаскивает в строки значения того, что в groupArray(), а мне нужно значение в соседнем столбце
-
группируйте по нужному столбцу
-
я что-то не пойму, как именно надо группировать
-
сделайте тестовый пример на числах
-
да, я вот сделал https://pastebin.com/cAmxY1kbqan-test-cluster-dca-lobod-pilor :) SELECT now() as ts, number AS k, number*2 as - Pastebin.com
Pastebin.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.
-
Joined.
-
Подскажите, пожалуйста, как безопасно дропнуть базу данных не стартуя КХ сервер?
-
select ts
, groupArray(k) arr1
, arr1[1] k1
, arr1[2] k2
, arr1[3] k3
, groupArray(v) arr2
, arr2[1] v1
, arr2[2] v2
, arr2[3] v3
from (
SELECT now() AS ts,
number AS k,
number * 2 AS v
FROM numbers(3)
)
group by ts
выбирайте -
О, спасибо!
я пробовал группировать по v но видимо что-то пошло не так 🙂 А есть вариант салиасить колонки значениями из arr1? -
-
если только динамически
-
/stat@combot
-
mv /var/lib/clickhouse/metadata/database /tmp/
systemctl start clickhouse-server
ну и потом данные из /var/lib/clickhouse/data/database/
тоже куда нибудь перенести
а чем вас обычный DROP DATABASE не устраивает? -
без старта, можно метаданные грохнуть
-
Сервер не стартует из-за неправильного создания таблиц с кафкой, да, тоже вот так почистили
А в Зукипере нужно ли чистить пути -
Используйте политики хранения
-
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.
-
создать аналогичную пустую таблицу, остановить сервер, подменить данные, запустить сервер, drop table
-
Данные не важны. Мне просто нужно с этими же именами таблиц пересоздать по-нормальному. Думаю что раз мета хранится в КХ - то ничего страшного. Ну или не удастся создать так как пути такие в Зукипере уже есть
-
почему нельзя взять из show create tname, drop table, создать заново?
-
при создании таблицы указать другой путь зукипера
-
если не удалилось
-
Не понял вопрос :).
Я накатил миграции, где из-за неправильно конфигурации Кафки сервер упал и не может стартануть. Для этого пришлось чистить директории. Но насколько я понимаю, для distributed таблиц в зукипере созданы пути, которые читсить очень неудобно. Вопрос мой сейчас в том что если не менять пути в зукипере - даст ли КХ пересоздать эти же самые таблицы после старта сервера. Потому что их пути основаны на названии базы и таблиц вроде как. А названия хочется оставить теми же самыми -
distirbuted таблицы не используют ZK
вы с ReplicatedMergeTree не попутали? -
попутал, да)
-
Привет.
Меня зовут Денис и я работаю в ООО Топвизор. Публикую здесь это объявление с разрешения администратора этого чата. Нам необходим функционал, которого сейчас нет в ClickHouse. К сожалению, кастомная разработка требует саппорта уровня Essential. Вход туда стоит 22 000 000 миллиона рублей в год. Думаю, что разработка может стоить намного порядков дешевле. Уверен, функционал будет полезен не только нам, но и сообществу.
Итак, мы используем ClickHouse и нам не хватает такого функционала:
В MySQL есть понятия UDF - пользовательские функции, написанные на Си
Разыскивается специалист, который сможет добавить такие функции в CH.
Необходимо разработать программу, которая при запуске смотрит в папку и подключает необходимые классы. А в самой программе будет подобный код:
callUDF('filename', 'args')
==
Мы не знаем точно, сколько может стоить такая работа. По поводу сроков выполнения тоже нет определенного понимания. Если вы готовы взяться за эту работу, пожалуйста, напишите мне в личку или на почту den@topvisor.com для обсуждения сроков и стоимости работы.
Спасибо. -
если у вас есть в ZK path Такая штука как {uuid} то это будут новые пути при создании новой таблицы ReplicatedMergeTree с тем же именем
-
Нет такого, я бы не спрашивал будь пути с некой генерацией имени)
-
попробуйте с китайцем пообщаться из этой презентации?
https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup33/udf.pptxClickHouse/clickhouse-presentationsPresentations, meetups and talks about ClickHouse. Contribute to ClickHouse/clickhouse-presentations development by creating an account on GitHub.
-
тогда страдать
-
-
Попробую, спасибо
-
партицирование это еще один min_max индекс но гораздо БОЛЬШИХ диапозонов
по нему ищется в первую очередь если ваше поле есть в PARTITION BY
только выражение PARTITION BY должно по типу совпадать с полем таблицы...
то есть toYYYYMM это на самом деле Integer а не дата
и искать по дате тогда тоже надо через WHERE toYYYYMM() чтобы партиции быстро отсекать
а вот toStartOfDate это дата и тогда поиск по date BETWEEN .. AND будет по партициям сначала использоваться без конвертации
=) если ваша дата есть в ORDER BY
или PRIMARY KEY
и
то это итак фактически и есть min_max индекс и по нему собственно говоря и ищутся нужные куски данных -
понял, спасибо
да, дата есть ключе сортировки -
тогда CREATE INDEX не нужен
-
спасибо)
-
По поводу второго это относится только ко вставкам из buffer, правильно? Или при вставке из того же rabbitmq ожидать такого же поведения?
-
rabbitmq по другому работает.
buffer пересортировывает инсерты которые вы повторяете с клиента, а повторяете по причине timeout / сетевой проблемы.
rabbitmq engine выбирает из очереди, собирает блок, и делает инсерты сам, и повторяет сам внутри до успеха. -
а он при этом ack посылает в очередь что обработал ДО INSERT или после?
и где он блок хранит? на диске? -
Если я правильно понимаю, мне достаточно добавить к buffer таблице уникальное поле например с uuid чтобы такого не случилось, а в репликатед таблице это поле не обязательно должно быть
-
я не смотрел, наверное как в кафке, ack после успеха инсерта, блок в памяти, зачем на диске
-
все неправильно поняли. Дедупликация инсертов это вообще не про это, читайте доку про репликацию.
-
кстати точно такую же дедупликацию вроде уже должны были присобачить в обычной mergetree, поищу
-
Joined.
-
о как, больше года раскопки https://github.com/ClickHouse/ClickHouse/pull/8467 , чудеса такая мелкая фича
-
всем привет
можно ли пересчитать данные в матвьюшке?
у нас есть матвьюшка, она хранит счетчики записей в основной таблице по минутам, но она стала как-то странно считать записи
после пересоздания все стало нормально
вот 2 запроса с агрегацией по часам - до и после пересоздания
версия 19.8.3.8
events_importance
┌─count─┬───────────────start─┐
│ 194 │ 2021-02-02 06:00:00 │
│ 7 │ 2021-02-02 04:00:00 │
└───────┴─────────────────────┘
events_importance после пересоздания
┌─count─┬───────────────start─┐
│ 122 │ 2021-02-02 10:00:00 │
│ 16 │ 2021-02-02 08:00:00 │
│ 10 │ 2021-02-02 07:00:00 │
│ 12 │ 2021-02-02 06:00:00 │
│ 21 │ 2021-02-02 04:00:00 │
│ 8 │ 2021-02-02 03:00:00 │
│ 4 │ 2021-02-02 02:00:00 │
│ 4 │ 2021-02-02 01:00:00 │
│ 4 │ 2021-02-02 00:00:00 │
└───────┴─────────────────────┘
итоговое число записей одинаковое, но распределение совершенно разное -
матвьюшка AggregatingMergeTree, основная таблица MergeTree
матвьюшка считается как
SELECT
countState() AS count,
toStartOfMinute(toDateTime(time)) AS time,
importance,
toDate(time) AS _date
FROM events
GROUP BY time, importance -
Спасибо
-
добрый вечер. сервер КХ был перезапущен. штатно.таблица реплицируемая. сейчас сервер не запускается с ошибкой DB::Exception: Suspiciously many (152) broken parts to remove.: Cannot attach table. правильно я понимаю, что я могу эти куски <Warning> DB.TABLE: Detaching stale part /var/lib/clickhouse/data/DB/TABLE/610766fc0a3e72b7376196f9f9251b7a_1024111_1024332_7_1024651, which should have been deleted after a move. That can only happen after unclean restart of ClickHouse after move of a part having an operation blocking that stale copy of part. перетащить в другую папку?
-
Добрый вечер! нет ли в КХ готовых конструкций для 7 day rolling average?
-
тапа avg(value)
over (order by date asc
rows between 6 preceding and current row) as avg, -
/stat@combot
-
-
Это всё ещё в разработке. https://github.com/ClickHouse/ClickHouse/issues/17623Roadmap 2021 (discussion) · Issue #17623 · ClickHouse/ClickHouse
This is ClickHouse roadmap 2021. Descriptions and links to be filled. It will be published in documentation in December. Main tasks Provide alternative for ZooKeeper Implementation of a server with...
-
понятно, тогда через подзапросы
-
Этого не может быть, потому что не может быть никогда?! Но есть.
Здравствуйте! Столкнулся с воспроизводимой ситуацией, когда запросы через Distributed таблицу к system.settings соседних серверов ClickHouse возвращают значение параметра(ов), которое когда-то на этом сервере было установлено, но с тех пор давно изменилось.
Как будто бы старое значение где-то залипло или закешировалось. -
Подробнее.
Тестовый кластер из 3 серверов.
Над часто востребованными таблицами (system.merges, system.replication_queue и т.д.) из system у меня Distributed таблицы (самое простое - 3 шарда по штуке на сервер, без реплицирования), чтобы из любой точки стенда одним запросом получить полную картину.
Разбирался с причинами неких неполадок с межсерверным взаимодействием (в логах непрерывным спам много раз в секунду события <Trace> HTTPCommon: Failed communicating with {ANOTHER_HOST} with error 'connect timed out: {IP}.61:9009' will try to reconnect session . на стенд идёт фоновая нагрузка примерно 100-200 тыс. событий в секунду).
Предположил, что надо покрутить параметры http_%_timeout, в частности значительно увеличить http_connection_timeout. (Поиск по этой группе показал, что некоторые его c 1 и до 15 поднимали).
На одном из серверов сперва установил (в конфиге профиля default-пользователя) http_connection_timeout в 10, потом в 2, потом закомментировал, тем самым восстановив значение по умолчанию - 1.
И локальный запрос этого параметра подтверждает, что значение параметра теперь дефолтное. -
-
-
-
это из-за pooling.
живой конект живет в пуле и выдается разным запросам, параметры у него такие какие были в момент его рождения. -
раньше пула не было, поэтому проблемы такой не было
-
потом добавили пул и обновление параметров уже непролезло в абстракции, дизайн
-
-
хм, INNER JOIN vOwen AS past ON (past.Date >= (vOwen.Date - toIntervalDay(6))) AND (past.Date <= vOwen.Date) не ест
-
JOIN ON inequalities are not supported
-
UDF в виде функций на C или C++, работающие прямо в пространстве процесса, вряд ли будут реализованы, так как это очень небезопасно и делает очень сложной отладку чужих инсталляций.
Сейчас рассматриваются другие решения, сейчас скину короткое описание... -
Там пять вариантов:
1. Простые функции в виде SQL выражений - композиций других функций. При включении compile_expressions может быть даже нормальным. Полезно для мелких вещей. Есть вопросы - как лучше их задавать, будут ли полиморфные функции. -
2. Функции в виде подключаемых бинарников, работающих в режиме streaming. Похоже на https://github.com/ClickHouse/ClickHouse/issues/14528Variant of executable dictionary source with pool of processes. · Issue #14528 · ClickHouse/ClickHouse
Executable dictionary runs a program (spawns a child process) for every block to process (typically 65536 rows), pipes data to its stdin, reads data from stdout. Program can work in streaming fashi...
-
Это варианты - минимум.
-
Первый ок, но мало что можно сделать с его помощью.
Второй позволяет всё, что угодно, но не очень эффективный. -
3. Функции в отдельных процессах (скомпилированных бинарниках), которые используют shared memory для передачи данных столбцов и пайпы для сигнализирования. Недостатки: - сложно сделать, придётся выделять аллокатор у столбцов, чтобы уметь аллоцировать в shared memory; - очень сложно для пользователей, никто не будет использовать, но может быть базой для более простых вариантов.
-
4. Функции, работающие в адресном пространстве процесса, но написанные на безопасном языке. Скорее всего на Rust. Недостатки - продумывать и выделять интерфейс для доступа к данным столбцов. Никто в нашей команде не знает Rust. Но полезно для популяризации.
P.S. Python, Go - небезопасные по факту. Про Rust не уверен. -
5. Использование какого-то интерфейса из Apache Arrow для взаимодействия.
-
А какие вообще юз кейс запросы были ?
-
Получается обычными функциями в запросе нет возможности получить необходимый результат эффективно ?
-
Иногда просят то, что подходит под пункт 1. То есть, запомнить композицию SQL выражений как функцию.
Но чаще просят в общем виде - чтобы подключать сложные функции, непонятно какие. -
Да, в SQL трудно с control flow, сложную логику не напишешь...
-
Ещё сложнее, когда функции имеют не только логику, но и зависят от своих данных-справочников.
-
Под это идеально подойдёт пункт 2.
-
Пример: функция для перевода hostname в IP-адрес. То есть, она медленная, ходит по сети куда-то... Но значения можно кэшировать. Кстати, это реализуемо уже с помощью executable словарей.
-
Или более простой пример - по номеру банковской карты определить тип карты, банк, проверить корректность... там простая функция должна быть, но на SQL неудобно.
-
Ну так он же пишет ошибку - джойны не умеют в неравенства.
Вместо этого делайте from table1 a, table2 b where a.val = b.val. -
да, уже в процессе, спасибо!
-
В смысле a.val > b.val. Ну вы поняли)
-
это кстати будет cartesian product тормозной
-
берите словарь range_hashed
-
это нереальная задача, скорее можно реализовать конретные функции которые нужны
-
Привет! Есть табличка с кликами на айтемы, хочу считать агрегаты по item_id в materialized view и периодически выгребать изменения из нее сторонним сервисом. Для этого нужно еще хранить время последнего изменения для каждого айтема. AggregatingMergeTree решает задачу, но агрегатную функцию нельзя поставить в условие фильтрации, а делать вложенный запрос кажется накладный, т.к. будет вычисляться агрегат по всей таблице. Какие есть пути решения?
-
что-что?
типа вычислять item_id max(updated_at) и потом max(updated_at) >= today - 7 ? -
проблема не в аггрегатной функции, а в несмерженных строках
в общем-то для max можно использовать simpleAggragateFunction
или делать finalizeAggregation для AggragateFunction -
Joined.
-
а есть какой-то хитрый способ выбрать все значения LowCardinality столбца?
у меня самое быстрое получилось через select col from table group by col, но оно все равно сканирует всю табличку, может как-то можно доступиться к самому dictionary, который хранит значения? -
ах, вопрос снимается https://github.com/ClickHouse/ClickHouse/issues/4670Faster distinct query query of low cardinality columns · Issue #4670 · ClickHouse/ClickHouse
In our scenario, we have some columns defined as low cardinality string type. The total number of the distinct values are no more than 10K. The values cannot be predicted. When query the distinct v...
-
нету , хотели сделать отдельную функцию которая только словари смотрит но не сделали
-
т.е. проблема в том что
select col from table group by col
читает словари dict -- очень маленькие файлы и .bin -- очень большие
select col from table group by col
под капотом возможно выполняется более сложный код который проверяет есть права на строку или нет, поэтому заходит в bin -
Денни, добрый... что там у вас... день... Не проконсультируете по Hetzner...
пачка серверов, пишет в енж буфер, который сливается в null, оттуда МатВью в часов суммариМерж, оттуда матвью дневной суммариМерж. В часовом пара миллиардов за день.
Сейчас стоит VPS 9-ти ядерный. И вроде как все хорошо, но иногда что-то с сеткой в ДЦ или что-то еще. И я начинаю видеть вставки в буфер табл висящую минуту... две...
Вот подкмал сменить VPS на реал серв. Есть какие-то советы по выбору? ПРосто обидно будет взять AX61-NVMe который будет все время спать -
КХ сервер один
-
VPS не проверял, с железками нет проблем.
Там конечно с сетью чудеса бывают, и сыплются ошибки зукипера, но ничего особо страшного
да он стоит 100 евро , я бы взял , это же копейки по сравнению с вашей зарплатой
сколько VPS стоит? -
один
-
цена какая? 1 евро?
-
Один VPS, но мы сейчас в Contabo
-
стоит 30 евро, чтоли
-
уже неск лет работает, но тут видать достигли лимита
-
ЗК не ставил пока, пока резерв просто на друг сервер
-
а памяти сколько у VPS ?
-
64Г
-
мне нравятся
ax61-nvme 128 GB DDR4 ECC / 2 x 1.92 TB NVMe за 100 евро это даром
я использую -
а по поводу "сетью чудеса бывают" - вот у меня сегодня такое чудо в Contabo. Так я аналог не получу у Hetz?
-
да,я его уже в корзину сунул... потом решил спросить
-
Ну всякое бывает, у меня в хетцере однажды свитч сгорел к моему серверу, ну полчаса-час его меняли.
-
>чудеса бывают
вы не заметите скорее всего.
там просто летенси иногда вырастает, и пакеты дропаются, это критично для ZK, у него особые требования.
ничего страшного в общем-то, все работает годами -
А ну ок, спасибо. Пакет дропнется - я перешлю. ДЦ любой можно - что Финка что Германия? Илии всеже немцев?
-
все равно, что ближе по пингу / расстоянию
-
Спасибо
-
у вас поля у AggregatingMergeTree неправильные в order by
и _date вам не нужен
ДОЛЖНО БЫТЬ ТАК AggregatingMergeTree partition by toYYYYMM(time) order by (importance, time) - 05 February 2021 (105 messages)
-
Коллеги, привет.
Пробую эксперементальную фичу MaterializeMySQL
Пока clickhouse вычитывает данные с Mysql все работает, как только заканчивает, доступ к таблицам пропадает
DB::Exception: Access denied for user reader (version 21.1.3.32 (official build)) (from [::1]:60458) (in query: select count(*) from test_database.test_table;), Stack trace (when copying this message, always include the lines below):
Подскажите, кто пробовал, у кого получилось? Может для Мускуля какие-то особые права нужны (хотя выставил все что можно) -
MaterializeMySQL -- Вот так, с помощью нехитрых приспособлений буханку белого (или черного) хлеба можно превратить в троллейбус.
-
нет
Матвьюшка сама по себе ничего не хранит
это AFTER INSERT TRIGGER
либо в .inner таблицу *MergeTree
либо в отдельную *MergeTree таблицу если указан CREATE MATERIALIZED VIEW ... TO db.table
пересчет делается удалением данных из TO или .inner таблицы и повторной вставкой через INSERT INTO ... SELECT .. GROUP BY ... -
а что значит "заканчивает вычитывать"? связь с MySQL сервером рвется?
-
В Mysql есть данные.
После создания БД с движком MaterializeMySQL - данные перекачиваются в CH.
В процессе (через несколько минут) вылетает ошибка MaterializeMySQLSyncThread: Code: 100, e.displayText() = DB::Exception: Access denied for user
И далее все запросы к данным вылетают с подобной ошибкой. -
ну там в логах то наверное выше должно быть еще какие то ошибки со стороны MaterializedMySQL что у него какие то ошибки репликации
SHOW SLAVES
на MySQL
что показывает?
есть там коннект от clickhouse сервера и активен ли он? -
-
Всем привет, подскажите пожалуйста за что отвечает ОСный процесс clickhouse-watchdog рядом с /usr/bin/clickhouse-server?
-
Joined.
-
Всем привет. Делал тут инсерт 10к записей раз пару секунд и словил такую ошибку
"Too many partitions for single INSERT block". Партиция у меня на дату по дням стоит и очевидно что в пачке из 10к будет куча одинаковых дат, так как пишу события по дням.
Нормально ли будет увеличить max_partitions_per_insert_block до 10к или это как-то скажется на скорости/ресурсах и так вообще неользя делать? -
Ошибка про то, что ваш инсерт вставляет во много партиции разом, а не про много записей в одну
-
а, хм. Тость наоборот там разные даты?
-
Да
-
Скорость инсерта снизится, тк ваш батч затрагиваетт слишком много партиций -> больше файлов. Так же в будущем будут замедлятся селекты, которые имеют(в вашем примере) выборку больше дня, тк читать много файликов приходится. Так же это генерит невероятное количество партов. Сам сталкивался с такой проблемой - пришлоись репартиционировать таблицу.
-
А как? По месяцам?
-
Да, я пришел к выводу что это самое оптимальное значение.
Ну я переодически чатик читаю, многие приходят к такому выводу. Так же туторах для кх тоже советуют использовать именно так.
Конечно же, все депендс от вашей специфики и конкретных кейсов. -
А если у меня таблица с примерно 300кк записями, как-то запросом можно определить, каких данных уникальных больше, чтобы например сделать репартицию например по какому-то типу. Например у меня есть тип события, там их всего штук 5 на все записи, а месцов очевидно больше и каждый раз будет больше. Имеет такое смысл? Или так же надо смотреть систему, какие вообще запросы и какие фильтры используются?
-
count() и group by. Можно ещё uniq()
-
Посчитайте количество уникальных значений, что бы найти коррелирующее значение, которое будет оптимально балансировать паратиции в рамках вашей специфики.
-
Да, точно. Но у меня например в системе поумолчанию фильтр по датам стоит с большим промежутком, однако фильтр на тип стоит всегда поумолчанию 1. Тоесть мы можем смотреть данные одного типа по разным датам. Однако можно поставить фильтр на дргой тип и надо будет делать join. Мб имеет смысл репартицию сделать на тип все же?
-
Партиции больше для удобства, так что оставьте по дате. А в индекс на первое место поставьте тип.
-
Так сделайте партиции по месяцу и в ключ оред бай поставьте колонку в начало с наибольшей кардинальностью - тип, в вашем примере.
-
-
Только перевставлять данные
-
Создайте новоую таблицу и сделайте insert select
Потом можете посмотреть количество партов на примере двух этих таблиц и увидите колоссальную разницу -
-
Joined.
-
ну тогда видимо автору китайцу пишите issue на github
-
у нас уже есть нечто похожее - скажите, что здесь не так?
CREATE MATERIALIZED VIEW foo.events_importance (
`count` AggregateFunction(count),
`time` DateTime('UCT'),
`importance` String,
`_date` Date
) ENGINE = AggregatingMergeTree()
PARTITION BY toDate(time)
ORDER BY (toDate(time), importance)
SETTINGS index_granularity = 8192 AS
SELECT
countState() AS count,
toStartOfMinute(toDateTime(time)) AS time,
importance,
toDate(time) AS _date
FROM foo.events
GROUP BY time, importance -
-
-
cat file.csv | gzip -c | curl -sS --data-binary @- -H 'Content-Encoding: gzip' 'http://clickhouse-host:8123/?query=INSERT INTO db.table (field1, field2) FORMAT CSV'
-
-
Joined.
-
Joined.
-
Добрый день! Подскажите пожалуйста, как можно вставлять в таблицу с массивом данные через select
create table test (id UInt8, myArray Array(UInt8)) Engine=Memory;
create table charges (id UInt8, chname String) Engine=Memory;
Create table packs(pack_id UInt8, pack_name String, charge_id UInt8) Engine=Memory;
insert into charges values
(100,'X')
(101,'Y')
(102,'Z')
insert into packs values
(1,'A',100)
(2,'B',100)
(3,'C',100)
(1,'A',101)
(3,'B',101)
(1,'A',102)
(2,'B',102);
select c.id,p.pack_id from charges c left join packs p on c.id=p.charge_id
100 1
100 2
100 3
101 1
101 3
102 1
102 2
Как можно вставить в таблицу test, чтоб в итоге данные легли вот таким образом
100,[1,2,3]
101,[1,3]
102,[1,2] -
groupArray
https://clickhouse.tech/docs/en/sql-reference/aggregate-functions/reference/grouparray/groupArray | ClickHouse DocumentationgroupArray Syntax: groupArray(x) or groupArray(max_size)(x) Creates an array of argument values. Values can be added to
-
PARTITION BY toDate(time)
ORDER BY ( importance, time)
либо
ORDER BY ( time, importance)
в зависимости от запросовъ -
Joined.
-
Спасибо большое!!
-
Я по неделям делал, тоже неплохо. А по дням это жесть, извините
-
Понял, я просто только начинаю осваивать КХ и пока только разбираюсь в партициях, ключах сортировки и тд
-
у нас и по часам есть. зависит от того:
- сколько времени храянятся все данные
- сколько времени в одном запросе запрашивается (минимальные-максимальный разброс)
- сколько данных итого в ГБ в один день -
-
Всем привет. Про табличную ф-ю numbers() подскажите плиз. Если я декартово множить буду, то кх сначала получит набор чисел, а потом забивать память дублями основной таблицы или он последовательно будет отрабатывать на каждый элемент numbers, т.е. в памяти только одна копия основной таблицы будет?
-
Вопрос знатокам. В партиционированную ReplicatedMergeTree таблицу залились задвойки данных.
Запустил поочередно по партициям OPTIMIZE DEDUPLICATE, схлопнулись все, кроме одной.
Куда копать? OPTIMIZE FINAL тоже без эффекта.
Размер партиции 6 ГБ, в ней 13 партов (active=1). -
Мы выбрали промежуточный вариант - по неделям.
PARTITION BY toYYYYMMDD(toMonday(clock)) -
Joined.
-
Друзья, подскажите ещё пожалуйста, столкнулся с проблемой при даунсемплинге. Есть вот такая вот вьюха CREATE MATERIALIZED VIEW external_ips_daily
ENGINE = SummingMergeTree(bv) PARTITION BY toYYYYMM(date) ORDER BY (date, uuid)
AS SELECT
toDate(sample_time) as date,
port_id as uuid,
ip_address,
count(*) as bv
FROM external_ips
GROUP BY date, port_id, ip_address;
Таблица external_ips - ReplacingMergeTree, соответственно туда данные пишут несколько коллекторов. И во вьюху залетает по несколько записей через count(*), потому что исходная таблица не успевает дубликаты схлопнуть. Существуют может быть какие-то рецепты что бы это обойти? Пока из идей только всё-таки переход на AggregationMergeTree черезу полное дублирование записей во вьюху с аггрегацией -
Joined.
-
-
вы не правильно понимаете что такое VIEW и как оно работает
это не "исходная таблица не успевает схлопнуть", она их схлапывает но существенно позже вставки
во VIEW прилетает только кусок данных который вставляется конкретным INSERT
и селект работает не с external_ips
а с куском данных из INSERT который вставляется в external_ips
VIEW это AFTER INSERT триггер который вешается на все таблицы из FROM секции -
По этому запись еденицы вместо count и должна сработать
-
-
Всем привет!
У меня есть таблица с одним полем по которой нужно проверять входит поле в этот список или нет.
Как этот фукционал лучше реализовать?
Eсть ли Replicated Join Engine? -
нет, если прилетит в разных INSERT одинаковый toDate() +port_id
то у вас будет 2
а автор хочет чтобы было 1?
или что? -
почитайте про CREATE DICTIONARY и dictGet
-
это уже в проде ))
список большой не хочется его в память грузить -
В исходную таблицу каждую минуту делается запись с datetime штампом. Изза избыточности у нас в исходной таблице на какой-то срок может возникнуть 5 одинаковых записей. Которые потом исходной таблицей сожмутся в одну. Вот мне нужна одна, что бы я в другой таблице просуммировал колличество таких записей после сжатия за сутки
-
-
У вас там в МатВью не должно быть ORDER BY (date, uuid, ip_address) ?
-
Я команду косо обрезал при копипасте, там по факту полей сильно больше
-
большой это сколько?
И какого типа поле...
словарь на миллион элементов UInt64 в памяти будет занимать 10 мегабайт -
Вам только AggregatingMergeTree поможет мне кажется.
-
Да, очень похоже на то
-
Вам надо чтобы за день была максимум одна запись?
-
обычная SummingMergeTree
без MATVIEW
и crontab раз в сутки
в котором будет
INSERT INTO summing_table ... SELECT ... FROM main_table FINAL WHERE toDate(date)=toDate(now()) GROUP BY ... -
Мне нужно колличество записей в исходной таблице за сутки
-
-
-
Тогда предыдущее сообщение или AggregatingMergeTree
-
-
Спасибо! сейчас 50M записей
Такой размер устраивает! попробую словарь из одного поля собрать -
ну и фильтровать соответсвенно
SELECT ... WHERE dictGetOrDefault('db.dict','attribute',tuple(your_field),0) = 0 -
-
Всем привет!
Пытаюсь завести clickhouse-copier для миграции данных на новые ноды.
Блоки копирует но не получается приаттачить.
В логе clickhouse-copier такое:
DB::Exception: Transaction failed (Node exists): Op #4, path: /clickhouse/tables/<table>/v2/blocks/20201217_replace_from_33251BB87614C3254BD357CDDC66D8F0. (version 21.1.3.32 (official build))
Версия clickhouse 21.1.3.32.
Что интересно, когда он это писал, мониторил содержимое znode по пути /clickhouse/tables/<table>/v2/blocks. И не увидел, что там что-то появилось.
Может это известная проблема? -
Добрый день
Подскажите с запросом
Есть:
CREATE MATERIALIZED VIEW test_materialized_view
ENGINE = MergeTree
PARTITION BY a ORDER BY (a, b, c, d, e, f, g, h)
Где a, b - String
Всего строк ~500M
Разных значений a около 10
Разных значений b - 3
При этом долго выполняется запрос вида:
SELECT a, b
FROM test_materialized_view
GROUP BY a, b
ORDER BY a, b;
Можно ли ускорить такой запрос в подобной ситуации -
-
Да
-
Сделайте виртуальные целые поля (материализованное поле - хеш от строкового поля) , на них постройке таблицу и делайте группировку. Можете попробовать сначала без изменения структуры.
-
SELECT database, name, formatReadableSize(bytes_allocated) FROM system.dictionaries
проверьте сначала после загрузки -
Привет
Кто может подсказать по структуре каталогов
/data/DATABASE/TABLE/???/COLUMNS -
Joined.
-
-
clickhouse-client -h your_server -q "SELECT * FROM db.table FORMAT TSV" | clickhouse-client -h yandex_cloud_server -q "INSERT INTO db.table FORMAT TSV"
-
а можно также с древнего кх в новый перемахнуть?)
-
INSERT INTO db.table SELECT * FROM remote('old_server:9000',db.table)
-
да так небось точно сломается с разными версиями)
-
спасибо! кажется, вариант с remote предпочтительнее?
-
протокол совместимый
-
если у вас доступ до вашего clickhouse сервера из yandex cloud есть
то в целом да
еще remoteSecure смотрите -
-
-
Joined.
-
Привет. А если для distributed таблицы добавить буферную, проблем каких-то быть не должно при вставке через нее?
db.table_buffer
ENGINE = Buffer('db', 'table', .. )
db.table
ENGINE = Distributed('{cluster}', 'db', 'table_replicated', ..)
db.table_replicated
ENGINE = ReplicatedMergeTree('{path}/{shard}/db/table_replicated', '{replica}') -
-
так и задумано
ENGINE = Distributed('{cluster}', 'db', 'table_buffer', ..) -
не, а если не перед replicated, а именно для distributed?
-
такое не знаю
-
Понятно, ладно будем тестить )
-
что значит долго?
Вы ожидаете что ORDER BY (a, b поможет? или о что?
optimize_aggregation_in_order выклечено по дефолту
--optimize_aggregation_in_order arg Enable GROUP BY optimization for aggregating data in corresponding order in MergeTree tables -
??? - парт
-
SELECT
GROUP BY time, importance -- гранулярность секунда
PARTITION BY toDate(time)
ORDER BY (toDate(time), importance) -- гранулярность день
что бессмысленно, логичнее либо там день либо тут секунда
AggregatingMergeTree схлапывает по своему ORDER BY , оно вообще не в курсе что есть MV, AggregatingMergeTree живет отдельной жизнью
а `_date` Date зачем вообще ?
https://youtu.be/1LVJ_WcLgF8?t=7596
https://den-crane.github.io/Everything_you_should_know_about_materialized_views_commented.pdf -
Хмм
Интересно почему их больше сотни тысяч -
ну так сто тысяч инсертов и пожалуйста
там наверное большинство неактивные, они удаляются через 8 минут.
проще смортеть
select round(sum(bytes)/1024/1024) size, round((sum(data_uncompressed_bytes))/1024/1024) ub , sum(rows),count() part_count, database,table,partition
from system.parts
where active = 1 and table like '%' and database like '%'
group by database,table,partition
order by part_count desc - 06 February 2021 (29 messages)
-
ой простите херню вам посоветовал
у вас же MV SummingMergeTree?
тогда просто из него через SELECT sum(k) FROM mv GROUP BY выбирайте и все будет ОК
потому что SummingMergeTree означает что суммирование по одинаковым значнеия ORDER BY будет в фоне производится при слиянии кусков из system.parts -
https://habr.com/ru/company/solarsecurity/blog/540368/#comment_22629566
>> min_insert_block_size_rows, min_insert_block_size_bytes не влияют на атомарность, тут Denny Crane ошибся.
@milovidov_an все мои предыдущие эксперименты говорят что это не похоже на правду, min-ы влияют в зависимости от вставляемых данных, например native
для ТСВ input_format_parallel_parsing влиял
короче МИН настройки нужны именно для ГАРАНТИИ атомарности, так как макс сам по себе не гарантирует этого...
https://t.me/clickhouse_ru/195294 -
min влияют на склеивание блоков в более крупные при INSERT SELECT или в Native протоколе, если отправляются мелкие блоки. Каждый такой склеенный блок в каждую партицию будет вставлен атомарно.
-
ну я про это и говорю. именно МИН дает гарантию атомарности независимо от того что на входе. а МАКС это просто ограничение сверху.
-
Хмм
Они там инсертся встроенным Кафка консюмером
Я думал они там батчами вставляются -
Joined.
-
Привет. Начали тестить и поняли что такой способ апдейтит только словарь целиком, инкрементальный апдейт же не поддерживается. Ту в любом случае придется гонять вс таблицу целиком. Те инкрменеталки строк поupdate_field нет. Или я что то непонимаю в доке?
-
-
Joined.
-
update_field не документирован, забили докумантировать.
Partial update словарей работают с марта 2018. -
ДДЛ словаря киньте
-
Проверим еще раз, спасибо
-
а что в partition by у таблицы ? возможно батчи режутся на множество партов по partition by
select round(sum(bytes)/1024/1024) size, round((sum(data_uncompressed_bytes))/1024/1024) ub , sum(rows),count() part_count, database,table,partition
from system.parts
where active = 1 and table like '%' and database like '%'
group by database,table,partition
order by part_count desc -
ржачная статья.
Оптимизатор запросов в ClickHouse пока далек от того, что есть в других базах (например, PostgreSQL и Oraсle). Он не понимает зависимости данных между столбцами. -
да, статья - самолюбование, её можно не читать...
Моя претензия к Алексею в том, что его комментарий как минимум "misleading". -
ну а теперь и ваш отредактированный им коммент на ГХ тоже misleading
https://github.com/ClickHouse/ClickHouse/issues/9195#issuecomment-587500824 -
странная статья... тип чел поработал с CH и решил поведать об этом миру?
-
статьи разные нужны статьи разные важны... =)
-
это верно
-
Непонятно каким образом там у них проблема с пакетами КХ яндекс-альтинити нарисовалась и необходимость собственной сборки.
Потому что вообще-то пакеты от яндекса были всегда, может конечно речь про rpm, был краткий период когда rpm не было от яндекса.
Альтинити конечно зарубежная компания с headquarter в жуковском (а вообще щаз посчитал, Альтинити канадская компания, больше всего народу в Канаде, правда на русском почти все шпарят). -
ну дъявол в деталях, через годы только начинаешь понимать что block_size задан в native файле при создании.
-
ну вот ещё при запуске инсерт селект тоже не атомарно, не говоря уж про магический флаг ТСВ парсера. все таки правильно писать
max_insert_block_size ограничение куска сверху но не гарантия
min_insert* - склеивание данных на входе до этого минимального размера
и нужны оба -
Я думаю Яндекс живёт в другой реальности и мыслит другими категориями. Они просто не понимают что кто-то может захотеть делать инсерты которые затрагивают несколько партиций.
-
И дефолтные настройки сделаны под широкие таблицы с килобайтными строками, конечно надо разбираться как вставлять аьтомарно миллионы строк узких и тестить. Наверное я напишу статью с примерами. Мы в альтинити решили попробовать на конфлюенсе поднять knowledge base
-
да, по инсертам там столько комбинаций... по любому надо
-
ClickHouse не гарантирует сохранность всех данных на все 100%. " почему ? как можно потерять данные ?
-
Нет транзакций. Вы вставили а во время вставки кх поймал сегфолт. Данные вставились или нет? Вы не узнаете.
-
нету D из ACID (не было / нету по дефолту).
КХ может потерять последние инсерты https://stackoverflow.com/a/60172559/11644308 -
- 07 February 2021 (48 messages)
-
Joined.
-
Joined.
-
Joined.
-
Joined.
-
Братцы, напомните, если go-софтинка, которая буферит инсерты к КХ... забыл название. Помнит кто-то?
-
clickhouse-bulk
-
я так понимаю - ставлю ее на сервак, куча инсертеров отправляет на него, а он сам периодичски в КХ, да?
-
ну вроде да, спасибо
-
Joined.
-
Ребят, а не подскажите как в клике использовать WITH вместо подзапроса?
Хочу сделать вот так:
with t1 as (select * from my_table)
select * from t1 -
какая версия clickhouse?
https://clickhouse.tech/docs/en/sql-reference/statements/select/with/
должно работать как вы показываетеWITH | ClickHouse DocumentationWITH Clause ClickHouse supports Common Table Expressions (CTE), that is provides to use results of WITH clause in the re
-
какую ошибку говорит?
-
и самое интересное - какая версия КХ
-
[2021-02-07 16:47:56] Code: 62, e.displayText() = DB::Exception: Syntax error: failed at position 12 ('(') (line 1, col 12): (select * from my_table)
[2021-02-07 16:47:56] FORMAT TabSeparatedWithNamesAndTypes;. Expected identifier (version 20.9.3.45 (official build)) -
То есть на скобку открывающую ругается как будто синтаксис не понимает
-
ClickHouse server version 20.9.3.45 (official build).
-
Вот этот пример работает
/* запрос покажет TOP 10 самых больших таблиц */
WITH
(
SELECT sum(bytes)
FROM system.parts
WHERE active
) AS total_disk_usage
SELECT
(sum(bytes) / total_disk_usage) * 100 AS table_disk_usage,
table
FROM system.parts
GROUP BY table
ORDER BY table_disk_usage DESC
LIMIT 10;
А там где я создаю переменную для подзапроса - нет -
судя по https://github.com/ClickHouse/ClickHouse/commit/0f92fe9ad2003b9c091c3a10db0190ff84d9a10d
оно и не должно
доку описали только для 20.11
так что наверное реализовали в 20.10 как минимум если не в 20.11DOCSUP-3118: Document the named subqueries WITH AS (#16339) · ClickHouse/ClickHouse@0f92fe9* Update WITH desc * Update docs/en/sql-reference/statements/select/with.md Co-authored-by: BayoNet <da-daos@yandex.ru> * Update docs/en/sql-reference/statements/select/with....
-
О, спасибо большое! А стоит ли переходить на 20.11 или лучше не стоит пока?
-
ClickHouse/ClickHouse tagged: v21.2.2.8-stable
Link: https://github.com/ClickHouse/ClickHouse/releases/tag/v21.2.2.8-stable
Release notes:
ClickHouse stable release v21.2.2.8-stableRelease v21.2.2.8-stable · ClickHouse/ClickHouseClickHouse stable release v21.2.2.8-stable
-
ну вроде бы скоро какой то LTS релиз будет новый
на него и переходите
, сейчас 20.8 является LTS
у вас уже 20.9
тут зависит от стадии продукта
если у вас MVP и вы легко сможете обновляться, то можно сидеть на stable релизах
а когда будете к продакшену подходить то дождаться LTS и перейти на него
правда в понимании ClickHouse ;) L это примерно пол года... ну может год... -
Я понял, ну, будем ждать))
-
-
НЕ пойму, как заставить обновляться словари mysql...
lifetime =1
у муsql запустил как сказано set global information_schema_stats_expiry=0; -
и ничего
-
во файл со словарем меняю - перечитывается
-
select * from system.dictionaries; - время загрузки не меняется
-
в доке написано lifetime в секундах. В базе - поле в минутах
-
mysql8 ?
-
да
-
все распоследнее - КХ, Мускл
-
SHOW TABLE STATUS -- в mysql
-
там дата
-
modification_date
-
меняется вообще?
-
а вот так если добавлю - сработает?
<invalidate_query>SELECT max(modified) as modified FROM tags2</invalidate_query> -
счас гляну статус
-
сработает
-
а кстати, почем у в примере в доке where id=1 ?
-
1 как-то меняется Хаусом или?
-
<invalidate_query>SELECT update_time FROM dictionary_source where id = 1</invalidate_query>
-
просто так , от балды написали
-
нет
-
обычно туда запрос к метаданным таблицы из системного каталога пишут, что бы не грузить базу (mysql/pg) запросами типа SELECT max(modified)
-
попробовал information_schema.tables - не... не двигается... ну ок, буду max(update)... это срабатывает
-
спасибо
-
-
- 08 February 2021 (198 messages)
-
Joined.
-
Добрый день! Поскажите в чем может быть проблема. Создал кластер из 6-ти узлов, переопределил пользователя для взаимодействия между нодами тэгами <user> и <password>. Пытаюсь с первого узла выполнить команду create table t on cluster dwh (n integer) engine = mergetree() order by n; IDE 30 секунд ждет ответа от сервера, потом выдает timeout. В логе при этом ошибка: <Error> DynamicQueryHandler: Code: 373, e.displayText() = DB::Exception: Session is locked by a concurrent client., Stack trace (when copying this message, always include the lines below):
0. DB::NamedSessions::acquireSession(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, DB::Context&, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l> >, bool) @ 0xeadf67d in /usr/bin/clickhouse
1. DB::Context::acquireNamedSession(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l> >, bool) @ 0xeadeec0 in /usr/bin/clickhouse
2. DB::HTTPHandler::processQuery(DB::Context&, Poco::Net::HTTPServerRequest&, HTMLForm&, Poco::Net::HTTPServerResponse&, DB::HTTPHandler::Output&, std::__1::optional<DB::CurrentThread::QueryScope>&) @ 0xf82c72a in /usr/bin/clickhouse
3. DB::HTTPHandler::handleRequest(Poco::Net::HTTPServerRequest&, Poco::Net::HTTPServerResponse&) @ 0xf8325c5 in /usr/bin/clickhouse
4. Poco::Net::HTTPServerConnection::run() @ 0x11d9fd75 in /usr/bin/clickhouse
5. Poco::Net::TCPServerConnection::start() @ 0x11dd646f in /usr/bin/clickhouse
6. Poco::Net::TCPServerDispatcher::run() @ 0x11dd7e81 in /usr/bin/clickhouse
7. Poco::PooledThread::run() @ 0x11f03809 in /usr/bin/clickhouse
8. Poco::ThreadImpl::runnableEntry(void*) @ 0x11eff79a 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
(version 21.1.2.15 (official build)) -
какая IDE?
DataGrip?
если запустить соответсвующий запрос из clickhouse-client запущенном на первом узле
все работает? -
Все верно datagrip, с клиента сейчас попробую
-
Выполнил клиентом. Суть осталась та же, запрос провисел, потом выдал ошибку: Code: 159. DB::Exception: Received from clickhouse-server:9000. DB::Exception: Watching task /clickhouse/task_queue/ddl/query-0000000015 is executing longer than distributed_ddl_task_timeout (=180) seconds. There are 6 unfinished hosts (0 of them are currently active), they are going to execute the query in background.
-
-
это другая ошибка
у вас все реплики online?
по ошибке выглядит так будто реплики по какойто причине не хотят исполнять запрос на создание таблицы из distributed_ddl очереди ZK
curl http://clickhouse_ip:8123/replica_status
или
SELECT * FROM system.zookeeper WHERE path='/'
на каждой реплике -
Все реплики онлайн, по отдельности выполняю запросы на них. Если быть точным это 3 шарда и у каждого по реплике. Тесты сейчас сделаю.
-
SELECT * FROM system.settings WHERE name = 'allow_distributed_ddl'; ?
-
user@node-01:~$ curl http://<ip>:<port_prefix>{4,5,6,7,8,9}/replicas_status
Ok.
Ok.
Ok.
Ok.
Ok.
Ok.
user@node-01:~$ -
grep ddl -r /etc/clickhouse-server/
настройки точно одинаковые ?
должно быть что то вроде
/etc/clickhouse-server/config.xml: <distributed_ddl>
/etc/clickhouse-server/config.xml: <path>/clickhouse/task_queue/ddl</path>
/etc/clickhouse-server/config.xml: </distributed_ddl> -
4c3862c37937 :) SELECT * FROM system.settings WHERE name = 'allow_distributed_ddl';
SELECT *
FROM system.settings
WHERE name = 'allow_distributed_ddl'
Query id: a0ba3bfd-9e19-46d5-914e-70a95e22fa0b
┌─name──────────────────┬─value─┬─changed─┬─description───────────────────────────────────────────────────────────────────────┬─min──┬─max──┬─readonly─┬─type─┐
│ allow_distributed_ddl │ 1 │ 0 │ If it is set to true, then a user is allowed to executed distributed DDL queries. │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ Bool │
└───────────────────────┴───────┴─────────┴───────────────────────────────────────────────────────────────────────────────────┴──────┴──────┴──────────┴──────┘
1 rows in set. Elapsed: 0.006 sec.
4c3862c37937 :) -
user@node-01:~$ grep ddl -r /opt/data/clickhouse_node{1,2,3,4,5,6}_dev/*.xml
/opt/data/clickhouse_node1_dev/config.xml: <distributed_ddl>
/opt/data/clickhouse_node1_dev/config.xml: <path>/clickhouse/task_queue/ddl</path>
/opt/data/clickhouse_node1_dev/config.xml: </distributed_ddl>
/opt/data/clickhouse_node2_dev/config.xml: <distributed_ddl>
/opt/data/clickhouse_node2_dev/config.xml: <path>/clickhouse/task_queue/ddl</path>
/opt/data/clickhouse_node2_dev/config.xml: </distributed_ddl>
/opt/data/clickhouse_node3_dev/config.xml: <distributed_ddl>
/opt/data/clickhouse_node3_dev/config.xml: <path>/clickhouse/task_queue/ddl</path>
/opt/data/clickhouse_node3_dev/config.xml: </distributed_ddl>
/opt/data/clickhouse_node4_dev/config.xml: <distributed_ddl>
/opt/data/clickhouse_node4_dev/config.xml: <path>/clickhouse/task_queue/ddl</path>
/opt/data/clickhouse_node4_dev/config.xml: </distributed_ddl>
/opt/data/clickhouse_node5_dev/config.xml: <distributed_ddl>
/opt/data/clickhouse_node5_dev/config.xml: <path>/clickhouse/task_queue/ddl</path>
/opt/data/clickhouse_node5_dev/config.xml: </distributed_ddl>
/opt/data/clickhouse_node6_dev/config.xml: <distributed_ddl>
/opt/data/clickhouse_node6_dev/config.xml: <path>/clickhouse/task_queue/ddl</path>
/opt/data/clickhouse_node6_dev/config.xml: </distributed_ddl>
user@node-01:~$ -
-
Доброе утро! Подскажите пожалуйста, как можно сделать так чтобы groupArray включал и NULL значения.
create table arrayTab (id UInt8,ch_name String, pidArray Array(UInt8),pnameArray Array(Nullable(String))) Engine=Memory;
insert into charges values
(100,'X')
(101,'Y')
(102,NULL);
insert into packs (pack_id,pack_name,charge_id) values
(4,NULL,100)
(2,'A',100)
(3,'C',100)
(1,'A',101)
(3,'B',101)
(1,NULL,102)
(2,'B',102);
insert into arrayTab
select id,max(chname), groupArray(pack_id),groupArray(pack_name) from (
select * from charges c
left join packs p on c.id=p.charge_id ) pp group by id;
Получается вот так:
select id,ch_name,pidArray,pnameArray from arrayTab;
100 X [4,2,3] ['A','C']
101 Y [1,3] ['A','B']
102 [1,2] B
но хотелось бы видеть:
100 X [4,2,3] ['A',NULL,'C']
101 Y [1,3] ['A','B']
102 [1,2] ['B',NULL]
Чтобы при array join не было ошбки: Sizes of ARRAY-JOIN-ed arrays do not match
select * from arrayTab
array join pidArray,pnameArray; -
в смысле нормально работают распределенные DDL? если у вас CREATE TABLE ... ON CLUSTER не отрабатывает?
-
DML, select из distributed table
-
ой тьу, распределенные DML ? это в смысле SELECT из Distributed таблицы?
дак Distributed никак с Replicated не связны это ортогональные понятия -
Это я к тому что связь между узлами есть
-
Сейчас обратил внимание на странное поведение клиента. Если подключиться клиентом с одной ноды на другую, то клиент виснет на фразе: user@5df50a09a5da:/$ clickhouse-client --host <ip> --port <port> --user default --password <pwd>
ClickHouse client version 21.1.2.15 (official build).
Connecting to <ip>:<port> as user default. -
Это я не тот порт указал. http вместо tcp
-
скорее всего никак
-
Joined.
-
ну смотрите
как distributed_ddl работает
в ZK ноду которая /clickhouse/task_queue/ddl/ просто добавляются child типа task-XXXX с текстом запроса и нодой инициатором
эту ноду делают watch все все остальные ноды, которые подключены с одному и тому же zookeeper
и должны вычитывать SQL запросы и после исполнения добавлять свое имя в task-XXXX/finished таким образом рапортовать о том что сделали
вы SELECT * FROM system.zookeeper WHERE path='/clickhouse/task_queue/ddl'
на всех нодах делали? нормально работает?
какая версия clickhouse?
SHOW CREATE DATABASE default
какой engine показывает ? Atomic?
у вас случайно не было там таблицы с точно таким же именем раньше?
если у вас Atomic
у вас в ReplicatedMergeTree
в настройках пути {uuid} макрос используется?
CREATE TABLE IF NOT EXISTS ... ON CLUSTER нормально отрабатывает?
в логи посмотрите на каждой ноде
поищите ваш запрос на создание посмотрие что в логах -
Большое спасибо за пояснения!
-
По порядку:
-
1. Со всех узлов SELECT * FROM system.zookeeper WHERE path='/clickhouse/task_queue/ddl' возвращает некий список запросов.
-
2. 5df50a09a5da :) show create database default;
SHOW CREATE DATABASE default
Query id: 119653f7-6b0a-434a-90c5-93926321218c
┌─statement──────────────────────────────┐
│ CREATE DATABASE default
ENGINE = Atomic │
└────────────────────────────────────────┘
1 rows in set. Elapsed: 0.006 sec.
5df50a09a5da :) -
-
docker-compose?
какая версия ClickHouse?
Atomic для не system баз по умолчанию вроде только в 20.9 включили
откатывали на 20.8? -
пункты про UUID пропустили
-
-
-
а где про atomic можно почитать ?
-
Использую docker в чистом виде, Clickhouse 21.1.2.15
-
Привет!
Подскажите, пожалуйста, что делать если после пересоздания MV в dependencies_table она начинает дублироваться и выглядит это так:
['table_mv', 'table_mv', 'table_mv', 'table_mv']?
Из-за этого вставки в основную таблицу падают с ошибкой:
Table schema.table_mv doesn't exist. -
{uuid} в ReplicatedMergeTree добавлен?
-
Нет, нигде его не использую
-
-
а надо
потому что Atomic
сделайте DROP TABLE IF EXISTS ... ON CLUSTER -
ок, сейчас попробую
-
drop также встал в очередь тасков в зукипере
-
ну рестартуйте clickhouse-server если есть такая возможность
что-то странное там у вас
SELECT * FROM system.replicas WHERE max_absolute_delay > 0 FORMAT Vertical -
смотрите в общем логи
-
-
-
Joined.
-
тоже неприятно удивился, что groupArray пропускает Null
я буду пробовать городить костыли типа заменять null на nan
в целом, мне не нравится это поведение 🙂 -
Подскажите. Как КХ в графане мониторить ? Через какие экспортёры или плагин к графане ?
-
feel free to Make Pull Request
-
https://clickhouse.tech/docs/ru/operations/server-configuration-parameters/settings/#server_configuration_parameters-prometheus
у кх есть прометеусная ручкаКонфигурационные параметры сервера | Документация ClickHouseКонфигурационные параметры сервера builtin_dictionaries_reload_interval Интервал (в секундах) перезагрузки встроенных сл
-
Спасибо, а с какой это версии ?
-
-
-
Joined.
-
да, очень неудобно..а чем заменяете числовые значения?
-
можете уточнить пожалуйста, что за pull request?
-
Могу
https://www.google.by/search?q=github+how+to+make+pull+request -
какая то такая идея была. я еще не пробовал
если COLUMN - Nullable(Float) то можно заменить Null на nan, а уже потом схлапывать в массив
если у вас не float - можно заменить на другое специальное значение, которое в ваших данных никогда не встречается
groupArray(ifNull( COLUMN, nan)) -
ну на гитхабе issue когда то заводили. Алексей закрыл 🙂
судя по всему, в яндексе это всех устраивает
надо как-то кворум набрать…
https://github.com/ClickHouse/ClickHouse/issues/1980 -
дак а чего не спросили "а чего закрыли"?
получили бы комментарии -
тоже верно. написал.
-
Приветствую! В чате поискал, но ответы про победить memory limit не помогают (или что-то делаю не так). Имеется Клик в облаке и 10Гб ограничение по оперативе. Для external_group_by и external_order_by стоит по 5Гб, join_algorithm = auto, max_block_size = 1024,
Имеется попытка создать таблу mergetree table_result as select * from table1 join table2 using id
Упирается в лимит. Пробую создать с одной записью (limit 1) = OK, потом insert into table_result [(c1, ...)] select * from table1 join table2 using id = memory limit
Пытаюсь ввести group by внутри селекта чтобы уйти на диск, всё равно лимит.
Может есть вариант создавать или вставлять чанками-батчами-кусками освобождая память?
Драйвер JDBC -
дело не в драйвере а в JOIN
у вас сам по себе SELECT
без INSERT скорее всего в memory limit упирается
JOIN в памяти происходит
у вас меньшая таблица table2 в память помещаются те столбцы по которым JOIN идет и те столбцы которые в итоге в result вставляются? -
отдельно джоин отрабатывает, сам по себе. В том и затык
-
INSERT INTO... (SELECT ... FROM table 1 WHERE ) .. JOIN (SELECT table2.. WHERE GROUD BY)
? -
Ну чанками вставлять можно. Например, используя связку SAMPLE и OFFSET
-
сколько колонок вставляете в _result?
-
сотню... если оставить 50 - в лимит не упирается, да. Но тогда другая проблема нарисовывается
-
100 колонок, это 2 мегабайта на колонку, 200 мегабайт только на буфера минимум
-
вставляйте чанками чанк выбирайте в память через sub query
https://t.me/clickhouse_ru/203008Slach in ClickHouse не тормозитINSERT INTO... (SELECT ... FROM table 1 WHERE ) .. JOIN (SELECT table2.. WHERE GROUD BY) ?
-
продумываю этот вариант как раз. Так а разве чанк не из результата джойна надо брать? или именно такие же ключи выбирать из обоих сначала?
-
если у вас JOIN между двумя sub-query
то сначала результат sub query в память
потом по нему JOIN -
про подзапросы и механику, да, помню. Здесь другое непонятно. WHERE в подзапросах что должно выбирать?
-
ЧАНК оно должно выбирать, ну по дате там например ограничивать, GROUP BY делать если надо
короче должно делать так чтобы данные для JOIN в память умещались -
тут сильно зависит от условий JOIN
получается ли их соблюдать в рамках одного chunk или нет -
тогда картина чанк1 из табла1 по дате - там рандомный набор c id1 по id10000 (например) и чанк1 из табла2 по дате и там рандомный набор из id5000 по id15000. Джойном чанки пересеклись в 4321 случае (например), таким образом результирующий чанк оставляет часть данных за бортом?
-
я же выше писал. просто по ключу id в обоих таблицах
-
Joined.
-
Привет. Не подскажите?
Делаю снапшот ec2 инстанса в aws(EBS Volume snapshot) на котором крутится clickhouse.
Достаточно ли делать только снапшот инстанса. Смогу ли я всегда в случае чего восстановить бд на последний инстанс? или может быть ситуация что не смогу никак восстановить из снапшота(потерять немного данных на момент пока делается снапшот не страшно). Или без бэкапа никак не обойтись? Есть опасность, что бд вообще не поднимется? -
можно сделать сначала бекап при помощи alexakulov/clickhouse-backup
он создаст хардлинки на все парты и потом можно будет смело снимать снапшот, тогда точно проблем не будет -
Спасибо. Уточняющий вопрос. То есть если сделаю перед снапшотов clickhouse-backup местно на инстансе не увелится? верно понимаю?
-
верно
-
если получится сравнить скорость восстановления EBS Snapshot и clickhouse-backup из S3
было бы хорошо
там кажется это все от типов инстанса должно зависеть -
Спасибо большое!
-
-
вот как раз хотелось только snapshot делать из-за некоторых особенностей.
-
А если так делать: clickhouse-backup; ebs snapshot; delete backup на инстансе. или перед началом следующего бэкапа сначала предыдущий удалить на инстансе. пото все проделать снова. что-то такое
-
-
на этом же инстансе еще постгря крутится(( но проблем и опасней больше кликхаус вызывает
-
Спасибо за помощь!
-
-
пока по моему опыту аварийного восстановления после крешей - кликхаус самый живучий.
-
-
ну из снапшота постгрю было проще поднять. с кликхаусом чуть больше мороки было. но подробностей не помню.
-
-
проще тогда уже сделать FREEZE
потом EBS snapshot
потом удалить hardlinks в /var/lib/clickhouse/shadow -
а это alexakulov/clickhouse-backup по сути тоже самое, но запакованное в контейнер)
-
-
он так и называется - CountIf
-
оно делает файловый бекап
это не тоже самое что EBS snapshot -
Joined.
-
есть countIf
на аггрегирующие фунции есть модификаторы
https://clickhouse.tech/docs/en/sql-reference/aggregate-functions/combinators/Combinators | ClickHouse DocumentationAggregate Function Combinators The name of an aggregate function can have a suffix appended to it. This changes the way
-
-
Добрый день, коллеги.
Подскажите, пожалуйста, добавляем http-словарь, где в source используется https...который сделан с помощью cloudflare ssl-сертификата.
Курлом проверяю всё ок. А когда делаю system reload dictionary, то получаю: "SSL Exception: error:14000410:SSL routines::sslv3 alert handshake failure, Stack trace" -
куда смотреть ? что читать ?
-
нене, это тоже самое что «сделать FREEZE»
он как раз создает хардлинки в /var/lib/clickhouse/shadow -
я в курсе что clickhouse-backup создает hardlinks
я пытаюсь донести до вас, что после этого он делает копирование на S3 или в "локальную папку"
а это вообще не тоже самое что сделать EBS Snapshot
который делается на уровне блочного устройства
хардлинки нужны чтобы данные во время бекапа никто не удалил изнутри clickhouse типа при background merge или mutations -
я понимаю. просто создание этих хардлинков как раз обеспечивают консистентность именно этих файлов для снепшота. и если вдруг из снепшота основной стейт не поднимается эти хардлинки как раз помогут консистентно запсутить клик «из бекапа» который сохранился в снепшоте и при этом не занимает места
-
-
нашел что данную настройку удалили, хотя из офф документации не убрали( вопрос новый, как сделать чтобы не вставлялись какие-то дефолтные данные, если на вставку не передаются данные для полей, которые должны быть
-
создать поля с типом Nullable и без DEFAULT выражения
-
так а если эти поля не должны быть Nullable, просто ошибка вставки нужна, как быть?
-
и default не указан при создании таблицы
-
Removed the strict_insert_defaults setting. If you were using this functionality, write to clickhouse-feedback@yandex-team.com.
думаю стоит написать или завести ISSUE на github
как минимум документацию поправят -
Привет. А что за MV и версия сервера?
-
Можно в личку чтобы не переписывать MV
-
Версия: 20.12.4.5
MV - Material View, которая агрегирует статистики для основной таблицы в которую не вставляются данные из-за ошибки описанной выше.
Возможно я не верно понял вопрос. -
Меня текст MV интересовал.
-
ок, пришлю в личку!
-
Всем привет, есть таблица с такими данными:
uuid payout is_upsell
ccc991c1-5dcf-41ca-801c-f9f519761c25 8 0
ccc991c1-5dcf-41ca-801c-f9f519761c25 10 1
ccc991c1-5dcf-41ca-801c-f9f519761c25 8 0
ccc991c1-5dcf-41ca-801c-f9f519761c25 10 0
ccc991c1-5dcf-41ca-801c-f9f519761c25 12 1
Как можно посчитать сумму с условиями
Поясню, логика работы, если последнее значение is_upsell = 1, тогда смотрим предыдущее значение, если значение is_upsell = 1, смотрим еще предыдущее, если оно 0, тогда суммируем payout значения
Из примера выше в итоге хочется видеть конечный результат:
ccc991c1-5dcf-41ca-801c-f9f519761c25 22
Может кто скажет в какую сторону копать или смотреть в доку? -
sumIf(выражение, выражение для проверки условия
https://clickhouse.tech/docs/en/sql-reference/aggregate-functions/combinators/Combinators | ClickHouse DocumentationAggregate Function Combinators The name of an aggregate function can have a suffix appended to it. This changes the way
-
-
А разве можно в sumIf множественные кондишены писать и еще в зависимости от предыдущего значения?
Если переводить на какой нибудь ЯП, это была бы функция в которую приходит коллекцию, коллекцию перебираешь с конца и проверяешь каждый элемент и суммируешь -
Что-то типа такого:
type Item = {
is_upsell: boolean;
payout: number;
}
function sum(items: Item[]): number {
let sum = 0;
for (const item of items.reverse()) {
if(!item.is_upsell) {
return sum + item.payout;
}
sum += item.payout;
}
return sum;
} -
deduplicate_blocks_in_dependent_materialized_views
https://clickhouse.tech/docs/ru/operations/settings/settings/#settings-deduplicate-blocks-in-dependent-materialized-views
что то я сообразить не могу. верно ли, что если я включу эту опцию, то у меня перестанут вставляться строки, чей group by в materialized view имеет один хеш, при этом вставляемый в основную таблицу блок будет разный по хешу?Настройки | Документация ClickHouseНастройки distributed_product_mode Изменяет поведение распределенных подзапросов. ClickHouse применяет настройку в тех с
-
почему clickhouse не может использовать хеш от INSERT оригинального? Не materialized view с GROUP BY
-
пример - табличка с событиями
event_id, event_type, event_cost
materialized view это group by event_type sum(event_cost)
получается INSERT’ы вида
INSERT event_id=0 event_type=B, event_cost=1
INSERT event_id=1 event_type=B, event_cost=1
INSERT event_id=2 event_type=B, event_cost=1
не будут триггерить matview так как group by хеш один
type=B, cost=1 -
Коллеги, кто использует DataGrip
Есть проблема с неверным отображением времени, кто как ее решает?
https://youtrack.jetbrains.com/issue/DBE-7770 -
-
таймзона может быть не та ?
-
в клике таймзона UTC
слева запрос через консоль яндекс, справа через datagrip. Почему-то datagrip дополнительно вычитает 3 часа. В настройках datagrip стоит использовать зону сервера. -
Переустановил data grip, заново создал подключение, стало норм
-
-
-
-
-
кондишены то можно писать, а вот предыдущее значение наверное только через window functions можно было бы попробовать сделать, но их еще не запилили
-
-
там весь стек трейс есть чуть ниже в логе
приведите -
0. Poco::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0x110e3bb0 in /usr/bin/clickhouse
1. DB::ErrnoException::ErrnoException(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, int, std::__1::optional<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > const&) @ 0x9988d8b in /usr/bin/clickhouse
2. DB::throwFromErrno(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, int) @ 0x998871a in /usr/bin/clickhouse
3. Allocator<false, false>::allocNoTrack(unsigned long, unsigned long) @ 0x99b5231 in /usr/bin/clickhouse
4. Allocator<false, false>::realloc(void*, unsigned long, unsigned long, unsigned long) @ 0x99c32a6 in /usr/bin/clickhouse
5. ? @ 0xe28dc6c in /usr/bin/clickhouse
6. DB::ColumnString::insertFrom(DB::IColumn const&, unsigned long) @ 0xe294fac in /usr/bin/clickhouse
7. DB::FunctionIf::executeGeneric(DB::ColumnVector<char8_t> const*, DB::Block&, std::__1::vector<unsigned long, std::__1::allocator<unsigned long> > const&, unsigned long, unsigned long) @ 0xb14b5a7 in /usr/bin/clickhouse
8. DB::FunctionIf::executeImpl(DB::Block&, std::__1::vector<unsigned long, std::__1::allocator<unsigned long> > const&, unsigned long, unsigned long) @ 0xb2630d9 in /usr/bin/clickhouse
9. DB::FunctionIf::executeForNullableThenElse(DB::Block&, std::__1::vector<unsigned long, std::__1::allocator<unsigned long> > const&, unsigned long, unsigned long) @ 0xb14c06e in /usr/bin/clickhouse
10. DB::FunctionIf::executeImpl(DB::Block&, std::__1::vector<unsigned long, std::__1::allocator<unsigned long> > const&, unsigned long, unsigned long) @ 0xb262b84 in /usr/bin/clickhouse
11. DB::ExecutableFunctionAdaptor::execute(DB::Block&, std::__1::vector<unsigned long, std::__1::allocator<unsigned long> > const&, unsigned long, unsigned long, bool) @ 0x9bdfcf2 in /usr/bin/clickhouse
12. DB::ExpressionAction::execute(DB::Block&, bool, std::__1::shared_ptr<DB::ExtraBlock>&) const @ 0xde96d32 in /usr/bin/clickhouse
13. DB::ExpressionActions::execute(DB::Block&, bool) const @ 0xde9b240 in /usr/bin/clickhouse
14. DB::ExpressionBlockInputStream::readImpl() @ 0xe02dfef in /usr/bin/clickhouse
15. DB::IBlockInputStream::read() @ 0xdb0234d in /usr/bin/clickhouse
16. DB::ExpressionBlockInputStream::readImpl() @ 0xe02dfcf in /usr/bin/clickhouse
17. DB::IBlockInputStream::read() @ 0xdb0234d in /usr/bin/clickhouse
18. DB::MaterializingBlockInputStream::readImpl() @ 0xde9008f in /usr/bin/clickhouse
19. DB::IBlockInputStream::read() @ 0xdb0234d in /usr/bin/clickhouse
20. DB::MergeTreeDataMergerMutator::mutateSomePartColumns(std::__1::shared_ptr<DB::IMergeTreeDataPart const> const&, std::__1::set<std::__1::shared_ptr<DB::IMergeTreeIndex const>, std::__1::less<std::__1::shared_ptr<DB::IMergeTreeIndex const> >, std::__1::allocator<std::__1::shared_ptr<DB::IMergeTreeIndex const> > > const&, DB::Block const&, std::__1::shared_ptr<DB::IMergeTreeDataPart>, std::__1::shared_ptr<DB::IBlockInputStream>, long, std::__1::shared_ptr<DB::ICompressionCodec> const&, DB::MergeListEntry&, bool) const @ 0xe58cb0c in /usr/bin/clickhouse -
судя по стектрейсу валится на мутации (тот самый адейт 10 миллионов записей)
пытается MATERIALIZED колонку посчитать через If функцию?
памяти на сервере сколько?
можно попробовать по одному background таску выполнять background_pool_size, background_schedule_pool_size, background_move_pool_size в 1 поставьте в default профиле
если не поможет то мутации лежат ваши где то в /var/lib/clickhouse в виде SQL файлов лежат
можно попробовать их просто грохнуть (предварительно стопнув сервер) -
-
Joined.
-
Добрый день, подскажите, пожалуйста, как правильно построить кросс-дц сетап кластеров кликхауса. Можно ли использовать несколько кластеров зукипера, по одному в каждом дц. Раскидывать кластер зукипера по нодам в разные дц/держать зукипер лишь в одном дц?
-
вам кросс-дц репликация нужна (ReplicatedMergeTree)?
или только кросс-дц вставка и чтение (Distributed)? -
Репликация нужна, да.
-
-
тогда кластер ZK один
и кросс-дц пинг критически важен, 30-60ms между нодами ZK -
-
Ребят, всем привет!
Есть Materialized кололнка, в которой выполняется регулярка, которая экстрактит данные из другой колонки.
Регулярка обновилась и хотелось бы обновить некоторые исторические данные. КХ ругается что нельзя делать ALTER UPDATE для MATERIALIZED COLUMN.
Есть вариант как-то все же заапдейтить колонку, или нужно пересоздавать чтобы обновить исторические значения? -
ну это. у вас теперь часть партов смутировала, а чать нет
-
То есть предпочтительнее держать ноды зукипера в разных дц?
-
несколько кластеров ZK точно не получится для кросс-дц репликации
потому что все реплики коннектятся к кластеру который в <zookeeper> конфиге прописан, и если ZK в разных ДЦ разные кластера, тогда никакой репликации не будет
все остальное через <remote_servers>
сами ноды по ДЦ разным раскидываете это нормально
и https://clickhouse.tech/docs/en/operations/settings/settings/#settings-load_balancing
nearest hostname
https://clickhouse.tech/docs/en/operations/settings/settings/#load_balancing-nearest_hostname
но пинги у нод ZK между собой должны быть минимальными
вот тут примеры настроек
https://clickhouse.tech/docs/en/operations/tips/#zookeeper
в яндексе есть кросс-дц
НО, есть ли там кросс-ГЕО-дц (РФ + Штаты) я не знаюSettings | ClickHouse DocumentationSettings distributed_product_mode Changes the behaviour of distributed subqueries. ClickHouse applies this setting when
-
предпочтительнее в одном, но это плохо для кейса "ДЦ вышел из строя"
-
ALTER TABLE MODIFY COLUMN
-
Спасибо!
-
модифай уже сделал
новые данные записываются правильно, а вот старые остались записанными по старому правилу -
ничего страшного, там не критичный апдейт был)
-
ну тогда надо как то старые парты стриггерить Merge
какую нибудь мутацию чтоли сделайте на ту колонку которая не MATERIALIZED
что нибудь типа
SET mutations_sync=2;
ALTER TABLE db.table UPDATE column=column;
попробовать -
сервер один? если ReplicatedMergeTree то в system.replicas поглядите не встала ли репликация для таблицы
-
Попробуйте ограничить мутацию партицией или мельче, а потом optimize table... partition...
Проальтерите другие части данных -
сработало
спасибо большое -
-
-
вряд ли наливка тормозит, скорее всего тормозят мерджи )
-
Joined.
-
после того как удостоверитесь можете поменять это
max_replicated_merges_in_queue 16
ну а если фетчи то вот эти:
replicated_max_parallel_fetches
replicated_max_parallel_fetches_for_table
replicated_max_parallel_fetches_for_host
replicated_max_parallel_sends
replicated_max_parallel_sends_for_table -
спасибо, попробуем
-
Скажите, а в kafka engine косюмер поднимается и висит постоянно и поллит, или же когда больше нечего читать из топика, освобождает место в backgroundSchedule пуле для других консюмеров? (речь о ситуаци когда консюмеров больше чем background_schedule_size)
Мы часто стали ловить ошибку при попытке закомитить оффсеты от брокера и консюмер группа постоянно ребалансится.
Clickhouse Server v 20.4.
2021.02.08 15:48:57.944984 [ 41516 ] {} <Error> StorageKafka (kafka_table_name): Exception during commit attempt: Broker: Unknown member
2021.02.08 15:48:57.963076 [ 41516 ] {} <Error> void DB::StorageKafka::threadFunc(): Code: 518, e.displayText() = DB::Exception: All commit attempts failed. Last block was already written to target table(s), but was not commited to Kafka., -
Подскажите пожалуйста - есть ли какая-то возможность повлиять на то в каком порядке кликхаус читает данные с диска(порядок чтения партиций)?
Проблема в чем, есть запрос:
insert select * from <very_big_table> any inner join <medium_table> using id
Именно в таком варианте оно работает, но нет понимания есть ли гарантия повторяемости результатов - any join при параллельном чтении выдает результаты того потока который первее нашел пару для правой части, верно?
Нужно получить гарантированное поведение данного запроса, а именно - чтоб к каждому элементу малого множества клеялась либо самая старая запись(самая старая партиция) либо самая новая. Хотя бы какой-то один из этих вариантов.
Добавляя какую-либо сортировку в very_big_query - сразу вылетаем по памяти( (здесь кстати не понятно почему - если сортируем по ключу партиционирования - все равно вылетает - хотя казалось бы выдавай партици по очереди и ок).
Срезав кол-во потоков через max_threads=1 можно убрать параллелизм и судя по логам вроде как чтение идет в один поток и в порядке партиций от меньшей к большей. Т.е. выглядит как подходящий вариант, но нигде не могу найти подтверждения этой теории - гарантирован ли в данном варианте повтор результата на одних и тех же данных, может кто-нибудь подсказать?
Ну и может есть рычаг заставить читать партиции в обратном порядке? тогда при условии того что предыдущий абзац верный - можно было бы получить вариант _join с самым свежим_. -
гарантий нет никогда, ни в одной нормальной SQL базе.
с памятью можете попробовать max_bytes_before_external_sort выставить -
Ребята, патовая ситуация, добавлили новую (следующую) ноду в кластер, а тут длинна имени папки для бинов уложила его (кластер), срочно вывели.
при анализе оказалось что имя ее более 255 симовлов.
Вручную проверили
mkdir 'replica:xxxxxxxxxx@clickhouse%2Dnode1......node27:9000/statistics' : File name too long
Как с минимальными потерями сократить есть идеи? -
укоротить имена и пароли 🙂
какая версия КХ?
В новых есть use_compact_format_in_distributed_parts_names -
20.3.19.4 (official build).
-
-
в этой наверное нету
поищите в system.settings на всякий случай -
есть такое
│ use_compact_format_in_distributed_parts_names │ 0 │ 0 │ Changes format of directories names for distributed table insert parts. │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │
Но есть и такое
https://github.com/ClickHouse/ClickHouse/issues/14130Clickhouse unable to start with unclear error if Distributed table have unexpected folders · Issue #14130 · ClickHouse/ClickHousecreate table default.DFA(A Int64) Engine=MergeTree order by tuple(); create table default.DFAD as default.DFA Engine=Distributed(test_shard_localhost, default, DFA) mkdir /var/lib/clickhouse/data/d...
-
Подскажите по update_field для словарей:
- Имеем таблицу в Postgres, в ней поле updated (timestamp with time zone, not null).
Какой тип updated поля ожидает ClickHouse (timestamp / timestamp with time zone)?
- Конфиг словаря такой:
<source>
<name>test</name>
<odbc>
<table>table_name</table>
<connection_string>DSN=...</connection_string>
<update_field>updated</update_field>
</odbc>
</source>
<layout>
<ssd_cache>
...
</ssd_cache>
</layout>
<lifetime>
<min>30</min>
<max>45</max>
</lifetime>
<structure>
<id>
<name>id</name>
<type>UInt64</type>
</id>
<attribute>
<name>status_id</name>
<type>UInt8</type>
<null_value />
</attribute>
<attribute>
<name>updated</name>
<type>UInt64</type>
<null_value />
</attribute>
</structure>
- Делаем system reload dictionary test; select dictGet('test', 'status_id', toUInt64(1))
- Видим зарос в Postgres: SELECT "id", "status_id", "updated" FROM "test_table" WHERE "id" IN (1)
- Повторяем через минуту - снова такой же запрос в Postgres
Почему нет запроса вида updated >= {$last_check}?
Словарь наполняется выборками по ID, не сразу все / изменившиеся выгружаются? -
остановите инсерты, удалите старые папки, поставьте настройку в 1 в default профиле и рестартаните
-
Joined.
-
Будем пробовать, но баг-то открыт...
-
-
много открытых багов
главное - не наступать 🙂 -
Joined.
-
Коллеги, как правильно считать delta от минимального значения в группе (100500 попытка изобрести window функции)? Есть события (id, node, ts DateTime64), хочется посчитать delta для каждого id, но runningDifference не подходит, ибо он бежит по всем. Попробовал финт с
min(toUnixTimestamp64Micro(ts)) AS ts_min
и
groupArray((node, toUnixTimestamp64Micro(ts))) AS a
но такая история ацки жрет память и оказалось проблематично это засунуть в materialized view. -
Такой заход нормальный? SELECT
id,
node,
ts,
ts - ts_min AS ts_delta,
date
FROM
(
SELECT
id,
min(toUnixTimestamp64Micro(ts)) AS ts_min,
groupArray((node, toUnixTimestamp64Micro(ts))) AS a,
date
FROM msgtime
WHERE date = '2021-02-06'
GROUP BY (id, date)
)
ARRAY JOIN
a.1 AS node,
a.2 AS ts -
-
А сколько разных групп то?
-
Может через JOIN лучше будет
-
вы смотрите на запрос который выполняется при промахе в кеш...
попробуйте сначала выбрать layout hashed/sparse_hashed...
тогда он выполнит один раз и заберет все, и каждый следующий раз будет выполнять update_field>=<last-updated>
формат всегда ожидается epoch судя по коду, (т.е. инт) -
Айдишников 40 миллионов, node десятки, база суммарно 1,5 лярда
-
40 млн * на сколько дат
-
14 дней, дальше думаю не будем
-
Ну и да, вы же знаете что МВ в кх это инсерт триггер на самом деле и он не читает таблицу
-
-
now() - INTERVAL number MINUTE FROM numbers(10000)
-
Спасибо!
- 09 February 2021 (312 messages)
-
Joined.
-
MATERIALIZED VIEW нет, а вот LIVE VIEW с v21.2.2.8-stable можно. https://github.com/ClickHouse/ClickHouse/blob/3d2788e1b5b622f96fd15dd4636eba30984d39fb/docs/en/sql-reference/statements/create/view.md#live-view-experimental-live-view.ClickHouse/view.md at 3d2788e1b5b622f96fd15dd4636eba30984d39fb · ClickHouse/ClickHouse
ClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
(groupArray( tuple(pack_name) )).1
-
Это специально сделано.
Агрегирующие функции не учитавают null. О об этом написано в доке. -
Нет, это не решает проблему. Точнее надо после бекапа сказать sync, чтобы записать грязный кеш на диск.
-
Спасибо
-
Для ssd_cache не должно работать. Это бессмысленно.
-
У вас any join и левую таблицу обрабатывает distinct. Надо либо включить настройку any_join_distinct_right_table_keys
либо использовать semi join -
Так кафка устроена. Необходимо постоянно полить. Иначе брокер думает что консьюмер помер и делает ребаланс и отдает партиции другому консьюмеру
-
-
Ребят привет, а я могу как то реплику запустить без ЗК? Мне только "прочитать" что есть в таблицах, которые были не реплицируемые.
Или лучший вариант, если я мувну все партиции на другой ЗК и приатачу ?
Версия CH: 20.10.6 -
Ну у нас так и получается. Может быть, что после получения из кафки кх слишком долго обрабатывает полученный батч, что брокер кикает консюмер? Очень на это похоже по крайней мере
-
-
Вам бы обновится сначала до 20.6+ там сильно лучше все с кафкой
-
Кх без зукипера стартует, таблицы просто ro
-
Чет не хочет, он стартовать. Пытается законнектися и после этого вырубается
-
не верится что-то. Ну удалите из конфига кусок про зукипер. И покажите лог
-
забавно, если conf.d/zookeeper.xml будет пустой, то CH не может запуститься, если в сервера ZK запихать localhost, то после попыток подключиться он вырубается.
А если удалить conf.d/zookeeper.xml и закомментировать <zookeeper incl="zookeeper-servers" optional="true" />, то он стартует
Но прочитать реплицируемую табличку чет не получается
2021.02.09 07:28:00.412261 [ 21805 ] {59dcd7bf-da8b-4737-b293-f0efb5b7c2e9} <Debug> executeQuery: (from 127.0.0.1:42870) SELECT count(*) FROM test_backup;
2021.02.09 07:28:00.416711 [ 21805 ] {59dcd7bf-da8b-4737-b293-f0efb5b7c2e9} <Error> executeQuery: Code: 225, e.displayText() = DB::Exception: Cannot get ZooKeeper (version 20.10.6.27 (official build)) (from 127.0.0.1:42870) (in query: SELECT count(*) FROM test_backup;), Stack trace (when copying this message, always include the lines below):
0. DB::StorageReplicatedMergeTree::getZooKeeper() const @ 0xe0783bb in /usr/bin/clickhouse
1. DB::StorageReplicatedMergeTree::getMaxAddedBlocks() const @ 0xe0da8cd in /usr/bin/clickhouse
2. DB::StorageReplicatedMergeTree::totalRows() const @ 0xe0db63d in /usr/bin/clickhouse
3. DB::InterpreterSelectQuery::executeFetchColumns(DB::QueryProcessingStage::Enum, DB::QueryPlan&, std::__1::shared_ptr<DB::PrewhereInfo> 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&) @ 0xdb543d3 in /usr/bin/clickhouse
4. DB::InterpreterSelectQuery::executeImpl(DB::QueryPlan&, std::__1::shared_ptr<DB::IBlockInputStream> const&, std::__1::optional<DB::Pipe>) @ 0xdb4c46b in /usr/bin/clickhouse
5. DB::InterpreterSelectQuery::buildQueryPlan(DB::QueryPlan&) @ 0xdb4b9c6 in /usr/bin/clickhouse
6. DB::InterpreterSelectWithUnionQuery::execute() @ 0xdcf167d in /usr/bin/clickhouse
7. ? @ 0xde48568 in /usr/bin/clickhouse
8. DB::executeQuery(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, DB::Context&, bool, DB::QueryProcessingStage::Enum, bool) @ 0xde4740d in /usr/bin/clickhouse
9. DB::TCPHandler::runImpl() @ 0xe4ee3a6 in /usr/bin/clickhouse
10. DB::TCPHandler::run() @ 0xe4fb1a7 in /usr/bin/clickhouse
11. Poco::Net::TCPServerConnection::start() @ 0x10cd40df in /usr/bin/clickhouse
12. Poco::Net::TCPServerDispatcher::run() @ 0x10cd5af1 in /usr/bin/clickhouse
13. Poco::PooledThread::run() @ 0x10e06c99 in /usr/bin/clickhouse
14. Poco::ThreadImpl::runnableEntry(void*) @ 0x10e02bca in /usr/bin/clickhouse
15. start_thread @ 0x7ea5 in /usr/lib64/libpthread-2.17.so
16. clone @ 0xfe96d in /usr/lib64/libc-2.17.so -
-
Количество партов
-
-
Спасибо, гляну.
А можно чуть-чуть теории? Как работает КХ в случае таких запросов и как количество портов влияет на подобные запросы? -
-
Спасибо огромное, попробую!!
-
Тупой вопрос, но я что то туплю, может кто подскажет
есть JSON (Netflow V9 с CISCO), который никак не соображу как распарсить, чтобы положить в табличку
значения из массива
интересует только массивы из "DataSets"
{"AgentID":"10.1.1.1",
"Header":{"Version":9,"Count":1},
"DataSets":[
[{"I":2,"V":"0x00000231"},{"I":1,"V":"0x0009c151"},{"I":8,"V":"109.195.122.130"}],
[{"I":2,"V":"0x00000341"},{"I":1,"V":"0x0009c221"},{"I":8,"V":"109.195.122.233"}]
]}' -
1000 файлов даже если limit 10?
-
Привет.
Есть бесплатный довольно удобный гуёвый клиент для мускула, постгреса, etc: HeidiSQL . И его автор начал делать поддержку ClickHouse: https://github.com/HeidiSQL/HeidiSQL/issues/135#issuecomment-775711225 . У него возникают вопросы, как делать разные системные запросы по аналогии с MySQL и PG. Требуется Ваша профессиональная помощь, ибо я сам не настолько большой профессионал, чтобы правильно написать все запросы, специфичные для ClickHouse-а.Clickhouse support · Issue #135 · HeidiSQL/HeidiSQLhttps://clickhouse.yandex/ https://github.com/yandex/clickhouse-odbc
-
-
-
вы берете специфичный кейс, который не оптимизирован (пока).
если взять select * from xxx where aaa=4 limit 10.
то КХ не знает когда эти 10 попадутся и будет лопатить все подряд.
также на таблице может висеть ROW POLICY что тоже обязывает фильтровать.
обычно когда у вас много партов причины две:
- у вас высокая гранулярность партиций, тогда лучше просто зафорсить использование partitionkey во всех запросах (force_index_by_date=1)
- у вас не работают мерджи, это надо чинить.
ну и можно сделать ФР на оптимизацию таких селектов. но это в реальной жизни не так уж и нужно учитывая все эти workaroundы -
^^
-
Если добавить условие, то логика чтения всех партиций понятна, а вот без условий и сортировок - нет. :/
Кстати, посмотрел - там 74 партиции всего, но 63 млрд записей на 1.2тб таблицу. -
-
Коллеги , всех приветствую!
Подскажите с кейсом : хочу удалить старые данные (partitions) из кластера , собсна хочется понять - это надо сделать на каждом узле или как ? -
(я не гуру в КХ, сильно не ругайте за может быть глупый вопрос)
-
-
on cluster можно добавить и удалится на всем кластере
-
Благодарю , коллеги!
-
ну а сколько партов? сколько колонок?
-
скорее всего, ttl не успевал отрабатывать, в старой версии он дропал один парт и больше ничего не делал, раз в день. можете попробовать уменьшить интервал отработки merge_with_ttl_timeout если у вас ttl_only_drop_parts=1,
-
Пардон, не туда посмотрел.
Вопрос снимается. -
67 столбцов, 347 партов
-
-
Joined.
-
Воистину. Пойду думать, спасибо. :)
-
-
Лучше расскажите, какую задачу решаете. Если вам декартово произведение нужно отрубить, то используйте any join
-
Простите за глупый вопрос. В доках написано, что КХ использует сжатие. Если у нас дефолтные настройки, будет ли сжатие данных на диске?
<compression incl="clickhouse_compression">
<case>
<min_part_size>10000000000</min_part_size>
<min_part_size_ratio>0.01</min_part_size_ratio>
<method>zstd</method>
</case>
</compression>
Вообще возможно как то "упаковать" данные на диске, чтобы они меньше места занимали? -
нет, я просто хочу понять как работает ASOF JOIN под капотом
-
Будет
-
Правильный order by +encoding иногда может зарешать. Надо знать данные
-
там тупо логи лежат
-
по умолчанию пакует LZ4
https://clickhouse.tech/docs/ru/sql-reference/statements/create/table/#codecs
вот тут можно почитать про кодаки сжатия, иногда можно ооооочень эффективно пожать поигравшись кодаками индивидуально для столбцовТаблица | Документация ClickHouseCREATE TABLE Запрос CREATE TABLE может иметь несколько форм, которые используются в зависимости от контекста и решаемых
-
-
а эффективность текущего сжатия какая?
-
Текстовые? Тогда только увеличить степень компрессии zstd
-
как узнать?
-
SELECT database, table, name, compression_codec,
round(sum(data_compressed_bytes) / 1024/1024/1024, 2) as size_gb,
round(sum(data_uncompressed_bytes) / 1024/1024/1024, 2) as size_uncompressed_gb,
round(size_gb/size_uncompressed_gb*100,2) perc
FROM system.columns
GROUP BY database,table, name, compression_codec
HAVING size_gb>0.1
ORDER BY name ASC,table ASC -
Можно уже к существующим таблицам менять кодек?
-
можно к существующим полям
-
ALTER TABLE.. MODIFY COLUMN
смотрите в доке -
сук, По факту не работает у меня вот так
-
А все условия из доки выполнены?
-
не помогут вам кодеки особо на лог-текстовых полях
-
Syntax error: failed at position 1 ('round'):
-
можно попробовать какой нить LZ4HC(9+), ну и логи бывают очень кардинальными )
-
Joined.
-
да. Соединяю по id пользователя и data в левой таблице должна быть меньше чем в правой
-
У меня точно такая же нога и она не болит)
-
LZ4HC - это не кодек, это компрессия, и то лучше как я сказал zstd>10... короче надо взять набор данных и делать бенчмарк
-
ну да, в любом случае надо пробовать
-
и вроде условия соблюдены, но они же никак не близкие
-
а можно скриншот?
-
В доке указано, что должно быть несколько полей для джоина — как минимум, одно жёсткое, и вот какое-нибудь для asof. Мб, из-за «жёстких» полей это максимально близкий вариант для джоина?
-
-
что значит "схлопнуть"?
select aggfn(col1), aggfn(col2) from tbl? -
-
select col1, col2, aggfn(col3), aggfn(col4) from tbl?
-
-
-
вы все правильно делаете, если не влезает - спилите на диск.
если результат неправильный - это баг -
-
я не знаю какая у вас сейчас версия, поэтому воздержусь от совета... вообще этот функционал врядли забагован, скорее всего у вас данные такие и там все правильно возвращается...
-
ну или не баг... а просто данные такие
-
-
-
-
SELECT uniqExact(col2) FROM table WHERE id=XX
тоже 4 показывает? -
-
-
WITH | ClickHouse Documentation
WITH Clause ClickHouse supports Common Table Expressions (CTE), that is provides to use results of WITH clause in the re
-
-
покажите структуру таблицы и SQL запрос
и как проверяли потом
100 миллиардов или триллион, роли не играет -
Спасибо!
-
-
Всем привет
Как узнать сколько еще будет выполняться запрос, если по трейс логам он занимается переименованием tmp партов -
Что-то не работает :(
Делаю так:
WITH users_logins as (
SELECT
login
FROM events
WHERE
date BETWEEN (toDate('2021-02-08') and toDate('2021-02-08'))
and event_id = 111
)
select
count(*)
from
users_logins
Пишет:
DB::Exception: Syntax error: failed at position 24 ('(') (line 3, col 22): (
SELECT
login
FROM events
WHERE
EventDate BETWEEN (toDate('2021-02-08') and toDate('2021-02-08'))
and event_id = 1. Expected identifier -
-
вот также и проверял, в материнской таблице 479 а в производной 4 (версия 20.6.4)
-
clickhouse какой версии?
CTE через WITH недавно подвезли -
20.8.11.17
-
-
-
оно то ли в 20.10 то ли в 20.11 приехало.
раньше был выбор версии в хелпе, сейчас куда то пропал... -
-
-
-
-
-
-
Всем привет. Никто не сталкивался с тем, что с указанием пода (kubectl) не дает подключиться по http интерфейсу?
Запрос вида
echo 'SELECT 1' | curl 'http://clickhouse-simple-01.db-test:8123/' -d @-
Падает с ошибкой
DB::Exception: default: Authentication failed: password is incorrect or there is no user with such name (version 20.12.4.5 (official build))
Даже будучи внутри самого пода, либо на другом поде, с которым имеется связь
Запрос вида
echo 'SELECT 1' | curl 'http://localhost:8123/' -d @-
Отрабатывает внутри пода
Пробовал менять типы авторизации, устанавливал пароль, ошибка сохраняется -
покажите вывод с curl -vvv
echo 'SELECT 1' | curl -vvv 'http://clickhouse-simple-01.db-test:8123/' -d @- -
как clickhouse в kubernetes ставили? clickhouse-operator? или helm какой нибудь?
-
helm
-
* Trying 172.20.144.86...
* TCP_NODELAY set
* Connected to clickhouse-simple-01.crm-test (172.20.144.86) port 8123 (#0)
> POST / HTTP/1.1
> Host: clickhouse-simple-01.crm-test:8123
> User-Agent: curl/7.58.0
> Accept: */*
> Content-Length: 8
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 8 out of 8 bytes
< HTTP/1.1 500 Internal Server Error
< Date: Tue, 09 Feb 2021 10:32:14 GMT
< Connection: Keep-Alive
< Content-Type: text/plain; charset=UTF-8
< X-ClickHouse-Server-Display-Name: chi-simple-01-cluster-0-0-0.chi-simple-01-cluster-0-0.crm-test.svc.dev.cluster.local
< Transfer-Encoding: chunked
< X-ClickHouse-Exception-Code: 516
<
Code: 516, e.displayText() = DB::Exception: default: Authentication failed: password is incorrect or there is no user with such name (version 20.12.4.5 (official build))
* Connection #0 to host clickhouse-simple-01.crm-test left intact -
mongo ни разу не про объёмы... скорее про неструктурированные данные
-
А про что
-
-
-
смотря какие данные
-
-
-
тогда это максимально неподходящий чат
-
-
-
sqlite
-
excel, access...
-
Ну вот я тоже думаю, пойду тогда смотреть, а там уже разберусь
-
Не
-
foxpro, dbase
-
-
берите sqlite, и не заморачивайтесь
-
Ок, спасибо
-
Вопрос по Kafka Engine (version 21.2.2.8). Пытаемся ускорить импорт из кафки, но не можем добиться больше 500 сообщений в секунду. Как понять в чем проблема и куда смотреть? Пробовали различные комбинации с kafka settings, создавали параллельно 3 консьюмера (отдельными таблицами с общей группой) так же игрались с kafka_num_consumers, но ничего не помогает.
Топик на три партиции, размер сообщения ~1.5кб, сейчас методом проб и ошибок вышли на такие значения, kafka_num_consumers = 3, kafka_max_block_size = 2000000, kafka_commit_every_batch = 1, kafka_thread_per_consumer = 1
Куда копать, что еще попробовать? -
Кол-во консюмеров увеличить
-
-
в конфиге пользователя default добавьте,
<networks incl="networks" replace="replace">
<ip>::/0</ip>
</networks>
либо используйте другого пользователя -
Заметил, что count() читает в разы больше полей, чем простой их вывод.
Делаю раз:
select field1, field2, field3
from table1
where field1 in (select field5 from table5)
1.5 секунды, читает 2.5 млн строк
Делаю два:
select count()
from table1
where field1 in (select field5 from table5)
8 секунд, читает 420 млн строк
Почему так? -
Интересный случай произошёл, опишу, ибо вдруг кто по истории чата будет искать. Была частая проблема при вставках аля
DB::Exception: Memory limit (total) exceeded: would use 56.60 GiB (attempt to allocate chunk of 67108896 bytes), maximum: 56.59 GiB
Складывалось полное впечатление, что кх (внезапно) перестало хватать памяти, хотя ничего не обновлялось и не выкатывалось. Смотрю в htop - занято всего 20Гб, по приборам в графане тоже самое. Смотрю MemoryTracking - поднимается до 50+ Гб и потом падает. В итоге поставил в два раза больше использование памяти и всё пошло как по маслу. Отчего такое аномальное поведение началось - для меня неизвестно. Версия кх 21.1.2.15
<max_server_memory_usage_to_ram_ratio>2</max_server_memory_usage_to_ram_ratio> -
но у нас топик на 3 партиции, и 3 кафка брокера
-
вы сравниваете запросы с помощью Format Null?
-
Format TabSeparatedWithNamesAndTypes
-
Уже есть этот блок
-
А что мешает увеличить?
-
у вас скорее всего останавливается клиент...
-
перепроверьте в preprocessed_configs/users.xml
-
из документации "The total number of consumers should not exceed the number of partitions in the topic, since only one consumer can be assigned per partition." Или вы имеете ввиду увеличить количество партицый на брокере тоже?
-
Про FORMAT Null не знал, спасибо. Сейчас попробую.
Правильно понимаю, что в таком случае фактор клиента должен исключаться? -
Конечно с начало на брокере нужно увеличить, толку не будет, если только на кафка энджин увеличить
-
Там отличивается, да
-
host_regexp смотрите в настройках default profile
-
<host_regexp>(chi-simple-01-[^.]+\d+-\d+|clickhouse\-simple-01)\.crm-test\.svc\.cluster\.local$</host_regexp>
-
<networks incl="networks" replace="replace">
<ip>::1</ip>
<host_regexp>(chi-simple-01-[^.]+\d+-\d+|clickhouse\-simple-01)\.crm-test\.svc\.cluster\.local$</host_regexp>
<ip>127.0.0.1</ip>
</networks> -
Ругается синтаксической ошибкой, КХ 20.8.3.18. :/
Этот формат недавно завезли? -
может на вставляемых таблицах навешан МВ?
либо слишком большой кусок вставляете... КХ сортирует их в памяти, т.е. он должен влезать. https://t.me/clickhouse_ru/199500
в очень новой версии есть флажок чтобы сортировать на клиенте
https://t.me/clickhouse_ru/201922 -
да
-
он давно там
-
Его нужно как-то заменить?
-
case sensitive: Format Null
-
Не хочет. Остальные форматы принимает.
Syntax error: failed at position 536 ('FORMAT') (line 21, col 13): FORMAT TabSeparatedWithNamesAndTypes;. Expected SETTINGS (version 20.8.3.18 (official build)) -
На вставляемую таблицу действительно навешаны MV, но уже достаточно давно и никогда с этим проблем не возникало. А вот по поводу клиента спасибо за подсказу, потому что сам вставщик clickhouse-client уже давно не обновлялся (аж 20.1.3.7). Быть может дело в клиенте
-
когда вы конектитесь к
Connected to clickhouse-simple-01.crm-test (172.20.144.86) port 8123
clickhouse при наличии host_regexp
будет делать DNS запрос c типом PTR на ваш source ip
c которого будет идти коннект
и это видимо будет какой то другой hostname не попадающий под ваш host-regpexp
судя по всему вы конектитесь не в под а в сервис ? или точно по имени именно ПОДа? -
нет, дело не в клиенте одного обновления клиента не хватит думаю, просто у вас не хватает памяти, придется вставлять кусками меньше... либо убить пару МВ
-
Если бы имя было не корректным то выдало ошибку хоста, поэтому скорее всего подключаюсь я к самому поду, возможно конечно я и ошибаюсь
-
судя по названию хостов, у вас все таки менеджмент clickhouse идет через clickhouse-operator
который установлен через самописный helm chart -
select * from system.parts Format Null;
SELECT *
FROM system.parts
FORMAT Null
Ok.
0 rows in set. Elapsed: 0.241 sec. Processed 5.38 thousand rows, 2.82 MB (22.39 thousand rows/s., 11.72 MB/s.) -
нет. имя некорректное и авторизация валится с ошибкой авторизации
-
А, в этом плане. Мейби, попробую действительно сделать батч поменьше
-
Видимо, дело в клиенте (DBeaver). :(
Оба запроса ругаются такой же синтаксической ошибкой. -
dbeaver И не должен работать. проверять надо родным клиентом
-
Joined.
-
Joined.
-
У вас AggregaringMergeTree с order by id.
Он не склеивает записи с разными idto? -
-
-
По описанию движка звучит логично
-
-
-
-
-
-
-
-
-
-
А как до этого люди делали запросы, в которых надо было провязать данные из двух селектов по сути? Никак?)
-
что значит привязать данные из двух селектов?
в смысле сдалть JOIN по результатам двух sub query ? -
У меня есть табличка с событиями. Я хочу посчитать воронку вида "какой процент пользователей, которые до этого тыкнули в определенную кнопку, сделали потом что-то".
То есть в обычном мире я бы либо поселектил в переменную пользователей, которые тыкнули в кнопку, а потом поселектил всех пользователей, сделавших что-то и входящих в этот список (переменную), либо сделал в where условие вида user in (select from) -
Подскажите пожалуйста. По какой причине SummingMergeTree может не суммироватся? Сделал запись около получаса назад, таблица так и не просуммирована
CREATE TABLE IF NOT EXISTS lbas_daily
(
date Date,
uuid UUID,
created_at DateTime,
type_name String,
bv Int64
) ENGINE = SummingMergeTree(bv)
PARTITION BY toYYYYMM(date)
ORDER BY (date, uuid);
INSERT INTO lbas_daily
SELECT toDate(sample_time) as date,
uuid,
created_at,
type_name,
1 as bv
FROM lbas
WHERE toDate(sample_time) == yesterday(); -
-
-
возможно, мой комментарий вряд ли пригодится, но емнип, тут или 1) действительно вам сделать join по подзапросу, 2) как вариант, то что вы указали в своем оригинальном сообщении, сделать на базе tmp по таблице тыкнувших пользователей. (изумдриться, но такой себе вывод)
Но JOIN или WITH звучит как-то разумнее, как сказал @BloodJazMan , ИМХО. 😅 -
Joined.
-
-
-
Привет, кто знает, в каком месте в сорцах ch трансформацию Float64 -> Decimal64 посмотреть можно?
UPD: https://github.com/ClickHouse/ClickHouse/blob/6fc3ca8b7b42879d36a9dfd1756b9eb772128814/src/DataTypes/DataTypesDecimal.h#L193ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
создалась табличка, но опять разница в 2 раза, делаю select uniqExact(idto) from schema1.id_all where id = xxxxxx
выдает 479 записей, делаю тот же запрос на производной таблице, выдает 249 записей
производная таблица создавалась create table schema1.agg_id engine = MergeTree order by id as select id, idto from schema1.id_all group by id, idto -
Parametric | ClickHouse Documentation
Parametric Aggregate Functions Some aggregate functions can accept not only argument columns (used for compression), but
-
есть идеи в чем может быть проблема?
-
не все вставилось... так бывает... сделайте select count() сравнение табличек
-
-
добрый день, столкнулись с проблемой зависания таблицы (engine mysql), любая операция drop/rename/select вызывает бесконечное зависание. в логах запросов можно увидеть следующую ошибку:
Code: 473, e.displayText() = DB::Exception: WRITE locking attempt on "database.tablename" has timed out! (120000ms) Possible deadlock avoided. Client should retry. (version 20.4.4.18 (official build))
погуглили после этого, вроде пишут, что это баг, связанный с возникновением дедлока при alter таблицы и он был починен в 20.6 обновились до 21, но сама проблема никуда не исчезает, таблица залочена намертво. убиваем вручную запросы, которые с ней как либо связаны, но запрос на убийство запроса тоже зависает зачастую. кто-то сталкивался с таким поведением? -
Всем привет
Уже сутки выполняется insert запрос запущенный через clickhouse client
Как узнать его прогресс, если на текущий момент в trace log он переименовывает tmp партиции -
да, не заметил group by.
там у вас ещё aggregatedmt... -
-
так может вы МВ создали позже чем начали наполнять сырую таблицу? зачем там вообще aggregating MT? я вообще потерял нить и в чем была проблема у вас...
select distinct [keys] from raw
select distinct [keys] from mv
дают разные значения? -
-
Ну сделайте
Select from main where (id, idto) not in (select from new)
Возьмите первую попавшуюся строку.
И select from new where id=a and idto=b; -
-
-
да, данных нет в производной таблице
-
ну у вас не все вставилось тогда, инсерт умер не дойдя до конца
-
-
select id, idto from rawtable group by id, idto;
select distinct id,idto from rawtable;
оба должны работать без проблем -
-
-
Привет всем, настраивал кто-нибудь уже с 21.2.2.8 LDAP с мапингом ролей? Вроде все сделал как написано в конфигах, настроил фильтры и тд. Пытаюсь войти, CH дергает LDAP, там все успешно, но дальше выдает что не пущу, а за ролями даже не идет (смотрю в wireshark) 😕
-
-
@tron_wai вот как-то так, не очень содержательно конечно
2021.02.09 14:02:51.012144 [ 54 ] {} <Error> Access(user directories): test_user: Authentication failed: Code: 192, e.displayText() = DB::Exception: There is no user `test_user` in user directories, Stack trace (when copying this message, always include the lines below): -
локально этого юзера нет в CH, но в том же и суть, чтобы не заводить, а использовать из LDAP, или что-то не так понял? И вот так в конфиге https://gist.github.com/fuCtor/bebfd81cd8d232ceacc1b15c4b72d6a1gist:bebfd81cd8d232ceacc1b15c4b72d6a1
GitHub Gist: instantly share code, notes, and snippets.
-
Добрый день.
Переключились на ZK c защищенным подключением, в query_log самые долгие запросы с ошибкой от юзера repl_stats, который указан в конфигах реплик:
Code: 999, e.displayText() = DB::Exception: Cannot allocate block number in ZooKeeper: Coordination::Exception: Session expired (Session expired) (version 21.2.2.8 (official build))
Вдобавок запросы редко проходят, потому что этот самый repl_stats:
DB::Exception: Too many simultaneous queries for user repl_stats. Current: 50, maximum: 50. (version 21.2.2.8 (official build)) -
может кто-то из свежезашедших знает?)
-
ldapsearch / ldapwhoami работают?
-
да, проверил через другие ldap клиенты, так в логах wireshark он пишет что bind success. Потом unbind и все, ошибка входа.
-
А если мапинг ролей убрать, то аутентифицируется пользователь?
-
-
да, без мапинга все завелось
-
-
-
еще бы в лог выкидывал 🙁 пойду курить, еще конечно сырки можно посмотреть с этой фичей )
-
что выдает эквивалентный ldapsearch?
-
проблема в том что там подстановка, и вот во что она разворачивается не совсем очевидно
-
-
-
-
-
-
это из настроек в секции <ldap_servers>
-
-
-
-
-
-
-
-
-
-
-
-
сорян, не думал что под маком есть, сейчас соберу
-
-
ldapsearch -H "ldap://ldap.domain.tld:389" -D 'DOMAIN\test_user' -w password -b "OU=Security Groups,dc=domain,dc=tld" "(&(objectClass=group)(member=DOMAIN\test_user))"
# extended LDIF
#
# LDAPv3
# base <OU=Security Groups,dc=domain,dc=tld> with scope subtree
# filter: (&(objectClass=group)(member=DOMAIN\test_user))
# requesting: ALL
#
ldap_search_ext: Bad search filter (-7)
ну собсвенно как и ожидалось 🙁
хз как это склеивать -
-
-
-
-
-
-
-
Добрый вечер!
У меня вопрос по GLOBAL IN:
Есть запрос:
SELECT *
FROM distributed_table
WHERE name IN (1, 2, 3)
И вопрос: что-то вообще изменится, если я IN заменю на GLOBAL IN?
Получится:
SELECT *
FROM distributed_table
WHERE name GLOBAL IN (1, 2, 3)
Заранее благодарю за ответ -
в вашем варианте нет
-
таблицы потянутся полностью на ноду инициатор без фильтрации
не стоит так делать
https://clickhouse.tech/docs/en/sql-reference/operators/in/#select-distributed-subqueriesIN Operators | ClickHouse DocumentationIN Operators The IN, NOT IN, GLOBAL IN, and GLOBAL NOT IN operators are covered separately, since their functionality is
-
если вы в ин передадите другой селект из дистрибутед таблицы, то первый вариант не отработает. Второй - да, только вы будете клеить, фильтровать результаты двух таблиц на одной машине
если вы в ин передидте локальную другую таблицу, то субвыборка будет распределена по шардам. -
Про подзапрос да, в курсе. Вот хотел узнать, не повысится ли нагрузка, если за GLOBAL IN будет константный кортеж
-
Все-равно все таблицы потянутся?
-
по возможности кх попробует обработать ваше условие на удаленных серваках
-
Понял, спасибо!
Резюмирую: если после IN стоит константный кортеж (не подзапрос), то IN можно заменить на GLOBAL IN без потери быстродействия -
в доке как то так выглядит
When using GLOBAL IN / GLOBAL JOINs, first all the subqueries are run for GLOBAL IN / GLOBAL JOINs, and the results are collected in temporary tables. Then the temporary tables are sent to each remote server, where the queries are run using this temporary data. -
Да, это тоже прочитал. Но я прям сильно надеюсь, что разработчики такой случай предусмотрели и не станут посылать в таблицы запросы почем зря
-
Joined.
-
остается сделать
в clickhouse-client
SET send_logs_level='trace';
выполнить запрос
и посмотреть что выдаваться будет -
Добрый вечер. У нас проблема возникла при попытке TTL уменьшить на базе(реплика 2 ноды, zookeper на 5). Как пофиксить? Перезапустить репликацию?
-
SHOW CREATE TABLE ...
-
ALTER же ON CLUSTER должен быть
-
Row 1:
──────
statement: CREATE TABLE logs.log
(
srv Int32,
port Int32,
t DateTime,
ms UInt64,
user_id Int32 DEFAULT 0,
proj String,
module Nullable(String),
proc String,
type Enum8('info' = 0, 'debug' = 1, 'trace' = 2, 'warn' = 3, 'error' = 4, 'fatal' = 5, 'panic' = 6, 'success' = 7, 'syslog' = 8),
mes Nullable(String),
pack Nullable(String),
market Nullable(String),
pair Nullable(String),
mail Nullable(String),
id Nullable(String),
sub_id Nullable(String),
event_id Nullable(String)
)
ENGINE = ReplicatedMergeTree('clickhouse/tables/1/log', '1')
ORDER BY (t, ms, user_id, proj, proc)
TTL t + toIntervalMonth(1)
SETTINGS index_granularity = 8192 -
Мы только учимся, не подскажите как правильно? Но ошибка то мне кажется не об этом
-
SELECT * FROM system.zookeeper WHERE path = '/clickhouse/tables/1/log/replicas/1' AND name IN ('metadata','columns')
SELECT * FROM system.zookeeper WHERE path = '/clickhouse/tables/1/log/' AND name IN ('metadata','columns') -
-
-
Вообще с первого взгляда выглядят идентичными.
Какое значение TTL было раньше? -
вроде 1,5 месяца
-
что интересно, похоже 1месяц применилась настройка. Места на диске прибавилось. Как узнать нормально ли сейчас работает репликация и не отстает ли она от зоокипера?
-
покажите show create table на реплике
-
выше давал
-
SELECT * FROM system.replicas;
SELECT * FROM system.replication_queue; -
Row 1:
──────
statement: CREATE TABLE logs.log
(
srv Int32,
port Int32,
t DateTime,
ms UInt64,
user_id Int32 DEFAULT 0,
proj String,
module Nullable(String),
proc String,
type Enum8('info' = 0, 'debug' = 1, 'trace' = 2, 'warn' = 3, 'error' = 4, 'fatal' = 5, 'panic' = 6, 'success' = 7, 'syslog' = 8),
mes Nullable(String),
pack Nullable(String),
market Nullable(String),
pair Nullable(String),
mail Nullable(String),
id Nullable(String),
sub_id Nullable(String),
event_id Nullable(String)
)
ENGINE = ReplicatedMergeTree('clickhouse/tables/1/log', '1')
ORDER BY (t, ms, user_id, proj, proc)
TTL t + toIntervalMonth(1)
SETTINGS index_granularity = 8192 -
SELECT * FROM system.replication_queue;
SELECT *
FROM system.replication_queue
Query id: 9d805bfe-a0ff-49da-b711-e4c306d70577
Ok.
0 rows in set. Elapsed: 0.002 sec. -
на второй ноде тоже пустой выхлоп
SELECT * FROM system.replication_queue; -
Я так понимаю это хорошо?
-
-
так и задумано
-
в разы? типа 6мс и 16 мс?
-
КХ вообще все делает кусками по 65к строк, выделяя память заранее
-
Всем привет!
Имеется конфигурация:
<storage_configuration>
<disks>
<hdd>
<path>/mnt/hdd/clickhouse/</path>
</hdd>
</disks>
<policies>
<hdd_policy>
<volumes>
<hdd_volume>
<disk>hdd</disk>
</hdd_volume>
</volumes>
</hdd_policy>
</policies>
</storage_configuration>
При создании такой таблицы:
CREATE TABLE test.t1
(
EventDate Date,
Value Int32
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(EventDate)
ORDER BY EventDate
TTL EventDate + INTERVAL 1 MONTH TO DISK 'hdd'
SETTINGS storage_policy='hdd_policy'
Данные пишутся на hdd, как настроить конфиг, что бы новые данные писались на ssd, а спустя месяц по TTL переносились на hdd?
Конфигурация должна быть такая или нет?
<storage_configuration>
<disks>
<ssd>
<path>/mnt/ssd/clickhouse/</path>
</ssd>
<hdd>
<path>/mnt/hdd/clickhouse/</path>
</hdd>
</disks>
<policies>
<hdd_policy>
<volumes>
<ssd_volume>
<disk>ssd</disk>
</ssd_volume>
<hdd_volume>
<disk>hdd</disk>
</hdd_volume>
</volumes>
</hdd_policy>
</policies>
</storage_configuration> -
проверьте метадату для каждой реплики этим запросом и сравните
SELECT * FROM system.zookeeper WHERE path =
'/clickhouse/tables/1/log/replicas/1' AND name IN ('metadata','columns')
SELECT * FROM system.zookeeper WHERE path =
'/clickhouse/tables/1/log/replicas/2' AND name IN ('metadata','columns')
... -
вроде идентично
-
-
GitHub - ClickHouse/clickhouse-go: Golang driver for ClickHouse
Golang driver for ClickHouse. Contribute to ClickHouse/clickhouse-go development by creating an account on GitHub.
-
с виду ок
-
его ранее @kshvakov разрабатывал?
-
Да
-
а это?
SELECT * FROM system.zookeeper WHERE path =
'/clickhouse/tables/1/log/replicas/1' AND name IN ('metadata_version');
...
SELECT * FROM system.zookeeper WHERE path =
'/clickhouse/tables/1/log/replicas/2' AND name IN ('metadata_version'); -
тоже одинаково.
czxid mzxid ctime mtime
совпадают -
похоже сейчас с репликой все нормально
-
-
-
всем привет, нужна помощь
есть столбец string, в каждой string - произвольное количество json, минимум 1
я хочу строку распарсить, разбить в массив и работать с каждым элементом массива как с ValidJSON
план такой, что хочу заменить в каждой строке ", " на скажем "|" при условии, что до ", " идёт "}", а после идёт "{", и затем splitByChar
соответственно пытаюсь написать регулярное выражение, чтобы это сматчить, но ничего не работает
replaceRegexpAll(some_string, '(?<=\\}), (?>=\\{)', '|')
что я делаю не так и как сделать правильно ? -
Joined.
-
есть такая штука JSONAsString оно json-ы в разные строки раскладывает
-
Круто, спасибо, попробую
-
Joined.
-
Joined.
- 10 February 2021 (333 messages)
-
Ребят, а КХ подходит для хранения и кверинга sorted sets во времени? Лучше всего наверное подходит аналогия с отслеживанием хитов веб-реквестов с примерно миллиардом уникальных посетителей, но мне требуется делать запросы вроде topN пользователей по количеству реквестов за последний месяц, а так же всего уникальных пользоватеоей в месяц.
Насколько жирная машина потребуется для КХ, если всего пользователей 1млрд, а хитов около 500млн в месяц? -
У нас сервак на 12 HDD, 32 потока ЦПУ, 64 ОЗУ посчитал uniqExact(uuid-строка) из 260кк записей(уников 230кк) за 50 секунд без кеша. Памяти съело 12ГБ.
По месту на HDD - зависит от payload записей... берете 100кк записей в файл, жмете, считаете. КХ сожмет их лучше) -
точное число до копейки ведь не нужно ? Можно хранить агрегаты по часу / дню, uniqHLL12State и считать за миллисекунды
-
Угу, вот спасибо, погуглю что это
-
Joined.
-
-
Всем привет!
Подскажите пожалуйста, почему в мат вью с движком ReplacingMergeTree могут не записываться данные?
Уже долгое время пытаюсь отловить этот shadow bug.
Когда ручками пересоздаю мат вью, то данные подтягиваются, а если её оставить на недельку, то некоторые строки не долетают.
@den_crane 🙏 -
Joined.
-
Всем привет!
Есть данные статистики netflow в кликхаусе.
┌─evtDate ─┬─────────time─┬──srcaddr─┬─srcport─┬─dstaddr─┬─dstport─┬evt─┬─proto┐
│ 2019-02-01 │ 2019-02-01 00:00:00 │ 3706411294 │ 14918 │ 3285434422 │ 6889 │ 129 │ 17 │
│ 2019-02-01 │ 2019-02-01 00:00:01 │ 34643719 │ 0 │ 3285434645 │ 2048 │ 80 │ 1 │
Хранится в виде реальных записей netflow.
Хочется свернуть по метке time до 1 минутных интервалов.
То есть при совпадении всех остальных данных нужно в рамках 1ой минуты просуммировать значение evt.
Как это можно сделать? -
SummingMergeTree
https://clickhouse.tech/docs/ru/engines/table-engines/mergetree-family/summingmergetree/SummingMergeTree | Документация ClickHouseSummingMergeTree Движок наследует функциональность MergeTree. Отличие заключается в том, что для таблиц SummingMergeTree
-
+ добавить поле с DEFAULT toStartOfMinute и ORDER BY с его учетом
-
В логах на одной из нод реплики сыпятся ошибки:
<Trace> HTTPCommon: Failed communicating with x.x.x.x with error 'Invalid HTTP status code' will try to reconnect session
На второй ноде с виду все нормально - идет вставка
Куда смотреть? -
Если curl-ом запрос пробросить, то вот это выводит:
Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = Not found: compress (version 20.11.3.3 (official build)) -
Разобрался - спасибо Денису на вот этой минуте - https://youtu.be/1LVJ_WcLgF8?t=7623
Может кому-то будет полезным, объясню в чем был мой мажорный баг:
Не используйте другие мат вью при формировании селекта для основного мат вью. Все дело в стриминге данных и может получиться рассинхрон данных в основном мат вью и тех, что используются в селекте. В таком случае не соблюдается комплиментарность данных. -
Joined.
-
-
Joined.
-
Joined.
-
Joined.
-
Приветствую всех. Появилась вот такая проблемка. Я хочу выполнить фун-ю multiSearchAnyCaseInsensitiveдля URL, но получаю ошибку, что первый аргумент должен быть константой.
Как можно преобразовать url в константу (надеюсь я достаточно грамотно написал ) 😶 -
-
второй аргумент должен быть константой, не первый (0 индексед)
-
что значит не долетают ?
-
Разве в функциях индексация начинается с нуля? Это же не массив
-
ну это вы так думаете, а кто-то может думать что аргументы функции это массив с динамическими типами...
-
Можешь, если не сложно, скинуть доку для ознакомления, буду премного благодарен
-
Добрый день!
Нужно сопоставить строки из одной таблицы по регулярке(или обычному like) с другой таблицей.
Обычный JOIN требует строгое сравнение.
А если применить CROSS JOIN, то КХ ругается, что функции сравнения строк (like, match) требуют вторым аргументом константу.
Есть ли какая-нибудь возможность осуществить задуманное?
Пример, на который ругается КХ:
SELECT
id AS InternalId,
name AS Name,
round(cost / 100,2) AS Price,
sum(amt) AS Quantity,
round(sum(tot / 100), 2) AS Sum
FROM
db.goods r,
(select '%text%' as Filter, 1 as CompaignId) as pt
WHERE
date >= today()
AND Name like pt.Filter -- Argument at index 1 for function like must be constant
GROUP BY InternalId, Name, Price
LIMIT 10 -
ничего не понял, но короче ваша проблема решается так:
multiSearchAnyCaseInsensitive(url, 'substring_to_find'); -
Подскажите пожалуйста. По какой причине SummingMergeTree может не суммироватся? Сделал запись около получаса назад, таблица так и не просуммирована. Не могу чёт отдуплить совсем, гугл тоже не помогает. Хотя в мат. вьюхе всё суммировалось быстро
```CREATE TABLE IF NOT EXISTS lbas_daily
(
date Date,
uuid UUID,
created_at DateTime,
type_name String,
bv Int64
) ENGINE = SummingMergeTree(bv)
PARTITION BY toYYYYMM(date)
ORDER BY (date, uuid);
INSERT INTO lbas_daily
SELECT toDate(sample_time) as date,
uuid,
created_at,
type_name,
1 as bv
FROM lbas
WHERE toDate(sample_time) == yesterday();``` -
-
если во второй таблице (pt) мало строк, можно их вернуть как массив в with и использовать. иначе вроде никак
with (select groupArray(flt) from (/* your filter table */select arrayJoin(['ing1', 'ing3', 'ing4']) as flt)) as fltArr
select * from (/* your goods table */select arrayJoin(['String1','String2','String3']) as name) as goods
where multiSearchAny(name, fltArr); -
Спасибо.
-
Всем привет!
Вопрос по движку Kafka.
Периодически ловлю такие сообщения:
2021.02.10 10:08:29.829926 [ 22125 ] {} <Warning> StorageKafka (my_kafka_table): Parsing of message (topic: my_topic, partition: 4, offset: 76719) return no rows.
Проверяю сам месседж в кафке, смотрю в кликхаус и вижу что данные из этого месседжа записались в таблицу.
Может ли кто-то подсказать из-за чего такие ворнинги могут быть? -
Если Вы читали документацию, то там написано, что оно суммирует в неизвестный момент времени, а так же ClickHouse может не полностью просуммировать все строки, для этого нужно использовать агрегатную функцию sum и секцию GROUP BY
-
Просто материальная вьюха суммировала каждые несколько минут, а тут сутки уже висит
-
Движок не гарантирует что все Ваши записи просуммируются
-
Только не просуммировалась ни одна вообще
-
Консьюмеры полят данные, иначе Кафка может посчитать их мёртвыми и будет ребалансировка.
-
Тогда посмотрите на свой Primary Key, он суммирует если одинаковый первичный ключ
-
-
Что вы пытаетесь доказать ? Движок работает вот так. Когда-то данные просуммируются, а может и нет.
-
Я пытаюсь понять, почему мат вьюха суммировала каждые несколько минут, а обчная таблица не суммирует в течении более чем суток уже
-
а почему в такоом случае warning падает?
-
Вы делаете count(*) - это вообще невалидно для summing таблиц
Вы сделали два инсерта по 1 записи - они смержились в одну - каунт вернёт единицу -
count(*) показывает как раз таки то, что записи не смерджились в данном случае
-
Вам же написали, что они могут и не смержиться
-
Не переживайте, все нормально.
-
Если Вам нужно гарантированно получить сумму в том или ином случае, то ни один движок Вам эту гарантию не даст
-
Можете написать select * from ... final
-
ну ок ))
спасибо -
А так чтобы в случае как с JOIN каждому 'ing1' фильтру был сопоставлен id уже получается не выйдет сделать?
-
Внезапно final помог. Спасибо
-
Почитайте про final и optimize
Сейчас просто налету мержится. В таблице все равно остались те строки -
Привет.
Внезапно столкнулся с проблемой: если в таблице в default expression использовать словари - при перезагрузке clickhouse-server не стартует с ошибкой -
Application: Caught exception while loading metadata: Code: 36, e.displayText() = DB::Exception: external dictionary 'currencies' not found: default expression and column type are incompatible.: Cannot attach table
Хотя в дефолте используется dictGetOrDefault().
получается, что нужно стартовать сервер без таблицы, и потом сделать ее attach. Есть ли способ избавиться от такого костыля? 🙁 -
Fix starting the server with tables having default expressions containing dictGet() by vitlibar · Pull Request #19805 · ClickHouse/ClickHouse
I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category: Bug Fix Changelog entry: Fix starting the server with tables having default expressio...
-
магия! значит недельку подождать до релиза…
-
нет
-
Доброго всем дня, кто то использует distributed с подзапросами? ни у кого нет магической палочки как эту проблему обойти и заставить КХ слать запрос с группировками на шарды?
https://github.com/ClickHouse/ClickHouse/issues/20254Optimize (select * from table [where clause]) subqueries usage for distributed engine · Issue #20254 · ClickHouse/ClickHouse(you don't have to strictly follow this form) Use case Many of BI engines and tools generate query syntax as select sum(col1) as xxx, sum(col2) as yyy from (select * from table) where dim1=...
-
всем привет! создал таблицу с движком HDFS (‘hdfs://<host>:<port>/apps/hive/warehouse/<db_name>.db/<table_name>/*’, ‘ORC’). при селекте из нее получаю ошибку DB::Exception: Unable to connect to HDFS: Operation category READ is not supported in state standby. Может кто подсказать, куда копать?
-
-
Joined.
-
Joined.
-
https://yandex.ru/jobs/vacancies/maintenance/clickhouse_engineer/
Внимание: на картинке справа совсем другие люди.Инженер ClickHouse в Yandex.CloudЯндекс — одна из ведущих ИТ-компаний с офисами в 21 городе России. Создаёт сервисы для прямых пользователей и бизнеса. В команду ищет профессионалов, которые ценят открытость и свободу и стремятся менять мир к лучшему. Вам это близко? Откликайтесь на вакансии.
-
None
-
Алексей, вот про людей справа, прямо заинтриговали
-
в мобильном варианте картинка вверху и там 1 человек
-
а так - замечательная картинка - прямо видно - человек спрашивает - а не видел ли ты где <текст вакансии> 🙂
-
а если найду
-
https://avatars.mds.yandex.net/get-bunker/128809/81bd5371a3028d71a6644d81ed5f0b2ef78875c1/orig
когда запустил alter table modify ttl, и все остановилось =) -
Скорее когда запустил
ALTER TABLE ON CLUSTER MODIFY COLUMN col new_type -
Не могу переехать с версии 20.4 на 21.2.2.8
На 20.4 мог бесплатно сколько хочу вызывать вот этот скрипт
```create database if not exists replica_test;
drop table if exists replica_test.replica_table;
create table if not exists replica_test.replica_table
(
timestamp DateTime64(3) default now64()
) engine = ReplicatedMergeTree('/clickhouse/local/tables/shard_0/replica_table', 'replica_0')
order by timestamp;```
А на 21.2.2.8 при повторном запуске ловлю ошибку Replica /clickhouse/local/tables/shard_0/replica_table/replicas/replica_0 already exists. (version 21.2.2.8 (official build))
Такое чувство, что старая версия Clickhouse все подчищала в Zookeeper при удалении последней реплики, а новая нет, ну или с большой задержкой.
Кто-то сталкивался? Как чинится? Таблицы пересоздаю в автотестах, clickhouse + zookeeper в docker'е поднимаются для них. -
Так и есть, это сделано для неблокирующих и атомарных DDL запросов. Можно по-старому, добавив NO DELAY:
drop table if exists replica_test.replica_table no delay -
вау))) а я уж часа три ковыряюсь)) Спасибо!
-
а это когда джуны из альтинити пояснили за МВ https://avatars.mds.yandex.net/get-bunker/50064/f723c24f0736640a29b8751ced7566d898a43e52/orig
=) -
Можно использовать макрос {uuid} в пути к реплике. Ещё можно не указывать путь и имя реплики в аргументах движка, тогда будут использоваться /clickhouse/tables/{uuid}/{shard} и {replica} по умолчанию (или default_replica_path и default_replica_name из конфига)
-
Добрый день, коллеги! Подскажите как решить такую задачу с помощью клика: есть временной ряд (изменение метрики по времени), сэмплы по минуте, но ряд не непрерывный, в нем есть пропуски. Надо сделать так чтобы ряд был строго непрерывным, а пропущенные значения заполнялись ближайшими к пропуску из предыдущих. Пропуски я заполнил, сджойнив текущий временной ряд со сгенерированным функцией timeSlots, теперь на месте пропусков у меня Null. А вот как заполнить их теперь ближайшими не могу придумать. Пробовал использовать neighbor(-1) но она срабатывает только если пропущено одно значение. Может быть кто-то даст наводку на подход или функцию которая сможет помочь. Подозреваю что можно сделать через группировку в массивы, но не понимаю как сделать нужную группировку чтобы в нее попало одно реальное значение и все следующие за ним Nulls.
-
примерно такую же задачу нам помог решить ASOF JOIN https://clickhouse.tech/docs/en/sql-reference/statements/select/join/#asof-join-usageJOIN | ClickHouse Documentation
JOIN Clause Join produces a new table by combining columns from one or multiple tables by using values common to each. I
-
Спасибо, покурю документацию!
-
Публичные клики (и система "ClickHouse over YT") - это часть Яндекса.
-
упс
-
-
Joined.
-
После консультации с админами диагноз, что имеющуюся схему AD не натянуть на глобус текущей схемы работы LDAP с ролями/группами в clickhouse )
-
Помогите пожалуйста с схемой таблиц
Проект под NDA, поэтому рассказываю на похожем примере,
Есть куча станций (больше 400 миллионов), у каждый станции есть несколько датчиков, суммарно станция может измерять до 10 параметров. Измерения снимаются раз в месяц. Данные измерений приходят в виде трех csv файлов ( в разные дни месяца)
CSV №1 - формат <ID станции>,Параметр №1, Параметр №2, Параметр 3 (приходит 10 числа)
CSV №2 - формат <ID станции>,Параметр №4, Параметр №5, Параметр 6 (приходит 20 числа)
CSV №3 - формат <ID станции>,Параметр №7, Параметр №8, Параметр 9 (приходит 30 числа)
Необходимо для каждой станции по запросу показывать последние доступные данные с фильтрацией. Параметры могут (int) а могут быть (string).
Какой движок таблиц лучше использовать для этого случая? Одна таблица которую апдейтить или три таблицы? -
В любом случае заведите таблицу под сырые данные и может статья https://m.habr.com/ru/company/oleg-bunin/blog/328784/ поможет в выборе схемы поверх сырыхПереезжаем на ClickHouse: 3 года спустя
Три года назад Виктор Тарнавский и Алексей Миловидов из Яндекса на сцене HighLoad++ рассказывали, какой ClickHouse хороший, и как он не тормозит. А на соседней сцене был Александр Зайцев с докладом...
-
Смотрите, в итоге история такая:
1. Нам нужно подгружать измерения SCD в кликхаус. Размером сотни ГБ
2. Вы посоветовали словарь с движком ssd_cache,
3. мы увидели проблему в том что словари по доке не уме/т подкачивать инкрементально обновления (по строкам)
4. Вы написали что есть недокументированная фича update_field
5. В итоге мой коллега Николая подрубился сюда в чат и мы выяснили что update_field для ssd_cache не работает в приницпе.
В итоге получается что словарь не подходит как способ из коробки подтягивать SCD в КХ инкрементально, Правильно мы понимаем? -
#5 неверный вывод вообще. Я просто сказал сначала проверить инкрементальные обновления на hashed/sparse_hashed словаре (можно ограничить строки саб-сетом).
а потом уже разобраться с ССД кешем. -
ну и тип UPDATED- int / epoch
-
@dj_mixer сори, не вы. А вот уважаемый коллега сформулировал
-
хотя если сам Денни сказал то наверно так оно и есть.
придется велосипедить либо фича-рекуэст ( -
тогда вам велосипедить с CollapsingMergeTree и слать все обновления в КХ... на mysql уже есть engine под это (materializemysql). Для ПГ пока нет.
-
Вообще, натянуть можно даже на основании той информации, которую вы предоставили. Просто для каждой OU можно создать свой ldap_server. Но мне кажется, если вы ответите на мои вопросы в issue, то еще есть шанс прямого решения.
-
вроде ответил, либо не совсем понял вопросы 🙂
Вариант с сервером под каждую OU принципиально ничего не изменит, так как не могу использовать логин для bind_dn кроме как в формате Домен/логин. Так как DN для юзера кирилический, собственно в issue это указал. -
-
-
а какие именно поля интересуют? там длинная портянка, маскировать всю не хочется )
-
-
[In reply to Denis Glazachev]
кстати я тут упустил. Отдельный поиск ролей по ЛДАП тоже вообще не надо делать. вы просто должны взять из объекта пользователя атрибуты memberOf (configurable)
теперь я вспомнил почему у нас есть поддержка атрибута "memberOf" =) -
Ну так memberOf указывается в search filter.
-
не, если есть memberOfAttributeName ="memberOf"
можно без search filter, вообще не искать группы -
да, и это будет частный случай
-
distinguishedName=CN=Петров Сергей Владимирович,OU=users_l0.2,OU=users_l0,DC=domain,DC=tld
distinguishedName=OU=users_l0.2,OU=users_l0,DC=domain,DC=tld
вроде оно -
Тут такая тема: в OU указана ссылка на DN пользователя (в той или иной форме, member, memberOf, и т.п.) Если по ней восстановить истинный DN где записан пользователь(ли), и его указать как bind_dn, то потом можно делать search по дереву груп с member=uid={user_name}
-
да, как раз на такие.. но в данном случае можно просто сделать улучшение с поддеркой placholder, {binddn:attr} / {fullbinddn}
-
несовсем понял
-
Это я понимаю, вопрос лишь как по логину восстановить DN, собственно в issue про это и написано. Либо в документации не все указано и есть еще какое-то место для дополнительного фильтра, который поможет сконвертировать логин в DN
-
судя по тому что я читаю, dsquery user -name s.v.petrov должен вернуть именно эту строку DN
-
это ручками из LDAP вытищил значение DN, прям выполнить dsquery нет возможности 🙁
-
-
т.е. вместо bind_dn: “uid={user_name},CN=x,CN=y” иметь возможность указывать
bind_dn_base: “CN=x,CN=y”, bind_db attr: “uid”
и потом
search base_dn “member=CN={bind_dn_base:CN},OU=a,OU=b,CN=x,CN=y” ? -
Вот спросите админов под каким DN они создают пользователя первым шагом, перед тем, как в группы его добавить.
-
-
cluster | Документация ClickHouse
cluster, clusterAllReplicas Позволяет обратиться ко всем шардам существующего кластера, который сконфигурирован в секции
-
Я правильно понимаю что мне нужно сначала прописать параметры соединения, а потом запрос будет выглядеть как SELECT * FROM cluster('cluster_name', db.table)?
-
Уже спрашивал, это была первая идея, плоская структура, тогда можно сформировать единый шаблон. Но сказали будет иерархическая и каждый в своем OU. Они везже в таком виде и отображаются, в группах (member=) и тд.
-
remote | ClickHouse Documentation
remote, remoteSecure Allows to access remote servers without creating a Distributed table. remoteSecure - same as remote
-
так где фром - указываете этот сорс. insert … select … from cluster(‘cluster_name’, db, table)
или clusterallreplicas в зависимости от ваших нужд -
если кластер вообще никак не связан с другим, то сверху скинули ремоут
-
Спасибо большое!
-
“в группах (member=)” - это ссылка на реальный DN, туда, где записаны все аттрибуты про конкретного поьзователя.
-
он и имеет вид как приводил ранее: CN=Петров Сергей Владимирович,OU=users_l0.2,OU=users_l0,DC=domain,DC=tld
-
там есть. uid? типа `uid=s.v.petrov,OU=users_l0.2,OU=users_l0,DC=domain,DC=tld`
-
неа, такое тоже пробовал, это значение только в sAMAccountName, mail, mailNickname и userPrincipalName есть
-
т.е. `sAMAccountName=s.v.petrov,OU=users_l0.2,OU=users_l0,DC=domain,DC=tld` ?
-
да типа этого
-
-
вроде пробовал, но сейчас еще раз проверю
-
а просто <null_value>[]</null_value> не подойдет ?
-
Joined.
-
не совсем, bind_dn может не совпадать с именем пользователя. имя скорее всего будет в одном из полей (userPrincipalName, samAccountName, etc), на самом деле имею ввиду такое
<bind_username>DOMAIN\{user_name}</bind_username>
or
<bind_username>user_name@mydomain.dj</bind_username>
(bind_dn КХ должен сам получить после bind)
и разрешить подобное
<search_filter>(&(objectClass=groupOfNames)(member={bind_dn}))</search_filter>
or
<search_filter>(&(objectClass=groupOfNames)(member={bind_username}))</search_filter>
это будет правильней + решит проблемы подобного рода как у Алексея -
т.е. человек ввел
myUser в КХ.
КХ забиндился используя DOMAIN\myUser
получил полный DN
и использовал его в фильтре уже (если надо) -
-
Есть подозрение, что прокатило. Спасибо!
-
А, показалось
-
если на это будет полочжительный ответ, то все решается элементарно:
bind_dn - как раньше
search base_dn: DC=domain,DC=tld
search filter: <all nodes that have sAMAccountName={user_name} nested inside>
attribute: OU -
-
Всем привет! Есть широкая таблица с несколькмим колонками String в которую уже неколько лет пишутся данные. Данные - разные, но значения в этих колонках из ограниченного множества.
Насколько больно преобразовывать из обычной колонки в LowCardinality и стоит ли оно того?
ALTER TABLE table
MODIFY COLUMN column LowCardinality(String), -
Салют! Как можно быстро и безболезненно перенести кликхаус из гугла в aws? Кликхаус весит +/- 100 гигов. Можно просто парты скопировать?
-
100 гб еще можно через INSERT INTO remote() SELECT * FROM table передать.
А можно и парты скопировть -
вы правы, в принципе никак, вопрос кому что интуитивней =)
проблема Алексея и так решается вашим фильтром... -
Joined.
-
или clickhouse-copier вместо insert into, да?
-
а у вас array(string) нормально работает ? без нул вэлью
-
хотя нет, ваш не решает. смотрите,, у меня member=Firstname Lastname, OU=DOMAIN, OU=GROUP
а samAccountName уже атрибут пользователя... а не группы -
Привет!
как проверить значение столбца на несколько паттернов чтобы не писать много условий в стиле:
select
field
where
field not like '%pattern1%'
and field not like '%pattern2%'
.....
and field not like '%pattern3%' -
Для 100гб и одного сервера слишком много геммора бдует
-
Не в словаре замечательно, а вот со словарем уже проблемы пошли
-
у меня точно такая же структура в АД, нельзя построить фильтр который идет по референсам
-
Ну да, тогда только имеет смысл {bind_dn_base:CN} и т.п. Но я не вижу, что это именно то, что у Алексея.
-
кстати, можно
-
достаточно больно, но это того стоит. выигрыш может быть весьма значительный особенно если кардинальность в пределах блоках действительно небольшая
сколько у вас там данных в байтах на диске по колонкам из system.columns?
фактически у вас по объему чтения \ записи на диск это будет равносильно OPTIMIZE TABLE FINAL -
👍
-
Может не в нашей текущей имплементации, но это вопрос флага в API.
-
я так понял чатик с вопросами это не этот чатик?
-
можете пример фильтра?
userdn: CN=FirstName LastName,OU=RU-Users,OU=USERS,OU=DOMAIN,DC=LOCAL
имя пользователя: firstname.lastname (from samAccountName of user)
GroupDN: CN=DevelopmentOnTestServers,OU=GROUPS,OU=DOMAIN,DC=LOCAL
member: CN=FirstName LastName,OU=RU-Users,OU=USERS,OU=DOMAIN,DC=LOCAL -
На одном шарде так
compressed 485,166,083,254
uncomressed 5,669,734,195,840
Ну сжатие ориентировочно на порядок идет -
вообще поискал в истории чата, пишут что массивы в словарях не работают.
-
Да, но есть варианты, например через запятую можно
-
Подозревал. Спасибо за Ваше время!
-
вон там сверху подсказывают, что можно как-то через запятые)
-
То есть пол терабайта на шард
диски сколько последовательное чтение выдают?
место есть свободное?
как вариант можно попробовать протестировать
INSERT INTO table_with_low_cardinality_schema SELECT FROM table WHERE ...
и сравнить что будет на выходе и как влияет
в общем достаточно больно будет, но прососать должно
можно поиграться с background_schedule_pool_size чтобы оно не сильно много потоков одновременно запустило. но это замедлит конвертацию...
по идее чтение при этом не должно прерываться...
и таблица вроде бы не блокируется -
Спасибо большое! Будем тестить
-
Ребят, привет!
Подвисла одна нода в кластере. Перезагрузил ее. Теперь начало валить куча ошибок и растет system.replication_queue
ошибки типа:
2021.02.10 15:42:48.196712 [ 6355 ] {} <Warning> db_name.user_device_id_shard (ReplicatedMergeTreePartCheckThread): Found parts with the same min block and with the same max block as the missing part 202102_228260_228514_39. Hoping that it will eventually appear as a result of a merge.
куда копать, как исправить? -
-
нет, походу, это было про Referrals и не одним флагом а спец. хендлингом
-
аха, вам по любому надо отделить юзернейм, и получать DN для него отдельно
https://t.me/clickhouse_ru/203596
# returns DN of a user
ldapsearch -H "ldap://ldapserver:389" -D 'PW\firstname.lastname' -w 'password' -b 'OU=USERS,DC=DOMAIN,DC=LOCAL' '(&(objectClass=person)(samAccountName=firstname.lastname))' dn
# finds group of user
ldapsearch -H "ldap://ldapserver:389" -D 'PW\firstname.lastname' -w 'password' -b 'OU=GROUPS,DC=DOMAIN,DC=LOCAL' '(&(objectClass=group)(member=CN=Firstname Lastname,OU=RU-Users,OU=USERS,DC=DOMAIN,DC=LOCAL))' name【D】【J】 in ClickHouse не тормозитне совсем, bind_dn может не совпадать с именем пользователя. имя скорее всего будет в одном из полей (userPrincipalName, samAccountName, etc), на самом деле имею ввиду такое <bind_username>DOMAIN\{user_name}</bind_username> or <bind_username>user_name@mydomain.dj</bind_username> (bind_dn КХ должен сам получить после bind) и разрешить подобное <search_filter>(&(objectClass=groupOfNames)(member={bind_dn}))</search_filter> or <search_filter>(&(objectClass=groupOfNames)(member={bind_username}))</search_filter> это будет правильней + решит проблемы подобного рода как у Алексея
-
так не работает, нужно только с CN=
-
Итого для инкрементальной заливки измерений SCD из постгреса выбрали ODBC вытаскивание по updated + Collapsing Merge Tree. Если все таки есть более правильный и/или простой спасибо - дайте знать)
-
т.е. вместо bind_dn лучше иметь
<username>DOMAIN\{user_name}</username>
<userdn_filter>(&(objectClass=person)(samAccountName={user_name}))</> -
Ну опять таки, все сводится к поддержке подстановок с заданием аттрибута из под bind_dn
-
у вас сводится к тому что bind_dn можно сконструировать используя username.
это не так -
-
-
+1 именно в этом проблема, нет возможности его сконструировать, от слова совсем. https://github.com/ClickHouse/ClickHouse/issues/20253 вот тут собственно прописал по сути схожее с тем, что предложили тут https://t.me/clickhouse_ru/203635Use service account for LDAP · Issue #20253 · ClickHouse/ClickHouse
Use case In some organisations are using AD with hierarchical structure (nested organisation unit) and DN follow this structure. As result we can not use permanent build_dn for users with different...
-
юзер может логинится в LDAP используя
bind_dn, userPrincipalName, samAccountName, и что угодно что можно наконфигурить...
т.е.
username=ivanov3443
bind_dn =CN=IVAN IVANOVICH IVANOV, OU=USERS, DC=ALTINITY, DC=COM -
Там другое описано.
-
поддержка подстановок не нужна уже вроде
-
достаточно отделить logonname/username от bind_dn
-
ну да, там через сервисного юзера, если взять вариант предложеный DJ, то отпадает лишь этап проверки пароля пользователя, остальное остается
-
нужна вроде, мы же хотим s.v.petrov в кликхаусе а не `Петров Сергей Владимирович`-а
-
-
нет, юзер нейм фиксированный, и тот, который указали при инициации сессии в кликхаусе. Менять его не надо. А вот под какое поле подставить при создании bind_dn - это да, нужно указать. Вот декомпозицию bind_dn может не стоит делать, т.е. только {bind_dn:attr} должно хватить
-
тогда фильтр не нужен, КХ может сам генерить
<username>DOMAIN\{user_name}</username>
<usernameAttribute>samAccountName</usernameAttribute> -
-
ну если не хардкодить то:
<username>DOMAIN\{user_name}</username>
<usernameAttribute>samAccountName</usernameAttribute>
<user_filter>(&(objectClass=person)(samAccountName={user_name}))</user_filter> -
несовсем:
<bind_dn>DOMAIN\{user_name}</bind_dn>
….
<base_dn>dc=domain,dc=tld</base_dn>
<search_filter>(&(objectClass=groupOfNames)(member=CN={bind_dn:CN}))<search_filter> -
<search_filter>(&(objectClass=groupOfNames)(member={bind_dn:DN}))<search_filter>
тоже валидно? -
а как вы DN пользователя вернете?
-
ну наверно да, если DN от DOMAIN\{user_name} будет реальный DN который мы сегодня так и не увидели 🙂
-
> # returns DN of a user
ldapsearch -H "ldap://ldapserver:389" -D 'PW\firstname.lastname' -w 'password' -b 'OU=USERS,DC=DOMAIN,DC=LOCAL' '(&(objectClass=person)(samAccountName=firstname.lastname))' dn
будет как аттрибут? -
только у вас там CN достаточно
-
а как вы узнали что надо писать samAccountName в фильтр? =)
-
-
и где в вашем конфиге это писать?
https://t.me/clickhouse_ru/203653Denis Glazachev in ClickHouse не тормозитнесовсем: <bind_dn>DOMAIN\{user_name}</bind_dn> …. <base_dn>dc=domain,dc=tld</base_dn> <search_filter>(&(objectClass=groupOfNames)(member=CN={bind_dn:CN}))<search_filter>
-
например, вместо member=CN= написать member=samAccountName=
-
надеюсь, главное иметь возможность достать атрибут )
-
а так разве работает, там же вроде требуется именно dn?
-
я все еще думаю, что для вашего случая может и текущего функционала хватить.
Есть ли запись uid=s.v.petrov,OU=users_l0.2,OU=users_l0,DC=domain,DC=tld у вас? -
не втупил, можете полноценный конфиг написать на это?
https://t.me/clickhouse_ru/203621【D】【J】 in ClickHouse не тормозитможете пример фильтра? userdn: CN=FirstName LastName,OU=RU-Users,OU=USERS,OU=DOMAIN,DC=LOCAL имя пользователя: firstname.lastname (from samAccountName of user) GroupDN: CN=DevelopmentOnTestServers,OU=GROUPS,OU=DOMAIN,DC=LOCAL member: CN=FirstName LastName,OU=RU-Users,OU=USERS,OU=DOMAIN,DC=LOCAL
-
в списке атрибутов uid нету
-
<bind_dn>samAccountName={user_name},OU=RU-Users,OU=USERS,OU=DOMAIN,DC=LOCAL</bind_dn>
<base_dn>OU=GROUPS,OU=DOMAIN,DC=LOCAL</base_dn>
<attribute>CN</attribute>
<scope>subtree</scope>
<search_filter>(&(objectClass=group)(member=CN={bind_dn:CN},OU=RU-Users,OU=USERS,OU=DOMAIN,DC=LOCAL))</search_filter> -
можно весь список аттрибутов?
-
-
-
<bind_dn>samAccountName={user_name},OU=RU-Users,OU=USERS,OU=DOMAIN,DC=LOCAL</bind_dn>
так нельзя. он не залогинится/не забиндится. -
-
-
смотрите:
в КХ - firstname.lastname
в LDAPbind надо отправить DOMAIN\firstname.lastname
в группах надо искать по user-DN -
-
вы не можете получить DN в результате bind-a (на самом деле LDAP должен вернуть matched Dn , но это так себе предположение), вам надо пользователя искать.
-
mailNickname
sAMAccountName
userPrincipalName
mail -
-
я могу искать по месту байнда аттрибут DN?
-
значит записано как:
sAMAccountName=s.v.petrov,OU=users_l0.2,OU=users_l0,DC=domain,DC=tld
? -
вот так там: sAMAccountName=s.v.petrov
-
Значит это должно сработать с текущим кодом.
-
из того что я знаю, нет
For certain result codes (typically, but not restricted to
noSuchObject, aliasProblem, invalidDNSyntax, and
aliasDereferencingProblem), the matchedDN field is set (subject to
access controls) to the name of the last entry (object or alias) used
in finding the target (or base) object. This will be a truncated
form of the provided name or, if an alias was dereferenced while
attempting to locate the entry, of the resulting name. Otherwise,
the matchedDN field is empty. -
да не будет оно работать в АД, а судя по всему у Алексея АД, просто что-то не то проверяется...
-
-
да, AD
-
почему не будет работать?
-
-
куда что админу указать?
дайте конфиг на этот пример https://t.me/clickhouse_ru/203621【D】【J】 in ClickHouse не тормозитможете пример фильтра? userdn: CN=FirstName LastName,OU=RU-Users,OU=USERS,OU=DOMAIN,DC=LOCAL имя пользователя: firstname.lastname (from samAccountName of user) GroupDN: CN=DevelopmentOnTestServers,OU=GROUPS,OU=DOMAIN,DC=LOCAL member: CN=FirstName LastName,OU=RU-Users,OU=USERS,OU=DOMAIN,DC=LOCAL
-
-
<bind_dn>attr={user_name},a=b,c=d</bind_dn>
….
<base_dn>dc=domain,dc=tld</base_dn>
<search_filter>(&(objectClass=groupOfNames)(member=CN={bind_dn:CN}))<search_filter> -
конечно нормально, он в bind_dn написал
DOMAIN\{user_name}
но он не сможет написать нормальный фильтр не имея возможность использовать {user_dn} -
-
-
не байндится с таким DN =) можно bindится одним из нижеследующих методов:
#1 DOMAIN\{user_name}
#2 {user_name}@domain.com
#3 CN=FirstName LastName,OU=RU-Users,OU=USERS,OU=DOMAIN,DC=LOCAL -
нельзя bind делать атрибутом, не умеет ЛДАП так
-
-
а если сотни различных OU, писать сотни конфигов выглядит как что-то не правильное.
Даже у меня в команде наберется сходу человек 10, у кого OU будут разные -
и попробуем это
-
ок, и как конфигурировать фильтр?
-
-
если указать полный DN то срабатывает, но это подходит для плоских структур
-
у меня в списке есть полный ДН, нельзя атрибутом ДНа
-
-
-
в группах НЕТ sAMAccountName
-
^
-
-
это имя группы ) там пользователь рядом не валяется
-
-
-
search_filter должен найти все группы куда входит пользователь... т.е. мы должны иметь возможность найти по атрибуту member.
в атрибуте member нет {user_name} -
-
-
group:
DN: CN=GroupName,OU=Support,OU=GROUPS,DC=DOMAIN,DC=LOCAL
member: CN=Ivan Ivanov,OU=RU-Users,OU=USERS,DC=DOMAIN,DC=LOCAL -
-
-
🥳
-
-
-
-
Да, т.е. нужно искать пользователя по любому...
-
принять что
bind_dn != user_dn
и искать пользователя -
ссылатся на атрибуты в group-searchfilter не надо.
member: userdn - всегда -
-
-
в вашем случае он не нужен, такое нужно когда пользователи синхронизируются автоматом по расписанию даже ни разу не залогинившись... у нас это 0.1%
-
-
можно (userDn)
-
-
-
-
-
а да, по диагонали прочёл
-
как-то так (bind_dn=username ):
<username>DOMAIN\{user_name}</username>
<user_filter>(&(objectClass=person)(samAccountName={user_name}))</user_filter> -
-
-
-
и переименовать placeholder {binddn} в {userdn} во избежание confusion
-
-
аха, я про это место заменить тут bind_dn на user_dn
<search_filter>(&(objectClass=groupOfNames)(member={bind_dn}))</search_filter> -
-
вернемся к нашим помидорам.
@den_crane у вас нет "рецептов" на такое?
можно ли вообще хоть как то заставить выполнятся на шарде запрос не-первого уровня?
https://t.me/clickhouse_ru/203523【D】【J】 in ClickHouse не тормозитДоброго всем дня, кто то использует distributed с подзапросами? ни у кого нет магической палочки как эту проблему обойти и заставить КХ слать запрос с группировками на шарды? https://github.com/ClickHouse/ClickHouse/issues/20254
-
функция view() есть, для remote и cluster команд, но вы хотите с обычной distributed.
-
это понятно, но вот эти группировки BI автоматом же накладывает
-
-
ну view на шардах и позапрос внутри вью, тут в чате был тред из 200 сообщений про это
дистрибьютид смотрит на вью -
Joined.
-
Всем привет. Кх 2 шарда (по 1 реплике на каждом)
После запуска
ALTER TABLE ... MODIFY COLUMN name Float64
С Инта на флоат модифай.
Очень долго работала мутация (на 1 Шарде) после того, как убили мутацию, то на все операции alter пишет
*Metadata on replica is not up to date with common metadata in zookeeper*
Можно ли как-то восстановить метадату из мастера? Или подправить в самом зукипере -
мне нужно динамические груп бай пробрасывать в шарды сквозь дистрибютед когда дистрибютед завернут в подзапрос.
напрямую
select sum(c) from distributed работает
select sum(c) from (select * from distributed) отправляет 'select c from shardtable' на шард
куда сюда вью можно прикрутить? -
а откуда взялся (select * from distributed) ? генератор SQL так пишет?
-
>после того, как убили мутацию
замечательный выстрел в ногу -
>Можно ли как-то восстановить метадату из мастера? Или подправить в самом зукипере
detach table ...
attach table .. -
внутренности скобок мы сами пишем.
потом генератор в зависимости от того что там юзер на drag-and-dropает генерит типа
select col1, sum(col2) from (select * from distributed) where col3=aaa group by col1
пользователь может колонками как хочет играться естесственно.
собственно у БИ есть режим клиента - но это скачать все и умереть...
просто в целом раз уж where pushitся нормально, почему бы и да.
+ ну и ОРМы всякие есть они тоже любят баловатся подзапросами -
ну нету этого, на придется орм этому учить
-
ну тогда ФР валидный )
-
опа опа
https://www.hetzner.com/dedicated-rootserver/sx133
128 GB DDR4 ECC RAM
Hard drive: 10 x 16 TB Enterprise HDD 7200 rpm, 2 x 960 GB datacenter NVMe SSD
from € 159.00 -
вот куда логи которые никто не читает будем писать
-
Что-то от 190 евриков
-
у меня страна us (ндс 0)
-
У меня тоже us, правда незалогинен
-
А есть смысл поставить clickhouse-bulk на тот же сервер где и хаус?
Просто попробовал соседним сервером - как-то не очень в КХ пишет - периодически валится, оставляет файлы.
15 мин поработал, потом пришлось запускать без нагрузки - еще мин 15 доливал их в базу -
или все от лукавого и если трафик большой - ставить кафку?
-
Задача - десяток серваков пишут в одну базу
-
А в чем подвох ? Почему так дёшево ?
-
нет подвоха, у нас 500 серверов в хецнере (не КХ, просто всякое разное, например кластера кассандры на NVME 2TB*2 из сотен тачек)
-
не совсем сервер грейд материнки(вроде supermicro), те возможно с защитой питания не так все хорошо, но другой вопрос что не всегда это надо
-
ну там CPU еще дешевые (в серверах с большими дисками)
-
А, и еще хетцер обещает флат цену, те вроде бы не дают скидку большим покупателям
-
там зато гигабитные интерфейсы за $0 с любым трафиком
-
А, это 10 дисков с суммарным объемом в 16тб ?
Я подумал, что по 16тб каждый -
нет, каждый по 16 конечно
-
Как-то прям слишком дёшево
-
Да в целом они раньше за туже цену предлагали 10 по 10.
-
В AWS такого нету
-
В AWS больше гарантий
-
Хетц счас забит заказами - мне предложили подождать пару недель пока серв запустят
-
Ещё бы, такие сервера за копейки раздают
-
все время такая дешевизна, уже 3 года это тут мусолим
-
https://www.hetzner.com/dedicated-rootserver/sx293
256 GB DDR4 ECC
14 x 16 TB Enterprise HDD 7200 rpm, 2 x 1.92 TB Datacenter NVMe SSD
(software RAID ; Level optional) -
from € 259.00
-
Ходят слухи, что там с надёжностью всё грустно. Это действительно так, или попросту стереотип ?
-
хетзнер учит резервировать хосты смолоду)
-
Нормально в целом, репликация вам еще на что?)
А так даже в амазоне могут потерять твой EBS и сказать, что извините -
Резервирование - да, но ничего не даст, если например провайдер площадки начнёт работать не адекватно, или кого-то DDoSить начнут серьезно..
-
просто в хетзнере ты сразу это закладываешь, а в амазоне когда уже поел)
-
в хетзнере много очередей, есть дц в германии и финке и антиддос они научились
-
но проблема что дешевле заказать новый сервер, чем починить свой осталась)
-
ребут по апи есть, квм дают, рескуе годный, можно пользовать в общем)
-
да, либо хецнер либо в 10 раз дороже, причем там где дороже будут месяц сервера собирать
-
сколько в день зависают?)
-
Goodbye XML, hello SQL! ClickHouse User Management Goes Pro
Access control is one of the essential features of database management. ClickHouse now offers enterprise-class user management that integrates smoothly with role-based access control. Best of all, it's all SQL!
-
зависают? не знаю, такой же процент пример как в OVH / LeaseWeb / INAP (там у меня железо есть)
небольшой кластер из КХ
21:33:36 up 104 days, 17:44, 0 users, load average: 5.13, 5.00, 4.43
21:33:36 up 104 days, 15:11, 0 users, load average: 4.80, 4.56, 4.00
21:33:36 up 226 days, 1:08, 2 users, load average: 8.12, 6.11, 5.09
21:33:37 up 225 days, 6:35, 0 users, load average: 1.65, 2.44, 2.87
21:33:37 up 225 days, 6:25, 0 users, load average: 2.62, 2.12, 1.71
21:33:37 up 225 days, 6:20, 0 users, load average: 2.97, 2.82, 3.18
21:33:37 up 225 days, 6:13, 0 users, load average: 3.91, 3.35, 3.71
21:33:38 up 225 days, 6:09, 0 users, load average: 2.95, 2.79, 2.81
zK
21:36:27 up 483 days, 7:27, 1 user, load average: 0.68, 0.71, 0.79
21:37:05 up 483 days, 7:27, 1 user, load average: 0.84, 0.97, 1.01
21:37:23 up 483 days, 5:34, 1 user, load average: 1.23, 1.13, 1.14 -
Неплохо так буква R прибавляет 20%
-
эм Starting in late 2019
-
хорошо) я даж ребуталку написал) наши старые ex частенько повисают)
-
там переключалка вверху
-
Да, и в панельке сразу видно праильную цену
-
можно прикинуться украинцем и не платить ндс
- 11 February 2021 (153 messages)
-
Похоже это именно то что надо! Огромное спасибо!
-
Добрый день!
Подскажите пожалуйста, может ли Кликхаус генерить случайные числа из классических распределений: нормальное, пуассона, …?
В доке говорится только про равномерное распределение, но в коде вроде используется сторонняя библиотека, которая умеет и другие: https://clickhouse.tech/codebrowser/html_report/ClickHouse/contrib/abseil-cpp/absl/random/gaussian_distribution.h.html -
библиотека может умеет
но в SQL это не прокинуто
https://clickhouse.tech/docs/en/sql-reference/functions/random-functions/
fell free make pull requestPseudo-Random Numbers | ClickHouse DocumentationFunctions for Generating Pseudo-Random Numbers All the functions accept zero arguments or one argument. If an argument i
-
-
-
Joined.
-
всем привет ! можно ли в КХ сделать вычисляемый столбец на основе значения в другом столбце ? что хочется: у меня есть odbc словарь, я хочу его отобразить в виде таблицы с помощью движка Dictionary. допустим в этом словаре есть ключ id UInt64, и значение value String. я хочу сделать так, чтобы в третьем столбце calculated_value UInt8 было значение if(value='some_value', 1, 0)
-
Joined.
-
select dictGet(‘dict', 'column’, tuple(your_column)) as your_value, if(your_value = 1, ‘true’, ‘false’) from table
-
это да, но здесь ты пользуешься dictGet, а я хочу словарь отобразить как таблицу, чтобы сразу из нее селектить и можно было посмотреть в случае чего все пары ключ-значение
-
можете таблицу создать с Engine = Dictionary и делать select *
-
да
а можно ли в эту таблицу ещё как-то добавить вычисляемое поле по примеру выше ? -
ну вообще я не пробовал, но предполагаю что так, если я вас правильно понял
create table my_table_dict (col1 int, col2 str, col3 int) engine = Dictionary(dict_name)
select *, if(col_1 = 1, ‘a’, ‘b’) as my_calc_value from my_table_dict -
хочется не применять if на этапе селекта, а чтобы это поле было уже посчитано при селекте
-
dictGet
в DEFAULT выражение пропишите
но есть бага связаная с тем что clickhouse Не умеет словари грузить ДО того как загружает определение таблиц
поэтому при выведении типов во время startup может валиться
https://github.com/ClickHouse/ClickHouse/issues/13613ClickHouse server fail after restart, Can't load table with `field String DEFAULT dictGet(...)` in table definition · Issue #13613 · ClickHouse/ClickHouseDescribe the bug Create table which have field_name String DEFAULT dictGet(...) can't attach after server restart How to reproduce git clone https://gist.github.com/2d6ced1980689703b033ab19...
-
А можно ли при описании словаря указать для поля не просто type, а какое-то выражение, типа parseDateTimeBestEffort ?
-
нет
а что мешает toDateTime( dictGetOrDefault() ) выполнить? -
не понимаю пока что вы имеете в виду)
-
ну храните просто строку в словаре
LowCardinality(String)
потом вытаскивайте ее через dictGet в select
и делайте toDateTime( от строки) -
да, я навреное так и сделаю. просто думал на этом инициализации скастить по возможности и иметь нужный тип
спасибо -
а почему у вас дата в источнике словаря не формализована вообще?
-
какой source у словаря?
-
так сложилось исторически) csv обновляемый
-
Добрый день.
Подскажите, пожалуйста, возможно ли осуществлять вставку смешанных данных с JSON?
Примерно такого формата:
create table json_with_others (
dt datetime,
str String,
a UInt8,
b String
) engine = Memory
insert into json_with_others values (now(), 'text', {"a":1, "b":"b_text"}) -
JSON вставляйте как строку
пока в clickhouse Нет аналогов PostgeSQL JSONB
INSERT INTO json_with_others values (now(), 'text', '{"a":1, "b":"b_text"}') -
читать так
https://clickhouse.tech/docs/en/sql-reference/functions/json-functions/JSON | ClickHouse DocumentationFunctions for Working with JSON In Yandex.Metrica, JSON is transmitted by users as session parameters. There are some sp
-
-
это не процесс это тред
в clickhouse все на ThreadPool сделано
а конкретно что за ошибка то? -
Ошибки нет, в 20.3 писал, что упал в логи. Сейчас 20.8 пишет только 2021.02.10 17:07:36.088961 [ 8880 ] {3b6494c9-d7a0-43e1-b832-51bf38a3fdea} <Error> DynamicQueryHandler: Code: 159, e.displayText() = DB::Exception: Watching task /clickhouse/task_queue/ddl/query-0000523861 is executing longer than distributed_ddl_task_timeout (=180) seconds. There are 4 unfinished hosts (0 of them are currently active), they are going to execute the query in background. Пока не понимаем, либо в версии что то поменялось, либо возможно конкретно сейчас это deadlock, пока разбираемся
-
-
Попробуйте использовать формат TSV, зачем xml?
-
-
WITH 'name' AS col_name
SELECT 1, 2, 3 AS col_name
Привет, подскажите, есть варианты как динамически задавать название столбца? спасибо! -
-
У меня исходные данные в xml
-
Если можно этот xml разделить на строки как в таблице, тогда можно взять формат JSONAsString и залить каждую строку в таблицу в КХ. А дальше перелить запросом уже в нормальную таблицу, регулярками выбирая значения для столбцов
-
Коллеги, у меня есть исходные данные в xml
чеки продаж.
Мне необходимо написать выгрузку в clickhouse что-бы потом можно было отдать эти данные аналитикам и они уже в powerbi строили свою отчетность.
SQL обычный не справляется с такой нагрузкой 50 тыс чеков в день
Если кто может помочь напишите в личку -
Joined.
-
-
может парсить xml до загрузки в бд?
-
просто пид..расить xml кажется не самой лучшей идеей
-
Привет. Помогите пожалуйста разобраться в проблеме, насколько я понимаю она как то связанно с сетью.
версия 21.1.2.15,
на 21.2 тоже воспроизводится
Делаю 10 последовательных селектов с увеличением offset по 100000 записаей из destributed таблицы (~ 1 миллион записей), подобных этому
SELECT date, id, volume
FROM v1_keywords.keywords
WHERE date = '2021-02-09'
ORDER BY id LIMIT ?,?
В произвольный момоент времени во время выполения запроса соеденение с сервером рвётся по причине падения сервера к которому подключен клиент.
Судя про трейсу где то недалеко от этого места вызвавется исключение
https://github.com/ClickHouse/ClickHouse/blob/21.1/src/Client/MultiplexedConnections.cpp#L240
Таблицы:
CREATE TABLE IF NOT EXISTS v1_keywords.local_keywords
ON CLUSTER cluster
(
date Date,
id UInt64,
volume String,
)
ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/{shard}/v1_keywords/local_keywords',
'{replica}')
PARTITION BY date
ORDER BY (date, id, volume)
SETTINGS index_granularity = 8192;
CREATE TABLE IF NOT EXISTS v1_keywords.keywords
ON CLUSTER cluster
(
date Date,
id UInt64,
volume UInt32
)
ENGINE Distributed(cluster, v1_keywords, local_keywords,
id);
clickhouse-server.log
...
2021.02.11 09:27:41.851524 [ 108 ] {20fa50e4-08d9-41a0-84fa-8537f8a56a67} <Trace> StorageDistributed (keywords): (ch-sub-4:9000) Cancelling query because enough data has been read
clickhouse-server.err.log
...
2021.02.11 09:27:41.855597 [ 44 ] {} <Trace> BaseDaemon: Received signal 11
2021.02.11 09:27:41.856436 [ 115 ] {} <Fatal> BaseDaemon: ########################################
2021.02.11 09:27:41.856816 [ 115 ] {} <Fatal> BaseDaemon: (version 21.1.2.15 (official build), build id: E40526A12E9A8F3819A18694F6B798F10C624D5C) (from thread 108) (query_id: 20fa50e4-08d9-41a0-84fa-8537f8a56a67) Received signal Segmentation fault (11)
2021.02.11 09:27:41.859238 [ 115 ] {} <Fatal> BaseDaemon: Address: 0xa0 Access: read. Address not mapped to object.
2021.02.11 09:27:41.859267 [ 115 ] {} <Fatal> BaseDaemon: Stack trace: 0xf7e3e31 0xf7f3053 0xf7f3787 0xe9a0847 0xf91077c 0xf910f49 0xf91081c 0xf910f49 0xf914500 0xf919005 0x86415ed 0x86451a3 0x7fc06de4a609 0x7fc06dd6b293
2021.02.11 09:27:41.861343 [ 115 ] {} <Fatal> BaseDaemon: 2. DB::Connection::receivePacket(std::__1::function<void (Poco::Net::Socket&)>) @ 0xf7e3e31 in /usr/bin/clickhouse
2021.02.11 09:27:41.861739 [ 115 ] {} <Fatal> BaseDaemon: 3. DB::MultiplexedConnections::receivePacketUnlocked(std::__1::function<void (Poco::Net::Socket&)>) @ 0xf7f3053 in /usr/bin/clickhouse
2021.02.11 09:27:41.861756 [ 115 ] {} <Fatal> BaseDaemon: 4. DB::MultiplexedConnections::drain() @ 0xf7f3787 in /usr/bin/clickhouse
2021.02.11 09:27:41.861774 [ 115 ] {} <Fatal> BaseDaemon: 5. DB::RemoteQueryExecutor::finish(std::__1::unique_ptr<DB::RemoteQueryExecutorReadContext, std::__1::default_delete<DB::RemoteQueryExecutorReadContext> >*) @ 0xe9a0847 in /usr/bin/clickhouse
2021.02.11 09:27:41.862187 [ 115 ] {} <Fatal> BaseDaemon: 6. DB::PipelineExecutor::tryAddProcessorToStackIfUpdated(DB::ExecutingGraph::Edge&, 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*> > >&, unsigned long) @ 0xf91077c in /usr/bin/clickhouse
2021.02.11 09:27:41.862205 [ 115 ] {} <Fatal> BaseDaemon: 7. DB::PipelineExecutor::prepareProcessor(unsigned long, 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*> > >&, std::__1::unique_lock<std::__1::mutex>) @ 0xf910f49 in /usr/bin/clickhouse
2021.02.11 09:27:41.862218 [ 115 ] {} <Fatal> BaseDaemon: 8. DB::PipelineExecutor::tryAddProcessorToStackIfUClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
pdated(DB::ExecutingGraph::Edge&, 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*> > >&, unsigned long) @ 0xf91081c in /usr/bin/clickhouse
2021.02.11 09:27:41.862231 [ 115 ] {} <Fatal> BaseDaemon: 9. DB::PipelineExecutor::prepareProcessor(unsigned long, 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*> > >&, std::__1::unique_lock<std::__1::mutex>) @ 0xf910f49 in /usr/bin/clickhouse
2021.02.11 09:27:41.862242 [ 115 ] {} <Fatal> BaseDaemon: 10. DB::PipelineExecutor::executeStepImpl(unsigned long, unsigned long, std::__1::atomic<bool>*) @ 0xf914500 in /usr/bin/clickhouse
2021.02.11 09:27:41.862511 [ 115 ] {} <Fatal> BaseDaemon: 11. ? @ 0xf919005 in /usr/bin/clickhouse
2021.02.11 09:27:41.862838 [ 115 ] {} <Fatal> BaseDaemon: 12. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0x86415ed in /usr/bin/clickhouse
2021.02.11 09:27:41.862850 [ 115 ] {} <Fatal> BaseDaemon: 13. ? @ 0x86451a3 in /usr/bin/clickhouse
2021.02.11 09:27:41.863118 [ 115 ] {} <Fatal> BaseDaemon: 14. start_thread @ 0x9609 in /usr/lib/x86_64-linux-gnu/libpthread-2.31.so
2021.02.11 09:27:41.863757 [ 115 ] {} <Fatal> BaseDaemon: 15. clone @ 0x122293 in /usr/lib/x86_64-linux-gnu/libc-2.31.so
2021.02.11 09:27:42.246363 [ 115 ] {} <Fatal> BaseDaemon: Checksum of the binary: F6479E166DD7E8ABFA19525726186F71, integrity check passed. -
OOM Killer пришел наверное
? -
Возможно. Пока лучше не нашел ничего
-
Увы, памяти ему достаточно.
Сервер падает вместе с контейнером если он в докере локально.
На витруалках в GCP с 8 гб каждая памяти аналогичная беда. Запрос кушает немного.
Вот аналогичный запрос который прошел и не упал
2021.02.11 09:27:41.694732 [ 46 ] {042c5fac-3490-40c2-9dff-8b59a0ff9c24} <Debug> MemoryTracker: Peak memory usage (for query): 50.52 MiB. -
-
Что вы такое делаете, что БД не справляется с 50к в день??
-
Может поможет, трейс с сервака который не отдал данные
2021.02.11 11:20:43.692816 [ 89 ] {} <Error> void Coordination::ZooKeeper::receiveThread(): Code: 33, e.displayText() = DB::Exception: Cannot read all data. Bytes read: 0. Bytes expected: 4., Stack trace (when copying this message, always include the lines below):
0. DB::ReadBuffer::readStrict(char*, unsigned long) @ 0x863c5b5 in /usr/bin/clickhouse
1. Coordination::ZooKeeper::receiveEvent() @ 0xfb9f62a in /usr/bin/clickhouse
2. Coordination::ZooKeeper::receiveThread() @ 0xfb9ef81 in /usr/bin/clickhouse
3. ? @ 0xfba4c61 in /usr/bin/clickhouse
4. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0x86415ed in /usr/bin/clickhouse
5. ? @ 0x86451a3 in /usr/bin/clickhouse
6. start_thread @ 0x9609 in /usr/lib/x86_64-linux-gnu/libpthread-2.31.so
7. clone @ 0x122293 in /usr/lib/x86_64-linux-gnu/libc-2.31.so
(version 21.1.2.15 (official build))
2021.02.11 11:20:43.696040 [ 89 ] {} <Error> void Coordination::ZooKeeper::finalize(bool, bool): Poco::Exception. Code: 1000, e.code() = 107, e.displayText() = Net Exception: Socket is not connected, Stack trace (when copying this message, always include the lines below):
0. ? @ 0x11dcf5be in /usr/bin/clickhouse
1. Poco::Net::SocketImpl::shutdown() @ 0x11dd051c in /usr/bin/clickhouse
2. Coordination::ZooKeeper::finalize(bool, bool) @ 0xfb9b0ef in /usr/bin/clickhouse
3. Coordination::ZooKeeper::receiveThread() @ 0xfb9f5ac in /usr/bin/clickhouse
4. ? @ 0xfba4c61 in /usr/bin/clickhouse
5. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0x86415ed in /usr/bin/clickhouse
6. ? @ 0x86451a3 in /usr/bin/clickhouse
7. start_thread @ 0x9609 in /usr/lib/x86_64-linux-gnu/libpthread-2.31.so
8. clone @ 0x122293 in /usr/lib/x86_64-linux-gnu/libc-2.31.so
(version 21.1.2.15 (official build))
2021.02.11 11:20:43.692990 [ 78 ] {} <Error> void Coordination::ZooKeeper::receiveThread(): Code: 33, e.displayText() = DB::Exception: Cannot read all data. Bytes read: 0. Bytes expected: 4., Stack trace (when copying this message, always include the lines below):
0. DB::ReadBuffer::readStrict(char*, unsigned long) @ 0x863c5b5 in /usr/bin/clickhouse
1. Coordination::ZooKeeper::receiveEvent() @ 0xfb9f62a in /usr/bin/clickhouse
2. Coordination::ZooKeeper::receiveThread() @ 0xfb9ef81 in /usr/bin/clickhouse
3. ? @ 0xfba4c61 in /usr/bin/clickhouse
4. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0x86415ed in /usr/bin/clickhouse
5. ? @ 0x86451a3 in /usr/bin/clickhouse
6. start_thread @ 0x9609 in /usr/lib/x86_64-linux-gnu/libpthread-2.31.so
7. clone @ 0x122293 in /usr/lib/x86_64-linux-gnu/libc-2.31.so
(version 21.1.2.15 (official build)) -
Добрый день есть ли информация по восстановлению distibuted таблиц . На офф сайте вообще мало информации. Кто восстанавливал данные когда зукипер умер раздел. Не можем восстановит даннве в readonly mode. Flag force restore не помогает. Конфиг такой 2 шарда в каждом по 2 реплики. 2й шард работает. На первом не дает вставку. На обоих при попытке подсчетаизаписей выдает session expire
-
кладут сырой ХМЛ в реляционную базу и парсят его каждый раз...
-
Ну если каждый, то да:)
-
Мне надо не погружать, а например потом делать анализ например за пол года по товару из каждого чека. Стандартный анализ
-
Joined.
-
Никогда не работал с массивами в КХ, пните в нужном направлении, пожалуйста.
CREATE TABLE TestTable
(
id Int32
, params Nested(
name LowCardinality(String)
, value String
)
)
ENGINE = Memory()
;
INSERT INTO TestTable(id, params.name, params.value)
VALUES (1, ['param1', 'param2'], ['val1', 'val2']), (2, ['param1', 'param2'], ['val1', 'val3']), (3, ['param1', 'param2', 'param3'], ['val1', 'val2', 'val4']), (4, ['param1', 'param2'], ['val1', 'val3'])
;
Как с учётом такой структуры выбрать, например, айдишники записей, у которых param1=val1 и param2=val2 (в данном примере 1 и 3)?
Или выбрать айдишники, набор параметров и значений которых не уникален (в данном примере 2 и 4)? -
WHERE params.name='param1' AND params.value='val1' ?
-
коллеги, подскажите плз, как посмотреть, что именно может крепко нагружать базу, какой запрос
-
-
Это для одного параметра, а для нескольких?
В лоб у меня получился вот такой монстр:
select
id
from
TestTable
array join params
where
(params.name, params.value) in (('param1', 'val1'), ('params2', 'val2'))
group by
id
having
count() > 1
Второй пример я сделал так:
select
(params.name, params.value) as p
, groupArray(id)
from
TestTable
group by
p
having
uniq(id) > 0
Но мне оба решения не нравятся, наверняка это можно сделать проще и быстрее. -
SELECT groupArray(arraySort((x) -> x.1, arrayZip(params.name,params.value))) AS uniq_params, count() AS ids_count
FROM TestTable
GROUP BY uniq_params
HAVING ids_count > 1
попробуйте почитать -
SELECT * FROM system.processes;
SELECT * FROM system.merges;
SELECT * FROM system.parts_log;
SELECT * FROM system.mutations; -
дякую
-
SELECT * FROM system.query_log;
-
Всем привет!
Подскажите плз, как и можно ли вообще сделать аналог SUM(col) Over()
без разворота массивов ( в выборке много столбцов и для нескольких из них придётся разворачивать )
И без джойнов (таблицы жирные) -
groupArray - это очепятка и там должен быть arrayDistinct?
-
Вы можете в словарь добавить еще один атрибут и прописать ему expression.
Expression будет отправляться в запросе на источник -
Joined.
-
Как правильнее сделать мат. вьюху для подсчета количества встречаемого Hash (хэш сумма) и списка Path, которые соотвествуют этому хэшу в таблице logs.
Сейчас сделал так:
CREATE MATERIALIZED VIEW hashes
(
`Hash` String,
`Paths` Array(String),
`Occurrence` Int32,
`CreatedAt` DateTime,
`UpdatedAt` DateTime
)
ENGINE = SummingMergeTree(Occurrence)
PARTITION BY toYYYYMM(CreatedAt)
ORDER BY Hash POPULATE AS
SELECT
PathHash AS Hash,
groupUniqArray(Path) AS Paths,
count() AS Occurrence,
min(EventDate) AS CreatedAt,
max(EventDate) AS UpdatedAt
FROM logs
GROUP BY Hash
Будут запросы вида
SELECT *
FROM hashes
ORDER BY CreatedAt DESC
LIMIT 10
SELECT *
FROM hashes
ORDER BY Occurrence DESC
LIMIT 10 -
ждать и молиться
https://github.com/ClickHouse/ClickHouse/issues/18097window functions: a prototype · Issue #18097 · ClickHouse/ClickHouseSome thoughts for internal discussion. The main task is here: #1469 What we need for a meaningful prototype: single-threaded, partitioning via sort the only supported frame is ROWS BETWEEN UNBOUNDE...
-
-
-
Joined.
-
Первое можно вот так, например
where arrayElement(params.value, indexOf(params.name, 'param1')) = 'val1' -
Спасибо, попробую.
Я ещё вот такой вариант придумал:
where hasAll(arrayZip(param.name, param.value), [('param1', 'val1'), ('param2', 'val2')]) = 1 -
Joined.
-
-
-
-
-
А подскажите, пожалуйста, может есть в КХ какая-то функция, что-то типа arrayForEach, в которую можно передать лямбду и массив и что-то там сделать с элементами массива?
-
лямбды есть =) для многих array фукнций
https://clickhouse.tech/docs/en/sql-reference/functions/#higher-order-functionsIntroduction | ClickHouse DocumentationFunctions There are at least* two types of functions - regular functions (they are just called “functions”) and aggregat
-
Массивы | Документация ClickHouse
Массивы empty Проверяет, является ли входной массив пустым. Синтаксис empty([x]) Массив считается пустым, если он не сод
-
Да, что-то я не подумал про arrayMap. Спасибо.
-
почему конструкция FROM table a, table b ест на порядки больше памяти чем в таблицах данных?
-
по условиям сравнения там всего х3 должно быть
-
CROSS JOIN же
a*b -
А какие конкретно условия?
кх в некоторых случаях не может оптимизировать это в INNER JOIN -
+
-
CROSS JOIN using unexpectedly large amount of memory · Issue #12571 · ClickHouse/ClickHouse
I've been having issues trying to find prefix relationships between strings in a table, using startsWith on top of a cross join. Although the dataset is about 20GiB uncompressed, ClickHouse...
-
да надо дельты считать, так что id = id and date = date - toIntervalMonth(1)
-
Какая версия кх?
-
20.12.3 revision 54442
-
EXPLAIN SYNTAX SELECT ....
-
Коллеги, всем привет!
Подскажите плиз по 2 вопросам:
1. Почему не ставится драйвер на бобра?
2. В КХ рили не работают оконные функции? -
ALL INNER JOIN ExternalData AS a ON (a.Client = Client) AND (a.StoreNo = StoreNo) AND (a.Brand = Brand) AND (a.XCode = XCode) │
│ WHERE (a.Client = Client) AND (a.StoreNo = StoreNo) AND (a.Brand = Brand) AND (a.XCode = XCode) AND (a.Date = (Date - toIntervalMonth(1))) -
Есть прототип оконок в 21.1 и 21.2
-
это selfjoin?
-
lf
-
можно сделать через GROUP BY тогда
сформировать 2 массива и потом через лямбду посчитать -
сходу не очень понимаю как
-
в принципе если вторую копию взять в виде подзапроса с суммой по интересующему полю, вроде отрабатывает. Но неизвестно до какого роста объема данных
-
,будет LEFT JOIN на порядок меньше памяти
-
Привет
Кто ни будь знает, tabbix ещё живой?
Там в репо последний комит 3года назад?
Или может есть какая альтернатива? -
поставить опен сорс apache superset)) или редаш) а чтоб сразу работало без прилолжения усилий хз, но таббикс около 3 месяцев назад ипользовал - вроде норм
-
В суперсет нужно ещё кастомный Кликхаус провайдер ставить, место того, что идёт в офф докер образе (там приколы с low cardinality, как минимум)
-
ну у меня не сразу подкючился (там приколы с паролем при подключении бд были)- я чз докер ставил и мне пришлось в requirements-local.txt прописать infi.clickhouse_orm==1.0.4, а что насчет low cardinality - это как на работе сказывается?
-
емнип как то так выглядит
WITH [Date, Date + INTERVAL 1 MONTH] as arr SELECT Client, StoreNo, Brand, sumIf(value, date2=Date) - sumIf(value, date2=Date + INTERVAL 1 MONTH) as diff ARRAY JOIN arr as date2 GROUP BY Client, StoreNo, Brand, date2 -
:) спасибо!
-
Там дефолтный провайдер даже селект не хочет делать, если есть low cardinality колонки.
-
не живой, но работает ок, удобно в свете того что он полностью на JS и его не надо ставить
-
Joined.
-
Парни, никто не "дорабатывал напильником" часом mailru/go-clickhouse ?
-
Привет! Мы тут боролись с ошибкой 1002, обновились до jdbc 0.2.5. Вроде стало лучше и тут опять вылезло без кода ошибки:
r.y.clickhouse.ClickHouseStatementImpl : Error during connection to ru.yandex.clickhouse.settings.ClickHouseProperties@31e4c6f4, reporting failure to data source, message: 1.1.1.111:8123 failed to respond
2021-02-11 20:05:45.179 INFO 1 --- [ task-4] r.y.clickhouse.ClickHouseStatementImpl : Error sql: select * from test.policy where policy_id = 123 and quotation_date = '2020-01-01' order by created_at desc limit 1
FORMAT TabSeparatedWithNamesAndTypes; -
Это же то же самое и оно никуда не делось? Как с ней можно ещё побороться кроме обновления на jdbc-0.2.5?
-
Добрый день, коллеги. У меня есть массив в колонке arr, у меня в таблице выбрана одна строка, и таким образом есть конкретный arr. И я хочу сделать на него other_table.other_column in arr. Я вот вижу что можно сделать has(arr, other_column), у вижу что там линейный поиск, очень ТОРМОЗИТ. Не нашел как превратить массив в таблицу шобы сделать обычный join. Что делать?
-
IN (SELECT arrayJoin(arr) FROM table)
-
о, прозевал, ща
-
офигенчик, спасибо за наводку!
-
-
-
зачем? он будет при мержах их двигать и падать по oom
-
нет, не починено это 0.2.5
оно даже не вмержено https://github.com/ClickHouse/clickhouse-jdbc/pull/540
и плюс это фикс для селектов -
Хм всю строку читает в память при мердже или только индекс колонки а остальное стримит?
Зачем - другие альтернативы требуют доп велосипедов -
8192 строк(из колонки или из всей таблицы) в память
-
Даже если выставить размер гранулы в 1?
-
какой смысл по одной строке писать и читать
-
не заработает, берите hdfs
-
Говорю же, бинарные файлы хранить
-
я имел в виду что мерж работает с кучей строк, я не проверял на гранулах в 1
но в общем-то есть настройка merge_tree -
Альтернативы то ясны, Ну только ради этого хдфс/s3 сложно воротить...
-
Спасибо. Собссно вопрос будет ли эту колонку читать в память при мердже или стримить из файла в файл на лету при грануле в 1 строку.
Есть альтернатива в виде лог таблиц, но там надо самим грузитб в реплики... А можно дистрибютед на лог таблицы с internalreplication false сделать? -
-
я сомневаюсь что с 15-20 ГБ это заработает
ну и сохранность Log не гарантируется с рестартом и даже инсерт может сломать log таблицу
я за hdfs -
Да, ладно. Спасибо. В крайнем случае всегда можно кидать файлами на два сервера )
-
-
-
там селект тормозит
-
В system.replication_queue причина есть обычно
-
потому что это два разных не связанных механизма
-
-
Спасибо продолжение пропустил.
А как насчет mv/chained mv? Эта настройка пробросится? -
сервер на котором вы выполняете on cluster ZZZ читает описание кластера ZZZ и видит два хоста AA и BB
и пишет задания в task_queue/ddl для АА и BB
сервер АА берет свой hostname -f и оказывается что у него hostname = localhost, идет в очередь task_queue и ищет задание для localhost, там пусто. -
да 🙂
https://github.com/ClickHouse/ClickHouse/issues/20304optimize_on_insert creates empty parts · Issue #20304 · ClickHouse/ClickHouseIt would be great if optimize_on_insert was smart enough to discard empty blocks create table empty (num Int8) engine=Memory; CREATE MATERIALIZED VIEW empty_mv ( `num` Int8 ) ENGINE = SummingMergeT...
-
не ну там с хостами точно все норм. сломалось совсем недав. но я проверю конечно
-
ну надо смотреть версию КХ, бывает что DDLWorker падает и тогда становится некому читать task_queue
-
версия 21.2.2. про воркер мало вероятно, так как буквально пару дней назад накатил последнюю версию. а сломалось еще на прошлой неделе. хорошо. завтра прочекаю все что выше описали. тут еще уточняющий момент - где то отработало, а где то нет.
-
и что рестарт КХ помогает?
# ps -eL|grep DDL
18829 18876 ? 00:00:00 DDLWorkerClnr
18829 18879 ? 00:00:00 DDLWorker
# ps -ef|grep 18829|grep -v grep
clickho+ 18829 18828 1 Feb09 ? 00:55:00 /usr/bin/clickhouse-server --config-file /etc/clickhouse-server/config.xml --pid-file /var/run/clickhouse-server/clickhouse-server.pid --daemon -
Joined.
-
Над хадупом какие форматы файлов поддерживаются ? CSV ?
http://clickhouse.tech/docs/en/engines/table-engines/integrations/hdfs/amp/#hdfs -
вроде должен быть любой формат из этих, нет?
https://clickhouse.tech/docs/en/interfaces/formats/#formatsInput and Output Formats | ClickHouse DocumentationFormats for Input and Output Data ClickHouse can accept and return data in various formats. A format supported for input
-
-
там еще и csv.gz должен работать автоматом
-
- 12 February 2021 (325 messages)
-
Все это работает только на простых типах ? Или CH , например, умеет разбирать json в колонках ? Вообще насколько хорошая это идея отказаться от impala в пользу CH ?
-
вы можете хранить строку как джсон, но это повлияет на производительность
для работы со строкой как с джсоном есть вот такие функции:
https://clickhouse.tech/docs/ru/sql-reference/functions/json-functions/
другой вариант - использовать вместо джсона тип данных Nested:
https://clickhouse.tech/docs/ru/sql-reference/data-types/nested-data-structures/nested/JSON | Документация ClickHouseФункции для работы с JSON В Яндекс.Метрике пользователями передаётся JSON в качестве параметров визитов. Для работы с та
-
вот здесь есть сравнение статистики исполнения запросов по кликхаусу и импале
https://habr.com/ru/company/tinkoff/blog/310620/
вообще их на первой странице гугла много, можете там посмотретьСравнение аналитических in-memory баз данныхВ последние два месяца лета в управлении хранилищ данных (Data Warehouse, DWH) Тинькофф Банка появилась новая тема для кухонных споров. Всё это время мы проводили масштабное тестирование...
-
Хм. Impala хороша тем , что работает поверх hdfs . Если в таком же ключе использовать CH он так же будет быстр как и с нативным движком хранения ?
-
вы и через интерфейс хайва можете запросы к hdfs делать
-
(судя по тому, что вы говорите про импалу, то и хайв в коробке у вас есть)
-
попробуйте лучше сделать анализ того функционала, который потребуется
может, вам достаточно запросов через хайв?
скорее всего, понять вам это поможет анализ функционала -
Joined.
-
Всем привет ! Вопрос есть.Есть такие теги в сфинке Москва*ORКоронавирус* подскажите пожалуйста как этот запрос переделать в кликхаус чтобы он заработал как надо.Я не могу понять какую функцию поиска текста юзать чтобы искать одновременно два тега.Я понял как найти именно одно определенное слово таким запросом select * from items where ilike(text, '%москва%') LIMIT 195 а как мне сделать так чтобы как бы искались два тега.
Основной вопрос: как передать в кликхаус больше одного тега ? -
-
select * from items where multiSearchAnyCaseInsensitive(text, ['москва','питер']) LIMIT 195
-
как пример
-
-
Пишет что нет места
-
увеличить раздел /tmp в ramfs? выбирать более малую часть данных?
-
Места хватает)
-
(Errcode: 28 - No space left on device)
это говорит об обратном -
-
-
Сообщение да, говорит другое.
-
-
-
-
-
Joined.
-
Итак. Версия 21.2.2.8. Посмотрел в select * from system.replication_queue \G там висят пару заданий, но они не относятся к делу, как я понимаю. Забыл изначально описать что я делал - create table ... on cluster ZZZ. При этом запрос был сделан с хоста с самого кластера. Зависло еще в процессе выполнения. В select * from system.zookeeper where path = '/clickhouse/task_queue/ddl' \G задача все еще висит. При этом первая задача была с ошибкой синтаксиса и она так же зависла в процессе выполнения и она так же висит. На каких то репликах таблица была создана, на каких то нет. Посмотрел что лежит в /clickhouse/ZZZ/3/logs/system/replicas - одна реплика, второй нет. Тут была идея про веркер DDL, кажется все впорядке:
$ ps -eL|grep DDL
1889 3177 ? 00:17:10 DDLWorkerExec
1889 3181 ? 00:00:00 DDLWorkerClnr
1889 9469 ? 00:00:00 DDLWorker
Я не очень понимаю как можно "протолкнуть" выполнения задачи. -
Joined.
-
Посмотрел про имена хостов, там все как обычно. hostname -f отдает тож самое что используется в работе КХ и в ЗК
-
Похоже я нашел проблему. Помог перезапуск КХ. DDL запросы отработали. Видимо проблема подключения с ЗК. Но это не точно. Тут вопрос как этом можно понять и сделать переподключение к ЗК? Если это вообще проблема с этим, так как я же без проблем делаю select * from system.zookeeper where path = '/clickhouse/task_queue/ddl' \G на проблемных хостах.
-
-
Всем привет!
Можете подсказать, кто-нибудь сталкивался с таким:
curl http://192.168.10.21:8124/ping
There is no handle /ping
Use / or /ping for health checks.
Or /replicas_status for more sophisticated health checks.
Send queries from your program with POST method or GET /?query=...
Use clickhouse-client:
For interactive data analysis:
clickhouse-client
For batch query processing:
clickhouse-client --query='SELECT 1' > result
clickhouse-client < query > result
Просто дичь какая-то на соседнем сервер с стакой же версией ch и конфигурацией точь в точь http API нормально работает.
А здесь два инстанса кликхауса на разных портах - и на обоих вот такой ответ и на ping и на /. -
-
да, там один на 8123, другой на 8124, оба не работают
-
разница только в ОС, у одного 18, У другого 20 убунта
-
Joined.
-
бинарник clickhouse тот же самый
-
-
-
наверно STOP REPLICA/START REPLICA
-
curl http://192.168.10.21:8124?query=select%201
There is no handle /?query=select%201
Use / or /ping for health checks.
Or /replicas_status for more sophisticated health checks.
Send queries from your program with POST method or GET /?query=...
Use clickhouse-client:
For interactive data analysis:
clickhouse-client
For batch query processing:
clickhouse-client --query='SELECT 1' > result
clickhouse-client < query > result -
кликхаус-клиент работает норм
-
Проблема не в кликхаусе, а в курле. Включите вывод дебага курла и посмотрите что он выдает.
-
В браузере ?)
-
фаервол там стоит calico, но его вырубали тот же эффект
по лгам посмотрю -
Я смотрела, он отдает 404, на другом сервере та же версия HTTP, но отдает Ок.
curl -v http://192.168.10.21:8123/ping
* Trying 192.168.10.21:8123...
* TCP_NODELAY set
* Connected to 192.168.10.21 (192.168.10.21) port 8123 (#0)
> GET /ping HTTP/1.1
> Host: 192.168.10.21:8123
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 404 Not Found
< Date: Fri, 12 Feb 2021 08:41:07 GMT
< Connection: Close
<
There is no handle /ping
Use / or /ping for health checks.
Or /replicas_status for more sophisticated health checks.
Send queries from your program with POST method or GET /?query=...
Use clickhouse-client:
For interactive data analysis:
clickhouse-client
For batch query processing:
clickhouse-client --query='SELECT 1' > result
clickhouse-client < query > result
* Closing connection 0 -
вероятно вы про RESTART REPLICA. в след раз попробую
-
просто с соседних серверов, где курл работает норм такая же фигня
то есть на один экземпляр он отдает Ок, а на другой - 404 с того же сервера -
RESTART=STOP+START...
-
пробовали на правильном порту запускать? может баг в КХ (хотя маловероятно)
-
ну это понятно :) в доке только рестарт
-
на этом сервере ещё оин инстанс CH работает на 8123, аналогичная ситуация
-
а да, сорри
-
т.е. на
curl 'http://localhost:8123/'
и на curl 'http://localhost:8124/'
он выдаёт 404 и говорит что ему прислали неверные гет параметры? -
может вы игрались с хендлерами и выключили дефолтс
что у вас в секции http_handlers в processed_configs? -
да, это два разных инстанса на одном сервер и у обоих такая фигня
-
Да ничего вроде, все по дефолту
-
сейчас буду тестировать на сервере с другой 20 убунтой
-
а вы точно на локалхост пробовали или как выше писали на IP сразу?
судя по дебагу вот *Mark bundle as not supporting multiuse HTTP/2
я не знаю, завозили в кликхаус HTTP/2 или нет. либо у вас nginx где-то стоит перед ним и вы неправильно проксируете запросы -
-
точно пытались на локалхос, никаких прокси до CH нету.
Если бы проблема была в curl, то нельзя было бы этим curl получить нормальный ответ от другого CH.
А на этом сервере запрос до другого CH работает Ок., а к локальному не работает.
И с других серверов такая же ситуация, на проблмном сервере запрос фейлится, на другом сервере запрос(ping) выполняется. -
это прямо мистика какая-то. но тут могу посоветовать только tcpdump и смотреть пакеты с заголовками и что прилетает в clickhouse.
а попробуйте вместо curl, например wget -
wget пробовала, там он просто 404 отдает, в принуипе, то же, что и курл
-
если можно остановить то можно перенести папки data/metadata + users sql файлики
-
-
Добрый день, делаю запрос по типу:
SELECT UserID, COUNT(*) as c FROM Statistic GROUP BY UserID ORDER BY c DESC LIMIT 100;
Выдает Code: 241. DB::Exception: Received from localhost:9000. DB::Exception: Memory limit (for query) exceeded: would use 93.14 GiB (attempt to allocate chunk of 8323568 bytes), maximum: 93.13 GiB: While executing AggregatingTransform.
Есть ли варианты, как это можно пофиксить? -
ну проверьте в preprocessed_configs/config.xml
по умолчанию секция закомментирована полностью должна быть -
попробуйте спиллить на диск
SELECT UserID, COUNT(*) as c FROM Statistic GROUP BY UserID ORDER BY c DESC LIMIT 100
SETTINGS max_bytes_before_external_group_by=10000000000; -
Сработало, спасибо, а можете подсказать, как правильно сделать MATERIALIZED VIEW, так как эта информация желательно, что бы обновлялась сама
-
https://www.youtube.com/watch?t=7596&v=1LVJ_WcLgF8
тут все поясняется что и как -
Thnx
-
-
Joined.
-
Здравствуйте! Подскажите, пожаулйста.
Есть такие конструкции
create view my_view as select…. которая возвращает одно число, create view calc_view as select col * my_view from some_table - будет ли во втором случае my_view вычисляться каждый раз для каждой строки, либо же лучше просто обернуть в with ? create view calc_view as with my_view as some_value select col * some_value from some_table -
-
-
SELECT * FROM system.query_log
MATERIALIZED VIEW это триггер который работает с блоком данных который вставляется в таблицу которая в SELECT .. FROM указана -
типа этого
https://t.me/clickhouse_ru/201620Denny Crane [Junior support specialist at Altinity (NB,Canada)] in ClickHouse не тормозити я бы конечно делал дневные партиции и ttl_only_drop_parts <query_log> <database>system</database> <table>query_log</table> <engine>ENGINE = MergeTree PARTITION BY (event_date) ORDER BY (event_time) TTL event_date + 1 day SETTINGS ttl_only_drop_parts=1 </engine> <flush_interval_milliseconds>7500</flush_interval_milliseconds> </query_log>
-
ENGINE переопределите
/etc/clickhouse-server/config.d/query_thread_log.xml
<yandex>
<query_thread_log>
<database>system</database>
<table>query_thread_log</table>
<partition_by>toMonday(event_date)</partition_by>
<engine>Engine = MergeTree PARTITION BY event_date ORDER BY event_time TTL event_date + INTERVAL 7 DAY</engine>
<flush_interval_milliseconds>7500</flush_interval_milliseconds>
</query_thread_log>
</yandex>
после этого отредактируйте
/var/lib/clickhouse/medata/system/query_thread_log.sql
и добавьте TTL там
после этого рестартуйте сервер -
А таблицу то как почистить ) ?
-
-
ALTER TABLE ... DELETE WHERE ...
или
TRUNCATE TABLE
если вы этими данными не пользуетесь -
Так вот выдает ошыбку не дает почистить
-
Joined.
-
Если через катсоль дропнуть файл таблицы ничего не сломаеться ?
-
Ну вам же сообщение говорит, что мешает.
Поправьте настройку или файл -
ну так прочитайте что в ошибке написано
чтобы не грохнули данные важные случайно
TRUNCATE TABLE system.query_thread_log SETINGS max_table_size_to_drop=0
сделайте если не пользуетесь данными -
Всем привет, новичок в кх пока,нужна помощь посчитать дельту(разность).
Есть таблица, в которой есть id продукта, окно предположим 7. есть некое значение shap_value, есть название фичи, их 38 различных и есть дата прогноза. Задача проста, посчитать дельту между определенным днем например 12 числом и 11 числом, притом, что forecast_window == 7
AND product_id == 837 будут одинаковы, а фичей за конкретный день при таком фильтре всегда 38.
То есть посчитать тупо разность 38 значений одного дня - 38 значений другого.
Вообще не нахожу в КХ методов чтобы это сделать, хоть задача и простая вроде -
Прочие функции | Документация ClickHouse
Прочие функции hostName() Возвращает строку - имя хоста, на котором эта функция была выполнена. При распределённой обраб
-
Не думаю, что подойдут офсеты, за день данных 62000*4, такой огромный оффсет делать не очень наверно. Тем более вообще следующая задача посчитать дельту 38 значений сегодняшнего дня - 38 значений среднего за 7 предыдущих дней. Тут наверно через что-то другое надо, но не хватает знаний как это сделать
-
Вроде в query_log нет insert ?
-
там все есть
только INSERT там без данных которые вы вставляете... а так, память покажет... и байты ... и кажется кол-во строк... (но это не точно) -
Joined.
-
Коллеги подскажите пожалуйста ловлю ошибку уже пару часов бьюсь ```DB::Exception: Table columns structure in ZooKeeper is different from local table structure: Cannot attach table```
Используется 2 сервера кх 1 шард и 1 зукипер.
Как можно пофиксить? -
добрый день всем. Подскажите, пожалуйста, возможно кто-то сталкивался с вопросом загрузки данных из существующей таблицы Clickhouse на движке MergeTree() в существующую на том же движке, но с другим ключом сортировки данных. Исходная таблица содержит порядка 14 миллиардов строк (1 строка - это некий 1 ивент). Есть ли проблемы, связанные с выполнением такого запроса insert select? И насколько это ресурсозатратная операция в плане потребления оперативной памяти?
-
-
логи которые "нужно обновлять" нельзя называть логами
или имеются ввиду логи которые прилетают старым периодом?
ну можно ReplacingMergeTree использовать, если знаете по каким параметрам будете сравнивать что с чем надо обновить
https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/replacingmergetree/ReplacingMergeTree | ClickHouse DocumentationReplacingMergeTree The engine differs from MergeTree in that it removes duplicate entries with the same sorting key valu
-
а можно просто в селекте эт оучитывать и ничего обновлять не придется
-
она вроде как стриминговая, по частям данные отправляются
-
проблем особых быть не должно по памяти
только по диску и CPU для сортировки
память выделяет для INSERT примерно 2 мегабайта на колонку
данные в процессе вставки из исходной таблицы бьет по умолчанию по блокам по миллиону записей
и уже его сортирует...
ORDER BY в SELECT добавлять не надо
селект должен получиться steamable
тоже какую то память жрет, на буфера для чтения...
возможно придется добавить в запрос что нибудь типа
SETTING max_partitions_per_insert_block=XXX
для пробы можно сделать
INSERT INTO ... SELECT ... FROM WHERE date BETWEEN ... SETTINGS ...
и проверить какие выходные данные получатся сравнить через system.parts
размеры в исходной и конечной таблице -
а какая вам нужда менять ORDER BY?
вы туда что-то добавить хотите?
что? низкокардинальное надеюсь? -
да, низкокардинальное, связано с оптимизацией под несколько основных запросов
-
спасибо огромное за информацию) сейчас попробую
-
низкокардинальное лучше поближе к началу ORDER BY добавлять
-
ок, об этом знаю, спасибо)
-
-
В западную страховую компанию требуется программист 1С, с опытом работы в страховых компаниях, некредитных финансовых организациях, консалтинга.
Условия:
-Оплата: 180 000-200 000 Гросс;
-Оформление согласно ТК РФ;
-Доплата по больничному листу, ДМС, страхование от НС, страхование жизни, подарок на день рождения.
Требования:
-Высшее профильное образование.
-Опыт работы разработчиком на платформе 1С от 3 лет.
-Уверенные навыки разработки на 1С 8.3.
-Понимание принципов работы современных технологий интеграции и обмена данными (веб-сервисы, soap, json, xml).
-Опыт администрирования систем на платформе 1С: Аксиома, Аванкор, Финансист, Sintegro.
-Опыт работы с продуктами Atlassian Jira, Confluence.
Обязанности:
-Доработка существующих типовых и нетиповых конфигураций.
-Взаимодействие с компаниями-разработчиками бизнес приложений, постановка и контроль выполнения задач, тестирование, передача реализованного функционала пользователям.
-Поддержка интеграционных механизмов бизнес приложений на платформе 1С.
-Разработка SQL запросов.
-Подготовка документации, ведение базы знаний по разрабатываемому и дорабатываемому функционалу.
-Консультирование и обучение пользователей бизнес приложений. Резюме направлять @Ekaterina_kst -
блин
-
клик уже с 1с работает?
-
вау
-
-
-
имеет смысл наверное issue для этого сделать в github
как вариант настроить memory profiler
и через https://github.com/Slach/clickhouse-flamegraph/
попробовать flamegraph для типа Memory построить...GitHub - Slach/clickhouse-flamegraph: CLI utility for build flamegraph based on system.trace_logCLI utility for build flamegraph based on system.trace_log - GitHub - Slach/clickhouse-flamegraph: CLI utility for build flamegraph based on system.trace_log
-
Всем привет, в доке по КХ, везде, черным по белому, рекомендуют за управление ролями, квотами, профилями и т.п. через SQL-воркфлоу.
Кто-то может объяснить с чем это связано?
Управление КХ планируется реализовать через ansible, и пока не могу представить, что хранение настроек, юзеров и прочего намноо удобнее держать в SQL нежели в xml(где явно и структурировано все описано)
Поделитесь опытом, в чем плюс SQL-воркфлоу и как вы управляете конфигурацией и ролями в КХ? -
ну, я думаю XML еще долго останется
RBAC через SQL определяется во всех СУБД практически
в целом же никто не мешает
CREATE ROLE IF NOT EXISTS сделать
и потом права раздавать -
-
For RBAC i find it useful to have separate tables for users, roles, permissions, role_permissions, and user_roles
-
-
SELECT * FROM system.merges
-
разве удобно хранить конфигурацию в sql файлах?
-
ну вы попробуйте =)
я понимаю что видимо вам конкретно неудобно
но вообще если подумать SQL определение ролей и прав, компактнее чем XML и тем кто работает с БД просто возможно более читабельно
конечно самое удобное и читаемое это какой нибудь UI с security matrix
где столбцы это права
строки роли
и на пересечении галочка =)
но это уже другой подход "накликивания" и вам он не нужен -
SELECT * FROM system.query_log
там тоже есть про память -
еще
посмотрите
system.metric_log
там есть метрики по трекингу памяти
еще
system.dictionaries
может у вас словарь какой завелся который память отожрал внезапно? -
мне тут интересен опыт других) Хотел понять в чем +- разных подходов и кто что использует.
-
ну SQL более устоявшийся подход
недостатки у него только то что обычно юзеров с паролями открытыми задают в SQL файлах
а надо бы через хеши =)
но это и в XML тоже встречается -
спасибо
-
спасибо
-
-
-
-
сделайте grep ba3f55d-a04c-48e2-bebb-53f7cd5fead7 -r /var/log/clickhouse/clickhouse-server.log
что там за запрос? -
судя по всему оно какую то query не может составить Pipeline
-
нужно запрос посмотреть
-
2021.02.12 16:50:06.563929 [ 15664 ] {8ba3f55d-a04c-48e2-bebb-53f7cd5fead7} <Debug> executeQuery: (from 157.230.84.89:41788, using production parser) SELECT * FROM stats708.events6892 WHERE packagename = 'com.managhost.cleanerbestap' AND time > '2021-01-13 16:50:01' LIMIT 1000 OFFSET 2000 FORMAT JSON
2021.02.12 16:50:06.564460 [ 15664 ] {8ba3f55d-a04c-48e2-bebb-53f7cd5fead7} <Trace> ContextAccess (default): Access granted: SELECT(date, time, msec, value, ip, country, city, region, isp, trackHost, firebasetoken, packagename, deviceid, version, manufacturer, devicemodel, countryCode, type, asn, aso, cohort, AndroidVersion, IsTabletDevice, UserAgent, Rdid, connectionType) ON stats708.events6892
2021.02.12 16:50:06.564920 [ 15664 ] {8ba3f55d-a04c-48e2-bebb-53f7cd5fead7} <Trace> ContextAccess (default): Access granted: SELECT(date, time, msec, value, ip, country, city, region, isp, trackHost, firebasetoken, packagename, deviceid, version, manufacturer, devicemodel, countryCode, type, asn, aso, cohort, AndroidVersion, IsTabletDevice, UserAgent, Rdid, connectionType) ON stats708.events6892
2021.02.12 16:50:06.565370 [ 15664 ] {8ba3f55d-a04c-48e2-bebb-53f7cd5fead7} <Trace> InterpreterSelectQuery: WithMergeableState -> Complete
2021.02.12 16:50:07.041136 [ 15849 ] {8ba3f55d-a04c-48e2-bebb-53f7cd5fead7} <Trace> StorageDistributed (events6892): (162.251.61.228:9020) Cancelling query because enough data has been read
2021.02.12 16:50:07.056876 [ 16857 ] {} <Fatal> BaseDaemon: (version 21.2.2.8 (official build), build id: 67D2DA03ADA750F18CEB331C65F50D0F56E33713) (from thread 15849) (query_id: 8ba3f55d-a04c-48e2-bebb-53f7cd5fead7) Received signal Segmentation fault (11)
2021.02.12 16:50:07.061467 [ 15834 ] {8ba3f55d-a04c-48e2-bebb-53f7cd5fead7} <Trace> StorageDistributed (events6892): (162.251.61.11:9020) Cancelling query because enough data has been read
2021.02.12 16:50:07.132243 [ 15783 ] {8ba3f55d-a04c-48e2-bebb-53f7cd5fead7} <Trace> StorageDistributed (events6892): (38.64.138.77:9020) Cancelling query because enough data has been read -
вроде не крамольная query
stats708.events6892
это Distributed таблица? -
Отец К’оргий
Так, ну поставил я Clickhouse. Куда говорить-то?
-
в общем похоже вы на какой то баг наступили очень неприятный...
попробуйте вместо SELECT * ...
столбцы выбирать? -
хз, как глянуть?
-
-
-
SHOW CREATE TABLE stats708.events6892
-
уже нашли виновника
-
-
ну вообще было бы не плохо если бы вы какой то минимально воспроизводимый пример сделали и issue на github завели
потому что ошибка прямо неприятная с сегфолтом в такой query вроде валиться не должно -
ща попрошу пример этого запроса
-
SELECT * FROM stats708.events6892 WHERE packagename = 'com.managhost.cleanerbestap' AND time > '2021-01-13 16:50:01' LIMIT 1000 OFFSET 2000 FORMAT JSON
Дак вот он у вас
ничего крамольного же говорю -
Но валится как то очень странно,
при попытке освободить соединение с другим clickhouse сервером
DB::RemoteQueryExecutor::finish
потом
DB::MultiplexedConnections::drain()
потом
DB::MultiplexedConnections::receivePacketUnlocked
потом
DB::Connection::receivePacket
и в нем уже куда то читает из памяти которая недоступна
так не должно быть
там сколько НОД в кластере?
обновления какие то на все ноды накатили или только на некоторые?
вот этот удаленный сервер он точно такой же версии или нет? -
=))) а почему вас то попросили? ;))))) других кто работал не нашлось чтоли? или убежали в страхе?
-
тип того)
-
я хз что они там творили
-
-
я вопросы перечислил было бы не плохо получить на них ответ
-
я соберу ответ
-
-
нет не отменяется
просто нет вставки в таблицу которая под MV лежит
в родительскую таблицу вставка пройдет
в clickhouse нет транзакций -
А если две MV и одна выдала ошибку? Ладно, это можно проверить(
Спасибо -
тоже самое, первая вставит, вторая нет
я же сказал транзакций НЕТ
MV это не транзакционный AFTER INSERT TRIGGER
который работает с куском данных который поступил в инициирующую таблицу по INSERT
каскадные MV тоже отдельно работают -
CREATE TABLE A (
a String
) ENGINE = MergeTree()
ORDER BY a
PRIMARY KEY a
CREATE TABLE B (
a String
) ENGINE = MergeTree()
ORDER BY a
PRIMARY KEY a
CREATE TABLE C (
a UUID
) ENGINE = MergeTree()
ORDER BY a
PRIMARY KEY a
CREATE MATERIALIZED VIEW A2B TO B (
a String
) AS
SELECT
a as `a`
FROM
A
CREATE MATERIALIZED VIEW A2C TO C (
a UUID
) AS
SELECT
toUUID(a) as `a`
FROM
A
Попробовал вставить INSERT INTO A (a) VALUES ('djskdjsd')
В A вставилось, в B и C не вставилось -
- 7 нод
- о каких обновлениях речь?
версии везде одинаковы -
ну об обновлениях версии clickhouse
7 нод как то не симметрично
почему 7?
сколько шардов? Тоже 7 и в каждом по одной реплике?
облако или свое железо?
на своем железе с памятью все впорядке? -
>>>сколько шардов? Тоже 7 и в каждом по одной реплике?
всё верно 7 шардорв по одной реплике
>>> не симметрично почему 7?
как я со стороны вжу что они их добавляют по мере необходимости
>>> облако или свое железо?
Своё
>>> на своем железе с памятью все впорядке?
пару раз было ООМ, но не связано с этими 5тиминутными рестартами -
возможно я ввел вас в заблуждение, извините
там может у вас сначала A2C выбрался и упал с ошибкой
или реально там когда все триггеры MV стартуют
то если хоть один упал остальные тоже откатываются
но вроде как планируются улучшения
https://github.com/ClickHouse/ClickHouse/issues/19352Why clickhouse does not support transaction? · Issue #19352 · ClickHouse/ClickHouseClickhouse does not support transaction will lead to duplicated data when we using spark to load data into clickhouse(spark task failed and retry will lead to this). As i know, the reason includes:...
-
рестарты всегда на разных запросах или на одном и том же?
запросы однотипные? -
рестарт только на одном сервере? остальные ОК?
запрос с которого падает
если его на другом сервере исполнить то все ок работает? -
да тот что выше
-
да, только на одном сервере
-
этот запрос выполнялся в цыкле, как мне говорили
-
1) SHOW CREATE TABLE stats708.events6892 - для ясности картины
2) memtest -
на других серверах такой запрос проходит ?
-
SHOW CREATE TABLE stats708.events6892
┌─statement──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ CREATE TABLE stats708.events6892
(
`date` Date DEFAULT toDate(time),
`time` DateTime,
`msec` UInt64,
`value` Float32 DEFAULT CAST(1, 'Float32'),
`ip` String,
`country` String,
`city` String,
`region` String,
`isp` String,
`trackHost` String,
`firebasetoken` String,
`packagename` String,
`deviceid` String,
`version` String,
`manufacturer` String,
`devicemodel` String,
`countryCode` String,
`type` String,
`asn` String,
`aso` String,
`cohort` String,
`AndroidVersion` String,
`IsTabletDevice` String,
`UserAgent` String,
`Rdid` String,
`connectionType` String
)
ENGINE = Distributed('events', 'stats708', 'events6892') │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
↘️ Progress: 1.00 rows, 732.00 B (2.41 rows/s., 1.76 KB/s.)
1 rows in set. Elapsed: 0.415 sec. -
его там небыло, они по ходу ток один сервер долбили
-
понятно ссылка на саму себя в Distributed таблице
даблица криво определена...
должно быть что то типа Distributed('events', 'stats708', 'events6892_local')
и
events6892_local это должна быть ENGINE = MergeTree -
лол, спасибо передам
-
-
-
запустите на сервере который не падает
SELECT hostName(), engine_full FROM clusterAllReplicas('events', system.tables) WHERE database='stats708' AND table='events6892'
различия в engine_full есть? -
ой тьфу
-
поправил запрос посмотрите выше
-
SELECT
hostName(),
engine_full
FROM clusterAllReplicas('events', system.tables)
WHERE (database = 'stats708') AND (table = 'events6892') -
-
? каких "обоих нодах" если там вы сказали 7 шардов?
bи не очень понятно что вы получили то? -
проверил там где валится и на одной из кластера
-
-
РЕЗУЛЬТАТ ТО КАКОЙ??? engine_full одинаковый везде?
-
-
-
Code: 47. DB::Exception: Received from 1.1.1.1:9020. DB::Exception: Missing columns: 'table' while processing query: 'SELECT hostName(), engine_full FROM clusterAllReplicas('events', 'system.tables') WHERE (database = 'stats708') AND (table = 'events6892')', required columns: 'engine_full' 'database' 'table', maybe you meant: '['engine_full']' '['database']'.
-
-
-
-
SELECT
hostName(),
engine_full
FROM clusterAllReplicas('events', system.tables)
WHERE (database = 'stats708') AND (name = 'events6892') -
1) значит <remote_servers> в конфигах /etc/clickhouse-server/ различается на разных нодах
2) извините запрос должен выглядеть вот так
SELECT
hostName(),
engine_full
FROM clusterAllReplicas('events', system.tables)
WHERE (database = 'stats708') AND (name = 'events6892') -
-
Joined.
-
привет. при связке clickhouse и rebbitmq как передать vhost при создании таблици на движке RabbitMQ
-
либо в настройках как указать?
-
делаю связку с rabbitmq, как vhost указать?
-
так. странно
пипец как
а есть среди выданых hostName
тот на котором не работает запрос? -
SHOW CREATE TABLE stats708.events6892
все еще показывает Distributed на сервере который валит запрос? -
а вы используете ссд кеш какой-то?
-
В дороге, через часик ток гляну
-
Приветствую!
Запрос:
SELECT * FROM data WHERE ServiceID = '<UUIDv4>' AND Application = ‘<application>’ AND Timestamp >= <1 января 2021> AND Timestamp <= <30 января 2021> ORDER BY Timestamp DESC LIMIT 250;
Запрос выполняется на 1 ноде, потребляет 20+ ГБ RAM.
В таблице data 161 поле. Timestamp - это Primary Key, по нему же сортировка. Всего данных за период внутри Where - примерно 2 ТБ.
optimize_read_in_order = 1
Вопрос - откуда такое потребление памяти? Clickhouse не использует heap sort и/или late materialization?
ClickHouse server version 20.12.3.3 (official build). -
нет, у меня предыдущией модели, еще без nvme, эти только появились я еще не успел.
но я скорее бы использовал встроенные в КХ TTL move -
спс
-
order by DESC же
-
таблица order by ? что ?
-
-
значит из-за SELECT *
что если одно поле выбирать?
>Clickhouse не использует heap sort и/или late materialization?
ахаха, дело вообще не в этом и это параметрами before_external_sort управляется -
-
>о late materialization
дело не в этом, просто select * ... limit 250 без order by работает? -
-
КХ выделяет память (буфера по несколько мегабайт) в куче потоков на каждую колонку
-
-
-
вы просите SELECT *
чтобы распаковать содержимое 160 .bin файлов, выделяется 160*10 или на *32 (потоков) буферов по 1МБ , получается 160*10МБ -
where и order by тут вообще еще не стояли
-
-
эм, вы там 1972 как живете? стримы у нас, все одноврерменно
-
-
-
max_threads=1, max_block_size=512
-
-
-
есть уже 2 FR о том что найти сначала марки order by limit а потом в них заходить
-
просто КХ не для этого, удивительно что optimize_in_order вообще сделали
-
как / чем вы проверяете? обновитесь до нормальной 20.8.12 ... что-то
-
Окей. 160 МБ * 32 потока = 5 ГБ. Запрос потребляет порядка 20 ГБ. Для чего остальные 15?
-
это на чай
-
set send_logs_level = 'trace'; в студию
-
зависит от кол-ва колонок (ширины строки) , если 5 полей UIn64 то 14млрд это фигня, если 700 полей общей шириной 5 кб, то это часов 12 может переливаться
-
сначала нужно понять почему не подходят просто файлы. Т.е. КХ не для хранения хлама.
-
-
Добрый вечер коллеги. Задача со звездочкой: есть колонка типа массива куча линий. Есть секция where. Хотелось бы посчитать метрику по всем выбранным линиям и получить скалярное значение метрики. Идея использовать суффиксы State и Merge не работает. Пробовал на первом уровне делать arrayMap(x -> avgState(x)) as lvl1 кх ругается, что не знает колонку х от ламбда функции. Попробывал arrayMap(x -> avgState(clm[x]), arrayEnumerate(clm)) AS lvl1 - кх ругается: Unknown identifier: x there are columns: clm. avgForEach не позволяет потом собрать в скаляр... Функция то не линейная... Есть идеи?
-
боюсь никто не ответит, я прочитал 3 раза, ничено не понятно. Вы слишком далеко улетели, я например не знаю что такое "скалярное значение метрики"
-
что такое "типа массива куча линий"
-
Ну в математике скаляр - это вещественное число (размерность = 0) потом идет вектор (размерность 1) потом матрица (размерность 2) и далее тензоры. Ну в общем я хотел бы посчитать например avg([1, 2, 3], [3, 4, 5])
-
arrayReduce('avg', flatten([[1],[2]])
-
select arrayReduce('avg', groupArrayArray(a)) from (select [1,2] a union all select [3,4])
-
куча линий в таблице в которой выбирается только некотрые. В таблице есть колонка у, которая есть массив вещественных чисел одной длины. Так вот хотелось бы посчитать одно число которое явлется метрикой по всем значениям в этом выбраных линиях массива.
-
мы не используем слово линия, пишите уже сразу на англ.
-
спасибо попробую агрегитировать массив в матрицу
-
:) а как же чистота языка :)
-
похоже что нужен avgMap, пример давайте что на входе что нужно на выходе
-
я в двуязычной провинции живу, мне можно
-
есть такой avgMap? в доке не нашел в комбинаторах агрегатных функций...
-
Joined.
-
Нету, но можно через суммап попробовать
-
такое надо по логам КХ смотреть. Что-то странное вы говорите.
-
это не поможет, это вообще не про репликацию
тут скорее detach table / attach -
вообще, rsync диф несколько раз на ходу , потом остановить КХ и финальный rsync
-
Подробные логи не были включены. Странно, не странно. А факт на лицо )) дитач/аттач чего? Я же создавал таблицу, как ее дитачить если ее нет?
-
а в чем ошибка create была ?
-
-
"При этом первая задача была с ошибкой синтаксиса и она так же зависла в процессе выполнения и она так же висит"
-
или в смысле некоторые ноды ответили с ошибкой, а некоторые НЕ ответили?
-
есть таблица system.distributed_ddl_queue там может что видно
-
но если все так то это просто зависание DDLWorker
-
я вчера накидал кстати небольшую статью https://altinity.atlassian.net/wiki/spaces/CHKB/pages/8486920/DDLWorker
надо дописать про system.distributed_ddl_queue -
Работаете на Altinity?
-
а что в имени не заметно ? "Junior support specialist at Altinity"
-
у какой крутой конфюенс, скорее FAQ, спасибо =)
-
Привет.
Есть условно большая табличка и простой VIEW
select user_id, count(*) from users group by user_id
Если я буду выполнять поверх такого VIEW запросы вида
select from view where user_id = A
то предикат user_id = A судя по explain syntax будет выполнен на шаге having. то есть сначала выполнится group by, затем уже только фильтр.
можно ли как-то повлиять на такое поведение? -
В двух словах - хочу спрятать все кишки aggregation merge tree с sumMerge во view
-
и дать пользователям простой доступ к таблице
-
микроскоп может и не для этого, но он очень хорош в забивании гвоздей )
-
это все равно плохо из-за избыточных полей в group by. Что за aggregateFunction
-
телескоп
-
sumState
anyState -
150+ полей с полным набором всего: строки, целые числа, вещественные числа. Все для типо расширенной аналитики
-
Ну тогда мы ваши клиенты :)
-
есть доклад "Забиваем телескопом гвозди, или Нестандартные способы использования ClickHouse."
-
можно использовать simpleAggregateFunction, там не нужен -Merge
-
да видел даже вроде, но у нас ЕАВ на нем есть... =) так что у нас не хуже
-
https://altinity.atlassian.net/wiki/spaces/CHKB/pages/196980/A+list+of+videos+Russian+lang а сюда не добавили, ай-яй-яй... можно и премии лишить
-
так все работает, и уже года полтора
create table test(A Int64, B Float) Engine=MergeTree order by A;
insert into test select number, 0 from numbers(10000000)
create view test_view as select A, sum(B) sb from test group by A;
select * from test_view where A = 42
Processed 8.19 thousand rows
select * from test_view where identity(A) = 42;
Processed 10.00 million rows, -
неуспел, той вике 3 дня от роду
-
Короче я не советую накрывать AggregatingMT вьюхой потому что получаются лишние группировки и чтения лишних колонок
в случаях
select a, sum () from
( select a,b,c,d, sumMerge() from group by a,b,c,d )
group a
это не оптимизировано. Будут прочитаны b,c,d и отгруппированы. -
из моего списка для коллег можете накинуть дельту
https://controlc.com/29662a67 -
-
три ЗуКипера нужно для HighAvialabilty
КХ-зу все равно один зукипер или 7 -
1. была ошибка синтаксиса и некоторые ноды так и ответили, другие не отвечали и потом запрос отвалился по времени
2. system.distributed_ddl_queue не очень понял. там есть мой запрос. инициатор тот хост где выполнял, а host_name и host_address почему адреса хоста из другого кластера. кластер тот что нужно. статус Unknown. exception_code: ZOK
3. за статью спасибо )) -
А чем плох select where userId in (select ...)?
-
https://github.com/ClickHouse/ClickHouse/issues/20451 в общем я тут накатал во имя всех пострадавших =)Skip parts when materializing TTL for TTL-expressions that are monotonic functions of columns · Issue #20451 · ClickHouse/ClickHouse
Problem description There is some fundamental problem with current TTL methodology that prevents from using it in production-grade non-cloud environment (when quick elastic resource allocation is n...
-
Проверьте, помогает ли выставление настройки
async_socket_for_remote = 0 -
Спасибо, проверю. Откатился пока на двадцатую версию. Там этих проблем нет.
-
Joined.
-
Помогите, пожалуйста. Обновляю КХ с 19.17 на 20.8
Были таблицы
CREATE TABLE source
(
a Int32,
b Int32,
c Nullable(Int32)
)
ENGINE = MergeTree
ORDER BY a
и
CREATE TABLE destination
(
a UInt64,
st AggregateFunction(argMax, Int32, Int32)
)
ENGINE = AggregatingMergeTree
ORDER BY a
и МВ от первой ко второй
CREATE MATERIALIZED VIEW mv TO destination AS
SELECT
a,
argMaxState(c, b) AS st
FROM source
GROUP BY a
На 19.17 вставка в source работала, но на 20.8 перестала:
Conversion from AggregateFunction(argMax, Nullable(Int32), Int32) to AggregateFunction(argMax, Int32, Int32) is not supported: while converting source column st to destination column st: while pushing to view default.mv.
чтобы поправить это попробовал заменить mv на следующую
CREATE MATERIALIZED VIEW mv TO destination AS
SELECT
a,
argMaxState(coalesce(c, 0), b) AS st
FROM source
GROUP BY a
Теперь если сделать такую вставку в source:
insert into source values (1,1,1), (1,2,null)
то в destination логично попадают следующая строка:
SELECT
a,
argMaxMerge(st)
FROM destination
GROUP BY a
┌─a─┬─argMaxMerge(st)─┐
│ 1 │ 0 │
└───┴─────────────────┘
Однако старая схема в 19.17 дала бы результат
┌─a─┬─argMaxMerge(st)─┐
│ 1 │ 1 │
└───┴─────────────────┘
Я нисколько не утверждаю, что поведение в какой-то из версий является багом, просто я что-то не придумал как мне написать Materialized View , чтобы точно сохранить поведение старой схемы в 19.17 ? -
>argMaxState(c, a) AS st
>argMaxState(coalesce(c, 0), b) AS st
а почему a на b поменялось? -
SELECT
argMax(assumeNotNull(x), y),
argMax(x, y)
FROM
(
SELECT
1 AS x,
1 AS y
UNION ALL
SELECT
NULL AS x,
2 AS y
)
Query id: f33b7565-5d19-40c1-b02c-960728e4e932
┌─argMax(assumeNotNull(x), y)─┬─argMax(x, y)─┐
│ 0 │ 1 │
└─────────────────────────────┴──────────────┘ -
Должно было быть изначально b. Прошу прощения, исправил
-
Так наоборот должно быть же?
-
-
Точнее, такой вопрос, "версией" является столбец b?
-
-
Т.е. в старой версии вернулось бы 0 же
-
Но при этом, хотите скипать Null значения?
-
-
-
нет, в старой версии Null значение c пропускается..
-
Ну вы их заменяете честным нулем, вот и не скипает
SELECT finalizeAggregation(argMaxStateIf(assumeNotNull(x), y, isNotNull(x)))
FROM
(
SELECT
1 AS x,
1 AS y
UNION ALL
SELECT
NULL AS x,
2 AS y
)
Грубое решение, но работает (если вам нужно сохранить старый тип данных в таблице агрегаций, иначе лучше пересоздать как DJ показал) -
а если так создать?
CREATE TABLE destination
(
a UInt64,
st AggregateFunction(argMax, Nullable(Int32), Int32)
)
ENGINE = AggregatingMergeTree
ORDER BY a; -
Ну тогда же туда будут падать нулы? А мне не хочется этого...
-
Немного не понял, это такое запрос должен быть в Materialized View ?