Предлагам да се запознаете с разшифровката на доклада за 2017 година на Игор Стрихарь «ClickHouse – визуално бърз и прегледен анализ на данните в Tabix».
Уеб интерфейс за ClickHouse в проекта Tabix.
Основни функции:
- Работи с ClickHouse директно от браузъра, без нужда от инсталиране на допълнителен софтуер;
- Редактор на запитвания с подсветка на синтаксиса;
- Автодовършване на командите;
- Инструменти за графичен анализ на изпълнението на запитванията;
- Цветови схеми по избор.



Аз съм технически директор на СМИ2. Ние сме новинарски обменен агрегатор. Съхраняваме много данни, които получаваме от нашите партньори и ги регистрираме в ClickHouse – около 30 000 запитвания в секунда.
Това са данни като:
- Кликове върху новини.
- Показвания на новини в агрегатора.
- Показвания на банери в нашата мрежа.
- И регистрираме събития от нашия собствен брояч, подобен на Яндекс.Метрика. Това е нашата собствена микроаналитика.

Преди ClickHouse имахме много бурен живот. Много се мъчихме да съхраняваме тези данни някъде и по някакъв начин да ги анализираме.
Животът преди ClickHouse — infiniDB
Първото, което имахме, беше infiniDB. Тя ни служеше 4 години. Започнахме я с много труд.
- Не поддържаше клъстериране или шардируется. Нито едно от тези умни неща не работеше по подразбиране.
- Има трудности с зареждането на данни. Имаше само специфичен конзолен инструмент, който можеше да зарежда само CSV файлове и то по много неясен начин.
- Базата данни е еднопоточна. Можеше или да пише, или да чете. Но позволяваше обработка на голям обем данни.
- Имаше интересен проблем. Всяка нощ трябваше да ребутваме сървъра, иначе не работеше.
Работи до края на 2016 година, когато изцяло преминахме на ClickHouse.
Животът преди ClickHouse — Cassandra
Тъй като infiniDB беше еднопоточна, решихме, че ни трябва многопоточна база, в която можем да пишем много потоци едновременно.
Опитахме много интересни неща. След това решихме да пробваме Cassandra. С Cassandra всичко беше прекрасно. 10 000 запитвания в секунда на запис. 2 000 запитвания на четене.
Но имаше и свои особености. Веднъж месечно или на два месеца имахме разсинхронизация на базата данни. И трябваше да ставаме и да бягаме да поправяме Cassandra. Рестартирахме сървърите последователно. И всичко ставаше гладко и красиво.
Животът преди ClickHouse – Druid
След това разбрахме, че трябва да пишем още повече данни. През 2016 година започнахме да гледаме Druid.
Druid е отворена база данни, написана на Java. Много специфична. И пасваше на clickstream, когато трябваше да съхраняваме определен поток от събития и след това да правим агрегация или да изготвяме аналитични отчети.
Druid имаше версия 0.9.X.
Самата база данни се разгръща много трудно. Това е сложност на инфраструктурата. За да я разгрънем, трябваше да поставим много-много хардуер. И всеки хардуер отговаряше за своята отделна роля.
За да заредим данни в нея, трябваше да прилагаме някаква магия. Има проект с отворен код - Tranquility, който в потока губеше данни. Когато зареждахме данни в него, той ги губеше.
Но по някакъв начин започнахме да го внедряваме. Ние, като таралежи, които се бодат, но продължават да ядат кактус, започнахме внедряването. Нуждаехме се от около месец, за да подготвим цялата инфраструктура за него. Т. е. да поръчаме сървъри, да настроим роли, да извършим пълна автоматизация на разгръщането. Т. е. при срив на кластера, за да се разгръща автоматично втори кластер.

Но тук се случи чудо. Бях в отпуск и моите колеги ми изпращат линк на , където се казва, че Яндекс реши да отвори ClickHouse. Аз казах, че да опитаме.
И буквално за 2 дни разгръщаме тестов кластер ClickHouse. Започваме да зареждаме данни в него. В сравнение с infiniDB – това е елементарно, в сравнение с Druid – това е елементарно. В сравнение с Cassandra също е елементарно. Защото ако зареждате данни в Cassandra през php, това не е елементарно.

