
Kuigi andmeid on praegu peaaegu igal pool palju, on analĂŒĂŒtilised andmebaasid endiselt ĂŒsna eksootilised. Neid tuntakse halvasti ja veelgi hullem, neid ei osata efektiivselt kasutada. Paljud jĂ€tkavad "kaktuse söömist" MySQL-i vĂ”i PostgreSQL-iga, mis on projekteeritud teiste stsenaariumide jaoks, vaevlevad NoSQL-i abil vĂ”i maksavad liiga palju kommertslahenduste eest. ClickHouse muudab reegleid ja vĂ€hendab oluliselt sisenemise takistust analĂŒĂŒtiliste DBMS-ide maailma.
Ettekanne BackEnd Conf 2018 ja see on avaldatud ettekandja loal.


Kes ma olen ja miks ma rÀÀgin ClickHouse'ist? Olen LifeStreet'i arenduse direktor, kes kasutab ClickHouse'i. Lisaks olen Altinity asutaja. See on Yandexi partner, kes edendab ClickHouse'i ja aitab Yandexil ClickHouse'i edukamaks muuta. Olen ka valmis jagama teadmisi ClickHouse'i kohta.

Ja veel, ma ei ole Petja Zaitsevi vend. Sellest kĂŒsitakse mind sageli. Ei, me ei ole vennad.

«KÔigile on teada», et ClickHouse:
- VĂ€ga kiire,
- VĂ€ga mugav,
- Kasutatakse Yandexis.
Muudatakse vÀhem tuntuks, millistes ettevÔtetes ja kuidas seda kasutatakse.

RÀÀgin teile, milleks, kus ja kuidas ClickHouse'i kasutatakse, peale Yandexi.
RÀÀgin, kuidas konkreetsed ĂŒlesanded lahendatakse ClickHouse'i abil erinevates ettevĂ”tetes, milliseid ClickHouse'i tööriistu saate oma ĂŒlesannete jaoks kasutada ja kuidas neid on erinevates ettevĂ”tetes kasutatud.
Olen valinud kolm nĂ€idet, mis nĂ€itavad ClickHouse'i erinevaid kĂŒlgi. MĂ”tlen, et see on huvitav.

Esimene kĂŒsimus: «Miks on vajalik ClickHouse?». Kuigi kĂŒsimus tundub piisavalt ilmne, on sellele rohkem kui ĂŒks vastus.

- Esimene vastus â tootlikkuse nimel. ClickHouse on vĂ€ga kiire. AnalĂŒĂŒs ClickHouse'is on samuti vĂ€ga kiire. Seda saab sageli kasutada seal, kus midagi muud töötab vĂ€ga aeglaselt vĂ”i vĂ€ga halvasti.
- Teine vastus â see on maksumus. EelkĂ”ige skaleerimise maksumus. NĂ€iteks Vertica on tĂ€iesti suurepĂ€rane andmebaas. See töötab vĂ€ga hĂ€sti, kui teil ei ole vĂ€ga palju terabaite andmeid. Kuid kui jutt on sadadest terabaidist vĂ”i petabaidist, siis litsentsi ja toe maksumus tĂ”useb piisavalt suureks. Ja see on kallis. ClickHouse on aga tasuta.
- Kolmas vastus on tegevuskulu. See lĂ€henemine on natuke teiselt poolt. RedShift on suurepĂ€rane analoog. RedShiftis saab vĂ€ga kiiresti lahenduse teha. See töötab hĂ€sti, kuid see maksab iga tunni, iga pĂ€eva ja iga kuu lĂŒhidalt Amazonile ĂŒsna kallilt, kuna see on oluliselt kulukas teenus. Google BigQuery on samuti. Kui keegi on seda kasutanud, siis ta teab, et seal saab kĂ€itada mitu pĂ€ringut ja Ă€kki saada arve sadade dollarite eest.
ClickHouse'is ei ole neid probleeme.

Kus kasutatakse ClickHouse'i praegu? Peale Yandexi kasutatakse ClickHouse'i mitmesugustes Àri- ja ettevÔtetes.
- Esiteks on see veebirakenduste analĂŒĂŒs, st see on kasutusjuht, mis tuli Yandexist.
- Palju AdTech ettevÔtteid kasutavad ClickHouse'i.
- Paljud ettevĂ”tted, kellel on vaja analĂŒĂŒsida operatiivlogisid erinevatest allikatest.
- MÔned ettevÔtted kasutavad ClickHouse'i turvalogide jÀlgimiseks. Nad laadivad need ClickHouse'i, teevad aruandeid ja saavad vajalikud tulemused.
- EttevĂ”tted hakkavad seda kasutama finantsanalĂŒĂŒsis, st jĂ€rk-jĂ€rgult suur Ă€ri ka valib ClickHouse'i.
- CloudFlare. Kui keegi jĂ€lgib ClickHouse'i, siis on ta kindlasti kuulnud selle ettevĂ”tte nime. See on ĂŒks olulisemaid panustajaid kogukonnas. Ja neil on vĂ€ga tĂ”sine ClickHouse'i paigaldus. NĂ€iteks nad tegid Kafka Engine'i ClickHouse'i jaoks.
- Telekommunikatsiooni ettevÔtted on hakanud seda kasutama. Mitmed ettevÔtted kasutavad ClickHouse'i kas proof of conceptina vÔi juba tootmises.
- Ăks ettevĂ”te kasutab ClickHouse'i tootmisprotsesside jĂ€lgimiseks. Nad testivad mikrokiipe, registreerivad hulga parameetreid, seal on umbes 2000 omadust. Ja seejĂ€rel analĂŒĂŒsivad â kas partii on hea vĂ”i halb.
- BlokiaanalĂŒĂŒs. On selline Venemaa ettevĂ”te nagu Bloxy.info. See analĂŒĂŒsib ethereum-vĂ”rku. Nad tegid seda ka ClickHouse'i abil.

