
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
с такой же ошибкой
↘️ 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 есть хорошая презентация Алексея Миловидова.

Alexey
22.08.2018
03:53:38

Google

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

Alexey
22.08.2018
03:54:48

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

Александр
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
Я несколько раз слышал краем уха, что КХ делает автоматический дедуп и является exactly-once решением на запись, но я не совсем понимаю контекст. Означает ли это что если я послал INSERT с миллионом строк и соединение оборвалось то я могу его еще раз послать, и, если в прошлый раз все уже вставилось, то второй раз ничего не вставится? Могу ли я вставить одну и ту же строку два раза и получить на выходе всего одну строку например в МТ, или как-то сделать чтоб в SummingMT счетчик не инкрементился для дупликатов?
Во-первых это работает только с реплицируемыми таблицами, во-вторых это работает с одинаковыми блоками данных. Например вы делаете два инсерта по 100 одинаковых строк, то будет всего 100 строк, а не 200. А вот если первый раз вы вставили 100, а потом эти же 100 + 1 строку, то будет дубль.
Что бы не было дублей именно строк, то можно использовать CollapsingMergeTree

Alexey
22.08.2018
06:00:50

Александр
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

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

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

Александр
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 потоков на запрос и часть завершиться быстро, а часть будет разгребать ваши "большие" таблицы). Еще сделайте буфер перед вставкой и, возможно, все взлетит и так;)


Konstantin
22.08.2018
07:06:10
Вы тут себе в ногу прострелить хотите, попробуйте просто сделать партиции по дате, причем не по дню, а, например, неделе или как дефолт месяцу, и, возможно, просто сжатие все порешает за вас, если очень сильно хочется то и дефолтное lz4 поменяйте на zstd (https://clickhouse.yandex/docs/ru/single/#compression). Если как советовали ниже использовать движок Merge то при наличии "меленьких" и "больших" таблиц под ней будут неэффективно расходоваться ресурсы (по дефолту N потоков на запрос и часть завершиться быстро, а часть будет разгребать ваши "большие" таблицы). Еще сделайте буфер перед вставкой и, возможно, все взлетит и так;)
Есть группы, которые за два дня в одиночку заполнят весь диск, отсюда желание работать с суточными патрициями.


Alexey
22.08.2018
07:11:08


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

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

Alexey
22.08.2018
07:28:30

Oleg
22.08.2018
07:29:15

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

Yuriy
22.08.2018
07:32:27
Но у кастомера тоже была задача: хранить все метрики, как можно детальнее, и вообще сделать идеальное решение для идеального мира
смена бизнес-требований под аргументациею почему чугунный утюг не взлетит творит чудеса, обычно.
ну а оптимиизировать терабайтный диск... Серьезно? Терабайт места стоит примерно ничего относительно общей стоимости инфраструктуры и стоимости зарполат разработчиков

Konstantin
22.08.2018
07:35:28

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 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? Или это будет считывание всего в задетых партициях?

Michal
22.08.2018
07:40:23

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

Google

Michal
22.08.2018
07:42:13

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?

Kirill
22.08.2018
08:08:24


Yuriy
22.08.2018
08:10:25
@kshvakov ооо, а ALTER TABLE Reports CLEAR COLUMN EventTime хитро, очень хитро ?
Кстати, а большая это проблема перенести данные из одной таблицы в другую? Например, в какой-то момент я захочу изменить двидок таблицы (ПК поменять, например). Понятно, что я создам новую таблицу и буду переносить данные из старой. Но select insert делать на миллионах записей не круто же. Вроде бы я видел гдето в доках, что КХ может "натрввить" таблицу на уже существующие данные

Kirill
22.08.2018
08:15:37

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

Kirill
22.08.2018
08:19:49

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

Kirill
22.08.2018
08:25:44

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

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

Kirill
22.08.2018
08:36:01

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

Evgeny
22.08.2018
08:47:39
у меня проблем нет с ПГ на этой версии КХ
какая версия ПГ драйвера?

Mike
22.08.2018
08:54:12

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