Какво получихме? Перформанс в скоростта. Перформанс в съхранението на данни. Т. е. използва се много по-малко дисково пространство. ClickHouse е бърз, той е много бърз в сравнение с другите продукти.

В момента на стартиране, когато Яндекс публикува ClickHouse в OpenSource, имаше само конзолен клиент. Ние в нашата компания СМИ2 решихме да опитаме да направим нативен клиент за web, така че да можем да отворим страница от браузъра, да напишем заявка и да получим резултат, защото започнахме да пишем много заявки. Писането в конзолата е трудно. И ние направихме нашата първа версия.

И около зимата на миналата година започнаха да се появяват странични инструменти за работа с ClickHouse. Това са инструменти като:
- .
- .
- . (Сега )
- .
- .
Ще разгледам някои от тези инструменти, т.е. тези, с които съм работил.

Добър инструмент, но за Druid. Когато внедрявахме Druid, пробвах SuperSet. Хареса ми. Работи много бързо за Druid.
Не е подходящ за ClickHouse. Т.е. работи, стартира, но е готов да обработва само основни заявки от типа: SELECT event, GROUP BY event. Не поддържа по-сложен синтаксис на ClickHouse.

Следващият инструмент е Apache Zeppelin. Това е добра и интересна вещ. Работи. Поддържа бележници, табла, поддържа променливи. Знам, че някой от общността на ClickHouse го използва.
Но синтаксисът на ClickHouse не се поддържа, т.е. ще трябва да пишете заявки или в конзолата, или на друго място. След това да проверявате дали всичко работи. Това е просто неудобно. Но поддръжката на табла е добра.

Следващият инструмент е Redash.IO. Redash се хоства в интернет. Т.е. за разлика от предишните инструменти, не трябва да се инсталира. И това е табло за управление с възможност за консолидация на данни от различни DataSource. Т.е. можете да извлечете данни от ClickHouse, MySQL, PostgreSQL и други бази данни.

Буквално преди месец (през март 2017 година) се появи поддръжка в Grafana. Когато изграждате отчети в Grafana, например, относно състоянието на вашето оборудване или по някои метрики, вече можете да изградите подобен график или панел от данни от ClickHouse директно. Това е много удобно и ние го използваме при нас. Позволява да се открият аномалии. Т.е. ако нещо се случва и някакво оборудване се проваля или е натоварено, можете да видите причината, ако тези данни са успели да стигнат до ClickHouse.

Много ми беше неудобно да пиша в тези инструменти или в конзолата. И реших да доработя нашия първи интерфейс. И заимствах идея от EventSQL, SeperSet, Zeppelin.

Какво исках? Исках да получа графики, подобрен редактор, да реализирам поддръжка на намекващи речници. Защото ClickHouse има отлична функция – речници. Но с речниците е трудно да се работи, защото трябва да се помни форматът на съхраняваните стойности, т.е. дали е число или низ и т.н. Тъй като често използваме речници в техните различни варианти, беше доста трудно да се пишат заявки.

Изминаха 3 месеца от излизането на първата ни версия. Направих около 330 комита в закрит клон и така се получи Tabix.
В отличие от предишната версия, която се наричаше ClickHouse-Frontend, реших да я преименувам на простото име Tabix.
Какво ново?
Рисува графики. Поддържа SQL синтаксис ClickHouse. Подскажава по функции и много интересно умее.

Така изглежда общата схема на Tabix. Отляво е представено дървото, в центъра – редактора на заявки, а долу – резултатът от тази заявка.

След това ще покажа как работи редакторът на заявки.

Тук автоматичният автокомплект сработи за таблицата и подскажева съответно автокомплект по полетата. И подсказки за функции. Ако натиснете ctrl и enter, заявката ще се изпълни или ще се провали с грешка. Най-простата заявка се изпраща към Tabix и получавате резултат, тоест можете бързо да работите с ClickHouse.

Справочниците, както вече споменах, са много интересна функция, с която работим изключително много. Те ни позволиха да направим много неща. Например, в справочниците съхраняваме всички градове. Съхраняваме идентификатора на града и името му, ширината и дължината. А в базата данни съхраняваме само идентификатора на града. Съответно, свиваме данните значително.