Lisaks ei ole suurus tĂ€htis. On palju ettevĂ”tteid, kes kasutavad ĂŒhte vĂ€ikest serverit. Ja see lahendab nende probleemid. Ja veel rohkem ettevĂ”tteid kasutavad suuri klastreid, mis koosnevad paljusid serverid vĂ”i kĂŒmneid servereid.
Ja kui vaadata rekordite jÀrgi, siis:
- Yandex: 500+ serverit, nad salvestavad 25 miljardit kirjet pÀevas.
- LifeStreet: 60 serverit, umbes 75 miljardit kirjet pÀevas. Servereid on vÀhem, kirjeid rohkem kui Yandexis.
- CloudFlare: 36 serverit, 200 miljardi kirjet pÀevas, mida nad hoiavad. Neil on veel vÀhem servereid ja veel rohkem andmeid, mida nad hoiavad.
- Bloomberg: 102 serverilt, umbes triljon kirjet pÀevas. Rekordite hoidja.

Geograafiliselt on see ka palju. Siin on kaart, mis nÀitab heatmap'i, kus ClickHouse'i maailmas kasutatakse. Siin paistavad silma Venemaa, Hiina, Ameerika. Euroopa riike on vÀhe. Ja vÔib vÀlja tuua 4 klastrit.
See on vĂ”rdlev analĂŒĂŒs, siin ei ole vaja otsida absoluutarve. See on analĂŒĂŒs kĂŒlastajatest, kes loevad ingliskeelseid materjale Altinity veebisaidil, sest seal pole venekeelseid. Venemaa, Ukraina, Valgevene, s.t. venekeelne osa kogukonnast, on kĂ”ige arvukamad kasutajad. SeejĂ€rel tulevad USA ja Kanada. Hiina tuleb kiiresti jĂ€rele. Pool aastat tagasi ei olnud Hiinat peaaegu ĂŒldse, nĂŒĂŒd on Hiina juba Euroopa ĂŒle lĂ€inud ja jĂ€tkab kasvu. Vanaproua Euroopa jÀÀb raskeveo asemel jĂ€rele, samas on ClickHouse'i juhtiv kasutaja, nagu kummaline see ka ei tunduks, Prantsusmaa.

Miks ma seda kĂ”ike rÀÀgin? Selleks, et nĂ€idata, et ClickHouse saab standardseks lahenduseks suurte andmete analĂŒĂŒsimiseks ja seda kasutatakse juba vĂ€ga paljudes kohtades. Kui te seda kasutate, olete Ă”igel teel. Kui te veel ei kasuta, siis ei pea muretsema, et jÀÀte ĂŒksi ja keegi teid ei aita, sest juba paljud tegelevad sellega.

Need on ClickHouse'i reaalsed kasutusnÀited mitmes ettevÔttes.
- Esimene nÀide on reklaamivÔrk: migratsioon Verticalt ClickHouse'i. Ja ma tean mitmeid ettevÔtteid, kes on Vertica kaudu kolinud vÔi on kolimisel.
- Teine nĂ€ide on tehingute andmehoidla ClickHouse'is. See on nĂ€ide, mis on ĂŒles ehitatud antipattern'idel. KĂ”ik, mida ClickHouse'is ei tohiks teha arendajate nĂ”uannete jĂ€rgi, on siin tehtud. Ja see on tehtud nii tĂ”husalt, et see töötab. Ja töötab palju paremini kui tĂŒĂŒpiline tehingute lahendus.
- Kolmas nĂ€ide on jaotatud arvutused ClickHouse'is. Oli kĂŒsimus selle kohta, kuidas ClickHouse'i integreerida Hadoopi ökosĂŒsteemi. NĂ€itan nĂ€idet, kuidas firma tegi ClickHouse'is midagi tĂŒĂŒpi analoog map reduce konteinerist, jĂ€lgides andmete lokaliseerimist jne, et lahendada vĂ€ga mitte triviaalne ĂŒlesanne.

- LifeStreet â See on Ad Tech ettevĂ”te, millel on kĂ”ik tehnoloogiad, mis on seotud reklaamivĂ”rguga.
- Tegeleb reklaamide optimeerimise ja programmatic bidding'iga.
- Palju andmeid: umbes 10 miljardit sĂŒndmust pĂ€evas. Need sĂŒndmused vĂ”ivad seejuures jaguneda mitmeks alamsĂŒndmuseks.
- Palju kliente nendele andmetele, ning need ei ole ainult inimesed, vaid palju rohkem â erinevad algoritmid, mis tegelevad programmilise pakkumisega.

EttevĂ”te on lĂ€binud pika ja keerulise tee. Olen sellest rÀÀkinud HighLoadis. Algul kolis LifeStreet MySQL-lt (vĂ€ikese peatusega Oracleâil) Verticasse. Ja sellest on vĂ”imalik leida juttu.
Ja kĂ”ik oli vĂ€ga hĂ€sti, kuid ĂŒsna kiiresti sai selgeks, et andmed kasvavad ja Vertica on kallis. SeetĂ”ttu otsiti erinevaid alternatiive. MĂ”ned neist on siin loetletud. Tegime tĂ”epoolest proof of conceptâi vĂ”i mĂ”nikord ka jĂ”udlustestimist peaaegu kĂ”igi andmebaasidega, mis olid turul saadaval aastatel 2013 kuni 2016 ja vastasid funktsionaalsuselt umbes meie vajadustele. Ja mĂ”nest neist rÀÀkisin samuti HighLoadis.

Ălesanne oli migratsioon Verticast, sest andmed kasvasid. Ja nad kasvasid eksponentsiaalselt mitu aastat. Siis jĂ”udsid nad tasemele, kuid siiski. Viies seda kasvu prognoosides, ettevĂ”tte nĂ”uded andmemahu osas, mille pĂ”hjal tuleb teha mingisugust analĂŒĂŒsi, oli selge, et varsti hakatakse rÀÀkima petabaitidest. Ja petabaitide eest tuleb juba vĂ€ga palju maksta, seega otsiti alternatiivi, kuhu liikuda.

Kuhu liikuda? Pikka aega ei olnud ĂŒldse selge, kuhu minna, sest ĂŒhelt poolt on olemas kommertstandmebaasid, mis nĂ€ivad töötavat hĂ€sti. MĂ”ned neist töötavad peaaegu sama hĂ€sti kui Vertica, mĂ”ned halvemini. Kuid nad kĂ”ik on kallid, midagi odavamat ja paremat leida ei Ă”nnestunud.
Teiselt poolt on olemas avatud lĂ€htekoodiga lahendused, mida ei ole vĂ€ga palju, st andmete analĂŒĂŒsi jaoks vĂ”ib neid sĂ”rmedel kokku lugeda. Need on tasuta vĂ”i odavad, kuid töötavad aeglaselt. Ja neis puudub sageli vajalik ja kasulik funktsionaalsus.
Laadi, mis ĂŒhendaks hea, mis olemas kommertstandmebaasides, ja kogu tasuta, mis olemas avatud lĂ€htekoodiga lahendustes â ei olnud midagi.

