Русский
Русский
English
Статистика
Реклама

Redshift

One Tool to Analyze Them All

07.12.2020 12:09:16 | Автор: admin
Мы рады сообщить о реализации на explain.tensor.ru базовой поддержки анализа и визуализации планов, специфичных для PostgreSQL-совместимых решений: Timescale, Citus, Greenplum и Redshift.


Так что если в будущем вам встретится план, похожий на результат обычного EXPLAIN, но с некоторыми странными узлами вы знаете, куда идти.

EXPLAIN <-> SQL


В развитие темы сопоставления узлов плана и запроса добавлена возможность быстрого просмотра и переключения между ними:



Поддерживается определение узлов [Parallel] Custom Scan (ChunkAppend):




Собственное время Task-узлов, выполняющихся на отдельных нодах кластера, определяется на основании фактического Execution Time:



Время родителя Custom Scan (Citus Adaptive) вычисляется корректно, даже в случае одновременного выполнения Task сразу на нескольких узлах кластера:


Подробнее об анализе EXPLAIN в Citus.


Поддерживаются специфичные узлы вроде Broadcast Motion, Redistribute Motion, Gather Motion, Partition Selector, Sequence:


Подробнее об анализе EXPLAIN в Greenplum.


Поддерживается работа со всеми XN-узлами, включая специфичные XN Network, XN Merge, XN Window и data redistribution у Join-узлов:



Подробнее об анализе EXPLAIN в Redshift.



Если вдруг вы нашли что-то, что мы пока не учли напишите в комментариях.
Подробнее..

Молекулярная биология. Houdini. NVIDIA 3080. Коронавирус vs иммуноглобулины

01.05.2021 14:19:19 | Автор: admin

Ссылка на наш ролик

Это мой второй текст на Хабре. Он плавно вырос из первой статьи Молекулярная биология и Houdini летом двадцатого.

Мы закончили наш новый (второй) ролик 12 апреля 2021 года, в День космонавтики. Дата получилась случайной я очень хотел закончить работу в понедельник. Но это оказалось идеальное совпадение.

Поехали!

Вот приблизительный диалог, который состоялся у нас с Валерией (молекулярный биолог) на старте проекта:

А давайте сделаем английскую озвучку к нашему ролику про иммуноглобулин?

А давайте.

И заменим ротавирус на коронавирус. Они же очень похожи.

Да.

Часть сцен нам даже не нужно будет переделывать.

Да.

И перейдём с CPU-рендера на GPU. Откажемся от Blender в пользу DaVinci Resolve. Тайминг у нас останется тот же одна минута. Звук и вирус. Думаю, за пару месяцев мы всё закончим.

Ага, наверное.

Мы делали ролик 5 (пять) месяцев. Я мог работать по 2 часа в день с 12 до 2 ночи и не каждый день. Длительность ролика увеличилась в 3.5 раза. Увеличение сложности проекта (по сравнению с первым нашим роликом) моим внутренним ОщущаторомСложности оценивается, как шестикратная.

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

За разных людей у нас был я.

Какие это фрагменты? Сториборд. Переход с Mantra (внутренний CPU-рендер Houdini) на RedShift (GPU-рендер, приобретается отдельно). Решение задачек средствами Houdini (обожаю эту часть). Рендер. Цветовое решение. Озвучка. Музыка и звуки. Монтаж в Resolve (к счастью, есть free-версия).

Я разобью повествование на разрозненные части. Хотя это, на самом деле, конечно, суп где всё влияет на всё. И мы постоянно перемещались от одного к другому, постепенно меняясь.

Закадровый голос влияет на монтаж. Внутренний ритм монтажа влияет на контекст озвучки. В одном месте цвет мембраны розовый. В другом серый. Почему? Как сделать, чтобы этот переход был понятен? И так далее...

Раскадровка (сториборд)

Мы сделали раскадровку. В неё попали ключевые сцены, которые нужно показать обязательно. Это сам коронавирус. Способ его проникновения в клетку. И крупно клетки, облепленные множеством вирусов. Всё остальное мы хотели взять из первого ролика.

Здесь нет цвета, эстетики, музыки и текста. Это больше про работу ума и логику. Не сложная задача, которую мы довольно быстро сделали, тем более что больше половины этого материала мы делали раньше.

Сториборд. Вирус прикрепляется к клеточному рецептору АСЕ2.Сториборд. Вирус прикрепляется к клеточному рецептору АСЕ2.Сториборд. Серые круги клетки. Чёрные вирусы. Белые иммуноглобулины или антитела.Сториборд. Серые круги клетки. Чёрные вирусы. Белые иммуноглобулины или антитела.

Работа

Я за лёгкость. За юмор. За улыбку. Поэтому мне очень симпатичны Фейнман, Сапольски и Северинов. Одновременно с этим я понимаю, что я не могу с хохотом заниматься молекулярной биологией потому что я некомпетентен в этом (в молекулярной биологии). Для этого я делегирую ответственность в принятии решений молекулярному биологу. Я также не компетентен в английском. Тогда появляется переводчик. И каждый из них принимает решение в своей зоне ответственности. Я лишь собираю из этого всего пазл. Не вмешиваясь. В моей вселенной командная работа движется в сторону, где роль руководителя стремится к 0.

Мы хотим делать и научно достоверные и красивые работы. Чтобы школьнику, студентке, взрослому было интересно. Поэтому за научную достоверность у нас молекулярный биолог Валерия Архипова. И большинство частей вируса и клеток это всамделишные атомарные запчасти, полученные с сайта www.rcsb.org.

Мы пошли по пути создания релиза целого ролика и постепенного (слой за слоем) его улучшения. Всего было сделано 5 релизов и 6 финальный. Первый имел длину полторы минуты. Последний три с половиной.

Вот, как выглядит одна и та же сцена в разных релизах:

Одна сцена в разных релизах.Одна сцена в разных релизах.

Первый релиз сделан на демоверсии RedShift. Это видно по ватермаркам. Увидев достоинства от перехода на GPU-рендер, я купил лицензию.

Но постойте! А как, почему длительность ролика увеличилась с одной минуты до трёх с половиной?! Был же сториборд. Где все ключевые сцены утверждены.

Я неслучайно написал, что в сториборде (моём) нет музыки, озвучки и эстетики. И когда я собрал модель вируса, да ещё и на атомарном уровне, то мне захотелось всё это показать поближе, порассматривать.

Или эпительная клетка, облепленная вирусами, как огромный захваченный пиратами космический корабль. Она тоже просила уделить ей внимание.

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

RedShift

Считать картинки можно на процессоре, как это делал я в первом ролике. А можно на видеокарте. По тестам разница в скорости 5-10 раз не в пользу процессора. Какие очевидные плюсы и минусы от перехода на GPU-рендер? Ну, думал я, из очевидных плюсов, во-первых, скорость. Во-вторых, скорость. Из минусов? Память. У видеокарты её сильно меньше, чем общей памяти. Но ведь у меня очень простые сцены! Даже текстур нет.

И я попробовал.

На моей новёхонькой 3080 в демоверсии RedShift кадр в 2к с драфтовыми настройками считался секунд 5. Это было удивительно! Mantra, славящаяся своей неторопливостью, справляется секунд за 30 (на 16 ядрах, между прочим). Конечно, я тут же перешёл на этот рендер! И с самого начала проекта второй ролик делался уже в RedShift.

