@clickhouse_ru

Страница 630 из 723
Alexey
22.08.2018
01:19:20
что я пропустил или где ошибся?

Denis
22.08.2018
01:21:17
а сообщение об ошибке сильно секретное?

Alexey
22.08.2018
01:22:05
↖️ Progress: 74.19 million rows, 7.16 GB (2.34 million rows/s., 225.60 MB/s.) ████████████████████████████████████████▊ 51Received exception from server (version 18.6.0): Code: 241. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Memory limit (for query) exceeded: would use 9.31 GiB (attempt to allocate chunk of 8388608 bytes), maximum: 9.31 GiB

Denis
22.08.2018
01:23:56
это странно, а если перед инсертом сделать set max_block_size=100000; set max_insert_block_size=100000;

Google
Alexey
22.08.2018
01:24:21
это странно, а если перед инсертом сделать set max_block_size=100000; set max_insert_block_size=100000;
похоже помогло, как понять, какие настройки оптимальные?

это странно, а если перед инсертом сделать set max_block_size=100000; set max_insert_block_size=100000;
а хотя не помогло, все равно свалилось когда сделал INSERT еще побольше

с такой же ошибкой

↘️ Progress: 81.55 million rows, 13.10 GB (2.07 million rows/s., 332.85 MB/s.) ████████████████████████████████████████████████████████████▊ 77Received exception from server (version 18.6.0): Code: 241. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Memory limit (for query) exceeded: would use 23.46 GiB (attempt to allocate chunk of 1073741824 bytes), maximum: 23.28 GiB. я увеличил в настройках лимит памяти до 25 ГБ

интересно AggregatingMT выигрывает всего лишь секунду у обычного MT на 600 mln записей, можно как-то его ускорить?

агрегация идет по 128 байтной строке, агрегируется наверное процентов 5 данных, остальные уникальны

Если я заменю его на UInt32 (или 64) это будет быстрее работать?

Vladimir
22.08.2018
02:41:09
попробовать? ?

Alexey
22.08.2018
02:44:15
попробовать? ?
Само собой, просто интересны бест практис оптимизации

Vladimir
22.08.2018
02:45:49
Поделитесь результатами. У меня аггрегация по хешу от строки в 64 байта не давала ничего, вроде бы

Michal
22.08.2018
03:49:17
Само собой, просто интересны бест практис оптимизации
Группировка по хэшу будет быстрее, будет нужно меньше памяти, но могут быть коллизии. Если group by вылетает по памяти значит скорее всего не включена группировка с использованием диска. Про best practices и нехватках памяти при group by есть хорошая презентация Алексея Миловидова.

Google
Michal
22.08.2018
03:54:10
Вопрос: для populate MV вы делаете group by по тем же колонкам, которые являются PK в вашем AggregatingMergeTree? Если да - то просто не надо делать один огромный group by при populate, а разбить его на несколько insert ... select. Если нет - то скорее всего ваш MV будет заполняться неправильно.

Michal
22.08.2018
04:08:33
Точно нельзя ему как-то сказать "не надо мёржить, если прошло меньше xx минут со вставки"?
Это лишено смысла. Как я уже писал выше - КХ не может эффективно работать при огромном количестве партиций/фрагментов. Т.е. если ему запретить merge то просто сделается много очень мелких кусочков, потом КХ начнет потихоньку "сходить с ума" из-за количества активных кусочков, и потом уже не сможет их перемерджить.

Другими словами - если решение задачи подразумевает создание десятков тысяч партиций в КХ, то это решение нормально работать не будет. Точка.

Александр
22.08.2018
05:06:20
Другими словами - если решение задачи подразумевает создание десятков тысяч партиций в КХ, то это решение нормально работать не будет. Точка.
Много партиций использовать можно, если по ним по всем не запускать запрос. Например если даже десять тысяч партиций и запрос только по двум, то вполне себе все будет работать. Если запрос будет по всем данным, то вот тут уже будет проблемка.