Ei olnud midagi, kuni ootamatult Yandex ei toonud, nagu maagia, ClickHouseâi. See oli ootamatu lahendus, ja seni kĂŒsitakse: "Miks?", kuid siiski.

Ja juba suvel 2016. aastal hakkasime uurima, mis on ClickHouse. Selgus, et mĂ”nikord vĂ”ib see olla kiiremini kui Vertica. Testisime erinevaid stsenaariume erinevate pĂ€ringute peal. Ja kui pĂ€ringutas kasutati ainult ĂŒhte tabelit, st ilma mingite join'ideta, siis oli ClickHouse kaks korda kiiremini kui Vertica.
Ma ei lasknud end laiskusest andestada ja vaatasin hiljuti ka Yandexi teste. Seal on sama: ClickHouse on kaks korda kiiremini kui Vertica, seetÔttu rÀÀgivad nad sellest sageli.
Aga kui pĂ€ringutes on join'id, siis on kĂ”ik mitte nii ĂŒheselt mĂ”istetav. Ja ClickHouse vĂ”ib olla Vertica'st kaks korda aeglasem. Kui natuke pĂ€ringut kohendada ja ĂŒmber kirjutada, siis on need enam-vĂ€hem ĂŒhesugused. Mitte halb. Ja tasuta.

Saades testitulemused ja vaadates sellele erinevatest nurkadest, lĂ€ks LifeStreet ClickHouse'i ĂŒle.

See on 2016. aasta, meenutan. See oli nagu anekdoot hiirtest, kes nutsid ja torkisid end, aga jÀtkasid kaktuse söömist. Ja sellest on pÔhjalikult rÀÀgitud, olemas on selle kohta videosid jne.

SeetÔttu ma ei hakka sellest pÔhjalikult rÀÀkima, rÀÀgin ainult tulemustest ja mÔnest huvitavast asjast, millest ma tol ajal ei rÀÀkinud.
Tulemused on jÀrgmised:
- Edukalt migratsioon ja sĂŒsteem on juba ĂŒle aasta olnud tootmises.
- Tootlikkus ja paindlikkus on kasvanud. 10 miljardi kirje asemel, mida me saime endale lubada sĂ€ilitada pĂ€evade kaupa ja siis lĂŒhikest aega, hoiab LifeStreet nĂŒĂŒd 75 miljardit kirjet pĂ€evas ja suudab seda teha 3 kuud vĂ”i kauem. Tippsituatsioonis salvestatakse kuni miljon sĂŒndmust sekundis. Ăks miljon SQL-pĂ€ringut pĂ€evas jĂ”uab sellesse sĂŒsteemi, enamasti erinevatelt robotitelt.
- Hoolimata sellest, et ClickHouse'i jaoks hakkas kasutama rohkem servereid kui Vertica jaoks, toimus sÀÀstmine ka riistvaras, sest Verticas kasutati ĂŒsna kalliseid SAS-kettasid. ClickHouse'is kasutati SATA-d. Miks? Sest Verticas on insert sĂŒnkroonne. Ja sĂŒnkroniseerimine nĂ”uab, et kettad ei peaks vĂ€ga palju pidurdama, samuti ei tohi vĂ”rguĂŒhendus vĂ€ga aeglane olla, st see on piisavalt kallis operatsioon. Samas ClickHouse'is on insert asĂŒnkroonne. Veelgi enam, kĂ”ike saab alati kohapeal kirjutada, selle jaoks ei ole mingeid lisakulusid, seega saab andmeid ClickHouse'i sisestada palju kiiremini kui Vertica'sse isegi mitte kĂ”ige kiirematel ketastel. Ja lugemine on umbes sama. Lugemise ajal SATA-l, kui need on RAID-is, on see kĂ”ik piisavalt kiire.
- Ei ole litsentsiga piiratud, st 3 petabaidid andmeid 60 serveris (20 serverit on ĂŒks koopia) ja 6 triljonit kirjet faktide ja agregaatide osas. Midagi sarnast ei suutnud Vertica endale lubada.

NĂŒĂŒd liigun ma selles nĂ€ites praktiliste asjade juurde.
- Esimene asi on efektiivne skeem. Skeemist sÔltub vÀga palju.
- Teine asi on efektiivse SQL-i genereerimine.

TĂŒĂŒpiline OLAP-pĂ€ring on select. Osa veerge lĂ€heb group by, osa veerge lĂ€heb agregaatfunktsioonidesse. On where, mida saab pidada kuubi lĂ”ikeks. Kogu group by saab pidada projektsiooniks. SeetĂ”ttu nimetatakse seda multidimensionaalseks andmeanalĂŒĂŒsiks.

Ja sageli modelleeritakse seda star-skeemi kujul, kus on keskne fakt ja selle fakti omadused kĂŒlgedel, kiirte kujul.

Ja fĂŒĂŒsilise disaini seisukohalt, kuidas see tabelisse asetub, tehakse tavaliselt normaliseeritud esitamine. VĂ”ite denormaliseerida, kuid see on ketta peal kallis ja pĂ€ringute osas mitte vĂ€ga tĂ”hus. Seega tehakse tavaliselt normaliseeritud esitamine, st faktitabel ja palju-palju mÔÔtmetabelit.
Aga ClickHouse'is töötab see halvasti. On kaks pÔhjust:
- Esimene â see, et ClickHouse'il ei ole vĂ€ga hĂ€id join'e, st join'id on olemas, kuid need on halvad. Praegu on nad halvad.
- Teine â see, et tabeleid ei uuendata. Tavaliselt on neil tabelitel, mis on star-skeemi ĂŒmber, vaja midagi muuta. NĂ€iteks kliendi nimi, ettevĂ”tte nimi jne. Ja see ei toimi.
Ja ClickHouse'is on sellele vÀljakÀik. Lausa kaks:
- Esimene â see, et kasutada sĂ”nastikke. External Dictionaries on see, mis aitab 99% ulatuses lahendada star-skeemi, uuenduste ja muu probleemi.
- Teine â see, et kasutada mahtusid. Mahtud aitavad samuti vabaneda join'ist ja normaliseerimise probleemidest.