Почему Redshift? Выбор был между Octane, Vray и Arnold. От Vray я отказался сразу. Я работал с этим рендером в 3dsmax и мне не нравится обилие настроек и хаотичность результата. Arnold в тестах показывал результаты сравнимые с Мантрой и меня отпугнул факт, что этот рендер выкупила компания Autodesk. Octane показался мне очень сырым. RedShift самый часто используемый рендер в моушн графике. По нему много туторов и развито сообщество. Наконец, сама компания Maxon, которая приобрела RedShift, мне очень симпатична.

Я, к сожалению, не вёл дневник в процессе работы, как это делал, например, Фёдор Овчинников, когда создавал книжные магазины, а потом придумал сделать Додо-пиццу. Поэтому могу вспомнить только ретроспективно.

У RedShift свои материалы, свет. И свои алгоритмы работы с instance и частицами. Со всеми граблями и айсбергами я знакомился в процессе работы.

Модель вируса или мембраны это, по сути, множество атомов. Или шариков. Есть два способа эти шарики получить. Буквально нарисовать сферу нужного диаметра и порендерить её. Или работать с частицами. Тогда на экране мы видим множество точек, а вот на рендере вместо них появляются сферы. Оп!

В случае работы с частицами мы получаем массу преимуществ. Вьюпорт не тормозит. Не нужно следить за детальностью сферы ближний и дальний план отрабатываются на рендере. Объект ничего не весит. Он буквально состоит из координат точек и всё. А значит подготовка к рендеру занимает меньше времени. Жмём рендер!

RedShift. Шейдер одинаковый. Слева частицы. Справа сферы. WTF?RedShift. Шейдер одинаковый. Слева частицы. Справа сферы. WTF?

Эээ но подождите! Почему они разных цветов?! И что это за чёрные швы в местах, где сферы пересекаются? Для швов я нашёл решение. Они убираются за счёт операции булеан. Оп! Через две минуты boolean посчитался и чёрные швы исчезли. Можно рендерить! Секундочку! Но ведь весь рендер занимает 5 секунд. А булеан 2 минуты. Да. Но ведь работает. Нет. Спасибо, но нет.

Я так и не смог решить задачу с разницей в отрисовке одинакового шейдера для частиц и сфер. В общей сложности я пытался решить эту задачку один месяц. В итоге я прекратил все попытки и отказался от сфер. Возможно, пост на форуме рендера помог бы, но я ограничился помощью русскоязычного сообщества до кого мог дотянуться.

Очень часто в сцене используются одинаковые части. Скажем, шипы у вируса. Это же, по сути, один шип, который рандомно развёрнут и расставлен по сферической мембране. И если мы так сделаем, то в этом случае мы получаем экономию по памяти на рендере и шустрый вьюпорт. Для этого у нас есть instance-объекты. Правильно? Логично?

Я тоже так думал. И у меня ушёл ещё один месяц на злость, смирение, слёзы и принятие другой реальности.

В RedShift (у меня) инстансные объекты из частиц/сфер рендерятся вот так:

RedShift. Слева без инстанс объектов. Справа с instance-объектами (сферы или частицы).RedShift. Слева без инстанс объектов. Справа с instance-объектами (сферы или частицы).

Видите? Свет. Слева он ровный и заполняющий. А справа он у каждого объекта свой и рандомно повёрнут. Хотя условия освещения в сцене одинаковые. Я не смог решить эту проблему. Кроме как отказаться от instance-объектов и упаковки. А учитывая, что атомов в сцене миллионы, то от сфер пришлось отказаться в пользу частиц. Памяти видеокарты (10Гб) не хватало. К слову, оперативной (64Гб) при таком подходе не хватало тоже.

NVIDIA 3080 и RedShift. В умелых руках и 10Гб мало. Не instance-геометрия крашит рендер.NVIDIA 3080 и RedShift. В умелых руках и 10Гб мало. Не instance-геометрия крашит рендер.

Уже после проекта мы обсудили эту особенность со Стасом Рыхликовым и он предположил, что дело в нежности объектов, которые мы копируем. О чём речь? Нужно убрать все ноды трансформаций и все другие ноды и тогда, возможно, всё будет хорошо.

К этому нужно добавить ещё одну особенность рендера на видеокарте. В случае с процессором я мог выделить нужные мне ядра, поставить приоритет и делать какие-то дела параллельно. Скажем, одновременно с рендером можно открыть вторую копию Houdini и решать там технические задачи.

При рендере на видеокарте так не получится. Рендер крашится. Или замедляется. Что, если подумать, логично. Но неприятно, да.

У меня не было цветового решения объектов. Я выкрашивал вирус в цвет окисленной меди (бирюзовый) и смотрел. Красиво? Красиво. А остальные объекты в какой цвет красить будем? И нужна цветовая гармония, настроение. Я остановился вот на такой палитре.

Цветовая палитра ролика.Цветовая палитра ролика.

И я нашёл решение, которое мне очень нравится. В жизни объекты, которые мы видим в ролике, настолько малы. что они меньше длины световой волны. Поэтому они не окрашиваются в цвета. Они чёрно-белые. Исключение составляет клетка. Она достаточно большая и уже может окрашиваться. Фотографии микроскопии, которые мы видим, раскрашены вручную. Я люблю чёрно-белую фотографию. Она даёт пространство воображению. В том числе и поэтому почти все рендеры в ролике чёрно-белые. Раскрашивал я их на монтаже. И такой подход, конечно, даёт огромное пространство для цветового решения объектов.

Ниже финальные рендеры из проекта. В оригинале рендеры в 2к. Для уменьшения трафика размер картинок уменьшен до 1к.

NVIDIA 3080. Redshift. Финальный рендер 2к. Атомарная модель коронавируса. Время рендера до 3 минут.NVIDIA 3080. Redshift. Финальный рендер 2к. Атомарная модель коронавируса. Время рендера до 3 минут.NVIDIA 3080. Redshift. Финальный рендер 2к. Атомарная модель коронавируса. Время рендера до 4х минут.NVIDIA 3080. Redshift. Финальный рендер 2к. Атомарная модель коронавируса. Время рендера до 4х минут.NVIDIA 3080. Redshift. Финальный рендер 2к. Эпительная клетка облепленная экземплярами коронавируса(порядка.150 000). Время рендера до 2 минут.NVIDIA 3080. Redshift. Финальный рендер 2к. Эпительная клетка облепленная экземплярами коронавируса(порядка.150 000). Время рендера до 2 минут.NVIDIA 3080. Redshift. Финальный рендеры 2к. SSS + DOF + Motion Blur. 1-4 минуты на кадр. Виньетирование добавлено в постпродакшене.NVIDIA 3080. Redshift. Финальный рендеры 2к. SSS + DOF + Motion Blur. 1-4 минуты на кадр. Виньетирование добавлено в постпродакшене.

Я оценил мощь 3080 и RedShift, когда нужны были тесты, драфты, финальные рендеры и потом куча перерендеров. Дело не только в скорости. Фактически, финального качества ролик считался те же 7 дней. Только это уже был ролик не в одну минуту, а в три с половиной. Такая скорость позволяет перманентно находится внутри проекта. Не выпадать из него на время рендера. И это очень и очень ускоряет работу. Я сэкономил огромное количество времени на том, что тесты считались по 5 секунд кадр, а не 30. Кажется и то и то отлично. Только в первом случае для секвенции в 200 кадров (менее 10 секунд) я получал результат через 20 минут. А во втором почти через 2 часа. И в этом важнейшее отличие между процессором и видеокартой.