Michal
22.08.2018
05:28:10
Много партиций использовать можно, если по ним по всем не запускать запрос. Например если даже десять тысяч партиций и запрос только по двум, то вполне себе все будет работать. Если запрос будет по всем данным, то вот тут уже будет проблемка.
кх всё равно читает индексы для всех (читай: запуск сервера будет длится дооолго) и держит их в памяти. Фоновые мерджи всё равно периодически будут проходить по всему списку активных частей в поисках тех которые необходимо смерджовать и т.п.

Короче черезчур много частей = плохо.

Alexey
22.08.2018
05:43:27
Я несколько раз слышал краем уха, что КХ делает автоматический дедуп и является exactly-once решением на запись, но я не совсем понимаю контекст. Означает ли это что если я послал INSERT с миллионом строк и соединение оборвалось то я могу его еще раз послать, и, если в прошлый раз все уже вставилось, то второй раз ничего не вставится? Могу ли я вставить одну и ту же строку два раза и получить на выходе всего одну строку например в МТ, или как-то сделать чтоб в SummingMT счетчик не инкрементился для дупликатов?

Александр
22.08.2018
05:57:24
Что бы не было дублей именно строк, то можно использовать CollapsingMergeTree

Александр
22.08.2018
06:01:18
В ReplicatedMergeTree

Тригер на вторую пачку не сработает, т.к. КХ ее скипнет

Alexey
22.08.2018
06:04:29
В ReplicatedMergeTree
понял, интересно, то есть проверяется уникальность именно набора всех данных, ну и, наверное, когда я второй раз вставляю те же 100 строк, они должны идти в том же порядке, чтоб скипнулись? Но, правильно я понимаю, что я могу вставлять не в режиме master-master, а даже всегда на первичную реплику, чтоб вторая порция данных скипалась?

Oleg
22.08.2018
06:12:40
все верно, это в zoo хранится потому что

master-master репликации кстати нет в ch

Google
Александр
22.08.2018
06:13:21
Асинхронная master-master репликация

Oleg
22.08.2018
06:13:28
ой все, ок

Александр
22.08.2018
06:13:32
master-slave вы имели ввиду

Alexey
22.08.2018
06:14:21
Да, данные в дубле должны быть идентичны и в таком же порядке
Спасибо, это хорошая новость, буду тестить

Kirill
22.08.2018
06:50:15
master-master репликации кстати нет в ch
У КХ и мастеров нет как таковых )

Александр
22.08.2018
06:54:40
У КХ и мастеров нет как таковых )
Под мастером подразумевается возможность записи в реплику. Т.е. по факту писать можно в любую реплику и данные расползутся, а так да, у них нет никаких элекшенов вроде на мастера и пр.