- Join'id ei ole vajalikud.
- Uuendatavad. Alates mÀrtsist 2018 on ilmunud dokumenteerimata vÔimalus (dokumentatsioonis te ei leia seda), et uuendada sÔnastikke osaliselt, st neid kirjeid, mis on muutunud. Praktikas on see nagu tabel.
- Alati mÀlus, seega töötavad join'id sÔnastikuga kiiremini kui siis, kui see oleks tabel, mis on kettal ja pole isegi fakt, et see on vahemÀlus, tÔenÀoliselt ei ole.

- Samuti ei ole join'id vajalikud.
- See on kompaktne esitus 1 paljudele.
- Ja minu arvates on massiivid loodud geekkide jaoks. Need on lambda-funktsioonid jne.
See ei ole lihtsalt tĂŒhja jutu pĂ€rast. See on vĂ€ga vĂ”imas funktsionaalsus, mis vĂ”imaldab paljusid asju teha vĂ€ga lihtsalt ja elegantselt.

TĂŒĂŒpilised nĂ€ited, mis aitavad lahendada massiive. Need nĂ€ited on lihtsad ja piisavalt ilustratiivsed:
- Otsi siltide jÀrgi. Kui sul on seal hashtags ja soovid leida mingeid postitusi selle sildi jÀrgi.
- Otsi key-value paaride jÀrgi. Seal on ka mingeid atribuute koos vÀÀrtustega.
- Hoia loendeid vÔtmetest, mida pead tÔlkima millegi muuks.
KĂ”iki neid ĂŒlesandeid saab lahendada ka ilma massiivideta. Silte saab panna mingisse ritta ja regulaarselt vĂ€ljendit kasutades valida vĂ”i eraldi tabelisse, kuid siis tuleb teha ĂŒhendused (join).

Aga ClickHouse'is ei pea mingit lisatööd tegema, piisab, kui kirjeldad massiivi stringide jaoks hashtagi vĂ”i teed pesakonstruktsiooni key-value tĂŒĂŒpi sĂŒsteemide jaoks.
Pesakonstruktsioon â see vĂ”ibolla ei ole kĂ”ige Ă”nnestunum nimetus. Need on kaks massiivi, millel on ĂŒhine osa nimedes ja mĂ”ned seotud omadused.
Ja sildi jÀrgi on otsimine vÀga lihtne. Funktsioon has, mis kontrollib, kas massiivis on element. KÔik, leidsime kÔik postitused, mis kuuluvad meie konverentsile.
Otsimine subidi jÀrgi on veidi keerulisem. Peame esmalt leidma vÔtme indeksi ja seejÀrel vÔtma selle indeksi elemendi ning kontrollima, kas see vÀÀrtus on selline, nagu me vajame. Kuid see on siiski vÀga lihtne ja kompaktne.
Regulaarne vĂ€ljend, mille sa tahaksid kirjutada, kui sa kĂ”ik seda ĂŒhe ritta hoiaksid, oleks kĂ”igepealt kohmakas. Teiseks, see töötaks palju kauem kui kaks massiivi.

Teine nĂ€ide. Sul on massiiv, milles hoiad ID-sid. Ja sa saad need nimedeks tĂ”lkida. Funktsioon arrayMap. See on tĂŒĂŒpiline lambda-funktsioon. Sa edastad sinna lambda-vĂ€ljendeid. Ja see toob igale ID-le sĂ”nastikus vĂ€lja nime vÀÀrtuse.
Sarnasel viisil on vÔimalik ka otsingut teha. Edastatakse predikaat-funktsioon, mis kontrollib, millele elemendid vastavad.

Need asjad lihtsustavad skeemi ja lahendavad hulgaliselt probleeme.
Aga jÀrgmine probleem, millega me silmitsi seisame ja millest ma tahaksin rÀÀkida, on efektiivsed pÀringud.
- ClickHouse'is ei ole pĂ€ringute planeerijat. Ăldse mitte.
- Kuid keerulisi pÀringuid tuleb ikkagi planeerida. Millal?
- Kui pĂ€ringus on mitu join'i, mis ĂŒmbritsete alampĂ€ringutes, siis on oluline, millises jĂ€rjekorras neid tĂ€idetakse.
- Ja teine asi on see, kui pĂ€ring on jaotatud. Sest jaotatud pĂ€ringus tĂ€idetakse ainult kĂ”ige sisemine alampĂ€ring ja kĂ”ik muu edastatakse ĂŒhele serverile, millega olete ĂŒhendatud, ja toimub seal. SeetĂ”ttu, kui teil on jaotatud pĂ€ringud paljude join'idega, tuleb mÀÀrata jĂ€rjekord.
Ja isegi lihtsamatel juhtudel tuleks mĂ”nikord planeerija tööd teha ja pĂ€ringuid natuke ĂŒmber kirjutada.

Siin on nĂ€ide. Vasakul on pĂ€ring, mis nĂ€itab 5 parimat riiki. Ja see kestab 2,5 sekundit, minu arvates. Ja paremal on sama pĂ€ring, kuid natuke ĂŒmber kirjutatud. Me ei grupeerinud ridade kaupa, vaid grupeerisime vĂ”tme (int) jĂ€rgi. Ja see on kiiremini. PĂ€rast seda liitsime tulemusele sĂ”nastiku. Selle asemel, et pĂ€ring kestaks 2,5 sekundit, kestab see 1,5 sekundit. See on hea.

Sarnane nĂ€ide filtrite ĂŒmber kirjutamisest. Siin on pĂ€ring Venemaa kohta. See kestab 5 sekundit. Kui me kirjutame selle ĂŒmber nii, et vĂ”rreldame taas mitte rida, vaid numbreid mingite vĂ”tmete kogumiga, mis kuuluvad Venemaale, siis on see palju kiirem.

Selliseid trikke on palju. Ja need vÔimaldavad mÀrkimisvÀÀrselt kiirendada pÀringute tÀitmist, mis tunduvad juba kiiret, vÔi vastupidi, töötavad aeglaselt. Need saab teha veelgi kiiremateks.