И не забываем о масштабируемости. У меня одна видеокарта. Если их будет больше, то скорость рендера падает линейно. А при подключении NVLink память у видеокарт (не более двух) становится общей это очень классный бонус!

Для меня возврат к рендеру на процессоре в схожих задачах он, ну, невозможен, наверное. Процессор апгрейдить уже некуда (16 ядер AMD 3950). А вот видеокарт мало не бывает.

Houdini

Я люблю Houdini. И люблю решать задачки. И технические задачи, в отличие от задач эстетических, могут решаться участниками одинаково. Скажем решение, уравнения вида x = 5 2 будет иметь одинаковый вид для любого участника процесса решения. Школьница, студент, мама и аспирант решат его одинаково. Более того, решение будет понятно и принято всеми.

А вот с эстетической задачей дела обстоят куда сложнее. Задача. Нарисуете бублик и покрасьте его. И для всех и каждого решение этой задачи будет различным. И, что удивительно, каждое решение будет верным. И тут вопрос кто у нас заказчик.

Поэтому решение технических задач мне нравится. А пиксельхантинг нет.

И я никогда не отгадал бы, какая самая сложная задача будет на этом проекте. Наверное, на попытку её решить у меня ушло месяца два. И я вижу, что ещё можно улучшить. И предполагаю, что знаю, как её можно решить по другому.

Клеточная мембрана. Вот как она выглядит на картинке из Википедии.

Википедия. Клеточная мембрана.Википедия. Клеточная мембрана.

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

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

Эндоцитоз. Способ проникновения вируса в клетку.Эндоцитоз. Способ проникновения вируса в клетку.

Давайте представим, что мы шариком тычем в тонкий лист картона. Картон, как не особо эластичная поверхность, порвётся. Но клетка не рвётся. Значит она эластичная. Хорошо. Заменим лист картона на что-то тягучее. Жвачку. Или слайм. Теперь наш шарик прекрасно входит и ничего не рвётся. Но погодите-ка. Ведь жвачка и слайм тянутся и в месте натяжения толщина вещества истончается. И, во-вторых, не происходит окутывания шарика. Эээ значит мембрана по свойству не плотное вещество, но и не тянется. И тут я словил инсайт. Мембрана жидкость! Именно этим объясняется её одинаковая плотность и не растяжимость. И теперь, если это жидкость, значит всегда и везде расстояние между фосполипидами одинаково. Жидкость не сжимаема.

И получается, что вирус растягивает мембрану, но одновременно с этим происходит её восполнение. Фосфолипиды как бы прибывают извне. Текут. И вот эту задачу растяжение, но с сохранением расстояния между фосфолипидами, мне и нужно было решить.

К этому прибавляется проблема свойственная 3d-анимаций фликинг или мерцание кадров. Это явление возникает, если у нас низкие настройки сглаживания рендера или меняется численность объектов. На статичной картинке этого эффекта, конечно, не видно.

Я решил обе эти задачи. Но появился, как я его называю, эффект лего. Ступеньки. От них можно избавиться, но тогда будет фликинг. Я выбрал ступеньки.

Возможно, что задачу можно решить динамикой, т.е. буквально симуляцией тонкой жидкостной плёнки. И да, когда я говорю, что решал эту задачу два месяца, то одновременно с этим я решал и массу других задач. Помните про суп?

Озвучка

В первом ролике мысль добавить диктора появилась, когда монтаж и чистовой рендер уже был закончен. Это очень сильно ограничивало гибкость и голос фактически писался под видео.

Поэтому в нашем втором ролике к работе со звуком я приступил задолго до финальной версии. Мы заранее приняли решение, что озвучка будет на английском. Рендеры считались в 960х540 в драфтовом качестве. И я держал в голове возможность отрезать или наращивать секвенции.

Я сделал четвертую версию ролика. Мы написали текст на английском для озвучки. Затем пригласили в команду переводчика - Александру.

Дальше молекулярный биолог и переводчик вместе работали над текстом. Я никак не участвовал и не вмешивался. Забрав конечный результат я отдал его на озвучку женщине-роботу. Параллельно я отправил запрос на озвучку живым нативным диктором. И ждал ответа по стоимости работ.

Когда женщина-робот озвучила текст я сел за монтаж. Видео и звук. О нет! Эти ребята совсем не хотели дружить. Даже мои возможности примирить их ускорением или замедлением секвенций не особо помогали. В озвученных предложениях появились многозначительные паузы или предложения наступали друг другу на ноги. Нужно всё перемонтировать. Я очень расстроился.

Пришёл ответ по стоимости участия живого диктора. 27000 рублей. Таких финансовых возможностей у меня не было. Я ещё немножко огорчился. Потом ещё. Пока увы совсем ничего не осталось.

Было решено оставить голос робота-женщины. И я приступил к новой версии монтажа.

DaVinchi Resolve

Монтаж и звук для первого ролика сделан в Blender. После этого опыта я возжелал сменить коня. А какие есть варианты? Чтобы под Windows. При этом композитинг и монтаж это разный софт.

  1. After Effects + Premiere Pro.

  2. Sony Vegas + ?

  3. Davinci Resolve + Fusion.

  4. Nuke + ?

Я выбрал Resolve. Во-первых, это бесплатно. У производителя есть фришная версия софта. В платной добавлена куча плагинов, которые мне не нужны. Fusion интегрирован с Resolve. Поэтому в одном софте можно делать и композитинг и монтаж. Необходимости перекидывать из одного софта в другой, как было бы во всех остальных вариантах нет. Fusion нодовая составляющая, что близко к концепции Houdini. Во-вторых, мне очень-очень понравился сам софт.

DaVinci Resolve. Вот, как выглядит четвёртая версия ролика. Проект мы закончили на шестой.DaVinci Resolve. Вот, как выглядит четвёртая версия ролика. Проект мы закончили на шестой.

Resolve прекрасно работает с exr. Очень быстро рендерит секвенции на таймлайне.

Вот пример раскрашенного рендера. Помните, я в части про RedShift рассказывал, что почти все рендеры чёрно-белые?

DaVinci Resolve. Коронавирус. Раскрашенный чёрно-белый рендер.DaVinci Resolve. Коронавирус. Раскрашенный чёрно-белый рендер.DaVinci Resolve. Коронавирус и поверхность клетки. Вирус прикрепляется к АСЕ2 рецептору.DaVinci Resolve. Коронавирус и поверхность клетки. Вирус прикрепляется к АСЕ2 рецептору.DaVinci Resolve. Эндоцитоз. Коронавирус попадает в клетку.DaVinci Resolve. Эндоцитоз. Коронавирус попадает в клетку.DaVinci Resolve. Иммуноглобулин IgG.DaVinci Resolve. Иммуноглобулин IgG.DaVinci Resolve. Иммуноглобулин IgG.DaVinci Resolve. Иммуноглобулин IgG.

Что дальше?

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

Я устал. Но это приятная усталость завершения. Без разрешения себе и другим ошибаться я устал бы ещё больше. И я вижу, что столь сложные и длительные (по таймингу) проекты требует большего участия, чем пара часов в день.