Това изглежда като простичка работа, но в ClickHouse помага по много интересен начин. Понеже ClickHouse поддържа само вложени join-ове, заявката расте надолу и встрани много силно. И когато скобата се отвори, и следва дълго изразение, такова простичко нещо, като сгъване на заявката, помага да работите по-лесно с нея. Защото когато заявката е дълга 200-300 реда и много широка, сгъването на заявката е много полезно и след това може да намерите определено място или как да го локализирате.
Дърво на обекти, много заявки и раздели (Видео 13:46) )

Следващите ще покажа за дървото и разделите. Отляво – дървото, отгоре можете да създадете няколко раздела. Разделите са като работно пространство. Можете да създадете няколко раздела и всеки да го именувате по своему. Това е като мини-система за изграждане на отчет.
Разделите се запазват автоматично. Ако рестартирате браузера или затворите Tabix, всичко това ще бъде запазено.
Горещи клавиши – удобно (Видео 14:39) )
Има горещи клавиши и те са доста много. Някои от тях съм представил тук за пример. Това е за превключване на раздели, изпълнение на заявка или изпълнение на няколко заявки.

Ще покажа как да се работи с резултата. Изпращаме заявка. Тук рисувам sin, cos и tg. Може да се подчертае резултатът, т.е. да се изготви типова карта на колоната. Може да се подчертаят положителни или отрицателни стойности. Или просто да се оцвети конкретен елемент от таблицата. Това е удобно, когато таблицата е огромна и трябва да се намери някаква аномалия с очите. Когато търсех аномалии, подчертавах някои редове, някои елементи в зелено или червено.

Има много интересни неща. Например, как да копираме в Redmine Markdown. Ако е нужно да копирате резултата някъде, това е много удобно. Може просто да се выдели област, да се каже 'Copy to Redmine' и той ще го копира в Redmine Markdown или ще създаде заявка Where.

Следващото е оптимизацията на заявките. Веднъж забравих да посоча полето 'date'. И моята заявка в ClickHouse не се обработваше много бързо, но все пак бързо, т.е. по-малко от секунда. Когато видях колко реда минава, ми стана страшно. Не писахме толкова реда в тази таблица за един ден. Започнах да анализирам заявката и видях, че пропуснах в едно място датата. Т.е. забравих да посоча, че данните ми са нужни не от цялата таблица, а за конкретен период.
В Tabix има таб 'Stats', в който се съхранява цялата история на изпратените заявки, т.е. там можете да видите колко реда е прочел този заявка и колко време е изпълнявал. Това позволява оптимизация.
Върху резултата от заявката можете да изградите сводна таблица. Изпратили сте заявка в ClickHouse, получили сте данни. И след това можете да плъзнете тези данни с мишката и да построите сводната таблица.

Следващото интересно нещо е изграждането на графики. Да предположим, имаме такава заявка: sin, cos от 0 до 299. И за да я нарисувате, трябва да изберете таба 'Draw' и ще получите график с вашите sin и cos.

Може да се раздели на различни оси, т.е. да се нарисуват два графика един до друг. Да напишете една команда и втора команда.

Може да се нарисуват хистограми.

Може да се раздели на матрица от графики.

Може да се изгради топлинна карта.

Може да се изгради топлинен календар. Много удобно нещо, когато трябва да анализирате аномалии за една година, т.е. да намерите или изблици, или спадове. Тази визуализация на данните ми помогна.

Следващото е Treemap.


Sankeys – интересен график. Той е или Streamgraphs, или River. Но аз го наричам River. С него също можете да търсите аномалии. Много е удобен. Препоръчвам да го използвате за търсене.

Следващото интересно нещо е визуализацията на динамична карта. Ако в базата данни имате запазена ширина, дължина и, например, цел, ако имате, да кажем, автомобилен транспорт или самолети, можете да визуализирате маршрутите до целите. Също така можете да зададете скоростта и размерите на обектите, в които те пристигат.
Но проблемът с тази карта е, че тя показва само картата на света, без детайли.

По-късно добавих Google карта. Ако запазвате широта и дължина, можете да визуализирате резултата на Google карта, но без поддръжка на самолетите.
Основните функции за работа с резултатите и заявките в Tabix обсъдихме.