- Maksimaalne töö jaotatud reĆŸiimis.
- Sorteerimine minimaalsete tĂŒĂŒpide jĂ€rgi, nagu ma seda tegin int-de pĂ”hjal.
- Kui on mingeid join'e, sĂ”nastikke, siis on parem need teha viimases jĂ€rjekorras, kui teil on andmed vĂ€hemalt osaliselt grupeeritud, siis on join'i vĂ”i sĂ”nastiku ĂŒleskutse vĂ€hem kordi ning see on kiirem.
- Filtrite asendamine.
On veel teisi tehnikaid, mitte ainult need, mida ma demonstreerisin. Ja kÔik need vÔimaldavad mÔnikord mÀrkimisvÀÀrselt kiirendada pÀringute tÀitmist.

Liigume jÀrgmise nÀite juurde. Firma X Ameerikast. Mida nad teevad?
Ălesanne oli:
- Reklaamitehingute offline-seostamine.
- Erinevate seostamismudelite modelleerimine.

Mis on stsenaariumi sisu?
Tavaline kĂŒlastaja kĂŒlastab veebisaiti nĂ€iteks 20 korda kuus erinevate reklaamide kaudu vĂ”i tuleb lihtsalt aeg-ajalt jĂ€lgides, kuna ta mĂ€letab seda saiti. Ta vaatab mĂ”ningaid tooteid, paneb need ostukorvi, eemaldab need ostukorvist. Ja lĂ”puks ostab ta midagi.
MĂ”istlikud kĂŒsimused: "Kellele tuleb reklaami eest tasuda, kui on vajadus?" ja "Milline reklaam teda mĂ”jutas, kui mĂ”jutas?". See tĂ€hendab, miks ta ostis ja kuidas teha nii, et sarnased inimesed ostaksid samuti?
Selle probleemi lahendamiseks on vaja siduda veebisaidil toimuvad sĂŒndmused omavahel, st luua nende vahel side. SeejĂ€rel tuleb need edastada analĂŒĂŒsiks DWH-sse. Ja selle analĂŒĂŒsi pĂ”hjal luua mudeleid, kellele ja millist reklaami nĂ€idata.

Reklaamitehing on seotud kasutaja sĂŒndmuste kogum, mis algab reklaami nĂ€itamisest, millele jĂ€rgneb midagi, siis vĂ”ib-olla ost ja hiljem vĂ”ivad olla ostud ostus. NĂ€iteks, kui see on mobiilirakendus vĂ”i mobiilimĂ€ng, siis tavaliselt installitakse rakendus tasuta, kuid kui seal toimub midagi muud, vĂ”ivad selleks olla vajalikud rahad. Ja mida rohkem inimene rakenduses kulutab, seda vÀÀrtuslikum ta on. Kuid selleks tuleb kĂ”ik siduda.

Sidumise mudeleid on palju.
KÔige populaarsemad on:
- Viimane interaktsioon, kus interaktsioon on kas klikk vÔi nÀitamine.
- Esimene interaktsioon, st esimene, mis tÔi inimese veebisaidile.
- Lineaarne kombinatsioon â kĂ”igil vĂ”rdselt.
- HĂ€ipumine.
- Ja muud.

Kuidas see kĂ”ik algselt toimi? Oli Runtime ja Cassandra. Cassandrat kasutati tehingute salvestamiseks, st seal hoiti kĂ”iki seotud tehinguid. Ja kui mĂ”ni sĂŒndmus jĂ”uab Runtime'i, nĂ€iteks mingi lehe nĂ€itamine vĂ”i midagi muud, tehti pĂ€ring Cassandrale â kas selline inimene on olemas vĂ”i mitte. Siis tuuakse vĂ€lja tehingud, mis temaga on seotud. Ja sidumine toimus.
Ja kui vedas, et pÀringus on tehingu id, siis see on lihtne. Kuid tavaliselt ei vea. SeetÔttu tuli leida viimane tehing vÔi tehing viimase kliki jÀrgi jne.
Ja see kÔik töötas vÀga hÀsti, kuni sidumine toimis viimase kliki jÀrgi. Sest klikke oli nÀiteks 10 miljonit pÀevas, 300 miljonit kuus, kui seada kuu aknaks. Ja kuna Cassandras peab see kÔik olema mÀlus, et töötada kiiresti, kuna Runtime peab vastama kiiresti, siis oli vaja umbes 10-15 serverit.
Aga kui sooviti siduda tehingut nĂ€itamistega, siis hakkas asi koheselt tunduma mitte nii lĂ”bus. Ja miks? On selge, et tuleb salvestada 30 korda rohkem sĂŒndmusi. Ja seetĂ”ttu on vaja 30 korda rohkem servereid. Tulemuseks on mingisugune astronomiline number. Hoida kuni 500 serverit selleks, et siduda, samas kui Runtime'i servereid on oluliselt vĂ€hem, on vale number. Ja hakati mĂ”tlema, mida teha.

Ja jÔuti ClickHouse'ni. Aga kuidas seda ClickHouse'is teha? Esmapilgul tundub, et see on antipaaterne.
- Tehing kasvab, me lisame sellele uusi ja uusi sĂŒndmusi, see tĂ€hendab, et see on muudetav, aga ClickHouse ei tööta hĂ€sti muudetavate objektidega.
- Kui kĂŒlastaja meie juurde tuleb, peame vĂ€lja tĂ”mbama tema tehingud vĂ”tme, tema kĂŒlastuse ID jĂ€rgi. See on samuti punktikĂŒsimus, ClickHouse'is nii ei tehta. Tavaliselt tehakse ClickHouse'is suuri skaneeringuid, aga meil on vaja vĂ€lja tĂ”mmata mitu kirjet. See on samuti antipaaterne.
- Lisaks oli tehing JSON-vormingus, kuid me ei soovinud seda ĂŒmber kirjutada, seetĂ”ttu soovisime hoida JSON-i struktureerimata ja vajadusel sealt midagi vĂ€lja tĂ”mmata. Ja see on samuti antipaaterne.
See on antipaaterne kogum.

Kuid siiski Ă”nnestus luua sĂŒsteem, mis töötas vĂ€ga hĂ€sti.
Mis tehti? Ilmus ClickHouse, kuhu visati logid, jagatud kirjedeks. Ilmus atribuuditeenus, mis sai ClickHouse'ist logid. PĂ€rast seda sai iga kirje jĂ€rgi kĂŒlastuse ID tehingud, mis vĂ”isid olla veel töötlemata, pluss snapshotid, see tĂ€hendab, et tehingud olid juba seotud, nimelt eelneva töö tulemus. Nendest tehti juba loogika, valiti Ă”ige tehing ja ĂŒhendati uued sĂŒndmused. Salvestati uuesti logisse. Logi saadeti tagasi ClickHouse'i, see tĂ€hendab, et see on pidevalt tsĂŒkliline sĂŒsteem. Lisaks saadeti see DWH-sse, et seal analĂŒĂŒsida.
Just like that, it didn't work very well. To make it easier for ClickHouse when querying by visit ID, they grouped these requests into blocks of 1,000-2,000 visit IDs and extracted all transactions for 1,000-2,000 people. Then everything started to work.