Я хотел добавить в название статьи фрактальность. Причём же здесь фрактальность? Ролик же про коронавирус и иммуноглобулин. Ну да. Но сколько можно?

Когда я решаю какую-либо задачу, то создаю некую модель реальности. Скажем мембрана клетки. Достаточно ли изобразить её ровной поверхностью, которую мы гнём? Достаточно. Но давайте приблизимся. И уже нужны фосфолипиды. Хорошо. А если мы захотим сделать сечение? Тогда нужно показать бислойность мембраны. А если добавить эндоцитоз? Тогда нужно сделать жидкую мембрану.

И вот это бесконечное погружение внутрь. Фрактальность. На следующем уровне абстракции понадобится подключение динамики Houdini. Чтобы фосфолипиды учитывали положение соседей и не протыкали друг друга. Погрузившись ещё глубже нам понадобится сторонний софт, занимающийся молекулярной динамикой: GROMACS, CHARMM, NAMD и другие. Копнув еще глубже, мы увидим, что атомы это, оказывается, совсем не шарики.

Мы очень сильно выросли на этом проекте. И видим куда расти дальше. И хотим этого.

P.S.

Если у вас есть задачи, в которых мы вместе можем достичь большего - напишите мне.

Пока я работал над статьёй закончился конкурс на Биомолекула. Мы участвовали с нашим первым роликом. И выиграл приз годовую подписку на OctaneRender.

Подробнее..

Теория и практика использования ClickHouse в реальных приложениях. Александр Зайцев

24.07.2020 10:04:54 | Автор: admin


Несмотря на то, что данных сейчас много почти везде, аналитические БД все еще довольно экзотичны. Их плохо знают и еще хуже умеют эффективно использовать. Многие продолжают "есть кактус" с MySQL или PostgreSQL, которые спроектированы под другие сценарии, мучиться с NoSQL или переплачивать за коммерческие решения. ClickHouse меняет правила игры и значительно снижает порог вхождения в мир аналитических DBMS.



Кто я такой и почему я рассказываю о ClickHouse? Я директор по разработке в компании LifeStreet, которая использует ClickHouse. Кроме того, я основатель Altinity. Это партнер Яндекса, который продвигает ClickHouse и помогает Яндексу сделать ClickHouse более успешным. Также готов делиться знаниями о ClickHouse.



И еще я не брат Пети Зайцева. Меня часто об этом спрашивают. Нет, мы не братья.



Всем известно, что ClickHouse:


  • Очень быстрый,
  • Очень удобный,
  • Используется в Яндексе.

Чуть менее известно, в каких компаниях и как он используется.



Я вам расскажу, для чего, где и как используется ClickHouse, кроме Яндекса.


Расскажу, как конкретные задачи решаются при помощи ClickHouse в разных компаниях, какие средства ClickHouse вы можете использовать для своих задач, и как они были использованы в разных компаниях.


Я подобрал три примера, которые показывают ClickHouse с разных сторон. Я думаю, это будет интересно.



Первый вопрос: Зачем нужен ClickHouse?. Вроде бы вопрос достаточно очевидный, но ответов на него больше, чем один.



  • Первый ответ ради производительности. ClickHouse очень быстрый. Аналитика на ClickHouse тоже очень быстрая. Его часто можно использовать там, где что-то другое работает очень медленно или очень плохо.
  • Второй ответ это стоимость. И в первую очередь стоимость масштабирования. Например, Vertica совершенно отличная база данных. Она очень хорошо работает, если у вас не очень много терабайт данных. Но когда речь идет о сотнях терабайтах или о петабайтах, то стоимость лицензии и поддержки выходит в достаточно существенную сумму. И это дорого. А ClickHouse бесплатный.
  • Третий ответ это операционная стоимость. Это подход чуть-чуть с другой стороны. RedShift отличный аналог. На RedShift можно очень быстро сделать решение. Оно будет хорошо работать, но при этом каждый час, каждый день и каждый месяц вы будете достаточно дорого платить Amazon, потому что это существенно дорогой сервис. Google BigQuery тоже. Если им кто-то пользовался, то он знает, что там можно запустить несколько запросов и получить счет на сотни долларов внезапно.

В ClickHouse этих проблем нет.



Где используется ClickHouse сейчас? Кроме Яндекса ClickHouse используется в куче разных бизнесов и компаний.


  • В первую очередь это аналитика веб-приложений, т. е. это use case, который пришел из Яндекса.
  • Много AdTech компаний используют ClickHouse.
  • Многочисленные компании, которым нужно анализировать операционные логи с разных источников.
  • Несколько компаний используют ClickHouse для мониторинга логов безопасности. Они их загружают в ClickHouse, делают отчеты, получают нужные им результаты.
  • Компании начинают его использовать в финансовом анализе, т. е. постепенно большой бизнес тоже подбирается к ClickHouse.
  • CloudFlare. Если кто-то за ClickHouse следит, то наверняка слышал название этой компании. Это один из существенных контрибуторов из community. И у них очень серьезная ClickHouse-инсталляция. Например, они сделали Kafka Engine для ClickHouse.
  • Телекоммуникационные компании начали использовать. Несколько компаний ClickHouse используют либо как proof on concept, либо уже в production.
  • Одна компания использует ClickHouse для мониторинга производственных процессов. Они тестируют микросхемы, списывают кучу параметров, там порядка 2 000 характеристик. И дальше анализируют хорошая партия или плохая.
  • Блокчейн-аналитика. Есть такая российская компания, как Bloxy.info. Это анализ ethereum-сети. Это они тоже сделали на ClickHouse.


Причем размер не имеет значения. Есть много компаний, которые используют один маленький сервер. И он им позволяет решить их проблемы. И еще больше компаний используют большие кластера из многих серверов или десятков серверов.


И если смотреть за рекордами, то:


  • Яндекс: 500+ серверов, 25 миллиардов записей в день они там сохраняют.
  • LifeStreet: 60 серверов, примерно 75 миллиардов записей в день. Серверов меньше, записей больше, чем в Яндексе.
  • CloudFlare: 36 серверов, 200 миллиардов записей в день они сохраняют. У них еще меньше серверов и еще больше данных они сохраняют.
  • Bloomberg: 102 сервера, примерно триллион записей в день. Рекордсмен по записям.


Географически это тоже много. Вот эта карта показывает heatmap, где ClickHouse используется в мире. Тут ярко выделяется Россия, Китай, Америка. Европейских стран мало. И можно выделить 4 кластера.


Это сравнительный анализ, тут не надо искать абсолютных цифр. Это анализ посетителей, которые читают англоязычные материалы на сайте Altinity, потому что русскоязычных там нет. И Россия, Украина, Беларусь, т. е. русскоязычная часть сообщества, это самые многочисленные пользователи. Потом идет США и Канада. Очень сильно догоняет Китай. Там полгода назад Китая почти не было, сейчас Китай уже обогнал Европу и продолжает расти. Старушка Европа тоже не отстает, причем лидер использования ClickHouse это, как ни странно, Франция.



Зачем я все это рассказываю? Для того чтобы показать, что ClickHouse становится стандартным решением для анализа больших данных и уже очень много где используется. Если вы его используете, вы в правильном тренде. Если вы еще его не используете, то можно не бояться, что вы останетесь одни и вам никто не поможет, поэтому что уже многие этим занимаются.