Kirill
22.08.2018
06:57:14
Привет! Экспериментирую тут с кастомным PARTITION BY ключом в обычном MergeTree. Хочу партишнинг по (дата, группа), где группа - это 1000 числовых значений (можно считать, что это client_id mod 1000). Задача в том, чтобы эффективно использовать 1ТБ диск, удаляя слишком большие группы чаще, чем маленькие. То есть если в группе записей на 1МБ, она может жить и год (365 партиций для неё), а если 300ГБ, то, скажем, один или два дня только. Данные поступают из 10-15 источников, почти отсортироваными по группам и времени, но в кажом источнике есть почти все группы. Каждый источник вствляет по 50-100МБ за раз раз в 20-30 секунд. Раз в несколько минут бывают маленькие вставки в несколько мегабайт или даже меньше. Проблема на дефолтном конфиге - Too many parts. Если увеличить max_replicated_merges_in_queue, то всё какое-то время работает, но старые неактивные партиции не успевают удалятся и на файловой системе через какое-то время кончаются inodes. Если взять ФС без inodes, всё равно всё будет плохо ибо новые parts всё равно появляются быстрее, чем удаляются старые (пробовал также разные разные значения *_lifteme). А уж если перезагрузить сервер, кликхаус не запустится примено никогда (Loading parts...). Буферные таблицы не помогают, хотя сильно с ними не экспериментировал. Такое ощущение, что нужно разрешить кликхаусу не мёржить parts как можно дольше - типа делать это только раз в час или около того. Решение, которое сейчас приодит в голову - сделать две таблицы, одну с партицированием только по времени (типа каждый час, без группы), а другую - по дате и группе. Ну, и рукаи брать всё, что из предыдущего часа и раньше, INSERT ... SELECT * FROM partitioned_by_time ORDER BY time, mod_group и предыдущие партиции из такой псевдо-буферной таблицы удалять. Но выглядит как страшный костыль и могу представить слишком много мест, где это может поломаться. Может есть какие-то ещё параметры, которые стоит попробовать подкрутить под этот юзкейс?
Вы тут себе в ногу прострелить хотите, попробуйте просто сделать партиции по дате, причем не по дню, а, например, неделе или как дефолт месяцу, и, возможно, просто сжатие все порешает за вас, если очень сильно хочется то и дефолтное lz4 поменяйте на zstd (https://clickhouse.yandex/docs/ru/single/#compression). Если как советовали ниже использовать движок Merge то при наличии "меленьких" и "больших" таблиц под ней будут неэффективно расходоваться ресурсы (по дефолту N потоков на запрос и часть завершиться быстро, а часть будет разгребать ваши "большие" таблицы). Еще сделайте буфер перед вставкой и, возможно, все взлетит и так;)

Точно нельзя ему как-то сказать "не надо мёржить, если прошло меньше xx минут со вставки"?
Можно размеры кусков мин/макс покрутить, но у вас накопиться их много и все встанет колом

Под мастером подразумевается возможность записи в реплику. Т.е. по факту писать можно в любую реплику и данные расползутся, а так да, у них нет никаких элекшенов вроде на мастера и пр.
Там есть элекшен, но он на каждую реплику (реплика это процесс над таблицей Replicated*) и он нужен только для того чтоб назначать задания на мержи (для того чтоб куски на разных серверах были одинаковые).

Konstantin
22.08.2018
07:06:10
Можно размеры кусков мин/макс покрутить, но у вас накопиться их много и все встанет колом
Как? Мне при таком раскладе проще периодически вызывать OPTIMIZE ... FINAL, чтобы партиций оставалось порядка 20к (при таком количестве время запуска приемлемое)

Alexey
22.08.2018
07:11:08
master-master репликации кстати нет в ch
Как это нет. Разве клик хаус не может работать в мультимастер кластере ?

Michal
22.08.2018
07:22:58
Как? Мне при таком раскладе проще периодически вызывать OPTIMIZE ... FINAL, чтобы партиций оставалось порядка 20к (при таком количестве время запуска приемлемое)
Мне по прежнему кажется что постановка задачи неверна. "Хочу партишнинг по (дата, группа), где группа - это 1000 числовых значений" "Задача в том, чтобы эффективно использовать 1ТБ диск," "Ожидаемое количество партиций - 20_000. Большинство из них никогда не будут задействованы ни в одном запросе." "eсть группы, которые за два дня в одиночку заполнят весь диск" "То есть если в группе записей на 1МБ, она может жить и год (365 партиций для неё), а если 300ГБ, то, скажем, один или два дня только." "некоторые группы за год могут всего 2гб набрать" Даже если только 10% групп будет храниться год, то у вас получится 100 * 365 = 36500 партиций. Если у вас есть группы которые "за 2 дня заполнят весь диск" то даже если вы будете хранить всего один день - то у вас половина диска будет постоянно занята. Пересмотрите задачу. Надо или диски увеличить, или политику хранения данных ясно обозначить (без "магического" удаления того что занимает "слишком много").

Если для вас допустимо удаление данных на следующий день после их получения, то почему тут же рядом лежат данные которые нужно хранить год?

Возможно вам нужно что-то типа прореживания (как в GraphiteMergeTree) и/или агрегации

Oleg
22.08.2018
07:26:50
Как это нет. Разве клик хаус не может работать в мультимастер кластере ?
да, это я ошибся. Однако все равно есть 1 leader который принимает решения когда мержи делать )