If you look inside ClickHouse, there are only 3 main tables that serve all this.
The first table, where logs are poured in, is filled with logs that are virtually unprocessed.
The second table. Through a materialized view, non-attributed events, i.e. unrelated ones, were filtered out from these logs. And through another materialized view, transactions were extracted from these logs to build a snapshot. Specifically, a special materialized view constructed the snapshot, representing the latest accumulated state of the transaction.

Here is the text written in SQL. I would like to comment on a few important things in it.
The first important thing is ClickHouse's ability to extract columns and fields from JSON. That is, ClickHouse has some methods for working with JSON. They are very, very primitive.
visitParamExtractInt allows extracting attributes from JSON, i.e., the first occurrence is triggered. This way, you can fetch the transaction ID or visit ID. That's one.
Second, a clever materialized field is used here. What does this mean? It means that you can't insert it into the table; it is calculated and stored upon insertion. When you insert, ClickHouse does the work for you. And it extracts from JSON what you will need later.
In this case, the materialized view is for unprocessed rows. It precisely uses the first table with virtually raw logs. So, what does it do? First of all, it changes the sorting, i.e., sorting is now done by visit ID because we need to quickly extract the transaction for a specific person.
The second important thing is index_granularity. If you've seen MergeTree, the default index_granularity is usually set to 8,192. What is this? This parameter indicates the sparsity of the index. In ClickHouse, the index is sparse; it never indexes every record. It does this every 8,192 entries. This is good when you need to calculate a lot of data, but bad when you need just a few, as it incurs significant overhead. And if you decrease index granularity, you reduce overhead. However, it cannot be reduced to one because there might not be enough memory. The index is always stored in memory.

Snapshoot kasutab veel mÔningaid huvitavaid ClickHouse'i funktsioone.
Esiteks on see AggregatingMergeTree. Ja AggregatingMergeTree'is hoitakse argMax'i, s.t. see on tehingu olek, mis vastab viimasele ajamĂ€rgile. Tehingud genereeritakse pidevalt selle kĂŒlastaja jaoks. Ja selle tehingu uuemas olekus lisame sĂŒndmuse ja meil on uus olek. See jĂ”udis jĂ€lle ClickHouse'i. Ja lĂ€bi argMax'i selles materialiseeritud vaates saame alati saada ajakohase oleku.

- Sidumine on âlahutatudâ Runtime'ist.
- Kuni 3 miljardit tehingut kuus hoitakse ja töödeldakse. See on kordades rohkem kui oli Cassandras, s.t. tĂŒĂŒpilises tehingusĂŒsteemis.
- Klastri 2x5 ClickHouse'i serverites. 5 serverit ja igal serveril on koopiad. See on isegi vÀhem, kui oli Cassandras, et teha kliki pÔhjal atribuutikat, siin on meil aga mulje pÔhjal. S.t. selle asemel, et suurendada serverite arvu 30 korda, suudeti neid vÀhendada.

Ja viimane nĂ€ide on finantsfirma Y, mis analĂŒĂŒsis aktsiahindade muutuste korrelatsioone.
Ja ĂŒlesanne oli jĂ€rgmine:
- Umbes 5000 aktsiat on.
- Hinnad on teada iga 100 millisekundi jÀrel.
- Andmed on kogunenud 10 aasta jooksul. NÀib, et mÔne firma jaoks rohkem, mÔne jaoks vÀhem.
- Kokku umbes 100 miljardit rida.
Ja tuli arvutada muutuste korrelatsioon.

Siin on kaks aktsiat ja nende hinnad. Kui ĂŒks tĂ”useb ja teine tĂ”useb, siis on see positiivne korrelatsioon, s.t. ĂŒks kasvab ja teine kasvab. Kui ĂŒks tĂ”useb, nagu graafiku lĂ”pus, ja teine langeb, siis on see negatiivne korrelatsioon, s.t. kui ĂŒks kasvab, langeb teine.
AnalĂŒĂŒsides neid vastastikuseid muutusi, saab teha ennustusi finantsturgudel.

Aga ĂŒlesanne on keeruline. Mida selleks tehakse? Meil on 100 miljardit kirjet, kus on: aeg, aktsia ja hind. Peame esmalt arvutama 100 miljardit korda kost lĂ”ikes olevat hinnavahetust. RunningDifference on funktsioon ClickHouse'is, mis arvutab jĂ€rjestikku kahe rea vahelise erinevuse.
Ja pÀrast seda tuleb arvutada korrelatsioon, ja korrelatsioon tuleb arvutada iga paari jaoks. 5000 aktsia jaoks on paare 12,5 miljonit. Ja see on palju, s.t. 12,5 korda tuleb arvutada selline korrelatsioonifunktsioon.
Ja kui keegi on unustanud, siis Íx ja Íy â need on valimi matemaatilised ootused. See tĂ€hendab, et tuleb mitte ainult juured ja summad arvutada, vaid ka nende summade sees veel ĂŒhed summad. Tuleb teha tohutult arvutusi 12,5 miljonit korda ja lisaks tuleb need ka tundide kaupa grupeerida. Aega on meil samuti parajalt. Ja kĂ”ik see tuleb 60 sekundi jooksul Ă€ra teha. See on nali.

Tuli kuidagi hakkama saada, sest kÔik see töötas vÀga- vÀga aeglaselt, enne kui ClickHouse tuli.

Nad proovisid seda arvutada Hadoopis, Sparkis, Greenplumis. Ja kÔik see oli kas vÀga aeglane vÔi kallis. See tÀhendab, et mingil moel oli vÔimalik arvutada, kuid see oli seejÀrel kallis.