Это примеры реального использования ClickHouse в нескольких компаниях.


  • Первый пример это рекламная сеть: миграция с Vertica на ClickHouse. И я знаю несколько компаний, которые с Vertica перешли или находятся в процессе перехода.
  • Второй пример транзакционное хранилище на ClickHouse. Это пример построенный на антипаттернах. Все, что не надо делать в ClickHouse по советам разработчиков, здесь сделано. И при этом сделано настолько эффективно, что это работает. И работает гораздо лучше, чем типичное транзакционное решение.
  • Третий пример это распределенные вычисления на ClickHouse. Был вопрос про то, как можно ClickHouse интегрировать в Hadoop экосистему. Я покажу пример, как компания сделала на ClickHouse что-то типа аналога map reduce контейнера, следя за локализацией данных и т. д, чтобы посчитать очень нетривиальную задачу.


  • LifeStreet Это Ad Tech компания, у которой есть все технологии, сопутствующие рекламной сети.
  • Занимается она оптимизацией объявлений, programmatic bidding.
  • Много данных: порядка 10 миллиардов событий в день. При этом там события могут на несколько подсобытий делиться.
  • Много клиентов этих данных, причем это не только люди, гораздо больше это различные алгоритмы, которые занимаются programmatic bidding.


Компания прошла долгий и тернистый путь. И я о нем рассказывал на HighLoad. Сначала LifeStreet перешла с MySQL (с небольшой остановкой на Oracle) в Vertica. И можно об этом найти рассказ.


И все было очень хорошо, но достаточно быстро стало понятно, что данные растут и Vertica это дорого. Поэтому искались различные альтернативы. Некоторые из них здесь перечислены. И на самом деле мы сделали proof of concept или иногда performance testing почти всех баз данных, которые с 13-го по 16-ый год были доступны на рынке и примерно подходили по функциональности. И о части из них я тоже рассказал на HighLoad.



Стаяла задача мигрировать с Vertica в первую очередь, потому что данные росли. И росли они экспоненциально несколько лет. Потом они вышли на полку, но тем не менее. И прогнозируя этот рост, требования бизнеса на объем данных, по которым нужно делать какую-то аналитику, было понятно, что скоро пойдет разговор о петабайтах. А за петабайты платить уже очень дорого, поэтому искали альтернативу, куда уходить.



Куда уходить? И долгое время было совершенно не понятно, куда уходить, потому что с одной стороны есть коммерческие базы данных, они вроде бы неплохо работают. Некоторые работают почти так же хорошо, как Vertica, некоторые похуже. Но они все дорогие, ничего дешевле и лучше найти не удавалось.


С другой стороны, есть open source решения, которых не очень много, т. е. для аналитики их можно пересчитать по пальцам. И они бесплатные или дешевые, но работают медленно. И в них часто не хватает нужной и полезной функциональности.


И того, чтобы совмещало то хорошее, что есть в коммерческих базах данных и все то бесплатное, что есть в open source, ничего не было.



Ничего не было до тех пор, пока неожиданно Яндекс не вытащил, как кролика фокусник из шапки, ClickHouse. И это было решение неожиданное, до сих пор задают вопрос: Зачем?, но тем не менее.



И сразу летом 2016-го года мы стали смотреть, что такое ClickHouse. И оказалось, что он иногда может быть быстрее Vertica. Мы тестировали разные сценарии на разных запросах. И если запрос использовал только одну таблицу, т. е. без всяких джойны (join), то ClickHouse был быстрее Vertica в два раза.


Я не поленился и посмотрел еще тесты Яндекса на днях. Там то же самое: в два раза ClickHouse быстрее Vertica, поэтому они часто об этом говорят.


Но если в запросах есть джойны (join), то все получается не очень однозначно. И ClickHouse может быть медленнее Vertica в два раза. А если чуть-чуть запрос подправить и переписать, то примерно равные. Неплохо. И бесплатно.



И получив результаты тестов, и посмотрев с разных сторон на это, LifeStreet поехал на ClickHouse.



Это 16-ый год, напоминаю. Это было как в анекдоте про мышей, которые плакали и кололись, но продолжали есть кактус. И об этом было подробно рассказано, есть об этом видео и т. д.



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


Результаты это:


  • Успешная миграция и более года система уже работает в продакшене.
  • Производительность и гибкость выросли. Из 10 миллиардов записей, которые мы могли позволить себе хранить в день и то недолго, теперь LifeStreet хранит 75 миллиардов записей в день и может это делать 3 месяца и больше. Если посчитать в пике, то это до миллиона событий в секунду сохраняется. Больше миллиона SQL-запросов в день прилетают в эту систему, в основном от разных роботов.
  • Несмотря на то, что для ClickHouse стали использовать больше серверов, чем для Vertica, экономия и на железе получилась, потому что в Вертике использовались достаточно дорогие SAS-диски. В ClickHouse использовались SATA. А почему? Потому что в Vertica insert синхронный. И синхронизация требует, чтобы диски не очень сильно тормозили, а также, чтобы сеть не очень тормозила, т. е. достаточно дорогая операция. А в ClickHouse insert асинхронный. Более того, можно все локально всегда писать, никаких дополнительных затрат на это нет, поэтому данные в ClickHouse можно вставлять гораздо быстрее, чем в Вертику даже на не самых быстрых дисках. А на чтение примерно одинаково. Чтение на SATA, если они в RAID сидят, то это все достаточно быстро.
  • Не ограничены лицензией, т. е. 3 петабайта данных в 60 серверов (20 серверов это одна реплика) и 6 триллионов записей в фактах и агрегатах. Ничего подобного на Vertica позволить себе не могли.


Сейчас я перехожу к практическим вещам в данном примере.


  • Первое это эффективная схема. От схемы зависит очень многое.
  • Второе это генерация эффективного SQL.


Типичный OLAP-запрос это select. Часть колонок идет в group by, часть колонок идет в агрегатные функции. Есть where, которую можно представить как срез куба. Весь group by можно представить как проекцию. И поэтому это называется многомерным анализом данных.



И часто это моделируется в виде star-схемы, когда есть центральный факт и характеристики этого факта по сторонам, по лучам.



И с точки зрения физического дизайна, того, как это ложится на таблицу, то обычно делают нормализованное представление. Можете денормализовать, но это дорого по диску и не очень эффективно по запросам. Поэтому обычно делают нормализованное представление, т. е. таблица фактов и много-много таблиц измерений.


Но в ClickHouse это работает плохо. Есть две причины:


  • Первая это потому что в ClickHouse не очень хорошие джойны (join), т. е. джойны (join) есть, но они плохие. Пока плохие.
  • Вторая это то, что таблицы не обновляются. Обычно в этих табличках, которые вокруг star-схемы, нужно что-то менять. Например, название клиента, название компании и прочее. И это не работает.

И выход из этого в ClickHouse есть. даже целых два:


  • Первый это использование словарей. External Dictionaries это то, что помогает на 99 % решить проблему со star-схемой, с апдейтами и прочим.
  • Второй это использование массивов. Массивы тоже помогают избавиться от джойны (join) и от проблем с нормализацией.


  • Не нужен джойны (join).
  • Обновляемые. С марта 2018-го года появилась недокументированная возможность (в документации вы об этом не найдете) обновлять словари частично, т. е. те записи, которые поменялись. Практически это как таблица.
  • Всегда в памяти, поэтому джойны (join) со словарем работают быстрее, чем, если бы это была таблица, которая лежит на диске и еще не факт, что она в кэше, скорее всего, что нет.


  • Тоже не нужен джойны (join).
  • Это компактное представление 1 ко многим.
  • И на мой взгляд, массивы сделаны для гиков. Это лямбда-функции и прочее.