Konstantin
22.08.2018
07:27:57
Не понимаю, в чём проблема. Да, всё описанное выше - верно. Да, добавление дисков и масштабирование возможны, как только оно станет оправдываться финансово, пока - нет.

Alexey
22.08.2018
07:28:30
Oleg
22.08.2018
07:29:15
Так лидер то не клик хаус, а зукипер. Или я не прав ?
ну у zoo тоже есть лидер, только для других целей

Konstantin
22.08.2018
07:29:25
Кстати, ничего магического в удалении нет, по крайней мере что-то вроде logrotate для обычных файлов с тем же содержимым у нас настроено.

Google
Alexey
22.08.2018
07:29:59
Не знал что в клик Хаус тоже есть понятие лидера и фоловера

Спасибо за информацию)

Yuriy
22.08.2018
07:31:54
У нас задача плюс-минус похожа: метрики летят по стопицот штук в день, через три месяца мы будем их сворачивать, уменьшая у них точность: 60 минутных в одну часовую с суммированием всех цикверок. Я пока не делал этого (три месяца еще есть же! ха!), но смотрю в сторону сбора метрик в таблицу типа NULL, на которую натравлены несколько materialized view: метрики минутные, часовые, дневные, погруппированы в вьюхах по месяцам или как-то так. Чтобы онии и сворачивались автоматически, и можно было легко удалить старые метрики.

не знаю как будет работать такая схема, но выглядит так, как будто неплохо.

Michal
22.08.2018
07:32:19
Не понимаю, в чём проблема. Да, всё описанное выше - верно. Да, добавление дисков и масштабирование возможны, как только оно станет оправдываться финансово, пока - нет.
Давайте так. Залейте 1 день данных без партиционирования по клиентам. Посчитайте сколько это заняло места. Если это заняло половину диска (такой вывод можно сделать из того что вы писали выше) то дальше обсуждать нечего, т.к. второй день писать уже некуда без удаления данных в первом.

Yuriy
22.08.2018
07:32:27
Но у кастомера тоже была задача: хранить все метрики, как можно детальнее, и вообще сделать идеальное решение для идеального мира

смена бизнес-требований под аргументациею почему чугунный утюг не взлетит творит чудеса, обычно.

ну а оптимиизировать терабайтный диск... Серьезно? Терабайт места стоит примерно ничего относительно общей стоимости инфраструктуры и стоимости зарполат разработчиков

Michal
22.08.2018
07:35:28
Если у вас места всего на 2 дня данных, при том что часть данных надо хранить год - это значит что в любые праздники / выходные ваши девопсы должны не спать потому что всё в любой момент развалится. Дежурство девопсов стоит явно дороже чем покупка нескольких дополнительных дисков.

Yuriy
22.08.2018
07:35:30
Мы когда скзаали, что волшебная магическая оптимизация хранения данных займет неделю времени двух человек и выйдет в $3000, мы потом поделиили эти 3000 на стоимость двухтерабайтного SSD и прикинули, что окупится это примерно... НИКОГДА

Konstantin
22.08.2018
07:36:13
А ALTER UPDATE существует? в каком состоянии?

Michal
22.08.2018
07:36:54
А ALTER UPDATE существует? в каком состоянии?
Существует. Относительно свежий фичер, но вполне работоспособный.

Там кстати есть ещё ALTER TABLE CLEAR COLUMN xxx IN PARTITION.