Следващото – това е анализът на вашия ClickHouse сървър. Има отделен раздел "Метрики", където можете да видите размера на съхраняваните данни по всяка колона. На скрийншота е показано, че полето "referrer" заема около 730 Gb. Ако се откажем от това поле, ще спестим три шардa по 700 GB, т.е. около 2 TB, които не са ни нужни.
Имаме също поле "request_id", което съхраняваме като низ. Но ако започнем да го съхраняваме в числов формат, ще компресира това поле значително.
Тук също е показана конфигурацията на сървъра и списъка с нодовете на вашия кластер.

Следващият раздел – това са метриките. Те се извличат в реално време от ClickHouse и просто позволяват да се анализира състоянието на сървъра и да се разбере какво се случва с него. Това не е замяна на оценка с Grafana. Това е нужно, за да се анализира бързо.

Следващият раздел – това са процесите. По тях можете да разберете какво се случва на сървъра. Да видите какво става там. Имах заявка, която изразходваше 200 GB за четене всеки път. Видях това благодарение на този интерфейс. Улових я и я коригирах. И станаха около 30 GB, т.е. производителността се увеличи значително.

Благодаря! И това е в OpenSource.
Приключих. И, между другото, това е в OpenSource, безплатно е и дори не трябва да се сваля. Просто го отворете в браузъра и всичко ще работи.
Въпроси
Игор, какво следва? Как ще развиваш този инструмент?
След време ще се появи дашбординг, т.е. възможно е да се появи дашбординг. Интеграция с други бази данни. Това съм го направил, но още не съм го публикувал в OpenSource. Това е MySQL и, възможно, PostgreSQL. Т.е. ще може да се изпращат заявки от Tabix не само в ClickHouse, но и в други инструменти.
Видно е, че е свършена огромна работа. Получи се доста завършена идея. Направено е в браузъра, явно за да се избегнат костите по различни оси и бързо да се нахвърлят всички тези неща. Чух, че работите на php това, затова е най-лесно да се нахвърли в браузъра и всичко ще работи навсякъде. Няма въпроси по това. Въпросът е такъв. Там е направено наистина много. Колко човека работиха по това? И колко време отне всичко? Защото инструментите, направени за себе си, обикновено нямат такъв голям функционал.
От лятото до есента работеше един човек от нашия екип. Това беше първата версия. После направих 330 комита сам. Това, което виждате, го правихме с колега наполовина. През 3 месеца от първата версия до последната, основно аз направих повечето. Но много зле познавам Javascript. Това беше моят единствен и, надявам се, последен проект на Javascript, с който работих. Около него бях, погледнах – о, ужас. Но много исках да завърша продукта и ето какво стана.
Много благодаря за доклада! Това е отличен инструмент. С Tableau сравнявахте ли?
Благодаря. Затова Tabix и получи името си, защото първите букви съвпадат.
Защото конкурирате?
Ще има много инвестиции, ще конкурираме.
Как предложите да продадете на вътрешните анализатори, че този инструмент напълно ще замести *Tableau*? Какие будут аргументы?
Нативно работи с ClickHouse. Пробвах Tableau, но там не може да се пише поддръжка на речници и подобно. Знам как работят хората с Tabix. Те пишат заявка, експортират в CSV и зареждат в BI. И вече там правят нещо. Но аз с трудност си представям как го правят, защото – това е графичен инструмент. Той може да експортира 5 000 реда, максимум 6 000 реда, но не повече, иначе браузърът не издържа.
Т.е. има някакви сериозни ограничения по обема данни, нали?
Да. Не мога да си представя, че искате да експортирате 10 000 реда на екрана на браузъра. Защо?
Предполага се, че това е интерфейс за бързо преглеждане на данни? Да ги повъртите малко?
Да, бързо да видим как работи и просто да построим обобщаваща диаграма. А после да я предадем някъде. При нас имаме собствена система за отчитане, от която просто вземам този запит. Рисувам в Tabix и я изпращам в нашия отчет.
И още един въпрос. Когортен анализ?
Ако имате предложения, ще добавим.
Когато току-що започнахме да ползваме ClickHouse, колко време отне внедряването ClickHouse и приведението в производствено състояние?
Както казах, внедрихме тестов клъстер за много кратки срокове. Разширихме го за два дни. И след това го тестваме още няколко седмици. До производствено състояние стигнахме за около 3 месеца. Но имаме собствен ETL, т.е. инструмент за запис на данни. Той пише навсякъде, където може. Може да пише в MongoDB, Cassandra, MySQL. Да го накараме да пише в ClickHouse беше лесно. Имахме готова инфраструктура за бързо внедряване. След около 3 месеца започнахме да внедряваме първия компонент. За 6 месеца напълно се отказахме от всичко останало. Остана ни само ClickHouse.
Игор, благодаря ти много за доклада. Много ми хареса функционалността за построяване на маршрути върху карти. Планира ли се интеграция с Яндекс.Карти и в частност с персонализираните Яндекс.Карти?
Опитах се да се интегрирам вместо Google map, но не намерих тъмен режим на Яндекс.Карти. Не споменах един фрагмент. Ще се върна, за да допълня.
Слайд – Google map. Там има команда „DRAW_GMAPS“, която рисува картата. Има команда „DRAW_YMAPS“, т.е. може да нарисува Яндекс.Карта. А всъщност под тази команда стои Javascript, т.е. данните, които получавате от ClickHouse могат да бъдат предадени на Javascript, който напишете тук. И на изхода имате област, където трябва да се отрисува. Можете да нарисувате всяка диаграма, т.е. всяка диаграма, карта, можете да отрисувате собствен компонент. Преди това имах друга библиотека за отрисуване на самите графики.
Т.е. има инструмент за персонализиране на функционалността на визуализацията?
Всякакви. Можете да вземете и да промените цвета на тези точки, като ги направите не червени, а сини, зелени.
Благодаря за доклада! Имахте слайд, на който бяха представени алтернативни инструменти за запитвания ClickHouse за изграждане на табла, аналитични отчети. Разбрах, че в момента, когато започнахте да работите с ClickHouse, за тези инструменти не са написани адаптери. Интересно ми е защо решихте да създадете свой собствен инструмент, вместо да напишете адаптер за някакъв готов инструмент? Мисля, че настройката на тестовия редактор е бърза. Защо решихте да работите толкова много?
Тук има интересен момент – фактът е, че аз съм технически директор, а не дата-сайентист. В момента, когато започнахме да внедряваме Druid, в моята пътна карта имаше около 50 % задачи – да изчислим това или да анализираме онова. И стана така, че внедрихме ClickHouse. Започнах да строя, да изчислявам, бързо затворих моята пътна карта. И в този момент осъзнах, че ми липсват знания по Data Science и визуализация на данни. Tabix е вид домашна работа за изучаване на визуализация на данни. Гледах как да допълня Zeppelin. Имам леко нежелание към програмирането му. Redash гледах как да допълня, но ми липсваше нормален редактор. И SuperSet също е написан на езика, който не харесвам особено. Затова реших да създам нещо свое, и ето какво стана.
Игор, приемате ли pull request?
Да.
Благодаря много за доклада! И два въпроса. Първият – не говорите много благоразположено за Javascript. Писахте ли на гол Javascript или все пак използвахте някакъв фреймворк?*
По-добре на гол Javascript.
Какъв фреймворк?
Angular.
Разбирам. И вторият въпрос. Някой път ли сте разглеждали R и *Shiny**?*
Разглеждал съм. Играх се.
Можеше просто да напишете адаптер.
Има такъв. Изглежда общността го е направила, но, както отговорих на предишния въпрос, исках да пробвам сама.
*Не, за визуализация на данни, там има.
Вие казвате, че има нещо такова и то ще ви нарисува график. Отворих книга за визуализация на данни. И си помислих: „Да видим как мога да визуализирам тези данни. Ще напиша сам, за да създам данните.“ И започнах да разбирам по-добре технологията за подаване на данни. А ако бях взел готов компонент, вероятно по-лошо щях да се науча да го ползвам, т.е. самата визуализация. Но така – да, хареса ми R, но още не съм чел книгата „R за начинаещи“.
Спасибо!
Прост въпрос. Има ли възможности бързо да изведем таблица, график?
Може да се изнесе в CSV, в Excel.
Не данни, а готова таблица, готов график? Например, за да покажете на шефа.
Има бутон „Изтегляне“ и бутон „Изтегляне на график в png, в jpg“.
Спасибо!
P.S. Мини-инструкция за инсталиране на tabix
- Изтеглете
- Разпакувайте, копирайте директорията
buildв nginx root_path - Настройте nginx
Източник: habr.com