Это не для красного словца. Это очень мощная функциональность, которая позволяет делать многие вещи очень просто и элегантно.



Типичные примеры, которые помогают решать массивы. Эти примеры простые и достаточно наглядные:


  • Поиск по тегам. Если у вас там есть хештеги и вы хотите найти какие-то записи по хештегу.
  • Поиск по key-value парам. Тоже есть какие-то атрибуты со значением.
  • Хранение списков ключей, которые вам нужно перевести во что-то другое.

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



А в ClickHouse ничего не нужно делать, достаточно описать массив string для хештегов или сделать вложенную структуру для систем типа key-value.


Вложенная структура это, может быть, не самое удачное название. Это два массива, которые имеют общую часть в названии и некоторые связанные характеристики.


И по тегу искать очень просто. Есть функция has, которая проверяет, что в массиве есть элемент. Все, нашли все записи, которые относятся к нашей конференции.


Поиск по subid чуть-чуть посложнее. Надо нам сначала найти индекс ключа, а потом уже взять элемент с этим индексом и проверить, что это значение такое, какое нам нужно. Но тем не менее очень просто и компактно.


Регулярное выражение, которое вы бы захотели написать, если бы вы все это хранили в одной строчке, оно было бы, во-первых, корявым. А, во-вторых, работало гораздо дольше, чем два массива.



Другой пример. У вас есть массив, в котором вы храните ID. И вы можете перевести их в имена. Функция arrayMap. Это типичная лямбда-функция. Вы передаете туда лямбда-выражения. И она каждому ID из словаря вытаскивает значение имени.


Аналогичным образом можно сделать и поиск. Передается функция предикат, которая проверяет чему соответствуют элементы.



Вот эти вещи сильно упрощают схему и решают кучу проблем.


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


  • В ClickHouse нет планировщика запросов. Вообще нет.
  • Но тем не менее сложные запросы все равно планировать надо. В каких случаях?
  • Если в запросе есть несколько джойны (join), которые вы заворачиваете в подселекты. И порядок, в котором они выполняются, имеет значение.
  • И второе если запрос распределенный. Потому что в распределенном запросе только самый внутренний подселект выполняется распределенно, а все остальное передается на один сервер, к которому вы подключились и выполняется там. Поэтому если у вас распределенные запросы со многими джойны (join), то нужно выбирать порядок.

И даже в более простых случаях тоже иногда следует выполнять работу планировщика и запросы чуть-чуть переписывать.



Вот пример. В левой части запрос, который показывает топ-5 стран. И он выполняется 2,5 секунды, по-моему. А в правой части тот же запрос, но чуть-чуть переписанный. Мы вместо того, чтобы группировать по строке, стали группировать по ключу (int). И это быстрее. А потом мы к результату подключили словарь. Вместо 2,5 секунд запрос выполняется 1,5 секунды. Это хорошо.



Похожий пример с переписыванием фильтров. Здесь запрос по России. Он выполняется 5 секунд. Если мы его перепишем таким образом, что будем сравнивать снова не строку, а числа с каким-то сетом тех ключей, которые относятся к России, то это будет гораздо быстрее.



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



  • Максимум работы в распределенном режиме.
  • Сортировка по минимальным типам, как я это делал по интам.
  • Если есть какие-то джойны (join), словари, то их лучше делать в самую последнюю очередь, когда у вас уже данные хотя бы частично сгруппированные, тогда операция джойны (join) или вызов словаря будет меньше раз вызываться и это будет быстрее.
  • Замена фильтров.

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



Переходим к следующему примеру. Компания Х из США. Что она делает?


Была задача:


  • Офлайн-связывание транзакций рекламы.
  • Моделирование разных моделей связывания.


В чем состоит сценарий?


Обычный посетитель заходит на сайт, например, 20 раз в месяц с разных объявлений или просто так иногда приходит без всяких объявлений, потому что помнит этот сайт. Смотрит какие-то продукты, кладет их в корзину, вынимает их из корзины. И, в конце концов, что-то покупает.


Резонные вопросы: Кому надо заплатить за рекламу, если надо? и Какая реклама на него повлияла, если повлияла?. Т. е. почему он купил и как сделать так, чтобы люди, похожие на этого человека, тоже покупали?


Для того чтобы эту задачу решить, нужно связывать события, которые происходят на веб-сайте правильным образом, т. е. как-то между ними выстраивать связь. Потом их передавать для анализа в DWH. И на основании этого анализа строить модели, кому и какую рекламу показывать.



Рекламная транзакция это набор связанных событий пользователя, которые начинаются от показа объявления, дальше что-то происходит, потом, может быть, покупка, а потом могут быть покупки в покупке. Например, если это мобильное приложение или мобильная игра, то обычно установка приложения бесплатно происходит, а если там что-то дальше делается, то на это могут потребоваться денежки. И чем больше человек потратит в приложении, тем он ценнее. Но для этого надо все связать.



Есть много моделей связывания.


Самые популярные это:


  • Last Interaction, где interaction это либо клик, либо показ.
  • First Interaction, т. е. первое, что привело человека на сайт.
  • Линейная комбинация всем поровну.
  • Затухание.
  • И прочее.


И как это все работало изначально? Был Runtime и Cassandra. Cassandra использовалась как transaction storage, т. е. в ней хранились все связанные транзакции. И когда приходит какое-то событие в Runtime, например, показ какой-то страницы или что-то еще, то делался запрос в Cassandra есть такой человек или нет. Потом доставались транзакции, которые к нему относятся. И производилось связывание.


И если повезло, что в запросе есть transaction id, то это легко. Но обычно не везет. Поэтому надо было найти последнюю транзакцию или транзакцию с последним кликом и т. д.


И это все очень хорошо работало, пока связывание было к последнему клику. Потому что кликов, скажем, 10 миллионов в день, 300 миллионов в месяц, если на месяц ставить окно. И поскольку в Cassandra это должно быть все в памяти для того, чтобы работало быстро, потому что требуется Runtime ответить быстро, то требовалось примерно 10-15 серверов.


А когда захотели к показу привязывать транзакцию, то сразу получилось не так весело. А почему? Видно, что в 30 раз больше событий надо хранить. И, соответственно, нужно в 30 раз больше серверов. И получается, что это какая-то астрономическая цифра. Держать до 500 серверов для того, чтобы делать связывание, притом, что в Runtime серверов существенно меньше, то это какая-то неправильная цифра. И стали думать, что делать.



И вышли на ClickHouse. А как это делать на ClickHouse? На первый взгляд кажется, что это набор антипаттернов.


  • Транзакция растет, мы к ней подцепляем все новые и новые ивенты, т. е. она mutable, а ClickHouse не очень хорошо работает с mutable-объектами.
  • Когда к нам приходит посетитель, то нам нужно вытащить его транзакции по ключу, по его visit id. Это тоже point query, в ClickHouse так не делают. Обычно в ClickHouse большие сканы, а тут нам нужно достать несколько записей. Тоже антипаттерн.
  • Кроме того, транзакция была в json, но переписывать не хотели, поэтому хотели хранить json не структурированно, а если надо, то из него что-то вытаскивать. И это тоже антипаттерн.