Ja siis tuli ClickHouse ja kÔik muutus palju paremaks.
Tuletan meelde, et meie probleem on andmete lokaalsus, seetĂ”ttu ei saa korrelatsioone lokaliseerida. Me ei saa osa andmeid panna ĂŒhele serverile, osa teisele ja arvutada, kĂ”ik andmed peavad olema igal pool.
Mida nad tegid? Algselt on andmed lokaliseeritud. Igal serveril hoitakse andmeid kindla aktsiapuhul hindade kohta. Need ei ĂŒhti. SeetĂ”ttu saab logReturni arvutada paralleelselt ja iseseisvalt, kĂ”ik toimub paralleelselt ja jaotatult.
Edasi otsustati andmeid vÀhendada, samas mitte kaotades vÀljendusrikkust. VÀhendada massiivide abil, st iga ajavahemiku jaoks teha aktsiate massiiv ja hindade massiiv. Nii vÔtab see andmete hoidmiseks palju vÀhem ruumi. Ja nendega on veidi mugavam töötada. Need on peaaegu paralleelsed toimingud, st arvutame paralleelselt osaliselt ja siis kirjutame serverisse.
PÀrast seda saab need replitseerida. TÀht 'r' tÀhendab, et need andmed oleme replitseerinud. See tÀhendab, et kÔikidel kolmel serveril on samad andmed - need massiivid.
Ja edasi erilise skripti abil saab sellest 12,5 miljonist korrelatsioonist, mida tuleb arvutada, teha pakendid. See tĂ€hendab 2 500 ĂŒlesannet, milles igaĂŒhes on 5 000 korrelatsiooni paari. Ja seda ĂŒlesannet arvutada konkreetses ClickHouse serveris. KĂ”ik andmed on tal olemas, kuna andmed on samad ja ta saab neid jĂ€rjestikku arvutada.

Veel, kuidas see vĂ€lja nĂ€eb. Esiteks on meil kĂ”ik andmed sellises struktuuris: aeg, aktsiad, hind. Siis arvutasime logReturn, st andmed sama struktuuri, ainult et hinna asemel on meil nĂŒĂŒd logReturn. Siis tegime need ĂŒmber, st meil on aeg ja groupArray aktsiate ja hindade kaupa. Me replikeerisime. Ja pĂ€rast seda genereerisime hulga ĂŒlesandeid ja söötsime need ClickHouse' ile, et see neid arvutaks. Ja see töötab.

Proof of concept'i ĂŒlesanne - see oli alamĂŒlesanne, st vĂ”tsime vĂ€hem andmeid. Ja kĂ”ik vaid kolmel serveril.
Kaks esimest etappi: log_returni arvutamine ja massiividesse pakkimine vÔttis aega umbes tund.
Aga korrelatsiooni arvutamine vÔttis umbes 50 tundi. Kuid 50 tund on vÀhe, sest varem töötas see nÀdalate kaupa. See oli suur edu. Ja kui arvutada, siis 70 korda sekundis arvutati kogu selle klastriga.
Aga kĂ”ige tĂ€htsam on see, et see sĂŒsteem on praktiliselt ilma kitsaskohtadeta, st see skaleerub praktiliselt lineaarselt. Ja nad on seda kontrollinud. Eduka skaleerimise saavutasid.

- Ăige skeem on pool edu. Ja Ă”ige skeem on kĂ”igi vajalike ClickHouse'i tehnoloogiate kasutamine.
- Summing/Aggregating MergeTrees - need on tehnoloogiad, mis vÔimaldavad agregreerida vÔi arvutada snapshot state'i erijuhuks. See lihtsustab palju asju.
- Materialiseeritud vaated vĂ”imaldavad vĂ€ltida ĂŒhe indeksi piirangut. VĂ”ib-olla ei selgitanud ma seda vĂ€ga selgelt, kuid kui laadisime logisid, siis toored logid olid tabelis, kus oli ĂŒks indeks, ja atribuutlogid olid teises tabelis, st samad andmed, ainult filtreeritud, aga indeks oli tĂ€iesti erinev. NĂ€ib, et need on samad andmed, kuid erinev jĂ€rjestus. Ja materialiseeritud vaated vĂ”imaldavad, kui see on vajalik, sellist ClickHouse'i piirangut vĂ€ltida.
- VÀhendage indeksi granulaarsust tÀppisteks pÀringuteks.
- Ja jaotage andmeid nutikalt, pĂŒĂŒdke maksimaalselt lokaliseerida andmeid serveri sees. Ja pĂŒĂŒdke, et pĂ€ringud kasutaksid ka lokaliseerimist seal, kus see on vĂ”imalik maksimaalselt.

KokkuvĂ”ttes vĂ”ib öelda, et ClickHouse on kindlalt haaranud nii kommertsebase andmebaaside kui ka avatud lĂ€htekoodiga andmebaaside territooriumi, st just analĂŒĂŒsi jaoks. See on suurepĂ€raselt sobitunud sellele maastikule. Veelgi enam, see hakkab tasapisi teisi vĂ€lja tĂ”rjuma, sest kui teil on ClickHouse, siis ei vaja te InfiniDB-d. Veridika vĂ”ib peagi olla ebavajalik, kui nad teevad normaalse SQL-i toe. Kasutage seda!