Konstantin
22.08.2018
07:38:11
И ещё - если я делаю Merge или Distributed (только с локальными партициями, на локальной машине) - будут ли условия в WHERE и PREWHERE в запросах ограничивать количество считываемых данных в подтаблицах?

Саша
22.08.2018
07:39:23
добрый день, коллеги а чем лечить варнинги stats.redirect_stat (StorageReplicatedMergeTree): DB::Exception: No active replica has part 20180725_20180725_0_0_0 or covering part ?

Konstantin
22.08.2018
07:39:47
Или, например, если я отказываюсь от партицирования по группам, могу ли я всё равно эффективно делать запросы типа WHERE mod_group = X? Или это будет считывание всего в задетых партициях?

Konstantin
22.08.2018
07:41:45
А где в этом синтаксисе PrimaryKey? https://clickhouse.yandex/docs/en/operations/table_engines/custom_partitioning_key/

Google
Konstantin
22.08.2018
07:47:00
А может ли ALTER UPDATE затрагивать колонку, по которой происходит партицирование? Что если я сделаю какую-то хитрую колонку в основной таблице (вместо DAYLY, WEEKLY и пр) и буду записывать в неё значение date (получая партицирование по дням), а потом - раз в сутки - делать ALTER UPDATE, вручую "по умному" раскидывая по партициям?

Oleg
22.08.2018
08:02:28
Привет! Подскажите, пожалуйста, какие есть возможности трансфера данных из хадупа в кликхаус? Я нашел вот такое: https://github.com/jaykelin/clickhouse-hdfs-loader Но выглядит странно. Есть вариант, конечно, через промежуточный сервер, через sqoop (тут только jdbc). Но это будет медленно, мне кажется. Мб есть что-то вроде гринпламовского gphdfs?

Yuriy
22.08.2018
08:10:25
@kshvakov ооо, а ALTER TABLE Reports CLEAR COLUMN EventTime хитро, очень хитро ?

Кстати, а большая это проблема перенести данные из одной таблицы в другую? Например, в какой-то момент я захочу изменить двидок таблицы (ПК поменять, например). Понятно, что я создам новую таблицу и буду переносить данные из старой. Но select insert делать на миллионах записей не круто же. Вроде бы я видел гдето в доках, что КХ может "натрввить" таблицу на уже существующие данные

Yuriy
22.08.2018
08:16:23
структура будет совпадать, но измениться, например, движок.

спасибо. Будем потом жкспериментировать

Kirill
22.08.2018
08:19:49
структура будет совпадать, но измениться, например, движок.
Тогда нет, не сработает перенос партиции

Yuriy
22.08.2018
08:20:45
@kshvakov а если движок останется прежним, но изменится поле сортировки и ПК в движке? Плюс появится еще параметр у движка по которому бить данные на партиции?

илии прям вообще всё идентичнодолжно быть?

Yuriy
22.08.2018
08:29:14
спасибо. Значит, опасаться за то, что сделали кривую схему (ну вдруг если прийдется внести изменения) не стоит

Daniel
22.08.2018
08:30:08
А я правильно понимаю, что если удаляю партицию за определённую дату из таблицы (всё по умолчанию), удалятся только те данные, которые имеют отношение к месяцу удаляемой партиции? И таблица не повредится?

Mike
22.08.2018
08:43:54
Коллеги, добрый день, опять я со словарями из postgresql :) На тесте обновили версию до 18.10.3 - сервер теперь запускается, но словарь не подгружается с ошибкой https://pastebin.com/2zMAkAyE (т.е. кх игнорируя все параметры хочет локально законнектиться?) isql DSN работает без проблем. в connection_string указан нужный dsn. Куда еще посмотреть?

Mike
22.08.2018
08:54:12
запости odbc.ini что касаемо ПГ?
https://pastebin.com/9iaG79Ac все 9.6. isql с этим dsn работает

Viktor
22.08.2018
09:33:28
Доброго дня

Страница 630 из 723