Т. е. набор антипаттернов.



Но тем не менее получилось сделать систему, которая очень хороша работала.


Что было сделано? Появился ClickHouse, в который забрасывались логи, разбитые на записи. Появился attributed сервис, который получал из ClickHouse логи. После этого для каждой записи по visit id получал транзакции, которые могли быть еще не дообработанные и плюс снапшоты, т. е. транзакции уже связанные, а именно результат предыдущей работы. Из них уже делал логику, выбирал правильную транзакцию, подсоединял новые события. Снова записывал в лог. Лог уходил обратно в ClickHouse, т. е. это постоянно цикличная система. И кроме того, уходил в DWH, чтобы там это анализировать.


Именно в таком виде это работало не очень хорошо. И чтобы ClickHouse было проще, когда шел запрос по visit id, то группировали эти запросы в блоки по 1 000-2 000 visit id и вытаскивали для 1 000-2 000 человек все транзакции. И тогда все это заработало.



Если посмотреть вовнутрь ClickHouse, то там всего 3 основных таблиц, которые все это обслуживают.


Первая таблица, в которую заливаются логи, причем логи заливаются практически без обработки.


Вторая таблица. Через materialized view из этих логов выкусывались, которые еще не attributed ивенты, т. е. несвязанные. И через materialized view из этих логов вытаскивались транзакции для построения снапшота. Т. е. специальным materialized view строил снапшот, а именно последнее накопленное состояние транзакции.



Вот здесь написан текст на SQL. Я бы хотел прокомментировать в нем несколько важных вещей.


Первая важная вещь это возможность в ClickHouse из json вытаскивать колонки, поля. Т. е. в ClickHouse есть некоторые методы для работы с json. Они очень-очень примитивные.


visitParamExtractInt позволяет из json вытаскивать атрибуты, т. е. первое попадание срабатывает. И таким образом можно вытащить transaction id или visit id. Это раз.


Второе здесь использовано хитрое materialized поле. Что это значит? Это значит, что вы его в таблицу вставить не можете, т. е. оно не вставляется, оно вычисляется и хранится при вставке. При вставке ClickHouse делает за вас работу. И уже вытаскивается из json то, что вам потом понадобится.


В данном случае materialized view это для необработанных строк. И как раз используется первая таблица с практически сырыми логами. И что делает? Во-первых, меняет сортировку, т. е. сортировка теперь идет по visit id, потому что нам нужно быстро вытаскивать именно по конкретному человеку его транзакцию.


Вторая важная вещь это index_granularity. Если вы видели MergeTree, то обычно по дефолту 8 192 стоит index_granularity. Что это такое? Это параметр разреженности индекса. В ClickHouse индекс разреженный, он никогда не индексирует каждую запись. Он это делает через каждые 8 192. И это хорошо, когда требуется много данных подсчитать, но плохо, когда немножко, потому что большой overhead. И если уменьшать index granularity, то мы уменьшаем overhead. Уменьшить до единицы нельзя, потому что может памяти не хватить. Индекс всегда в памяти хранится.



А снапшот использует еще некоторые интересные функции ClickHouse.


Во-первых, это AggregatingMergeTree. И в AggregatingMergeTree хранится argMax, т. е. это состояние транзакции, соответствующее последнему timestamp. Транзакции все время новые генерируются для данного посетителя. И в самое последнее состояние этой транзакции мы добавили ивент и у нас появилось новое состояние. Оно снова попало в ClickHouse. И через argMax в этом материализованном представлении мы всегда можем получить актуальное состояние.



  • Связывание отвязано от Runtime.
  • Хранится и обрабатывается до 3 миллиардов транзакций в месяц. Это на порядок больше, чем было в Cassandra, т. е. в типичной транзакционной системе.
  • Кластер 2х5 серверов ClickHouse. 5 серверов и каждый сервер имеет реплику. Это даже меньше, чем было в Cassandra для того, чтобы сделать click based атрибуцию, а здесь у нас impression based. Т. е. вместо того, чтобы увеличивать количество серверов в 30 раз, их удалось уменьшить.


И последний пример это финансовая компания Y, которая анализировала корреляции изменений котировок акций.


И задача стояла такая:


  • Есть примерно 5 000 акций.
  • Котировки каждые 100 миллисекунды известны.
  • Данные накопились за 10 лет. Видимо, для некоторых компаний побольше, для некоторых поменьше.
  • Всего примерно 100 миллиардов строк.

И нужно было посчитать корреляцию изменений.



Здесь есть две акции и их котировки. Если одна идет вверх, и вторая идет вверх, то это положительная корреляция, т. е. одна растет, и вторая растет. Если одна идет вверх, как в конце графика, а вторая вниз, то это отрицательная корреляция, т. е. когда одна растет, другая падает.


Анализируя эти взаимные изменения можно делать предсказания на финансовом рынке.



Но задача сложная. Что для этого делается? У нас есть 100 миллиардов записей, в которых есть: время, акция и цена. Нам нужно посчитать сначала 100 миллиардов раз runningDifference от алгоритма цены. RunningDifference это функция в ClickHouse, которая разницу между двумя строчками последовательно вычисляет.


А после этого надо посчитать корреляцию, причем корреляцию надо посчитать для каждой пары. Для 5 000 акций пар 12,5 миллионов. И это много, т. е. 12,5 раз надо вычислять вот такую функцию корреляции.


И если кто-то забыл, то x и y это мат. ожидание по выборке. Т. е. нужно не только корни и суммы посчитать, а еще внутри этих сумм еще одни суммы. Кучу-кучу вычислений нужно произвести 12,5 миллионов раз, да еще и сгруппировать по часам надо. А часов у нас тоже немало. И успеть надо за 60 секунд. Это шутка.



Надо было успеть хоть как-то, потому что все это работало очень-очень медленно, прежде, чем пришел ClickHouse.



Они пробовали на Hadoop это посчитать, на Spark, на Greenplum. И все это было очень медленно или дорого. Т. е. можно было как-то посчитать, но потом это было дорого.



А потом пришел ClickHouse и все стало гораздо лучше.


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


Что они сделали? Изначально данные локализованные. На каждом из серверов хранятся данные по прайсингу определенного набора акций. И они не пересекаются. Поэтому можно параллельно и независимо посчитать logReturn, все это происходит пока параллельно и распределено.


Дальше решили эти данные уменьшить, при этом не потеряв выразительности. Уменьшить с помощью массивов, т. е. для каждого отрезка времени сделать массив акций и массив цен. Таким образом это занимает гораздо меньше места данные. И с ними несколько удобнее работать. Это почти параллельные операции, т. е. мы параллельно частично считаем и потом записываем на сервер.


После этого это можно среплицировать. Буковка r означает, что эти данные мы среплицировали. Т. е. у нас на всех трех серверах одинаковые данные вот эти массивы.


И дальше специальным скриптом из этого набора 12,5 миллионов корреляций, которые надо посчитать, можно сделать пакеты. Т. е. 2 500 задач по 5 000 пар корреляций. И эту задачу вычислять на конкретном ClickHouse-сервере. Все данные у него есть, потому что данные одинаковые и он может их последовательно вычислять.