âAitĂ€h ettekande eest! VĂ€ga huvitav! Kas oli mingeid vĂ”rdlusi Apache Phoenixiga?
-Ei, ma ei ole kuulnud, et keegi oleks vĂ”rrelnud. Me ja Yandex pĂŒĂŒame jĂ€lgida kĂ”iki vĂ”rdlusi ClickHouse'i ja erinevate andmebaaside vahel. Sest kui Ă€kki selgub, et midagi on kiirem kui ClickHouse, siis Aleksei Milovidov ei saa öösiti magada ja hakkab seda kiiresti kiirendama. Ma ei ole sellisest vĂ”rdlusest kuulnud.
(Aleksei Milovidov) Apache Phoenix on SQL-mootor Hbase'i peal. Hbase on peamiselt mĂ”eldud key-value tĂŒĂŒpi tööstsenaariumiteks. Iga rida vĂ”ib sisaldada suvalist arvu veerge suvaliste nimedega. Seda saab öelda selliste sĂŒsteemide kohta nagu Hbase, Cassandra. Ja nende peal ei tööta tĂ”sised analĂŒĂŒtilised pĂ€ringud normaalselt. VĂ”i vĂ”ite arvata, et need töötavad normaalselt, kui teil pole ClickHouse'iga töökogemust.
AitÀh
Tere pĂ€evast! Ma olen juba ĂŒsna palju selle teemaga huvitatud, kuna mul on analĂŒĂŒtiline alamsĂŒsteem. Kuid kui ma vaatan ClickHouse'i, siis mul on tunne, et ClickHouse sobib vĂ€ga hĂ€sti sĂŒndmuste, muutuvate andmete analĂŒĂŒsimiseks. Ja kui mul on vaja analĂŒĂŒsida palju Ă€rilisi andmeid koos suurte tabelitega, siis ClickHouse, nii palju kui ma aru saan, ei sobi mulle eriti? Eriti kui need muutuvad. Kas see on Ă”ige vĂ”i on olemas nĂ€iteid, mis vĂ”iksid seda ĂŒmber lĂŒkata?
See on Ă”ige. Ja see kehtib enamiku spetsialiseeritud analĂŒĂŒtiliste andmebaaside kohta. Need on optimeeritud selleks, et seal oleks ĂŒks vĂ”i mitu suurt tabelit, mis on muutuvad, ja palju vĂ€ikseid, mis aeglaselt muutuvad. TeisisĂ”nu, ClickHouse ei ole nagu Oracle, kuhu saab panna kĂ”ike ja luua keerulisi pĂ€ringuid. Et kasutada ClickHouse'i efektiivselt, tuleb skeem ĂŒles ehitada viisil, mis ClickHouse'is hĂ€sti töötab. See tĂ€hendab, et tuleks vĂ€ltida liigset normaliseerimist, kasutada sĂ”nastikke ja pĂŒĂŒda luua vĂ€hem pikki seoseid. Ja kui skeem on ĂŒles ehitatud selliselt, siis sarnaseid Ă€rilisi ĂŒlesandeid ClickHouse'is saab lahendada palju efektiivsemalt kui traditsioonilises relatsioonilises andmebaasis.
AitĂ€h ettekande eest! Mul on kĂŒsimus viimase finantsjuhtumi kohta. Neil oli analĂŒĂŒs. Tuleb vĂ”rrelda, kuidas asjad liiguvad ĂŒles-alla. Ja ma saan aru, et te ehitasite sĂŒsteemi just selle analĂŒĂŒsi jaoks? Kui neil homme, ĂŒtleme, on vaja mingit muud aruannet nende andmete pĂ”hjal, kas tuleb skeem uuesti ĂŒles ehitada ja andmed uuesti laadida? See tĂ€hendab, et tuleb teha mingisugune eelprotsess, et saada pĂ€ring?
Muidugi, see on ClickHouse'i kasutamine tĂ€iesti konkreetse ĂŒlesande lahendamiseks. Seda on traditsiooniliselt vĂ”inud lahendada Hadoopi raames. Hadoopi jaoks on see ideaalne ĂŒlesanne. Kuid Hadoopis on see vĂ€ga aeglane. Ja minu eesmĂ€rk on nĂ€idata, et ClickHouse'is on vĂ”imalik lahendada ĂŒlesandeid, mis tavaliselt lahendatakse tĂ€iesti teiste vahendite abil, kuid samas teha seda palju efektiivsemalt. See on konkreetselt ĂŒhele ĂŒlesandele kohandatud. Loomulikult, kui on sarnane ĂŒlesanne, siis on vĂ”imalik seda sarnasel viisil lahendada.
Selge. Te ĂŒtlesite, et töödeldi 50 tundi. Kas see algas algusest, kui andmed laaditi vĂ”i kui tulemused saadi?
Jah-jah.
HÀsti, suur aitÀh.
See on 3-serveri klastris.
Tervitused! AitĂ€h ettekande eest! KĂ”ik on vĂ€ga huvitav. Ma kĂŒsin natuke mitte funktsionaalsuse kohta, vaid ClickHouse'i kasutamise kohta usaldusvÀÀrsuse seisukohalt. Kas teil on olnud mingeid probleeme, kas on tulnud taastada? Kuidas ClickHouse sel juhul kĂ€itub? Kas on olnud nii, et ka replikatsioon on kokku kukkunud? Me oleme nĂ€iteks ClickHouse'is kokku puutunud probleemiga, et see siiski ĂŒletab oma piiri ja kukub vĂ€lja.
Muidugi ei ole ideaalset sĂŒsteemi. Ka ClickHouse'il on oma probleemid. Kuid kas olete kuulnud, et Yandex.Metrica ei töötanud pikka aega? TĂ”enĂ€oliselt mitte. See on töötanud usaldusvÀÀrselt alates 2012-2013. aastast ClickHouse'il. Minu kogemuse kohta vĂ”in samuti öelda. Meil ei ole kunagi olnud tĂ€ielikke rikkeid. MĂ”ned osalised probleemid vĂ”ivad juhtuda, kuid need pole kunagi olnud nii kriitilised, et tĂ”siselt Ă€ri mĂ”jutada. Sedasorti olukordi ei ole kunagi olnud. ClickHouse on piisavalt usaldusvÀÀrne ega krahhi mingil ettearvamatul pĂ”hjusel. Selle pĂ€rast ei pea muretsema. See ei ole toores asi. Seda on tĂ”estanud paljud ettevĂ”tted.
Tere! Te ĂŒtlesite, et andmeskeemi tuleks kohe hĂ€sti lĂ€bi mĂ”elda. Ent kui see on juba juhtunud? Andmed voolavad ja voolavad. Aasta möödub, ja ma saan aru, et nii ei saa elada, pean andmed uuesti ĂŒles laadima ja millegagi tegelema.
See sĂ”ltub muidugi teie sĂŒsteemist. On mitmeid viise, kuidas seda teha praktiliselt katkestusteta. NĂ€iteks vĂ”ite luua Materialized View, milles on teine andmestruktuur, kui seda saab ĂŒhemĂ”tteliselt kaardistada. St. kui see lubab kaardistamist ClickHouse'i vahenditega, s.t. tuletada mĂ”ningaid asju, muuta primaarvĂ”tit, muuta partitsioneerimist, siis saab teha Materialized View. Vanad andmed saab sinna kirjutada, uued kirjutatakse automaatselt. Ja siis lihtsalt lĂŒlituda Materialized View'i kasutamisele, seejĂ€rel lĂŒlitada kirjutamine ja vana tabel hĂ€vitada. See on tĂ€iesti katkestusteta meetod.
AitÀh.
Allikas: habr.com
