184 похожих чатов

Всем салют! Дано: Aerospike cluster(7 nodes) с ~1B записией. Каждая запись

имеет следующуюю структуру:
PK Bin1 Bin2 Bin3 Bin4
----------------------------------------------------------------------------------------------------
uuid {ts: ...., uuid: "..."} {ts: ...., uuid: "..."} {ts: ...., uuid: "..."} {ts: ...., uuid: "..."}
Фактически, это отображение некоторого идентификатора в нашей системе на аналогичный идентификатор в другой системе.
Bin1, Bin2 ... BinN это индентификатор систем с которым ми работает.
Каждый PK может иметь от 1 до N отображений.

Проблема:
Возникла необходимость получить различного рода статистику по данным из aerospike, например:
1. сколько уникальных идентификаторов у нас есть для BinX
2. Сколько записей имеют BinA и BinB одновременно и сколько уникальных идентификаторов имеет BinA, BinB
4. Сколько уникальных идентификаторов было добавлено за определенный день и тд
3. Нужно также делать выгрузку из aerospike данных в произвольном формате

Чтобы ответить на все эти вопросы приходится писать свои пользовательские скрипты используя sdk. Осложняется все тем, что у нас не Aerospike Enterprise и поэтому некоторая функциональность просто недоступна, например, OPERATOR.

Вообщем, хотим попробовать сделать выгрузку из Aerospike в Clickhouse и на нем уже делать аналитику.
Предварительно схема будет такой:
PK String
Bin1Id String
Bin1TsYear Int
Bin1TsDay Int
Bin1TsHour Int
Bin1Uuid
...
BinNId String
BinNTsYear Int
BinNTsDay Int
BinNTsHour Int
BinNUuid
т.е. заранее создать N колонок в CH для каждого Bin и просто не заполнять те, для которых нет данных для конкретного PK


Нашел на GitHub issue Aerospike as dictionary source/layout, но к сожалению, ее закрыли из-за low demand.
Вопросы:
1. Насколько такая схема CH оправдана?
2. Насколько CH подойдет для таких задач где 1B уникальных значений?
3. Как лучше/эффективнее сделать partition key/sort key?
4. Был ли у кого-нибудь подобные задачи? Поделитесь плз свои опытом.
5. Как вообще организовать обновление/удаление записей, так как PK обновляются время от времени: могу обновляться uuid для конкретного bin, могут добавлять/удаляться bins. Здесь есть идеи использовать ttl по записят в CH, тогда можно примерно подсчитать сколько осталось жить записи в Aerospike и поставить нужное значение ttl при записи, тогда CH сам удалить старые записи... Но это решит только проблему удаления

4 ответов

12 просмотров

1. Сложно понять, по входным данным какие именно вам запросы нужны и как будут растекаться данные по столбцам. 2. Кликхаус подойдёт, но в любом случае должны быть какие то столбцы с категориями, чтобы можно сделать ORDER BY и Primary Key 3. Обычно partition key делают по времени месяц/неделя/день всё зависит от количество данных приходящих в день . ORDER BY лучше делать на основе, что используются в главных запросах к таблицам и вносить это 4. Не знаю, впервые за 6 месяцев вижу что то подобное в чатике 5. Есть движок таблицы VersionedCollapsingMergeTree

freeman-Freeman Автор вопроса
Константин
1. Сложно понять, по входным данным какие именно в...

1. Да, я и сам точно пока что не понимаю, т.к. буквально три запроса от заказчика поступило на подобие тех что перечислены в примерах. Но я точно знаю, что кол-во таких запросов на получение какой-то статиситики по данных в Aerospike будет расти и чтобы сэкономить время, - т.к. сейчас приходится постоянно все на коленке реализовывавть в виде самописных etl, - хочется сделать более мене нормальное решение которое позволит делать это в привычной форме. 2. Угу, буду еще думать что лучше выделить под primary/ order by 3. "всё зависит от количество данных приходящих в день" можно подробнее? какие вообще рекомендации на этот счет? 5. дзякуй, будем посмотреть

freeman Freeman
1. Да, я и сам точно пока что не понимаю, т.к. бук...

3. Первое надо зайти сюда, понять как хранятся данные и что такое парты, партиции, гранулы https://clickhouse.com/docs/ru/engines/table-engines/mergetree-family/mergetree/ . Дальше каждый парт максимально может вмещать в себя 100 Гигабайт ифнормации (парт часть партиции для чтения). Так же кликхаус читает по умолчанию в 8 потоков с дисков информацию. Чем больше парты тем хуже (я думаю так, потому что сложней производить слияние партов, обращения к большим партов)

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

Похожие вопросы

Обсуждают сегодня

А чем вам питонисты не угодили?😂
.
79
Язык Си можно выучить за день? По книжке ANSI C на 230 страниц
Vincent Vegan
29
Привет, запускаю werf в dind в k8s, получаю ошибку на этапе build/beforeSetup: /.werf/stapel/embedded/bin/bash: /.werf/scripts/5898bdfe5214357d3706b879cc8d3d78460fb379607cbd...
florius0
7
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
17
Dim Dim, [02.07.2024 11:07] DB 0x62 Dim Dim, [02.07.2024 11:07] DB 0x66 Dim Dim, [02.07.2024 11:07] кто пояснит что это?
Dim Dim
14
Ошибка: segmentation fault (core dumped) Код: pastebin.com/BEsNNSSV Сообщение от компилятора: отсутствует ОС: Arch Linux Ядро: x86_64 Linux 6.9.7-arch1-1 Процессор: Intel Cele...
sec
4
Ещё такой вопрос. Мне необходимо хранить пароль пользователя локально. Для этого планирую использовать ini файл. Это для автозаполнения полей логин и пароль при авторизации. Е...
Евгений
19
Ребят, а за скок можно впарить анон чат с апишкой и веб админкой ?
Eugene Неелов
15
Кстати, я тут еще с одной темой столкнулся, вот учу я C++, на таком то ресурсе, а остальные постоянно советуют практиковаться, что то писать, проекты, но как писать если вот т...
aaswq1
7
Карта сайта