Еще раз, как это выглядит. Сначала у нас все данные есть в такой структуре: время, акции, цена. Потом мы посчитали logReturn, т. е. данные той же структуры, только вместо цены у нас уже logReturn. Потом их переделали, т. е. у нас получились время и groupArray по акциям и по прайсам. Среплицировали. И после этого сгенерировали кучу задач и скормили ClickHouse, чтобы он их считал. И это работает.



На proof of concept задача это была подзадача, т. е. взяли меньше данных. И всего на трех серверах.


Первые эти два этапа: вычисление Log_return и заворачивание в массивы заняли примерно по часу.


А вычисление корреляции где-то 50 часов. Но 50 часов это мало, потому что раньше у них это работало неделями. Это был большой успех. И если посчитать, то 70 раз в секунду на этом кластере все считалось.


Но самое главное, что эта система практически без узких мест, т. е. она масштабируется практически линейно. И они это проверили. Успешно ее отмасштабировали.



  • Правильная схема половина успеха. И правильная схема это использование всех нужных технологий ClickHouse.
  • Summing/AggregatingMergeTrees это технологии, которые позволяют агрегировать или считать снапшот state как частный случай. И это существенно упрощает многие вещи.
  • Materialized Views позволяют обойти ограничение в один индекс. Может быть, я это не очень четко проговорил, но когда мы загружали логи, то сырые логи были в таблице с одним индексом, а на attribute логи были в таблице, т. е. те же самые данные, только отфильтрованные, но индекс был совершенно другим. Вроде бы одни и те же данные, но разная сортировка. И Materialized Views позволяет, если вам это нужно, обойти такое ограничение ClickHouse.
  • Уменьшайте гранулярность индекса для точечных запросов.
  • И распределяйте данные умно, старайтесь максимально локализовать данные внутри сервера. И старайтесь, чтобы запросы использовали тоже локализацию там, где это возможно максимально.


И резюмируя это небольшое выступление, можно сказать, что ClickHouse сейчас твердо занял территорию и коммерческих баз данных, и open source баз данных, т. е. именно для аналитики. Он замечательно вписался в этот ландшафт. И более того, он потихонечку начинает других вытеснять, потому что, когда есть ClickHouse, то вам не нужен InfiniDB. Вертика, может быть, скоро будет не нужна, если они сделают нормальную поддержку SQL. Пользуйтесь!



-Спасибо за доклад! Очень интересно! Были ли какие-то сравнения с Apache Phoenix?


-Нет, я не слышал, чтобы кто-то сравнивал. Мы и Яндекс стараемся отслеживать все сравнения ClickHouse с разными базами данных. Потому что если вдруг что-то оказывается быстрее ClickHouse, то Леша Миловидов не может спать по ночам и начинает быстренько его ускорять. Я не слышал о таком сравнении.


  • (Алексей Миловидов) Apache Phoenix это SQL-движок на Hbase. Hbase в основном предназначен для сценария работ типа key-value. Там в каждой строчке может быть произвольное количество столбцов с произвольными именами. Это можно сказать про такие системы как Hbase, Cassandra. И на них именно тяжелые аналитические запросы нормально работать не будут. Или вы можете подумать, что они работают нормально, если у вас не было никакого опыта работы с ClickHouse.


  • Спасибо


    • Добрый день! Я уже довольно много интересуюсь этой темой, потому что у меня подсистема аналитическая. Но когда я смотрю на ClickHouse, то у меня возникает ощущение, что ClickHouse очень хорошо подходит для анализа ивентов, mutable. И если мне нужно анализировать много бизнес-данных с кучей больших таблиц, то ClickHouse, насколько я понимаю, мне не очень подходит? Особенно, если они меняются. Правильно ли это или есть примеры, которые могут опровергнуть это?


    • Это правильно. И это правда про большинство специализированных аналитических баз данных. Они заточены под то, что есть одна или несколько больших таблиц, которые mutable, и под много маленьких, которые медленно изменяются. Т. е. ClickHouse не как Oracle, куда можно положить все и строить какие-то очень сложные запросы. Для того чтобы ClickHouse эффективно использовать, надо схему выстраивать тем образом, который в ClickHouse хорошо работает. Т. е. избегать излишней нормализации, использовать словари, стараться делать меньше длинных связей. И если схему таким образом выстроить, то тогда аналогичные бизнес-задачи на ClickHouse могут быть решены гораздо более эффективно, чем традиционной реляционной базе данных.




Спасибо за доклад! У меня вопрос по последнему финансовому кейсу. У них была аналитика. Надо было сравнить, как идут вверх-вниз. И я так понимаю, что вы систему построили именно под эту аналитику? Если им завтра, допустим, понадобится, какой-то другой отчет по этим данным, нужно заново схему строить и загружать данные? Т. е. делать какую-то предобработку, чтобы получить запрос?


Конечно, это использование ClickHouse для вполне конкретной задачи. Она более традиционно могла бы быть решена в рамках Hadoop. Для Hadoop это идеальная задача. Но на Hadoop это очень медленно. И моя цель это продемонстрировать то, что на ClickHouse можно решать задачи, которые обычно решаются совершенно другими средствами, но при этом сделать гораздо эффективнее. Это под конкретную задачу заточено. Понятно, что если есть задача чем-то похожая, то можно ее похожим образом решать.


Понятно. Вы сказали, что 50 часов обрабатывалось. Это начиная с самого начала, когда загрузили данные или получили результаты?


Да-да.


Хорошо, спасибо большое.


Это на 3-х серверном кластере.


Приветствую! Спасибо за доклад! Все очень интересно. Я немножко не про функционал спрошу, а про использование ClickHouse с точки зрения стабильности. Т. е. случались ли у вас какие-то, приходилось ли восстанавливать? Как при этом себя ведет ClickHouse? И случалось ли так, что у вас вылетала и реплика в том числе? Мы, допустим, у ClickHouse сталкивались с проблемой, когда он вылезает все-таки за свой лимит и падает.


Конечно, идеальных систем нет. И у ClickHouse тоже есть свои проблемы. Но вы слышали о том, чтобы Яндекс.Метрика долго не работала? Наверное, нет. Она работает надежно где-то с 2012-2013-го года на ClickHouse. Про мой опыт я тоже могу сказать. У нас никогда не бывало полных отказов. Какие-то частичные вещи могли случаться, но они никогда не были критичными настолько, чтобы серьезно повлиять на бизнес. Никогда такого не было. ClickHouse достаточно надежен и не падает случайным образом. Можно об этом не беспокоиться. Это не сырая вещь. Это доказано многими компаниями.


Здравствуйте! Вы сказали, что нужно сразу хорошо продумать схему данных. А если это случилось? У меня данные льются-льются. Проходит полгода, и я понимаю, что так жить нельзя, мне надо перезаливать данные и что-то с ними делать.


Это зависит, конечно, от вашей системы. Есть несколько способов сделать это практически без остановки. Например, вы можете создать Materialized View, в котором сделать другую структуру данных, если ее можно однозначно смапировать. Т. е. если она допускает мапирование средствами ClickHouse, т. е. extract каких-то вещей, поменять primary key, поменять партиционирование, то можно сделать Materialized View. Туда ваши старые данные переписать, новые будут писаться автоматически. А потом просто переключиться на использование Materialized View, потом переключить запись и старую таблицу убить. Это вообще без остановки способ.


Спасибо.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru