{"id":89878,"date":"2020-07-27T01:42:42","date_gmt":"2020-07-26T23:42:42","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-clickhouse-v-realnyh-prilozheniyah-aleksandr-zajczev-2018g"},"modified":"2020-07-27T01:42:42","modified_gmt":"2020-07-26T23:42:42","slug":"teoriya-i-praktika-ispolzovaniya-clickhouse-v-realnyh-prilozheniyah-aleksandr-zajczev-2018g","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-clickhouse-v-realnyh-prilozheniyah-aleksandr-zajczev-2018g","title":{"rendered":"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/b46b964324a3311157d5df737526b1d1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mimo \u017ce danych jest teraz wiele prawie wsz\u0119dzie, analityczne bazy danych nadal s\u0105 do\u015b\u0107 egzotyczne. S\u0142abo je znaj\u0105 i jeszcze gorzej potrafi\u0105 efektywnie wykorzysta\u0107. Wielu wci\u0105\u017c \"je kaktusa\" z MySQL lub PostgreSQL, kt\u00f3re zosta\u0142y zaprojektowane do innych scenariuszy, m\u0119czy si\u0119 z NoSQL lub przep\u0142aca za komercyjne rozwi\u0105zania. ClickHouse zmienia zasady gry i znacz\u0105co obni\u017ca pr\u00f3g wej\u015bcia do \u015bwiata analitycznych DBMS.<\/p>\n<p><\/p>\n<p>Prezentacja z BackEnd Conf 2018 roku, opublikowana za zgod\u0105 prelegenta.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<center><div class=\"youtube-placeholder\" data-id=\"9MwKE30aUPs\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/9MwKE30aUPs\/hqdefault.jpg\" alt=\"Odtwarzaj wideo\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/6c55b639d9703f460d99e0b0b1194507.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKim jestem i dlaczego opowiadam o ClickHouse? Jestem dyrektorem ds. rozwoju w firmie LifeStreet, kt\u00f3ra korzysta z ClickHouse. Ponadto jestem za\u0142o\u017cycielem Altinity. To partner Yandexu, kt\u00f3ry promuje ClickHouse i pomaga Yandexowi uczyni\u0107 ClickHouse bardziej udanym. R\u00f3wnie\u017c ch\u0119tnie dziel\u0119 si\u0119 wiedz\u0105 o ClickHouse. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/36af6acba62271f7aa19dda2eb470870.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I jeszcze nie jestem bratem Piotra Zajcewa. Cz\u0119sto o to pytaj\u0105. Nie, nie jeste\u015bmy bra\u0107mi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/6ca605f97619a1373bb8a92f88d480d5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u201eWszyscy wiedz\u0105\u201d, \u017ce ClickHouse:<\/p>\n<p><\/p>\n<ul>\n<li>Jest bardzo szybki,<\/li>\n<li>Jest bardzo wygodny, <\/li>\n<li>Jest u\u017cywany w Yandexie. <\/li>\n<\/ul>\n<p><\/p>\n<p>Nieco mniej wiadomo, w jakich firmach i jak jest wykorzystywany. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/c097b003bf8ea13b8a3bb765270e99c8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Opowiem wam, do czego, gdzie i jak ClickHouse jest u\u017cywany, poza Yandexem. <\/p>\n<p><\/p>\n<p>Opowiem, jak konkretne zadania s\u0105 rozwi\u0105zywane za pomoc\u0105 ClickHouse w r\u00f3\u017cnych firmach, jakie narz\u0119dzia ClickHouse mo\u017cecie u\u017cy\u0107 do swoich zada\u0144 i jak zosta\u0142y one wykorzystane w r\u00f3\u017cnych firmach.<\/p>\n<p><\/p>\n<p>Wybra\u0142em trzy przyk\u0142ady, kt\u00f3re pokazuj\u0105 ClickHouse z r\u00f3\u017cnych perspektyw. My\u015bl\u0119, \u017ce to b\u0119dzie interesuj\u0105ce.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/d3cab92ceccd6c7d01ca1f28b028803f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pierwsze pytanie: \"Po co potrzebny jest ClickHouse?\". Wydaje si\u0119, \u017ce pytanie jest do\u015b\u0107 oczywiste, ale odpowiedzi jest wi\u0119cej ni\u017c jedna. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/1a4e14cc041a3c01ad0fd2a305aeeab0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Pierwsza odpowied\u017a \u2013 z powodu wydajno\u015bci. ClickHouse jest bardzo szybki. Analizy na ClickHouse r\u00f3wnie\u017c s\u0105 bardzo szybkie. Cz\u0119sto mo\u017cna go u\u017cywa\u0107 tam, gdzie co\u015b innego dzia\u0142a bardzo wolno lub bardzo \u017ale. <\/li>\n<li>Druga odpowied\u017a \u2013 to koszt. A w pierwszej kolejno\u015bci koszt skalowania. Na przyk\u0142ad Vertica \u2013 to \u015bwietna baza danych. Dzia\u0142a bardzo dobrze, je\u015bli nie masz zbyt wielu terabajt\u00f3w danych. Ale gdy mowa o setkach terabajt\u00f3w lub petabajtach, koszt licencji i wsparcia staje si\u0119 do\u015b\u0107 znaczny. I to jest drogie. A ClickHouse jest darmowy. <\/li>\n<li>Trzecia odpowied\u017a to koszty operacyjne. To podej\u015bcie jest nieco z innej perspektywy. RedShift to doskona\u0142y odpowiednik. W RedShift mo\u017cna bardzo szybko opracowa\u0107 rozwi\u0105zanie. B\u0119dzie dzia\u0142a\u0107 dobrze, ale co godzin\u0119, co dzie\u0144 i co miesi\u0105c b\u0119dziesz p\u0142aci\u0107 Amazonowi do\u015b\u0107 du\u017co, poniewa\u017c jest to znacznie drogi serwis. Google BigQuery te\u017c. Je\u015bli kto\u015b go u\u017cywa\u0142, to wie, \u017ce mo\u017cna uruchomi\u0107 kilka zapyta\u0144 i nagle otrzyma\u0107 rachunek na setki dolar\u00f3w. <\/li>\n<\/ul>\n<p><\/p>\n<p>W ClickHouse nie ma tych problem\u00f3w. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/3084a8bd9271f14726d73989946816c5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Gdzie teraz u\u017cywany jest ClickHouse? Opr\u00f3cz Yandex, ClickHouse wykorzystywany jest w wielu r\u00f3\u017cnych przedsi\u0119biorstwach i firmach. <\/p>\n<p><\/p>\n<ul>\n<li>Przede wszystkim jest to analiza aplikacji webowych, tzn. przypadek u\u017cycia, kt\u00f3ry pochodzi z Yandex.<\/li>\n<li>Wiele firm AdTech korzysta z ClickHouse. <\/li>\n<li>Liczne firmy, kt\u00f3re musz\u0105 analizowa\u0107 operacyjne logi z r\u00f3\u017cnych \u017ar\u00f3de\u0142.<\/li>\n<li>Kilka firm wykorzystuje ClickHouse do monitorowania log\u00f3w bezpiecze\u0144stwa. \u0141aduj\u0105 je do ClickHouse, tworz\u0105 raporty, uzyskuj\u0105 potrzebne im wyniki.<\/li>\n<li>Firmy zaczynaj\u0105 go u\u017cywa\u0107 w analizie finansowej, tzn. stopniowo du\u017cy biznes r\u00f3wnie\u017c zbli\u017ca si\u0119 do ClickHouse. <\/li>\n<li>CloudFlare. Je\u015bli kto\u015b \u015bledzi ClickHouse, to pewnie s\u0142ysza\u0142 nazw\u0119 tej firmy. Jest jednym z kluczowych uczestnik\u00f3w ze spo\u0142eczno\u015bci. I maj\u0105 bardzo powa\u017cn\u0105 instalacj\u0119 ClickHouse. Na przyk\u0142ad stworzyli Kafka Engine dla ClickHouse. <\/li>\n<li>Firmy telekomunikacyjne zacz\u0119\u0142y z niego korzysta\u0107. Kilka firm u\u017cywa ClickHouse albo jako proof of concept, albo ju\u017c w produkcji.<\/li>\n<li>Jedna firma u\u017cywa ClickHouse do monitorowania proces\u00f3w produkcyjnych. Testuj\u0105 mikroprocesory, zapisuj\u0105 mn\u00f3stwo parametr\u00f3w, oko\u0142o 2000 cech. A nast\u0119pnie analizuj\u0105 \u2013 dobra partia czy z\u0142a.<\/li>\n<li>Analiza blockchain. Jest taka rosyjska firma, jak Bloxy.info. To analiza sieci ethereum. R\u00f3wnie\u017c zrobili to na ClickHouse. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/8a0c1924a20ed2d15cd0f959e9b3e499.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Przy czym rozmiar nie ma znaczenia. Wiele firm korzysta z jednego ma\u0142ego serwera. I pozwala im to rozwi\u0105za\u0107 ich problemy. A jeszcze wi\u0119cej firm korzysta z du\u017cych klastr\u00f3w z wielu <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/pl\/server\/\"   title=\"serwer\u00f3w\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"1513\">serwer\u00f3w<\/a> lub dziesi\u0105tek serwer\u00f3w. <\/p>\n<p><\/p>\n<p>A je\u015bli przyjrze\u0107 si\u0119 rekordom, to:<\/p>\n<p><\/p>\n<ul>\n<li>Yandex: 500+ serwer\u00f3w, codziennie przechowuj\u0105 tam 25 miliard\u00f3w rekord\u00f3w.<\/li>\n<li>LifeStreet: 60 serwer\u00f3w, oko\u0142o 75 miliard\u00f3w rekord\u00f3w dziennie. Mniej serwer\u00f3w, wi\u0119cej rekord\u00f3w ni\u017c w Yandex. <\/li>\n<li>CloudFlare: 36 serwer\u00f3w, 200 miliard\u00f3w zapis\u00f3w dziennie, kt\u00f3re przechowuj\u0105. Maj\u0105 jeszcze mniej serwer\u00f3w i jeszcze wi\u0119cej danych, kt\u00f3re przechowuj\u0105. <\/li>\n<li>Bloomberg: 102 <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/pl\/server\/dts-los-angeles\/\"   title=\"serwera\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"3643\">serwera<\/a>, oko\u0142o trylion zapis\u00f3w dziennie. Rekordzista pod wzgl\u0119dem zapis\u00f3w.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/49194030b6586221cb17029889ce33da.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Geograficznie to r\u00f3wnie\u017c du\u017co. Ta mapa pokazuje heatmap\u0119, gdzie ClickHouse jest u\u017cywany na \u015bwiecie. Szczeg\u00f3lnie wyr\u00f3\u017cniaj\u0105 si\u0119 Rosja, Chiny, Ameryka. Kraj\u00f3w europejskich jest ma\u0142o. Mo\u017cna wyr\u00f3\u017cni\u0107 4 klastry.<\/p>\n<p><\/p>\n<p>To jest analiza por\u00f3wnawcza, nie trzeba tu szuka\u0107 absolutnych cyfr. To analiza odwiedzaj\u0105cych, kt\u00f3rzy czytaj\u0105 angloj\u0119zyczne materia\u0142y na stronie Altinity, poniewa\u017c nie ma tam materia\u0142\u00f3w w j\u0119zyku rosyjskim. I Rosja, Ukraina, Bia\u0142oru\u015b, czyli rosyjskoj\u0119zyczna cz\u0119\u015b\u0107 spo\u0142eczno\u015bci, to najliczniejsi u\u017cytkownicy. Nast\u0119pnie id\u0105 Stany Zjednoczone i Kanada. Bardzo szybko goni\u0105 Chiny. Jeszcze p\u00f3\u0142 roku temu Chin prawie nie by\u0142o, teraz Chiny ju\u017c wyprzedzi\u0142y Europ\u0119 i dalej rosn\u0105. Stara Europa te\u017c nie pozostaje w tyle, a liderem w u\u017cyciu ClickHouse, co dziwne, jest Francja. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/3a8305c51b1bd62f3467b795402df4ed.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Dlaczego to wszystko opowiadam? \u017beby pokaza\u0107, \u017ce ClickHouse staje si\u0119 standardowym rozwi\u0105zaniem do analizy du\u017cych danych i jest ju\u017c szeroko stosowane.<\/strong> Je\u015bli go u\u017cywasz, jeste\u015b w dobrym nurcie. Je\u015bli jeszcze go nie u\u017cywasz, nie musisz si\u0119 martwi\u0107, \u017ce zostaniesz sam i nikt ci nie pomo\u017ce, poniewa\u017c ju\u017c wiele os\u00f3b si\u0119 tym zajmuje.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/6aa635f3a35034d3af837c78b2c8fe60.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>To s\u0105 przyk\u0142ady rzeczywistego u\u017cycia ClickHouse w kilku firmach. <\/p>\n<p><\/p>\n<ul>\n<li>Pierwszy przyk\u0142ad to sie\u0107 reklamowa: migracja z Vertica na ClickHouse. Znam kilka firm, kt\u00f3re przesz\u0142y z Vertica lub s\u0105 w trakcie przechodzenia. <\/li>\n<li>Drugi przyk\u0142ad to transakcyjne przechowywanie danych w ClickHouse. To przyk\u0142ad zbudowany na antywzorcach. Wszystko, czego nie nale\u017cy robi\u0107 w ClickHouse wed\u0142ug zalece\u0144 deweloper\u00f3w, zosta\u0142o tu zrealizowane. I zosta\u0142o to zrobione tak efektywnie, \u017ce dzia\u0142a. I dzia\u0142a znacznie lepiej ni\u017c typowe rozwi\u0105zanie transakcyjne. <\/li>\n<li>Trzeci przyk\u0142ad to rozproszone obliczenia w ClickHouse. By\u0142o pytanie o to, jak mo\u017cna zintegrowa\u0107 ClickHouse z ekosystemem Hadoop. Poka\u017c\u0119 przyk\u0142ad, jak firma zrobi\u0142a w ClickHouse co\u015b w rodzaju analogowego kontenera map reduce, \u015bledz\u0105c lokalizacj\u0119 danych itd., aby rozwi\u0105za\u0107 bardzo nietrywialne zadanie. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/e08ab5418500599f08d40324ccdfbcd0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>LifeStreet \u2013 to firma Ad Tech, kt\u00f3ra ma wszystkie technologie zwi\u0105zane z sieci\u0105 reklamow\u0105. <\/li>\n<li>Zajmuje si\u0119 optymalizacj\u0105 reklam, programatycznym licytowaniem. <\/li>\n<li>Wiele danych: oko\u0142o 10 miliard\u00f3w zdarze\u0144 dziennie. Przy tym zdarzenia mog\u0105 dzieli\u0107 si\u0119 na kilka podzdarze\u0144.<\/li>\n<li>Mn\u00f3stwo klient\u00f3w korzysta z tych danych, przy czym to nie tylko ludzie, ale znacznie wi\u0119cej \u2013 to r\u00f3\u017cne algorytmy zajmuj\u0105ce si\u0119 programmatic bidding. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/2da99b53eb25f675a2431027f86db934.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Firma przesz\u0142a d\u0142ug\u0105 i wyboist\u0105 drog\u0119. Opowiada\u0142em o tym na HighLoad. Pocz\u0105tkowo LifeStreet migrowa\u0142a z MySQL (po kr\u00f3tkim okresie na Oracle) do Vertica. Mo\u017cna znale\u017a\u0107 opowie\u015b\u0107 na ten temat. <\/p>\n<p><\/p>\n<p>I wszystko wygl\u0105da\u0142o bardzo dobrze, ale szybko sta\u0142o si\u0119 jasne, \u017ce dane rosn\u0105, a Vertica staje si\u0119 kosztowna. Dlatego szukano r\u00f3\u017cnych alternatyw. Niekt\u00f3re z nich zosta\u0142y tu wymienione. Faktycznie przeprowadzili\u015bmy proof of concept, a czasami testy wydajno\u015bci prawie wszystkich baz danych, kt\u00f3re by\u0142y dost\u0119pne na rynku w latach 2013-2016 i mniej wi\u0119cej pasowa\u0142y funkcjonalno\u015bci\u0105. O cz\u0119\u015bci z nich r\u00f3wnie\u017c opowiada\u0142em na HighLoad.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/4bebd2f43892cbef9249ddded1b8a70a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zadanie polega\u0142o na migracji z Vertica w pierwszej kolejno\u015bci, poniewa\u017c dane ros\u0142y. Ros\u0142y eksponencjalnie przez kilka lat. Potem osi\u0105gn\u0119\u0142y plateau, ale mimo to. Przewiduj\u0105c ten wzrost, wymagania biznesowe dotycz\u0105ce obj\u0119to\u015bci danych, na kt\u00f3rych trzeba prowadzi\u0107 analityk\u0119, wskazywa\u0142y, \u017ce wkr\u00f3tce rozmowy b\u0119d\u0105 si\u0119ga\u0107 petabajt\u00f3w. A za petabajty p\u0142aci si\u0119 ju\u017c bardzo drogo, dlatego szukano alternatywy, dok\u0105d odej\u015b\u0107. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/f170a4307168e8560122966eab85c24e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dok\u0105d odej\u015b\u0107? D\u0142ugo nie by\u0142o jasne, dok\u0105d zmierza\u0107, poniewa\u017c z jednej strony s\u0105 komercyjne bazy danych, kt\u00f3re zdaj\u0105 si\u0119 dzia\u0142a\u0107 ca\u0142kiem nie\u017ale. Niekt\u00f3re dzia\u0142aj\u0105 prawie tak samo dobrze jak Vertica, inne gorzej. Ale wszystkie s\u0105 drogie, nie uda\u0142o si\u0119 znale\u017a\u0107 nic ta\u0144szego i lepszego. <\/p>\n<p><\/p>\n<p>Z drugiej strony s\u0105 rozwi\u0105zania open source, kt\u00f3rych jest niewiele, tzn. do analityki mo\u017cna je policzy\u0107 na palcach. S\u0105 darmowe lub tanie, ale dzia\u0142aj\u0105 wolno. Cz\u0119sto brakuje im niezb\u0119dnej i przydatnej funkcjonalno\u015bci.<\/p>\n<p><\/p>\n<p>I do tej pory nic nie \u0142\u0105czy\u0142o tego, co dobre w komercyjnych bazach danych, z tym wszystkim, co darmowe w open source \u2013 nie by\u0142o takiego rozwi\u0105zania. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/abbefbf0d9578b554f81579b87213a50.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nic nie by\u0142o, dop\u00f3ki niespodziewanie Yandex nie wyci\u0105gn\u0105\u0142, jak kr\u00f3lik z kapelusza, ClickHouse. I to by\u0142o niespodziewane rozwi\u0105zanie, do tej pory zadaj\u0105 pytanie: \u201ePo co?\u201d, ale mimo to. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/c88981aace9d5925396ca5171241b7d2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I ju\u017c latem 2016 roku zacz\u0119li\u015bmy ogl\u0105da\u0107, czym jest ClickHouse. Okaza\u0142o si\u0119, \u017ce czasami mo\u017ce by\u0107 szybszy od Vertica. Testowali\u015bmy r\u00f3\u017cne scenariusze na r\u00f3\u017cnych zapytaniach. A je\u015bli zapytanie korzysta\u0142o tylko z jednej tabeli, tzn. bez \u017cadnych join\u00f3w, to ClickHouse by\u0142 dwa razy szybszy od Vertica. <\/p>\n<p><\/p>\n<p>Nie leni\u0142em si\u0119 i spojrza\u0142em na testy Yandexu kilka dni temu. Tam to samo: ClickHouse jest dwa razy szybszy od Vertica, dlatego cz\u0119sto o tym m\u00f3wi\u0105. <\/p>\n<p><\/p>\n<p>Ale je\u015bli w zapytaniach s\u0105 joiny, to sytuacja staje si\u0119 niejednoznaczna. ClickHouse mo\u017ce by\u0107 dwa razy wolniejszy od Vertica. A je\u015bli troch\u0119 poprawimy zapytanie i przepiszemy je, to jest mniej wi\u0119cej r\u00f3wne. Nie\u017ale. I za darmo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/188bf56b72123175a18d2cb97d989a47.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Otrzymuj\u0105c wyniki test\u00f3w i przygl\u0105daj\u0105c si\u0119 temu z r\u00f3\u017cnych perspektyw, LifeStreet przeszed\u0142 na ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/1183b9b7681916686c52786fc95ccb45.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>To jest ju\u017c rok 2016, przypominam. To by\u0142o jak w anegdocie o myszach, kt\u00f3re p\u0142aka\u0142y i k\u0142u\u0142y si\u0119, ale nadal jad\u0142y kaktusa. To by\u0142o szczeg\u00f3\u0142owo opisane, s\u0105 na ten temat filmy itd. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/993052ed83dc295c3777e614c7703456.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dlatego nie b\u0119d\u0119 szczeg\u00f3\u0142owo o tym opowiada\u0142, powiem tylko o wynikach i kilku interesuj\u0105cych rzeczach, o kt\u00f3rych wtedy nie m\u00f3wi\u0142em. <\/p>\n<p><\/p>\n<p>Wyniki to:<\/p>\n<p><\/p>\n<ul>\n<li>Udana migracja i od ponad roku system dzia\u0142a ju\u017c w produkcji. <\/li>\n<li>Wydajno\u015b\u0107 i elastyczno\u015b\u0107 wzros\u0142y. Z 10 miliard\u00f3w rekord\u00f3w, kt\u00f3re mogli\u015bmy sobie pozwoli\u0107 przechowywa\u0107 w ci\u0105gu dnia, a to przez kr\u00f3tki czas, LifeStreet przechowuje teraz 75 miliard\u00f3w rekord\u00f3w dziennie i mo\u017ce to robi\u0107 przez 3 miesi\u0105ce i d\u0142u\u017cej. Je\u015bli liczy\u0107 w szczycie, to rejestruje to do miliona zdarze\u0144 na sekund\u0119. Ponad milion zapyta\u0144 SQL dziennie trafia do tego systemu, g\u0142\u00f3wnie od r\u00f3\u017cnych robot\u00f3w. <\/li>\n<li>Mimo \u017ce dla ClickHouse zacz\u0119to u\u017cywa\u0107 wi\u0119cej serwer\u00f3w ni\u017c dla Vertica, oszcz\u0119dno\u015bci uzyskano na sprz\u0119cie, poniewa\u017c w Vertica u\u017cywano do\u015b\u0107 drogich dysk\u00f3w SAS. W ClickHouse u\u017cywano SATA. A dlaczego? Poniewa\u017c w Vertica insert jest synchronizowany. Synchronizacja wymaga, aby dyski zbytnio nie spowalnia\u0142y, a tak\u017ce, aby sie\u0107 nie by\u0142a zbyt powolna, co jest do\u015b\u0107 drog\u0105 operacj\u0105. A w ClickHouse insert jest asynchroniczny. Co wi\u0119cej, zawsze mo\u017cna pisa\u0107 lokalnie, nie ma dodatkowych koszt\u00f3w, wi\u0119c dane w ClickHouse mo\u017cna wstawia\u0107 znacznie szybciej ni\u017c w Vertica, nawet na nie najszybszych dyskach. A w przypadku odczytu jest to mniej wi\u0119cej podobne. Odczyt na SATA, je\u015bli s\u0105 w RAID, jest wystarczaj\u0105co szybki. <\/li>\n<li>Nieograniczone licencj\u0105, tzn. 3 petabajty danych na 60 serwer\u00f3w (20 serwer\u00f3w to jedna replikacja) i 6 bilion\u00f3w rekord\u00f3w w faktach i agregatach. Nic podobnego nie mog\u0142o pozwoli\u0107 sobie Vertica. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/f461cdc12917ee655655dd7eb9c32bb2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Teraz przechodz\u0119 do praktycznych aspekt\u00f3w w tym przyk\u0142adzie.<\/p>\n<p><\/p>\n<ul>\n<li>Pierwszym jest efektywna schematy. Od schemy zale\u017cy bardzo wiele. <\/li>\n<li>Drugim jest generowanie efektywnego SQL.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/e7dc2a217e77c8794ff6e8a754e78c85.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Typowe zapytanie OLAP to select. Cz\u0119\u015b\u0107 kolumn trafia do group by, cz\u0119\u015b\u0107 kolumn do funkcji agreguj\u0105cych. Jest where, kt\u00f3re mo\u017cna przedstawi\u0107 jako przekr\u00f3j kostki. Ca\u0142e group by mo\u017cna przedstawi\u0107 jako projekcj\u0119. I dlatego nazywa si\u0119 to wielowymiarow\u0105 analiz\u0105 danych. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/a03a2d7fd28905ae83183346f0c673e2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cz\u0119sto modeluje si\u0119 to w postaci schemy gwiazdy, gdy w centrum znajduje si\u0119 fakt, a cechy tego faktu s\u0105 rozmieszczone po bokach, w promieniach. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/d9671af4b39cc83e1ae49e6fd75d0e02.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Z punktu widzenia projektowania fizycznego, tego jak to si\u0119 uk\u0142ada w tabeli, zazwyczaj tworzy si\u0119 znormalizowan\u0105 wersj\u0119. Mo\u017cesz denormalizowa\u0107, ale to jest kosztowne pod wzgl\u0119dem dysku i niezbyt efektywne w zapytaniach. Dlatego zazwyczaj robi si\u0119 znormalizowan\u0105 wersj\u0119, tzn. tabel\u0119 fakt\u00f3w i wiele, wiele tabel wymiarowych. <\/p>\n<p><\/p>\n<p>Jednak w ClickHouse to dzia\u0142a s\u0142abo. S\u0105 dwa powody: <\/p>\n<p><\/p>\n<ul>\n<li>Pierwszy \u2013 to dlatego, \u017ce ClickHouse nie ma zbyt dobrych join\u00f3w, to znaczy joiny s\u0105, ale s\u0105 kiepskie. Na razie kiepskie. <\/li>\n<li>Drugi \u2013 to fakt, \u017ce tabele nie s\u0105 aktualizowane. Zazwyczaj w tych tabelach, kt\u00f3re otaczaj\u0105 schemat gwiazdy, trzeba co\u015b zmienia\u0107. Na przyk\u0142ad nazwa klienta, nazwa firmy itd. I to nie dzia\u0142a. <\/li>\n<\/ul>\n<p><\/p>\n<p>Istnieje wyj\u015bcie z tej sytuacji w ClickHouse. Nawet dwa: <\/p>\n<p><\/p>\n<ul>\n<li>Pierwsze \u2013 to u\u017cycie s\u0142ownik\u00f3w. S\u0142owniki zewn\u0119trzne to to, co pomaga w 99% rozwi\u0105za\u0107 problem ze schem\u0105 gwiazdy, z aktualizacjami i innymi rzeczami. <\/li>\n<li>Drugie \u2013 to u\u017cycie tablic. Tablice r\u00f3wnie\u017c pomagaj\u0105 pozby\u0107 si\u0119 join\u00f3w i problem\u00f3w z normalizacj\u0105. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/775972cc412651600799173407384492.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Nie potrzebujesz join\u00f3w. <\/li>\n<li>Aktualizowalne. Od marca 2018 roku pojawi\u0142a si\u0119 niedokumentowana mo\u017cliwo\u015b\u0107 (w dokumentacji nie znajdziesz o tym) cz\u0119\u015bciowego aktualizowania s\u0142ownik\u00f3w, tzn. tych rekord\u00f3w, kt\u00f3re si\u0119 zmieni\u0142y. Praktycznie \u2013 to jak tabela.<\/li>\n<li>Zawsze w pami\u0119ci, dlatego joiny ze s\u0142ownikiem dzia\u0142aj\u0105 szybciej ni\u017c w przypadku, gdyby to by\u0142a tabela, kt\u00f3ra le\u017cy na dysku, a jeszcze nie wiadomo, czy jest w cache, prawdopodobnie nie. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/f73176a650b6d885011e3265c2af2fc3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>R\u00f3wnie\u017c nie potrzebujesz join\u00f3w.<\/li>\n<li>To kompaktowe przedstawienie 1 do wielu. <\/li>\n<li>I moim zdaniem, tablice s\u0105 stworzone dla geek\u00f3w. To funkcje lambda i inne. <\/li>\n<\/ul>\n<p><\/p>\n<p>To nie jest pusta deklaracja. To bardzo pot\u0119\u017cna funkcjonalno\u015b\u0107, kt\u00f3ra pozwala robi\u0107 wiele rzeczy w spos\u00f3b prosty i elegancki. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/5d813952ca8f3da7a74c6f2a15d80a9b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Typowe przyk\u0142ady, kt\u00f3re pomagaj\u0105 rozwi\u0105zywa\u0107 zadania z u\u017cyciem tablic. Te przyk\u0142ady s\u0105 proste i wystarczaj\u0105co ilustracyjne:<\/p>\n<p><\/p>\n<ul>\n<li>Wyszukiwanie po tagach. Je\u015bli masz hashtagi i chcesz znale\u017a\u0107 jakie\u015b wpisy po ha\u015ble. <\/li>\n<li>Wyszukiwanie po parach klucz-warto\u015b\u0107. R\u00f3wnie\u017c istniej\u0105 jakie\u015b atrybuty z warto\u015bciami. <\/li>\n<li>Przechowywanie list kluczy, kt\u00f3re musisz przet\u0142umaczy\u0107 na co\u015b innego.<\/li>\n<\/ul>\n<p><\/p>\n<p>Wszystkie te zadania mo\u017cna rozwi\u0105za\u0107 bez tablic. Tagi mo\u017cna zapisa\u0107 w jednym wierszu i wybra\u0107 u\u017cywaj\u0105c wyra\u017cenia regularnego lub umie\u015bci\u0107 w osobnej tabeli, ale wtedy trzeba b\u0119dzie robi\u0107 z\u0142\u0105czenia (join).<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/dbbf90eee098c4564206532f24156823.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A w ClickHouse nie trzeba nic robi\u0107, wystarczy opisa\u0107 tablic\u0119 string dla hashtag\u00f3w lub stworzy\u0107 zagnie\u017cd\u017con\u0105 struktur\u0119 dla system\u00f3w typu klucz-warto\u015b\u0107.<\/p>\n<p><\/p>\n<p>Zagnie\u017cd\u017cona struktura \u2013 mo\u017ce to nie jest najszcz\u0119\u015bliwsza nazwa. To dwa tablice, kt\u00f3re maj\u0105 wsp\u00f3ln\u0105 cz\u0119\u015b\u0107 w nazwie i niekt\u00f3re powi\u0105zane cechy. <\/p>\n<p><\/p>\n<p>I wyszukiwanie po tagu jest bardzo proste. Istnieje funkcja <code>has<\/code>, kt\u00f3ra sprawdza, czy w tablicy znajduje si\u0119 dany element. I to wszystko, znale\u017ali\u015bmy wszystkie wpisy, kt\u00f3re odnosz\u0105 si\u0119 do naszej konferencji.<\/p>\n<p><\/p>\n<p>Wyszukiwanie po subid jest nieco bardziej skomplikowane. Musimy najpierw znale\u017a\u0107 indeks klucza, a potem wzi\u0105\u0107 element z tym indeksem i sprawdzi\u0107, czy ta warto\u015b\u0107 jest taka, jakiego potrzebujemy. Niemniej jednak to wci\u0105\u017c bardzo proste i kompaktowe.<\/p>\n<p><\/p>\n<p>Wyra\u017cenie regularne, kt\u00f3re chcia\u0142by\u015b napisa\u0107, gdyby\u015b to wszystko przechowywa\u0142 w jednym wierszu, by\u0142oby po pierwsze, nieczytelne. A po drugie, dzia\u0142a\u0142oby znacznie d\u0142u\u017cej ni\u017c dwa tablice. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/17664c3121b2b0d33188adbfaa653d4e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Inny przyk\u0142ad. Masz tablic\u0119, w kt\u00f3rej przechowujesz identyfikatory. I mo\u017cesz je przet\u0142umaczy\u0107 na imiona. Funkcja <code>arrayMap<\/code>. To typowa funkcja lambda. Przekazujesz do niej wyra\u017cenia lambda. I dla ka\u017cdego identyfikatora z s\u0142ownika wyci\u0105ga warto\u015b\u0107 imienia.<\/p>\n<p><\/p>\n<p>Podobnie mo\u017cna zrealizowa\u0107 wyszukiwanie. Przekazujesz funkcj\u0119 predykatu, kt\u00f3ra sprawdza, czemu odpowiadaj\u0105 elementy. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/146917b71a35d38a550cd9accf6ab2f7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Te rzeczy znacznie upraszczaj\u0105 schemat i rozwi\u0105zuj\u0105 wiele problem\u00f3w. <\/p>\n<p><\/p>\n<p>Ale nast\u0119pny problem, z kt\u00f3rym si\u0119 spotkali\u015bmy i o kt\u00f3rym chcia\u0142bym wspomnie\u0107, to efektywne zapytania. <\/p>\n<p><\/p>\n<ul>\n<li>W ClickHouse nie ma planera zapyta\u0144. Wcale go nie ma. <\/li>\n<li>Niemniej jednak z\u0142o\u017cone zapytania musz\u0105 by\u0107 planowane. W jakich przypadkach? <\/li>\n<li>Je\u015bli zapytanie zawiera wiele po\u0142\u0105cze\u0144 (join), kt\u00f3re owijasz w podzapytania. I kolejno\u015b\u0107 ich wykonania ma znaczenie. <\/li>\n<li>Po drugie, je\u015bli zapytanie jest rozproszone. Poniewa\u017c w rozproszonym zapytaniu tylko najbli\u017csze podzapytanie jest wykonywane w spos\u00f3b rozproszony, a wszystko inne jest przekazywane na jeden serwer, do kt\u00f3rego si\u0119 pod\u0142\u0105czasz i wykonywane tam. Dlatego je\u015bli masz rozproszone zapytania z wieloma po\u0142\u0105czeniami (join), musisz wybiera\u0107 kolejno\u015b\u0107. <\/li>\n<\/ul>\n<p><\/p>\n<p>Nawet w bardziej prostych przypadkach czasami warto wykona\u0107 prac\u0119 planisty i nieco przepisa\u0107 zapytania. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/217d422b429e8b4bc13abbf0efdf6be1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Oto przyk\u0142ad. Po lewej stronie zapytanie, kt\u00f3re pokazuje pi\u0119\u0107 najlepszych kraj\u00f3w. Wykonuje si\u0119 to przez 2,5 sekundy, moim zdaniem. A po prawej stronie to samo zapytanie, ale nieco przepisane. Zamiast grupowa\u0107 wed\u0142ug wiersza, zacz\u0119li\u015bmy grupowa\u0107 wed\u0142ug klucza (int). I to jest szybsze. A potem po\u0142\u0105czyli\u015bmy wyniki ze s\u0142ownikiem. Zamiast 2,5 sekundy zapytanie wykonuje si\u0119 w 1,5 sekundy. To dobrze. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/f19fb7d7f0397a3b38b2a3bd179c156b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Podobny przyk\u0142ad z przepisywaniem filtr\u00f3w. Tutaj zapytanie dotycz\u0105ce Rosji. Wykonuje si\u0119 przez 5 sekund. Je\u015bli przepiszemy je w taki spos\u00f3b, \u017ce b\u0119dziemy por\u00f3wnywa\u0107 ponownie nie wiersze, a liczby z jakim\u015b zbiorem tych kluczy, kt\u00f3re odnosz\u0105 si\u0119 do Rosji, to b\u0119dzie znacznie szybciej. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/0c1dd1f317133d1d106ffef85f337079.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jest wiele takich sztuczek. I pozwalaj\u0105 one znacznie przyspieszy\u0107 zapytania, kt\u00f3re wydaj\u0105 si\u0119 ju\u017c dzia\u0142a\u0107 szybko, lub, przeciwnie, dzia\u0142aj\u0105 wolno. Mo\u017cna je zrobi\u0107 jeszcze szybciej.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/25b132790b03f239e38237af5e92ab63.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Maksymalne obci\u0105\u017cenie w trybie rozproszonym. <\/li>\n<li>Sortowanie wed\u0142ug minimalnych typ\u00f3w, jak to robi\u0142em wed\u0142ug int\u00f3w. <\/li>\n<li>Je\u015bli s\u0105 jakie\u015b po\u0142\u0105czenia (join), s\u0142owniki, lepiej zrobi\u0107 to na samym ko\u0144cu, gdy masz ju\u017c dane przynajmniej cz\u0119\u015bciowo pogrupowane, wtedy operacja po\u0142\u0105czenia (join) lub wezwanie s\u0142ownika b\u0119dzie wywo\u0142ywane mniej razy i b\u0119dzie to szybsze. <\/li>\n<li>Zamiana filtr\u00f3w. <\/li>\n<\/ul>\n<p><\/p>\n<p>S\u0105 jeszcze inne techniki, a nie tylko te, kt\u00f3re zademonstrowa\u0142em. I wszystkie one czasami pozwalaj\u0105 znacznie przyspieszy\u0107 wykonanie zapyta\u0144.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/175832796bee525909d8875bd723a881.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Przechodzimy do nast\u0119pnego przyk\u0142adu. Firma X z USA. Co ona robi? <\/p>\n<p><\/p>\n<p>By\u0142o zadanie: <\/p>\n<p><\/p>\n<ul>\n<li>Offline powi\u0105zanie transakcji reklamy. <\/li>\n<li>Modelowanie r\u00f3\u017cnych modeli powi\u0105zania. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/0136b71a1205512d86f13e86761146f4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na czym polega scenariusz?<\/p>\n<p><\/p>\n<p>Zwyk\u0142y u\u017cytkownik odwiedza stron\u0119, na przyk\u0142ad 20 razy w miesi\u0105cu z r\u00f3\u017cnych og\u0142osze\u0144 lub po prostu czasami wraca bez \u017cadnych og\u0142osze\u0144, poniewa\u017c pami\u0119ta t\u0119 stron\u0119. Ogl\u0105da r\u00f3\u017cne produkty, wk\u0142ada je do koszyka, a potem je wyjmuje. A na ko\u0144cu czego\u015b kupuje. <\/p>\n<p><\/p>\n<p>S\u0142uszne pytania: \"Komu nale\u017cy zap\u0142aci\u0107 za reklam\u0119, je\u015bli jest to konieczne?\" oraz \"Jaka reklama na niego wp\u0142yn\u0119\u0142a, je\u015bli wp\u0142yn\u0119\u0142a?\". To znaczy, dlaczego kupi\u0142 i jak sprawi\u0107, by ludzie podobni do niego r\u00f3wnie\u017c kupowali?<\/p>\n<p><\/p>\n<p>Aby rozwi\u0105za\u0107 ten problem, nale\u017cy poprawnie powi\u0105za\u0107 zdarzenia, kt\u00f3re wyst\u0119puj\u0105 na stronie internetowej, czyli jako\u015b je ze sob\u0105 po\u0142\u0105czy\u0107. Nast\u0119pnie nale\u017cy je przes\u0142a\u0107 do analizy do DWH. Na podstawie tej analizy rozwija si\u0119 modele, kt\u00f3rym i jakie reklamy pokazywa\u0107.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/e53ec81ce89150697d0eca4d72886638.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Transakcja reklamowa to zestaw powi\u0105zanych zdarze\u0144 u\u017cytkownika, kt\u00f3re zaczynaj\u0105 si\u0119 od wy\u015bwietlenia og\u0142oszenia, nast\u0119pnie co\u015b si\u0119 dzieje, potem mo\u017ce by\u0107 zakup, a nast\u0119pnie mog\u0105 wyst\u0105pi\u0107 dodatkowe zakupy w ramach zakupu. Na przyk\u0142ad, je\u015bli to jest aplikacja mobilna lub gra mobilna, to zazwyczaj instalacja aplikacji jest darmowa, ale je\u015bli co\u015b dalej si\u0119 robi, mog\u0105 by\u0107 potrzebne pieni\u0105dze. Im wi\u0119cej osoba wyda w aplikacji, tym jest ona cenniejsza. Ale trzeba to wszystko powi\u0105za\u0107. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/a2213613f1ef660409124ef8bcdd4fe3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Istnieje wiele modeli powi\u0105za\u0144. <\/p>\n<p><\/p>\n<p>Najpopularniejsze z nich to:<\/p>\n<p><\/p>\n<ul>\n<li>Ostatnia interakcja, gdzie interakcja to albo klikni\u0119cie, albo wy\u015bwietlenie.<\/li>\n<li>Pierwsza interakcja, czyli pierwsza rzecz, kt\u00f3ra przyci\u0105gn\u0119\u0142a osob\u0119 na stron\u0119.<\/li>\n<li>Liniowa kombinacja \u2013 wszystkim r\u00f3wno. <\/li>\n<li>Wygasanie.<\/li>\n<li>I inne. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/9523307d557e094d981da5b525ed0b59.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A jak to wszystko dzia\u0142a\u0142o na pocz\u0105tku? By\u0142 Runtime i Cassandra. Cassandra by\u0142a u\u017cywana jako pami\u0119\u0107 transakcji, tzn. przechowywano w niej wszystkie powi\u0105zane transakcje. I gdy przychodzi jakie\u015b zdarzenie do Runtime, na przyk\u0142ad wy\u015bwietlenie jakiej\u015b strony czy co\u015b innego, to wykonywano zapytanie do Cassandry \u2013 czy taka osoba istnieje, czy nie. Nast\u0119pnie pobierano transakcje, kt\u00f3re si\u0119 do niej odnosz\u0105. I nast\u0119powa\u0142o powi\u0105zanie.<\/p>\n<p><\/p>\n<p>I je\u015bli mia\u0142e\u015b szcz\u0119\u015bcie, \u017ce w zapytaniu znajduje si\u0119 id transakcji, to jest to \u0142atwe. Ale zwykle nie ma szcz\u0119\u015bcia. Dlatego trzeba by\u0142o znale\u017a\u0107 ostatni\u0105 transakcj\u0119 lub transakcj\u0119 z ostatnim klikni\u0119ciem itd. <\/p>\n<p><\/p>\n<p>I to wszystko dzia\u0142a\u0142o bardzo dobrze, dop\u00f3ki powi\u0105zanie opiera\u0142o si\u0119 na ostatnim klikni\u0119ciu. Poniewa\u017c mamy, powiedzmy, 10 milion\u00f3w klikni\u0119\u0107 dziennie, co daje 300 milion\u00f3w miesi\u0119cznie, je\u015bli ustawimy okno na miesi\u0105c. A poniewa\u017c w Cassandra wszystko musi by\u0107 w pami\u0119ci, aby dzia\u0142a\u0142o szybko, poniewa\u017c wymagana jest szybka odpowied\u017a Runtime, to potrzebnych by\u0142o oko\u0142o 10-15 serwer\u00f3w. <\/p>\n<p><\/p>\n<p>A kiedy chcieli\u015bmy powi\u0105za\u0107 transakcj\u0119 z danymi wy\u015bwietleniami, to od razu zacz\u0119\u0142o by\u0107 mniej weso\u0142o. Dlaczego? Wida\u0107, \u017ce trzeba przechowywa\u0107 30 razy wi\u0119cej zdarze\u0144. A co za tym idzie, potrzebnych jest 30 razy wi\u0119cej serwer\u00f3w. I okazuje si\u0119, \u017ce to jaka\u015b astronomiczna liczba. Utrzymanie do 500 serwer\u00f3w, aby realizowa\u0107 powi\u0105zania, podczas gdy w Runtime serwer\u00f3w jest znacznie mniej, to nie jest w\u0142a\u015bciwa liczba. Zacz\u0119li\u015bmy my\u015ble\u0107, co zrobi\u0107. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/7af35f1ade680232cc83a6887891bc5c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I dotarli\u015bmy do ClickHouse. A jak to zrobi\u0107 w ClickHouse? Na pierwszy rzut oka wydaje si\u0119, \u017ce to zbi\u00f3r antywzor\u00f3w. <\/p>\n<p><\/p>\n<ul>\n<li>Transakcja ro\u015bnie, podpinamy do niej coraz to nowe zdarzenia, czyli jest mutowalna, a ClickHouse nie radzi sobie z obiektami mutowalnymi. <\/li>\n<li>Kiedy odwiedzaj\u0105cy przychodzi do nas, musimy wyci\u0105gn\u0105\u0107 jego transakcje na podstawie klucza, jego visit id. To r\u00f3wnie\u017c jest zapytanie punktowe, a w ClickHouse tak si\u0119 nie robi. Zwykle w ClickHouse wykonywane s\u0105 du\u017ce skany, a tutaj musimy wyci\u0105gn\u0105\u0107 kilka rekord\u00f3w. Te\u017c antywz\u00f3r. <\/li>\n<li>Ponadto transakcja by\u0142a w JSON, ale nie chcieli\u015bmy jej przepisywa\u0107, wi\u0119c chcieli\u015bmy przechowywa\u0107 JSON w niestrukturalny spos\u00f3b, a je\u015bli trzeba, to co\u015b z niego wydobywa\u0107. I to r\u00f3wnie\u017c jest antywz\u00f3r. <\/li>\n<\/ul>\n<p><\/p>\n<p>Czyli zestaw antywzor\u00f3w. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/2473129a5880ee3172b8ab7bf4afc376.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jednak uda\u0142o si\u0119 stworzy\u0107 system, kt\u00f3ry dzia\u0142a\u0142 bardzo dobrze. <\/p>\n<p><\/p>\n<p>Co zrobiono? Pojawi\u0142 si\u0119 ClickHouse, do kt\u00f3rego wgrywano logi podzielone na rekordy. Pojawi\u0142a si\u0119 us\u0142uga atrybut\u00f3w, kt\u00f3ra pozyskiwa\u0142a logi z ClickHouse. Nast\u0119pnie dla ka\u017cdego rekordu na podstawie visit id pozyskiwa\u0142a transakcje, kt\u00f3re mog\u0142y by\u0107 jeszcze nieprzetworzone, oraz dodatkowo snapshoty, czyli ju\u017c powi\u0105zane transakcje, a dok\u0142adniej wyniki wcze\u015bniejszej pracy. Na ich podstawie tworzy\u0142em logik\u0119, wybiera\u0142em odpowiedni\u0105 transakcj\u0119, pod\u0142\u0105cza\u0142em nowe zdarzenia. Znowu zapisywa\u0142em w logu. Log wraca\u0142 do ClickHouse, czyli to by\u0142a stale cykliczna system. Poza tym trafia\u0142 do DWH, aby tam to analizowa\u0107. <\/p>\n<p><\/p>\n<p>W tej formie to nie dzia\u0142a\u0142o zbyt dobrze. Aby u\u0142atwi\u0107 ClickHouse, gdy pojawia\u0142o si\u0119 zapytanie po ID wizyty, grupowano te zapytania w bloki po 1000-2000 ID wizyt i wyci\u0105gano dla 1000-2000 os\u00f3b wszystkie transakcje. I wtedy to zadzia\u0142a\u0142o.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/d920ce231e6e4b5fd5b27ab28f848aed.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Je\u015bli zajrzymy do wn\u0119trza ClickHouse, to s\u0105 tam tylko 3 g\u0142\u00f3wne tabele, kt\u00f3re to obs\u0142uguj\u0105. <\/p>\n<p><\/p>\n<p>Pierwsza tabela, do kt\u00f3rej trafiaj\u0105 logi, jest zalewana logami prawie bez przetwarzania.<\/p>\n<p><\/p>\n<p>Druga tabela. Przez widok zmaterializowany z tych log\u00f3w wyci\u0105gano zdarzenia, kt\u00f3re jeszcze nie by\u0142y przypisane, czyli niezwi\u0105zane. I przez widok zmaterializowany z tych log\u00f3w wyci\u0105gano transakcje do budowy zrzutu. To znaczy, specjalny widok zmaterializowany budowa\u0142 zrzut, a dok\u0142adnie ostatni zgromadzony stan transakcji. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/12b0adb691f483923a6c35bb6e4a5017.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tutaj jest napisany tekst w SQL. Chcia\u0142bym skomentowa\u0107 kilka wa\u017cnych rzeczy w tym kontek\u015bcie. <\/p>\n<p><\/p>\n<p>Pierwsza wa\u017cna rzecz \u2013 to mo\u017cliwo\u015b\u0107 wyci\u0105gania kolumn z json w ClickHouse. To znaczy, w ClickHouse istniej\u0105 pewne metody pracy z json. S\u0105 one bardzo, bardzo prymitywne. <\/p>\n<p><\/p>\n<p>visitParamExtractInt pozwala na wyci\u0105ganie atrybut\u00f3w z json, to znaczy pierwsze trafienie dzia\u0142a. Dzi\u0119ki temu mo\u017cna wyci\u0105gn\u0105\u0107 ID transakcji lub ID wizyty. To jest jedno. <\/p>\n<p><\/p>\n<p>Po drugie \u2013 tutaj u\u017cyto sprytnego pola zmaterializowanego. Co to oznacza? Oznacza to, \u017ce nie mo\u017cna go wk\u0142ada\u0107 do tabeli, to znaczy, \u017ce nie jest wstawiane, jest obliczane i przechowywane podczas wstawiania. Podczas wstawiania ClickHouse wykonuje prac\u0119 za ciebie. I ju\u017c wyci\u0105gane jest z json to, co potem b\u0119dzie potrzebne.<\/p>\n<p><\/p>\n<p>W tym przypadku widok zmaterializowany \u2013 to dla nieprzetworzonych wierszy. I w\u0142a\u015bnie wykorzystuje pierwsz\u0105 tabel\u0119 z praktycznie surowymi logami. Co robi? Po pierwsze, zmienia sortowanie, to znaczy, \u017ce sortowanie teraz odbywa si\u0119 wed\u0142ug ID wizyty, poniewa\u017c musimy szybko wyci\u0105ga\u0107 transakcj\u0119 konkretnej osoby. <\/p>\n<p><\/p>\n<p>Druga wa\u017cna rzecz \u2013 to index_granularity. Je\u015bli widzia\u0142e\u015b MergeTree, to zwykle domy\u015blnie ustawia si\u0119 index_granularity na 8192. Co to oznacza? To jest parametr rzadko\u015bci indeksu. W ClickHouse indeks jest rzadki, nigdy nie indeksuje ka\u017cdej rekord. Robi to co 8192. I to jest dobre, gdy potrzebujesz policzy\u0107 du\u017co danych, ale \u017ale, gdy troch\u0119, poniewa\u017c pojawia si\u0119 du\u017cy overhead. A je\u015bli zmniejszamy index granularity, to zmniejszamy overhead. Nie mo\u017cna go zmniejszy\u0107 do jedno\u015bci, poniewa\u017c mo\u017ce zabrakn\u0105\u0107 pami\u0119ci. Indeks zawsze przechowywany jest w pami\u0119ci. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/5fe303061977cad64e6c0333b125d595.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A snapshot uses some other interesting features of ClickHouse.<\/p>\n<p><\/p>\n<p>Firstly, there is AggregatingMergeTree. The AggregatingMergeTree stores the argMax, i.e., this is the state of the transaction corresponding to the last timestamp. Transactions are continuously generated for a given visitor. In the most recent state of this transaction, we added an event, and we have a new state. It went back into ClickHouse. And through argMax in this materialized view, we can always obtain the current state.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/d1b87301ab5206a36bf035679f79d35a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>The binding is 'detached' from the Runtime. <\/li>\n<li>Up to 3 billion transactions are stored and processed monthly. This is an order of magnitude more than what was in Cassandra, i.e., in a typical transactional system. <\/li>\n<li>A cluster of 2x5 ClickHouse servers. 5 servers, and each server has a replica. This is even less than what was in Cassandra in order to perform click-based attribution, while here we use impression-based. That is, instead of increasing the number of servers by 30 times, they managed to reduce it. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/583779fe9e133df519411e2256401eb3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>And the last example is a financial company Y that analyzed the correlations of stock price changes. <\/p>\n<p><\/p>\n<p>And the task was as follows:<\/p>\n<p><\/p>\n<ul>\n<li>There are approximately 5,000 stocks. <\/li>\n<li>Quotes are known every 100 milliseconds. <\/li>\n<li>Data has accumulated over 10 years. Obviously, some companies have more data, and some have less. <\/li>\n<li>In total, about 100 billion rows. <\/li>\n<\/ul>\n<p><\/p>\n<p>And it was necessary to calculate the correlation of changes. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/b02051e6cadec8c51e7f6e351ef903f9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Here are two stocks and their quotes. If one goes up and the other goes up, that is a positive correlation, i.e., one rises and the other rises. If one goes up, as at the end of the graph, and the other goes down, that is a negative correlation, i.e., when one rises, the other falls. <\/p>\n<p><\/p>\n<p>By analyzing these mutual changes, predictions can be made in the financial market. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/31329cf7523eef6a167632d281a634ce.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>But the task is complicated. So what is done for this? We have 100 billion records that contain: time, stock, and price. First, we need to calculate the runningDifference of the price algorithm 100 billion times. RunningDifference is a function in ClickHouse that sequentially computes the difference between two rows. <\/p>\n<p><\/p>\n<p>After that, we need to calculate the correlation, and moreover, the correlation must be calculated for each pair. For 5,000 stocks, there are 12.5 million pairs. And that\u2019s a lot, i.e., we need to compute such a correlation function 12.5 times. <\/p>\n<p><\/p>\n<p>Je\u015bli kto\u015b zapomnia\u0142, to \u035ex i \u035ey to oczekiwana warto\u015b\u0107 dla pr\u00f3bki. Oznacza to, \u017ce trzeba nie tylko obliczy\u0107 pierwiastki i sumy, ale r\u00f3wnie\u017c wewn\u0105trz tych sum obliczy\u0107 kolejne sumy. Nale\u017cy wykona\u0107 mn\u00f3stwo oblicze\u0144 12,5 miliona razy, a tak\u017ce pogrupowa\u0107 je wed\u0142ug godzin. A godzin mamy te\u017c sporo. I trzeba to zrobi\u0107 w ci\u0105gu 60 sekund. To \u017cart. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/567a07f586a824c91671820fe21ec305.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Trzeba by\u0142o si\u0119 spieszy\u0107, bo wszystko dzia\u0142a\u0142o bardzo, bardzo wolno, zanim pojawi\u0142 si\u0119 ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/3eca1af4c3f25ff4b23fce9b84e16659.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pr\u00f3bowali oblicza\u0107 to na Hadoop, na Spark, na Greenplum. I wszystko to by\u0142o bardzo wolne lub drogie. To znaczy, mo\u017cna by\u0142o to jako\u015b obliczy\u0107, ale potem by\u0142o to kosztowne. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/37608c7e87ddb9a7d54854643044c369.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A potem pojawi\u0142 si\u0119 ClickHouse i wszystko sta\u0142o si\u0119 du\u017co lepsze. <\/p>\n<p><\/p>\n<p>Przypominam, mamy problem z lokalno\u015bci\u0105 danych, dlatego nie mo\u017cemy lokalizowa\u0107 korelacji. Nie mo\u017cemy z\u0142o\u017cy\u0107 cz\u0119\u015bci danych na jednym serwerze, a cz\u0119\u015bci na drugim i policzy\u0107; wszystkie dane musz\u0105 by\u0107 wsz\u0119dzie. <\/p>\n<p><\/p>\n<p>Co zrobili? Pocz\u0105tkowo dane by\u0142y lokalizowane. Na ka\u017cdym z serwer\u00f3w przechowywane s\u0105 dane dotycz\u0105ce wyceny okre\u015blonego zestawu akcji. I nie zachodz\u0105 na siebie. Dlatego mo\u017cna jednocze\u015bnie i niezale\u017cnie obliczy\u0107 logReturn, wszystko to dzieje si\u0119 r\u00f3wnolegle i roz\u0142o\u017cone. <\/p>\n<p><\/p>\n<p>Nast\u0119pnie postanowili te dane zmniejszy\u0107, nie trac\u0105c przy tym wyrazisto\u015bci. Zmniejszy\u0107 za pomoc\u0105 tablic, to znaczy dla ka\u017cdego przedzia\u0142u czasowego stworzy\u0107 tablic\u0119 akcji i tablic\u0119 cen. W ten spos\u00f3b zajmuj\u0105 one znacznie mniej miejsca. I \u0142atwiej si\u0119 z nimi pracuje. To prawie r\u00f3wnoleg\u0142e operacje, to znaczy r\u00f3wnolegle cz\u0119\u015bciowo obliczamy i p\u00f3\u017aniej zapisujemy na serwerze. <\/p>\n<p><\/p>\n<p>Po tym mo\u017cna to zreplikowa\u0107. Literka 'r' oznacza, \u017ce te dane zreplikowali\u015bmy. To znaczy, \u017ce na wszystkich trzech serwerach s\u0105 takie same dane \u2013 te tablice. <\/p>\n<p><\/p>\n<p>A nast\u0119pnie specjalnym skryptem z tego zestawu 12,5 miliona korelacji, kt\u00f3re trzeba obliczy\u0107, mo\u017cna stworzy\u0107 pakiety. To znaczy 2 500 zada\u0144 po 5 000 par korelacji. I to zadanie oblicza\u0107 na konkretnym serwerze ClickHouse. Ma on wszystkie dane, poniewa\u017c dane s\u0105 identyczne i mo\u017ce je oblicza\u0107 sekwencyjnie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/587c6d587a48f2407dd2687f5423d44a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jeszcze raz, jak to wygl\u0105da. Na pocz\u0105tku mamy wszystkie dane w takiej strukturze: czas, akcje, cena. Nast\u0119pnie obliczyli\u015bmy logReturn, czyli dane tej samej struktury, tylko zamiast ceny mamy ju\u017c logReturn. Potem przekszta\u0142cili\u015bmy je, co da\u0142o nam czas oraz groupArray dla akcji i cen. Zreplikowali\u015bmy. Po tym wygenerowali\u015bmy mn\u00f3stwo zada\u0144 i wrzucili\u015bmy je do ClickHouse, aby to przetworzy\u0142. I to dzia\u0142a. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/434e7385aebcffcc03d1bd1a2020c8bf.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na proof of concept zadanie to by\u0142a podzadanie, czyli wzi\u0119li\u015bmy mniej danych. I to wszystko na trzech serwerach.<\/p>\n<p><\/p>\n<p>Pierwsze dwa etapy: obliczanie Log_return i owini\u0119cie w tablice zaj\u0119\u0142y oko\u0142o godziny ka\u017cda. <\/p>\n<p><\/p>\n<p>A obliczanie korelacji zaj\u0119\u0142o gdzie\u015b 50 godzin. Ale 50 godzin to ma\u0142o, poniewa\u017c wcze\u015bniej trwa\u0142o to tygodniami. To by\u0142 wielki sukces. I je\u015bli policzy\u0107, to na tym klastrze wszystko by\u0142o obliczane 70 razy na sekund\u0119.<\/p>\n<p><\/p>\n<p>Ale najwa\u017cniejsze jest to, \u017ce ten system praktycznie nie ma w\u0105skich garde\u0142, co oznacza, \u017ce skalowanie przebiega prawie liniowo. I to zosta\u0142o zweryfikowane. Skutecznie go skalowali. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/5a595a84897e492b49dccfb0f058b1b8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Poprawna schemat to po\u0142owa sukcesu. A poprawne schematy to wykorzystanie wszystkich potrzebnych technologii ClickHouse. <\/li>\n<li>Summing\/AggregatingMergeTrees to technologie, kt\u00f3re pozwalaj\u0105 agregowa\u0107 lub oblicza\u0107 stan snapshot jako szczeg\u00f3lny przypadek. I to znacz\u0105co upraszcza wiele spraw. <\/li>\n<li>Materialized Views pozwalaj\u0105 obej\u015b\u0107 ograniczenie jednego indeksu. Mo\u017ce nie do ko\u0144ca jasno to wyja\u015bni\u0142em, ale gdy \u0142adowali\u015bmy logi, surowe logi by\u0142y w tabeli z jednym indeksem, a logi atrybut\u00f3w by\u0142y w innej tabeli, to znaczy te same dane, tylko przefiltrowane, ale indeks by\u0142 zupe\u0142nie inny. Wydaj\u0105 si\u0119 to by\u0107 te same dane, ale r\u00f3\u017cni si\u0119 sortowanie. I Materialized Views pozwala, je\u015bli jest to potrzebne, obej\u015b\u0107 to ograniczenie ClickHouse. <\/li>\n<li>Zmniejszaj granularity indeksu dla punktowych zapyta\u0144. <\/li>\n<li>I rozdzielaj dane m\u0105drze, staraj si\u0119 maksymalnie lokalizowa\u0107 dane wewn\u0105trz serwera. I staraj si\u0119, aby zapytania r\u00f3wnie\u017c korzysta\u0142y z lokalizacji tam, gdzie to mo\u017cliwe. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/c0fc1737986e3f18ed1d3c53df9f0252.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Podsumowuj\u0105c t\u0119 kr\u00f3tk\u0105 prezentacj\u0119, mo\u017cna stwierdzi\u0107, \u017ce ClickHouse z powodzeniem zaj\u0105\u0142 miejsce zar\u00f3wno w komercyjnych bazach danych, jak i w bazach open source, tj. w analizie danych. Doskonale wpasowa\u0142 si\u0119 w ten krajobraz. Co wi\u0119cej, powoli zaczyna wypiera\u0107 innych, poniewa\u017c gdy mamy ClickHouse, nie potrzebujemy InfiniDB. Mo\u017ce Vertica wkr\u00f3tce stanie si\u0119 zb\u0119dna, je\u015bli zapewni\u0105 odpowiednie wsparcie dla SQL. Polecam korzysta\u0107!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pi-KVM \u2014 projekt otwartego IP-KVM na Raspberry Pi\" src=\"\/wp-content\/uploads\/2020\/07\/6e9a65d32eb6de7f9f139a30e7ab0d25.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u2014<em>Dzi\u0119kuj\u0119 za referat! Bardzo interesuj\u0105ce! Czy by\u0142y jakie\u015b por\u00f3wnania z Apache Phoenix?<\/em><\/p>\n<p><\/p>\n<p>-Nie, nie s\u0142ysza\u0142em, aby kto\u015b por\u00f3wnywa\u0142. My i Yandex staramy si\u0119 \u015bledzi\u0107 wszystkie por\u00f3wnania ClickHouse z r\u00f3\u017cnymi bazami danych. Poniewa\u017c je\u015bli przypadkiem co\u015b okazuje si\u0119 szybsze ni\u017c ClickHouse, to Aleksey Milovidov nie mo\u017ce spa\u0107 w nocy i szybko stara si\u0119 go przyspieszy\u0107. Nie s\u0142ysza\u0142em o takim por\u00f3wnaniu. <\/p>\n<p><\/p>\n<ul>\n<li>\n<p><em>(Aleksey Milovidov) Apache Phoenix to silnik SQL na Hbase. Hbase jest g\u0142\u00f3wnie przeznaczone do scenariuszy pracy typu key-value. Tam w ka\u017cdym wierszu mo\u017ce by\u0107 dowolna liczba kolumn z dowolnymi nazwami. Mo\u017cna to powiedzie\u0107 o takich systemach jak Hbase, Cassandra. Na nich trudne zapytania analityczne nie b\u0119d\u0105 dzia\u0142a\u0107 poprawnie. Lub mo\u017cesz pomy\u015ble\u0107, \u017ce dzia\u0142aj\u0105 normalnie, je\u015bli nie mia\u0142e\u015b \u017cadnego do\u015bwiadczenia z ClickHouse.<\/em><\/p>\n<p>\n<\/li>\n<li>\n<p>Dzi\u0119kuj\u0119<\/p>\n<p><\/p>\n<ul>\n<li>\n<p><em>Dzie\u0144 dobry! Ju\u017c od d\u0142u\u017cszego czasu interesuj\u0119 si\u0119 tym tematem, poniewa\u017c mam system analityczny. Ale kiedy patrz\u0119 na ClickHouse, mam wra\u017cenie, \u017ce ClickHouse bardzo dobrze nadaje si\u0119 do analizy zdarze\u0144, danych mutowalnych. A je\u015bli musz\u0119 analizowa\u0107 wiele danych biznesowych z du\u017c\u0105 ilo\u015bci\u0105 tabel, to ClickHouse, o ile rozumiem, niezbyt mi pasuje? Szczeg\u00f3lnie, je\u015bli si\u0119 zmieniaj\u0105. Czy to prawda, czy s\u0105 przyk\u0142ady, kt\u00f3re mog\u0105 to obali\u0107?<\/em><\/p>\n<p>\n<\/li>\n<li>\n<p>To prawda. I to dotyczy wi\u0119kszo\u015bci specjalistycznych baz danych analitycznych. S\u0105 one dostosowane do tego, \u017ce wyst\u0119puje jedna lub kilka du\u017cych tabel, kt\u00f3re s\u0105 zmienne, oraz wiele ma\u0142ych, kt\u00f3re zmieniaj\u0105 si\u0119 powoli. Tzn. ClickHouse nie jest jak Oracle, gdzie mo\u017cna wrzuci\u0107 wszystko i budowa\u0107 bardzo skomplikowane zapytania. Aby efektywnie korzysta\u0107 z ClickHouse, nale\u017cy stworzy\u0107 schemat w taki spos\u00f3b, aby dobrze funkcjonowa\u0142 w ClickHouse. Tzn. unika\u0107 nadmiernej normalizacji, u\u017cywa\u0107 s\u0142ownik\u00f3w, stara\u0107 si\u0119 ograniczy\u0107 d\u0142ugie powi\u0105zania. I je\u015bli schemat zostanie w ten spos\u00f3b skonstruowany, to podobne zadania biznesowe w ClickHouse mog\u0105 by\u0107 rozwi\u0105zywane znacznie efektywniej ni\u017c w tradycyjnej bazie danych relacyjnej. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><em>Dzi\u0119kuj\u0119 za prezentacj\u0119! Mam pytanie dotycz\u0105ce ostatniego przypadku finansowego. Mieli analiz\u0119. Nale\u017ca\u0142o por\u00f3wna\u0107, jak zmieniaj\u0105 si\u0119 warto\u015bci. Rozumiem, \u017ce system zosta\u0142 zbudowany w\u0142a\u015bnie pod t\u0119 analiz\u0119? Je\u015bli na przyk\u0142ad jutro potrzebny b\u0119dzie im inny raport na podstawie tych danych, czy musz\u0105 budowa\u0107 schemat od nowa i \u0142adowa\u0107 dane? Tzn. czy potrzebna jest jaka\u015b wst\u0119pna obr\u00f3bka, aby uzyska\u0107 zapytanie?<\/em><\/p>\n<p><\/p>\n<p>Oczywi\u015bcie, to u\u017cycie ClickHouse do ca\u0142kowicie konkretnego zadania. Tradycyjnie mog\u0142oby by\u0107 ono rozwi\u0105zane w ramach Hadoop. Dla Hadoop to idealne zadanie. Ale na Hadoop jest to bardzo wolne. Moim celem jest pokazanie, \u017ce w ClickHouse mo\u017cna rozwi\u0105zywa\u0107 zadania, kt\u00f3re zazwyczaj s\u0105 realizowane przy u\u017cyciu ca\u0142kowicie innych \u015brodk\u00f3w, ale mo\u017cna to zrobi\u0107 znacznie efektywniej. To jest dostosowane do konkretnego zadania. Jest oczywiste, \u017ce je\u015bli pojawi si\u0119 co\u015b podobnego, mo\u017cna je rozwi\u0105za\u0107 w podobny spos\u00f3b. <\/p>\n<p><\/p>\n<p><em>Rozumiem. Powiedzia\u0142e\u015b, \u017ce przetwarzano 50 godzin. Czy to od samego pocz\u0105tku, gdy za\u0142adowano dane, czy od momentu uzyskania rezultat\u00f3w?<\/em><\/p>\n<p><\/p>\n<p>Tak, tak.<\/p>\n<p><\/p>\n<p><em>Dobrze, bardzo dzi\u0119kuj\u0119.<\/em><\/p>\n<p><\/p>\n<p>To jest na klastrze 3-serwerowym. <\/p>\n<p><\/p>\n<p><em>Witam! Dzi\u0119kuj\u0119 za prezentacj\u0119! Wszystko jest bardzo interesuj\u0105ce. Chcia\u0142em zapyta\u0107 nieco nie o funkcjonalno\u015b\u0107, a o u\u017cycie ClickHouse z punktu widzenia stabilno\u015bci. Czy mieli\u015bcie jakie\u015b problemy, czy musieli\u015bcie dokonywa\u0107 przywr\u00f3cenia? Jak w tym przypadku zachowuje si\u0119 ClickHouse? Czy zdarza\u0142y si\u0119 sytuacje, w kt\u00f3rych r\u00f3wnie\u017c replika si\u0119 wy\u0142\u0105cza\u0142a? My na przyk\u0142ad mieli\u015bmy problem z ClickHouse, gdy jednak przekracza\u0142 sw\u00f3j limit i pada\u0142.<\/em><\/p>\n<p><\/p>\n<p>Oczywi\u015bcie, nie ma idealnych system\u00f3w. ClickHouse r\u00f3wnie\u017c ma swoje problemy. Ale czy s\u0142ysza\u0142e\u015b o tym, \u017ce Yandex.Metrica d\u0142ugo nie dzia\u0142a\u0142a? Prawdopodobnie nie. Dzia\u0142a niezawodnie gdzie\u015b od 2012-2013 roku na ClickHouse. Mo\u017cna r\u00f3wnie\u017c m\u00f3wi\u0107 o moim do\u015bwiadczeniu. Nigdy nie mieli\u015bmy ca\u0142kowitych awarii. Mog\u0142y zdarza\u0107 si\u0119 jakie\u015b cz\u0119\u015bciowe problemy, ale nigdy nie by\u0142y one na tyle krytyczne, \u017ceby powa\u017cnie wp\u0142yn\u0105\u0107 na biznes. Takiego sytuacji nigdy nie by\u0142o. ClickHouse jest wystarczaj\u0105co niezawodny i nie pada przypadkowo. Nie ma co si\u0119 tym martwi\u0107. To nie jest surowy produkt. Potwierdza to wiele firm. <\/p>\n<p><\/p>\n<p><em>Witam! Powiedzia\u0142e\u015b, \u017ce trzeba od razu dobrze przemy\u015ble\u0107 schemat danych. A co, je\u015bli to si\u0119 jednak sta\u0142o? Dane nap\u0142ywaj\u0105 bez ko\u0144ca. Mija p\u00f3\u0142 roku, a ja rozumiem, \u017ce tak dalej \u017cy\u0107 si\u0119 nie da, musz\u0119 przetworzy\u0107 dane i co\u015b z nimi zrobi\u0107.<\/em> <\/p>\n<p><\/p>\n<p>To oczywi\u015bcie zale\u017cy od twojego systemu. Istnieje kilka sposob\u00f3w, aby zrobi\u0107 to praktycznie bez przestoj\u00f3w. Na przyk\u0142ad, mo\u017cesz stworzy\u0107 Materialized View, w kt\u00f3rym skonstruujesz inn\u0105 struktur\u0119 danych, je\u015bli mo\u017cna j\u0105 jednoznacznie zmapowa\u0107. To znaczy, je\u015bli dopuszcza mapowanie przy pomocy ClickHouse, to znaczy extract niekt\u00f3re rzeczy, zmieni\u0107 klucz g\u0142\u00f3wny, zmieni\u0107 partycjonowanie, to mo\u017cna zrobi\u0107 Materialized View. Tam przepiszesz swoje stare dane, nowe b\u0119d\u0105 zapisywane automatycznie. A potem po prostu prze\u0142\u0105czysz si\u0119 na u\u017cywanie Materialized View, a nast\u0119pnie przestawisz zapis i usuniesz star\u0105 tabel\u0119. To spos\u00f3b bez przerwy. <\/p>\n<p><\/p>\n<p><em>Dzi\u0119kujemy.<\/em><\/p>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/512304\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0447\u0442\u0438 \u0432\u0435\u0437\u0434\u0435, \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0411\u0414 \u0432\u0441\u0435 \u0435\u0449\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u044d\u043a\u0437\u043e\u0442\u0438\u0447\u043d\u044b. \u0418\u0445 \u043f\u043b\u043e\u0445\u043e \u0437\u043d\u0430\u044e\u0442 \u0438 \u0435\u0449\u0435 \u0445\u0443\u0436\u0435 \u0443\u043c\u0435\u044e\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u041c\u043d\u043e\u0433\u0438\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 &quot;\u0435\u0441\u0442\u044c \u043a\u0430\u043a\u0442\u0443\u0441&quot; \u0441 MySQL \u0438\u043b\u0438 PostgreSQL, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438, \u043c\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0441 NoSQL \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043f\u043b\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0437\u0430 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f. ClickHouse \u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438\u0433\u0440\u044b \u0438 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433 \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0432 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":89879,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-89878","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-clickhouse-v-realnyh-prilozheniyah-aleksandr-zajczev-2018g\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0422\u0435\u043e\u0440\u0438\u044f \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f ClickHouse \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445. \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0417\u0430\u0439\u0446\u0435\u0432 (2018\u0433) | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-clickhouse-v-realnyh-prilozheniyah-aleksandr-zajczev-2018g\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-07-26T23:42:42+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-26T23:42:42+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Teoria i praktyka zastosowania ClickHouse w rzeczywistych aplikacjach. Aleksandr Zajcew (2018) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-clickhouse-v-realnyh-prilozheniyah-aleksandr-zajczev-2018g","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0422\u0435\u043e\u0440\u0438\u044f \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f ClickHouse \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445. \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0417\u0430\u0439\u0446\u0435\u0432 (2018\u0433) | ProHoster","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-clickhouse-v-realnyh-prilozheniyah-aleksandr-zajczev-2018g","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-07-26T23:42:42+00:00","article:modified_time":"2020-07-26T23:42:42+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"89878","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 13:02:37","updated":"2026-02-22 15:29:33","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/89878","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=89878"}],"version-history":[{"count":2,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/89878\/revisions"}],"predecessor-version":[{"id":162171,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/89878\/revisions\/162171"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/89879"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=89878"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=89878"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=89878"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}