
Trots att det finns mycket data nÀstan överallt nuförtiden, Àr analytiska DBMS fortfarande ganska exotiska. De Àr dÄligt kÀnda och Ànnu sÀmre pÄ att anvÀndas effektivt. MÄnga fortsÀtter att "Àta kaktusar" med MySQL eller PostgreSQL, som Àr utformade för andra scenarier, lider med NoSQL eller betalar överpris för kommersiella lösningar. ClickHouse förÀndrar spelreglerna och sÀnker tröskeln avsevÀrt för att ge sig in i den analytiska DBMS-vÀrlden.
Föredraget Àr frÄn BackEnd Conf 2018 och publiceras med talarens tillstÄnd.


Vem Àr jag och varför pratar jag om ClickHouse? Jag Àr utvecklingschef pÄ LifeStreet, ett företag som anvÀnder ClickHouse. Jag Àr ocksÄ grundare av Altinity, en Yandex-partner som marknadsför ClickHouse och hjÀlper Yandex att göra ClickHouse mer framgÄngsrikt. Jag Àr ocksÄ villig att dela med mig av min kunskap om ClickHouse.

Och jag Àr inte Petya Zaitsevs bror. Jag fÄr ofta frÄgan om detta. Nej, vi Àr inte bröder.

âAlla vetâ att ClickHouse:
- Mycket snabbt,
- Mycket bekvÀmt,
- AnvÀnds i Yandex.
Det Àr nÄgot mindre kÀnt i vilka företag och hur det anvÀnds.

Jag ska berÀtta varför, var och hur ClickHouse anvÀnds, förutom Yandex.
Jag kommer att berÀtta hur specifika uppgifter löses med hjÀlp av ClickHouse i olika företag, vilka ClickHouse-verktyg du kan anvÀnda för dina uppgifter och hur de anvÀndes i olika företag.
Jag har valt ut tre exempel som visar ClickHouse frÄn olika hÄll. Jag tror att det kommer att bli intressant.

Den första frĂ„gan Ă€r: âVarför behöver vi ClickHouse?â Det verkar vara en ganska uppenbar frĂ„ga, men det finns fler Ă€n ett svar pĂ„ den.

- Det första svaret gÀller prestanda. ClickHouse Àr vÀldigt snabbt. Analys pÄ ClickHouse Àr ocksÄ vÀldigt snabbt. Det kan ofta anvÀndas dÀr nÄgot annat fungerar vÀldigt lÄngsamt eller vÀldigt dÄligt.
- Det andra svaret Àr kostnad. Och först och frÀmst, kostnaden för skalning. Vertica Àr till exempel en helt utmÀrkt databas. Den fungerar mycket bra om du inte har mÄnga terabyte data. Men nÀr vi pratar om hundratals terabyte eller petabyte blir kostnaden för licensering och support ganska betydande. Och det Àr dyrt. Och ClickHouse Àr gratis.
- Det tredje svaret Àr driftskostnader. Detta Àr en nÄgot annorlunda metod. RedShift Àr en utmÀrkt analog. Du kan skapa en lösning pÄ RedShift vÀldigt snabbt. Det kommer att fungera bra, men samtidigt kommer du att betala Amazon en hel del varje timme, varje dag, varje mÄnad, eftersom det Àr en betydligt dyrare tjÀnst. Google BigQuery ocksÄ. Om nÄgon har anvÀnt det vet de att man kan köra flera frÄgor dÀr och plötsligt fÄ en rÀkning pÄ hundratals dollar.
ClickHouse har inte dessa problem.

Var anvÀnds ClickHouse nu? Förutom Yandex anvÀnds ClickHouse av en mÀngd olika företag och företag.
- Först och frÀmst Àr detta webbapplikationsanalys, d.v.s. detta Àr ett anvÀndningsfall som kommer frÄn Yandex.
- MÄnga AdTech-företag anvÀnder ClickHouse.
- MÄnga företag som behöver analysera operativa loggar frÄn olika kÀllor.
- Flera företag anvÀnder ClickHouse för att övervaka sÀkerhetsloggar. De laddar upp dem till ClickHouse, skapar rapporter och fÄr de resultat de behöver.
- Företag börjar anvÀnda det inom finansiell analys, d.v.s. gradvis nÀrmar sig Àven stora företag ClickHouse.
- CloudFlare. Om nÄgon följer ClickHouse har de förmodligen hört namnet pÄ det hÀr företaget. Det Àr en av de viktigaste bidragsgivarna frÄn communityn. Och de har en vÀldigt seriös ClickHouse-installation. Till exempel skapade de Kafka Engine för ClickHouse.
- Telekomföretag har börjat anvÀnda det. Flera företag anvÀnder ClickHouse antingen som ett koncepttest eller redan i produktion.
- Ett företag anvÀnder ClickHouse för att övervaka produktionsprocesser. De testar chip, skriver av en mÀngd parametrar, det finns ungefÀr 2 000 egenskaper. Och sedan analyserar de om batchen Àr bra eller dÄlig.
- Blockchain-analys. Det finns ett ryskt företag som heter Bloxy.info. Detta Àr en analys av ethereum-nÀtverket. De gjorde ocksÄ detta pÄ ClickHouse.

Och storleken spelar ingen roll. Det finns mÄnga företag som anvÀnder en enda liten server, och det löser deras problem. Och Ànnu fler företag anvÀnder stora kluster av mÄnga servrar eller dussintals servrar.
Och om man tittar pÄ protokollen, sÄ:
- Yandex: 500+ servrar, 25 miljarder poster per dag lagras dÀr.
- LifeStreet: 60 servrar, cirka 75 miljarder poster per dag. FÀrre servrar, fler poster Àn Yandex.
- CloudFlare: 36 servrar, 200 miljarder poster per dag lagrar de. De har Ànnu fÀrre servrar och lagrar Ànnu mer data.
- Bloomberg: 102 server, ungefÀr en biljon poster per dag. RekordhÄllare för antalet poster.

Geografiskt sett Àr detta ocksÄ mycket. Den hÀr kartan visar en temperaturkarta över var ClickHouse anvÀnds i vÀrlden. Ryssland, Kina och Amerika sticker ut hÀr. Det finns fÄ europeiska lÀnder. Och fyra kluster kan identifieras.
Detta Àr en jÀmförande analys, det finns ingen anledning att leta efter absoluta siffror. Detta Àr en analys av besökare som lÀser engelsksprÄkigt material pÄ Altinitys webbplats, eftersom det inte finns nÄgra rysktalande anvÀndare dÀr. Och Ryssland, Ukraina, Vitryssland, d.v.s. den rysktalande delen av gemenskapen, Àr de mest talrika anvÀndarna. Sedan kommer USA och Kanada. Kina kommer ikapp mycket snabbt. För sex mÄnader sedan var Kina nÀstan obefintligt, nu har Kina redan gÄtt om Europa och fortsÀtter att vÀxa. Gamla Europa ligger inte lÄngt efter, och ledande inom anvÀndningen av ClickHouse Àr, konstigt nog, Frankrike.

Varför berÀttar jag allt detta? För att visa att ClickHouse hÄller pÄ att bli en standardlösning för stordataanalys och redan anvÀnds pÄ mÄnga stÀllen. Om du anvÀnder det Àr du inne pÄ rÀtt spÄr. Om du inte anvÀnder det Àn kan du inte vara rÀdd för att du kommer att vara ensam och att ingen kommer att hjÀlpa dig, eftersom mÄnga redan gör det.

Det hÀr Àr verkliga exempel pÄ hur ClickHouse anvÀnds i flera företag.
- Det första exemplet Àr ett annonsnÀtverk: migrering frÄn Vertica till ClickHouse. Och jag kÀnner till flera företag som har migrerat frÄn Vertica eller hÄller pÄ att migrera.
- Det andra exemplet Àr en transaktionell lagring pÄ ClickHouse. Detta Àr ett exempel byggt pÄ anti-mönster. Allt som inte borde göras i ClickHouse enligt utvecklarnas rÄd görs hÀr. Och det görs sÄ effektivt att det fungerar. Och det fungerar mycket bÀttre Àn en typisk transaktionell lösning.
- Det tredje exemplet Àr distribuerad databehandling pÄ ClickHouse. Det fanns en frÄga om hur ClickHouse kan integreras i Hadoop-ekosystemet. Jag ska visa ett exempel pÄ hur ett företag skapade nÄgot i stil med en kartreducerad containeranalog pÄ ClickHouse, övervakade datalokalisering etc. för att berÀkna en mycket icke-trivial uppgift.

- LifeStreet â Detta Ă€r ett Ad Tech-företag som har all teknik som krĂ€vs för att driva ett annonsnĂ€tverk.
- Hon arbetar med annonsoptimering och programmatisk budgivning.
- Mycket data: cirka 10 miljarder hÀndelser per dag. Samtidigt kan hÀndelser delas in i flera underhÀndelser.
- Det finns mĂ„nga klienter av denna data, och det Ă€r inte bara mĂ€nniskor, utan mycket fler â det Ă€r olika algoritmer som arbetar med programmatisk budgivning.

Företaget har haft en lÄng och mödosam resa. Och jag pratade om det pÄ HighLoad. Först flyttade LifeStreet frÄn MySQL (med ett kort stopp pÄ Oracle) till Vertica. Och du kan hitta en artikel om det.
Och allt var mycket bra, men det blev snabbt tydligt att datamÀngden vÀxte och att Vertica var dyrt. SÄ olika alternativ söktes. NÄgra av dem listas hÀr. Och faktum Àr att vi gjorde proof of concept eller ibland prestandatester av nÀstan alla databaser som fanns tillgÀngliga pÄ marknaden frÄn 13 till 16 och som var ungefÀr lÀmpliga i funktionalitet. Och jag pratade ocksÄ om nÄgra av dem pÄ HighLoad.

Uppgiften var att migrera frÄn Vertica först och frÀmst, eftersom datamÀngden vÀxte. Och den vÀxte exponentiellt i flera Är. Sedan lades den pÄ hyllan, men ÀndÄ. Och med tanke pÄ denna tillvÀxt, affÀrskraven för den datamÀngd som analyser skulle göras pÄ, var det tydligt att det snart skulle pratas om petabyte. Och det Àr redan vÀldigt dyrt att betala för petabyte, sÄ de letade efter ett alternativ, vart de skulle ta vÀgen.

Vart skulle man ta vÀgen? Och lÀnge var det helt oklart vart man skulle ta vÀgen, för Ä ena sidan finns det kommersiella databaser, de verkar fungera bra. Vissa fungerar nÀstan lika bra som Vertica, vissa Àr sÀmre. Men de Àr alla dyra, inget billigare och bÀttre kunde hittas.
à andra sidan finns det lösningar med öppen kÀllkod, vilka inte Àr sÀrskilt mÄnga, d.v.s. för analys kan man rÀkna dem pÄ fingrarna. Och de Àr gratis eller billiga, men de arbetar lÄngsamt. Och de saknar ofta den nödvÀndiga och anvÀndbara funktionaliteten.
Och det fanns ingenting som kombinerade de goda sakerna som finns i kommersiella databaser och allt som Àr gratis som finns i öppen kÀllkod.

Det fanns ingenting förrÀn Yandex plötsligt drog ut ClickHouse som en trollkarl som drar en kanin ur en hatt. Och det var ett ovÀntat beslut, och folk stÀller sig fortfarande frÄgan: "Varför?", men ÀndÄ.

Och direkt sommaren 2016 började vi titta pÄ vad ClickHouse Àr. Och det visade sig att det ibland kan vara snabbare Àn Vertica. Vi testade olika scenarier pÄ olika frÄgor. Och om frÄgan bara anvÀnde en tabell, dvs. utan nÄgra joins, dÄ var ClickHouse dubbelt sÄ snabb som Vertica.
Jag var inte lat och tittade pÄ Yandex tester hÀromdagen. Det Àr samma sak dÀr: ClickHouse Àr dubbelt sÄ snabb som Vertica, sÄ de pratar ofta om det.
Men om det finns joins i frÄgorna, dÄ Àr allt inte sÄ tydligt. Och ClickHouse kan vara dubbelt sÄ lÄngsamt som Vertica. Men om du korrigerar och skriver om frÄgan nÄgot, dÄ Àr de ungefÀr lika. Inte dÄligt. Och gratis.

Och efter att ha mottagit testresultaten och granskat dem frÄn olika vinklar, gick LifeStreet till ClickHouse.

Det hÀr Àr 16:e Äret, vill jag pÄminna er. Det var som i skÀmtet om mössen som grÀt och stack sig, men fortsatte att Àta kaktusen. Och det berÀttades i detalj, det finns en video om det, etc.

DÀrför kommer jag inte att gÄ in pÄ detaljer om det, jag kommer bara att prata om resultaten och nÄgra intressanta saker som jag inte pratade om dÄ.
Resultaten Àr:
- Migreringen har lyckats och systemet har varit i produktion i över ett Är.
- Prestanda och flexibilitet har ökat. FrÄn 10 miljarder poster som vi hade rÄd att lagra per dag och inte lÀnge, lagrar LifeStreet nu 75 miljarder poster per dag och kan göra detta i 3 mÄnader eller mer. Om man rÀknar vid toppnivÄ lagras upp till en miljon hÀndelser per sekund. Mer Àn en miljon SQL-frÄgor per dag flyger in i det hÀr systemet, frÀmst frÄn olika robotar.
- Trots att ClickHouse började anvÀnda fler servrar Àn Vertica, sparades det ocksÄ pÄ hÄrdvara, eftersom Vertica anvÀnde ganska dyra SAS-diskar. ClickHouse anvÀnde SATA. Varför? För att Vertica har synkron insert. Och synkronisering krÀver att diskarna inte saktar ner för mycket, och Àven att nÀtverket inte saktar ner för mycket, d.v.s. det Àr en ganska dyr operation. Och i ClickHouse Àr insert asynkront. Dessutom kan man alltid skriva allt lokalt, det finns inga extra kostnader för detta, sÄ data kan infogas i ClickHouse mycket snabbare Àn i Vertica, Àven pÄ inte de snabbaste diskarna. Och lÀsning Àr ungefÀr detsamma. LÀsning pÄ SATA, om de Àr i RAID, dÄ gÄr allt ganska snabbt.
- Inte begrÀnsat av licens, d.v.s. 3 petabyte data pÄ 60 servrar (20 servrar Àr en replik) och 6 biljoner poster i fakta och aggregeringar. Inget liknande hade Vertica rÄd med.

Nu gÄr jag vidare till det praktiska i det hÀr exemplet.
- Det första Àr ett effektivt system. Mycket beror pÄ systemet.
- Det andra Àr att generera effektiv SQL.

En typisk OLAP-frÄga Àr select. Vissa kolumner gÄr till group by, andra kolumner gÄr till aggregeringsfunktioner. Det finns where, vilket kan representeras som en del av kuben. Hela group by kan representeras som en projektion. Och det Àr dÀrför det kallas flerdimensionell dataanalys.

Och ofta modelleras detta i form av ett stjÀrndiagram, nÀr det finns ett centralt faktum och egenskaper hos detta faktum pÄ sidorna, lÀngs strÄlarna.

Och ur ett fysiskt designperspektiv, hur det passar in i tabellen, dÄ brukar de göra en normaliserad representation. Man kan avnormalisera, men det Àr dyrt pÄ disk och inte sÀrskilt effektivt nÀr det gÀller frÄgor. DÀrför brukar de göra en normaliserad representation, dvs. en faktatabell och mÄnga, mÄnga dimensionstabeller.
Men i ClickHouse fungerar det dÄligt. Det finns tvÄ anledningar:
- Det första beror pÄ att ClickHouse inte har sÀrskilt bra joins, d.v.s. det finns joins, men de Àr dÄliga. Hittills dÄliga.
- Det andra Àr att tabellerna inte uppdateras. Vanligtvis i dessa tabeller som ligger runt stjÀrnschemat behöver nÄgot Àndras. Till exempel klientnamnet, företagsnamnet etc. Och det fungerar inte.
Och det finns en vÀg ut ur detta i ClickHouse. Det finns faktiskt tvÄ:
- Det första Àr att anvÀnda ordböcker. Externa ordböcker Àr det som hjÀlper till att lösa 99 % av problemen med stjÀrnschemat, uppdateringar etc.
- Det andra Àr anvÀndningen av arrayer. Arrayer hjÀlper ocksÄ till att bli av med joins och problem med normalisering.

- Inga kopplingar behövs.
- Uppdaterbar. Sedan mars 2018 har en odokumenterad funktion dykt upp (du hittar den inte i dokumentationen) för att uppdatera ordböcker delvis, dvs. de poster som har Àndrats. I praktiken Àr det som en tabell.
- Alltid i minnet, sÄ kopplingar med en ordlista fungerar snabbare Àn om det vore en tabell som fanns pÄ disk och det inte var ett faktum att den fanns i cachen, troligtvis inte.

- Inget behov av joins heller.
- Detta Àr en kompakt 1-till-mÄnga-representation.
- Och enligt min mening Àr arrayer gjorda för nördar. Det hÀr Àr lambdafunktioner och sÄ vidare.
Detta Àr inte bara ett slagord. Det hÀr Àr en mycket kraftfull funktion som lÄter dig göra mÄnga saker vÀldigt enkelt och elegant.

Typiska exempel som hjÀlper till att lösa matriser. Dessa exempel Àr enkla och ganska illustrativa:
- Sök efter taggar. Om du har hashtaggar dÀr och vill hitta inlÀgg efter hashtag.
- Sök efter nyckel-vÀrde-par. Det finns ocksÄ vissa attribut med ett vÀrde.
- Föra listor över nycklar som du behöver översÀtta till nÄgot annat.
Alla dessa uppgifter kan lösas utan arrayer. Taggar kan placeras pÄ nÄgon rad och vÀljas med ett reguljÀrt uttryck eller i en separat tabell, men dÄ mÄste man göra joins.

Och i ClickHouse behöver du inte göra nÄgonting, det rÀcker med att beskriva en strÀngmatris för hashtags eller skapa en kapslad struktur för system av nyckel-vÀrde-typ.
Kapslad struktur Àr kanske inte det bÀsta namnet. Det Àr tvÄ arrayer som har en gemensam del i namnet och nÄgra relaterade egenskaper.
Och det Àr vÀldigt enkelt att söka efter tagg. Det finns en funktion has, vilket kontrollerar att arrayen innehÄller ett element. Det var allt, vi hittade alla poster som relaterar till vÄr konferens.
Att söka efter sub-id Àr lite mer komplicerat. Vi behöver först hitta nyckelindexet och sedan ta elementet med detta index och kontrollera att det hÀr vÀrdet Àr vad vi behöver. Men det Àr ÀndÄ vÀldigt enkelt och kompakt.
Det reguljÀra uttryck du skulle vilja skriva om du lagrade allt pÄ en rad skulle för det första vara klumpigt. Och för det andra skulle det ta mycket lÀngre tid att arbeta Àn tvÄ arrayer.

Ett annat exempel. Du har en array dÀr du lagrar ID:n. Och du kan översÀtta dem till namn. Funktionen arrayMapDetta Àr en typisk lambda-funktion. Du skickar lambda-uttryck dit. Och den hÀmtar namnvÀrdet för varje ID frÄn ordlistan.
En sökning kan göras pÄ ett liknande sÀtt. En predikatfunktion skickas, som kontrollerar vad elementen motsvarar.

Dessa saker förenklar systemet avsevÀrt och löser mÄnga problem.
Men nÀsta problem vi stötte pÄ som jag vill nÀmna Àr effektiva frÄgor.
- ClickHouse har ingen frÄgeplanerare. Ingen alls.
- Men komplexa frÄgor mÄste ÀndÄ planeras. I vilka fall?
- Om det finns flera kopplingar i frÄgan, slÄr du in dem i undersekvenser. Och ordningen i vilken de körs spelar roll.
- Och den andra - om frÄgan Àr distribuerad. För i en distribuerad frÄga exekveras endast den innersta delselekteringen distribuerat, och allt annat överförs till en server som du har anslutit och exekverat dÀr. DÀrför, om du har distribuerade frÄgor med mÄnga joins, mÄste du vÀlja ordningen.
Och Àven i enklare fall bör ibland planerarens arbete göras och frÄgorna skrivas om nÄgot.

HÀr Àr ett exempel. Till vÀnster, en frÄga som visar de 5 frÀmsta lÀnderna. Och det tar 2,5 sekunder, tror jag. Och till höger, samma frÄga, men nÄgot omskriven. IstÀllet för att gruppera efter strÀng började vi gruppera efter nyckel (int). Och det Àr snabbare. Och sedan kopplade vi en ordbok till resultatet. IstÀllet för 2,5 sekunder tar frÄgan 1,5 sekunder. Det Àr bra.

Ett liknande exempel med omskrivning av filter. HĂ€r Ă€r en frĂ„ga för Ryssland. Det tar 5 sekunder. Om vi ââskriver om den pĂ„ ett sĂ„dant sĂ€tt att vi inte jĂ€mför en strĂ€ng, utan tal med nĂ„gon uppsĂ€ttning nycklar som relaterar till Ryssland, kommer det att gĂ„ mycket snabbare.

Det finns mÄnga sÄdana knep. Och de lÄter dig avsevÀrt snabba upp frÄgor som du tror redan fungerar snabbt, eller tvÀrtom, fungerar lÄngsamt. De kan göras Ànnu snabbare.

- Maximalt arbete i distribuerat lÀge.
- Sorterar efter minsta typer, som jag gjorde efter heltal.
- Om det finns nÄgra kopplingar eller ordböcker Àr det bÀttre att göra dem sist, nÀr du redan har Ätminstone delvis grupperad data, dÄ kommer kopplingsoperationen eller ordboksanropet att anropas fÀrre gÄnger och det kommer att gÄ snabbare.
- Byte av filter.
Det finns andra tekniker Àn bara de jag har demonstrerat, och alla kan ibland avsevÀrt snabba upp exekveringen av frÄgor.

LÄt oss gÄ vidare till nÀsta exempel. Företag X frÄn USA. Vad gör det?
Uppgiften var:
- Offline-lÀnkning av annonstransaktioner.
- Modellering av olika bindningsmodeller.

Vad Àr scenariot?
En vanlig besökare kommer till webbplatsen, till exempel, 20 gÄnger i mÄnaden frÄn olika annonser eller ibland utan annonser, eftersom hen kommer ihÄg den hÀr webbplatsen. Tittar pÄ nÄgra produkter, lÀgger dem i varukorgen, tar ut dem ur varukorgen. Och köper till slut nÄgot.
Rimliga frÄgor: "Vem ska fÄ betalt för reklam, om det behövs?" och "Vilken reklam pÄverkade honom, om den gjorde det?" Det vill sÀga, varför köpte han och hur kan vi göra det sÄ att personer som liknar den hÀr personen ocksÄ köper?
För att lösa detta problem behöver du koppla samman hÀndelserna som intrÀffar pÄ webbplatsen pÄ rÀtt sÀtt, d.v.s. pÄ nÄgot sÀtt skapa en koppling mellan dem. Sedan överföra dem för analys till DWH. Och baserat pÄ denna analys bygga modeller för vem som ska visa vilka annonser för.

En annonstransaktion Àr en uppsÀttning relaterade anvÀndarhÀndelser som börjar med att en annons visas, sedan hÀnder nÄgot, sedan kanske ett köp, och sedan kan det finnas köp inom ett köp. Om det till exempel Àr en mobilapp eller ett mobilspel, sÄ installeras appen vanligtvis gratis, men om nÄgot annat görs dÀr, dÄ kan pengar krÀvas. Och ju mer en person spenderar i appen, desto mer vÀrdefull Àr den. Men för detta mÄste allt vara uppkopplat.

Det finns mÄnga modeller av bindning.
De mest populÀra Àr:
- Senaste interaktion, dÀr interaktionen antingen Àr ett klick eller en visning.
- Första interaktionen, d.v.s. det första som förde en person till webbplatsen.
- LinjÀr kombination - lika andelar för alla.
- Fading.
- Och sÄ vidare.

Och hur fungerade allt frĂ„n början? Det fanns Runtime och Cassandra. Cassandra anvĂ€ndes som transaktionslagring, d.v.s. alla relaterade transaktioner lagrades dĂ€r. Och nĂ€r en hĂ€ndelse intrĂ€ffade i Runtime, till exempel visning av en sida eller nĂ„got annat, dĂ„ gjordes en förfrĂ„gan till Cassandra â om en sĂ„dan person existerade eller inte. Sedan hĂ€mtades transaktionerna relaterade till honom. Och lĂ€nkningen utfördes.
Och om du har tur att begÀran har ett transaktions-ID, sÄ Àr det enkelt. Men oftast har du otur. SÄ du var tvungen att hitta den senaste transaktionen eller transaktionen med det senaste klicket, etc.
Och allt fungerade vÀldigt bra, sÄ lÀnge kopplingen var till det sista klicket. För klick, sÀg, 10 miljoner per dag, 300 miljoner per mÄnad, om man stÀller in ett fönster pÄ en mÄnad. Och eftersom allt i Cassandra mÄste finnas i minnet för att fungera snabbt, eftersom Runtime mÄste svara snabbt, dÄ krÀvdes ungefÀr 10-15 servrar.
Och nÀr de ville lÀnka en transaktion till displayen blev det inte sÄ roligt direkt. Och varför? Det Àr uppenbart att 30 gÄnger fler hÀndelser behöver lagras. Och följaktligen behövs 30 gÄnger fler servrar. Och det visar sig att detta Àr nÄgon slags astronomisk siffra. Att behÄlla upp till 500 servrar för att göra lÀnkningen, med tanke pÄ att det finns betydligt fÀrre servrar i Runtime, Àr nÄgon slags felaktig siffra. Och de började fundera pÄ vad de skulle göra.

Och vi gick till ClickHouse. Och hur gör man det pÄ ClickHouse? Vid första anblicken verkar det som en uppsÀttning antimönster.
- Transaktionen vÀxer, vi kopplar fler och fler nya hÀndelser till den, d.v.s. den Àr muterbar, och ClickHouse fungerar inte sÀrskilt bra med muterbara objekt.
- NĂ€r en besökare kommer till oss behöver vi extrahera hans transaktioner efter nyckel, efter hans besöks-ID. Detta Ă€r ocksĂ„ en punktfrĂ„ga, ClickHouse gör inte det. ClickHouse har vanligtvis stora ...skanningar, men hĂ€r behöver vi extrahera flera poster. Ăven ett antimönster.
- Dessutom var transaktionen i json, men de ville inte skriva om den, sÄ de ville lagra json ostrukturerad, och om nödvÀndigt, extrahera nÄgot frÄn den. Och detta Àr ocksÄ ett antimönster.
Det vill sÀga en uppsÀttning antimönster.

Men trots det lyckades vi skapa ett system som fungerade mycket bra.
Vad gjordes? ClickHouse dök upp, dÀr loggar, uppdelade i poster, lades till. En attributionstjÀnst dök upp, som tog emot loggar frÄn ClickHouse. DÀrefter tog den emot transaktioner som Ànnu inte kunde ha bearbetats för varje post efter besöks-ID, plus ögonblicksbilder, dvs. transaktioner som redan var lÀnkade, nÀmligen resultatet av tidigare arbete. FrÄn dem skapade den logik, valde rÀtt transaktion, kopplade nya hÀndelser. à terigen skrev den till loggen. Loggen gick tillbaka till ClickHouse, dvs. detta Àr ett stÀndigt cykliskt system. Och dessutom gick den till DWH för att analysera den dÀr.
Det fungerade inte sĂ€rskilt bra i den hĂ€r formen. Och för att göra det enklare för ClickHouse, nĂ€r det kom en förfrĂ„gan efter besöks-ID, grupperade de dessa förfrĂ„gningar i block om 1 000â2 000 besöks-ID:n och hĂ€mtade ut alla transaktioner för 1 000â2 000 personer. Och sedan fungerade allt.

Om du tittar inuti ClickHouse finns det bara 3 huvudbord som serverar allt detta.
Den första tabellen till vilken loggar laddas upp, och loggarna laddas upp praktiskt taget utan bearbetning.
Den andra tabellen. Genom den materialiserade vyn extraherades hÀndelser som Ànnu inte hade tillskrivits frÄn dessa loggar, dvs. orelaterade. Och genom den materialiserade vyn extraherades transaktioner frÄn dessa loggar för att skapa en ögonblicksbild. Det vill sÀga, en speciell materialiserad vy skapade en ögonblicksbild, nÀmligen transaktionens senast ackumulerade tillstÄnd.

HÀr Àr texten skriven i SQL. Jag skulle vilja kommentera flera viktiga saker i den.
Det första viktiga Àr möjligheten att extrahera kolumner och fÀlt frÄn json i ClickHouse. Det vill sÀga, ClickHouse har nÄgra metoder för att arbeta med json. De Àr vÀldigt, vÀldigt primitiva.
visitParamExtractInt lÄter dig extrahera attribut frÄn json, d.v.s. den första trÀffen fungerar. Och pÄ sÄ sÀtt kan du extrahera transaktions-ID eller besöks-ID. Det Àr ett exempel.
För det andra anvÀnds ett knepigt materialiserat fÀlt hÀr. Vad betyder det? Det betyder att du inte kan infoga det i tabellen, d.v.s. det infogas inte, utan berÀknas och lagras nÀr det infogas. NÀr det infogas gör ClickHouse jobbet Ät dig. Och det du behöver senare hÀmtas frÄn json-filen.
I det hÀr fallet Àr den materialiserade vyn för obearbetade rader. Och den första tabellen med nÀstan rÄa loggar anvÀnds. Och vad gör den? Först Àndrar den sorteringen, d.v.s. sorteringen sker nu efter besöks-ID, eftersom vi snabbt behöver extrahera en transaktion för en specifik person.
Den andra viktiga saken Àr index_granularity. Om du har sett MergeTree Àr standardvÀrdet vanligtvis 8 192 index_granularity. Vad Àr det? Detta Àr indexets sparseness-parameter. I ClickHouse Àr indexet sparse, det indexerar aldrig varje post. Det gör detta var 8 192:e. Och detta Àr bra nÀr du behöver berÀkna mycket data, men dÄligt nÀr du behöver berÀkna lite, eftersom overheaden Àr stor. Och om du minskar indexgranulariteten minskar vi overheaden. Du kan inte minska den till ett, eftersom det kanske inte finns tillrÀckligt med minne. Indexet lagras alltid i minnet.

Och ögonblicksbilden anvÀnder nÄgra andra intressanta ClickHouse-funktioner.
Först Àr det AggregatingMergeTree. Och AggregatingMergeTree lagrar argMax, d.v.s. detta Àr transaktionstillstÄndet som motsvarar den senaste tidsstÀmpeln. Nya transaktioner genereras stÀndigt för denna besökare. Och i det allra sista tillstÄndet för denna transaktion lade vi till en hÀndelse och vi fick ett nytt tillstÄnd. Det hamnade i ClickHouse igen. Och genom argMax i denna materialiserade vy kan vi alltid fÄ det aktuella tillstÄndet.

- Bindningen Àr frikopplad frÄn Runtime.
- Lagrar och bearbetar upp till 3 miljarder transaktioner per mÄnad. Detta Àr en storleksordning mer Àn Cassandra, ett typiskt transaktionssystem.
- Ett kluster av 2x5 ClickHouse-servrar. 5 servrar och varje server har en replika. Detta Àr Ànnu fÀrre Àn vad det var i Cassandra för att göra klickbaserad attribution, och hÀr har vi visningsbaserad. Det vill sÀga, istÀllet för att öka antalet servrar med 30 gÄnger, minskades de.

Och det sista exemplet Àr finansföretaget Y, som analyserade korrelationer mellan förÀndringar i aktiekurser.
Och uppgiften var denna:
- Det finns cirka 5 000 aktier.
- Citat Àr kÀnda var 100:e millisekund.
- Informationen har samlats in under 10 Är. Tydligen Àr det mer för vissa företag, mindre för andra.
- Det finns ungefÀr 100 miljarder linjer totalt.
Och det var nödvÀndigt att berÀkna korrelationen mellan förÀndringarna.

HÀr Àr tvÄ aktier och deras kurser. Om den ena gÄr upp och den andra gÄr upp, dÄ Àr detta en positiv korrelation, d.v.s. den ena vÀxer och den andra vÀxer. Om den ena gÄr upp, som i slutet av diagrammet, och den andra gÄr ner, dÄ Àr detta en negativ korrelation, d.v.s. nÀr den ena vÀxer, faller den andra.
Genom att analysera dessa ömsesidiga förÀndringar kan man göra förutsÀgelser pÄ finansmarknaden.

Men uppgiften Àr komplicerad. Vad görs för detta? Vi har 100 miljarder poster, som innehÄller: tid, lager och pris. Vi mÄste först berÀkna 100 miljarder gÄnger runningDifference frÄn prisalgoritmen. RunningDifference Àr en funktion i ClickHouse som sekventiellt berÀknar skillnaden mellan tvÄ rader.
Och efter det behöver du berÀkna korrelationen, och korrelationen behöver berÀknas för varje par. För 5 000 aktier finns det 12,5 miljoner par. Och det Àr mycket, d.v.s. du behöver berÀkna denna korrelationsfunktion 12,5 gÄnger.
Och om nĂ„gon glömde, sĂ„ Ă€r Íx och Íy den matematiska förvĂ€ntade siffran för urvalet. Det vill sĂ€ga, vi behöver berĂ€kna inte bara rötterna och summorna, utan ocksĂ„ nĂ„gra fler summor inom dessa summor. En hel massa berĂ€kningar mĂ„ste göras 12,5 miljoner gĂ„nger, och de mĂ„ste ocksĂ„ grupperas efter timmar. Och vi har ocksĂ„ mĂ„nga timmar. Och vi mĂ„ste göra det pĂ„ 60 sekunder. Det hĂ€r Ă€r ett skĂ€mt.

Vi var tvungna att fÄ det att fungera pÄ nÄgot sÀtt, eftersom allt detta fungerade vÀldigt, vÀldigt lÄngsamt innan ClickHouse dök upp.

De försökte berÀkna det pÄ Hadoop, pÄ Spark, pÄ Greenplum. Och allt detta var vÀldigt lÄngsamt eller dyrt. Det vill sÀga, det var möjligt att pÄ nÄgot sÀtt berÀkna det, men det var dyrt.

Och sedan kom ClickHouse och allt blev mycket bÀttre.
LÄt mig pÄminna er om att vi har ett problem med datalokalitet, eftersom korrelationer inte kan lokaliseras. Vi kan inte lÀgga viss data pÄ en server, viss data pÄ en annan och berÀkna, vi mÄste ha all data överallt.
Vad gjorde de? Inledningsvis Àr informationen lokaliserad. Varje server lagrar data om prissÀttningen av en viss uppsÀttning aktier. Och de korsar inte varandra. DÀrför Àr det möjligt att berÀkna logReturn parallellt och oberoende, allt detta sker parallellt och distribueras för tillfÀllet.
Sedan bestÀmde vi oss för att reducera denna data utan att förlora uttrycksfullhet. Reducera den med hjÀlp av arrayer, d.v.s. för varje tidsintervall, skapa en array med aktier och en array med priser. PÄ sÄ sÀtt tar informationen upp mycket mindre plats. Och det Àr nÄgot bekvÀmare att arbeta med dem. Dessa Àr nÀstan parallella operationer, d.v.s. vi berÀknar delvis parallellt och skriver sedan till servern.
Efter det kan den replikeras. Bokstaven "r" betyder att vi har replikerat dessa data. Det vill sÀga, vi har samma data pÄ alla tre servrar - dessa arrayer.
Och sedan, med hjÀlp av ett speciellt skript, kan du skapa paket frÄn denna uppsÀttning av 12,5 miljoner korrelationer som behöver berÀknas. Det vill sÀga 2 500 uppgifter med 5 000 par korrelationer. Och berÀkna denna uppgift pÄ en specifik ClickHouse-server. Den har all data, eftersom datan Àr densamma och den kan berÀkna dem sekventiellt.

à terigen, hur det ser ut. Först har vi all data i den hÀr strukturen: tid, aktier, pris. Sedan berÀknade vi logReturn, d.v.s. data frÄn samma struktur, fast istÀllet för pris har vi logReturn. Sedan omarbetades de, d.v.s. vi fick time och groupArray efter aktier och priser. Replikerade. Och efter det genererade vi en massa uppgifter och matade dem till ClickHouse sÄ att det skulle berÀkna dem. Och det fungerar.

För koncepttestningsuppgiften var det en deluppgift, d.v.s. de tog mindre data. Och bara pÄ tre servrar.
De tvÄ första stegen: att berÀkna Log_return och slÄ in den i arrayer tog ungefÀr en timme vardera.
Och berÀkningen av korrelationen Àr ungefÀr 50 timmar. Men 50 timmar Àr inte tillrÀckligt, för innan dess fungerade det i veckor. Det var en stor framgÄng. Och om man rÀknar, sÄ berÀknades allting 70 gÄnger per sekund pÄ detta kluster.
Men det viktigaste Àr att det hÀr systemet i princip inte har nÄgra flaskhalsar, d.v.s. det skalar nÀstan linjÀrt. Och de testade det. De skalade det framgÄngsrikt.

- RÀtt upplÀgg Àr halva framgÄngen. Och rÀtt upplÀgg Àr anvÀndningen av all nödvÀndig ClickHouse-teknik.
- Summing/AggregatingMergeTrees Àr teknologier som möjliggör aggregering eller att betrakta en tillstÄndsbild som ett specialfall. Och detta förenklar mÄnga saker avsevÀrt.
- Materialized Views lÄter dig kringgÄ begrÀnsningen av ett index. Jag kanske inte sa det sÄ tydligt, men nÀr vi laddade loggarna fanns de rÄa loggarna i en tabell med ett index, och attributloggarna fanns i en tabell, d.v.s. samma data, bara filtrerade, men indexet var helt annorlunda. Det verkar vara samma data, men med annan sortering. Och Materialized Views lÄter dig, om du behöver det, kringgÄ denna ClickHouse-begrÀnsning.
- Minska indexgranulariteten för punktfrÄgor.
- Och distribuera data klokt, försök att lokalisera data inom servern sÄ mycket som möjligt. Och försök att anvÀnda lokalisering i sÄ stor utstrÀckning som möjligt vid frÄgor.

Och för att sammanfatta detta korta anförande kan vi sÀga att ClickHouse nu har ockuperat territoriet för bÄde kommersiella databaser och databaser med öppen kÀllkod, d.v.s. specifikt för analys. Det har passat anmÀrkningsvÀrt bra in i detta landskap. Och dessutom börjar det sakta men sÀkert ersÀtta andra, för nÀr du har ClickHouse behöver du inte InfiniDB. Vertika kan snart bli onödigt om de har normalt SQL-stöd. AnvÀnd det!

-Tack för rapporten! Mycket intressant! Fanns det nÄgra jÀmförelser med Apache Phoenix?
â Nej, jag har inte hört talas om nĂ„gon som jĂ€mfört. Vi och Yandex försöker spĂ„ra alla jĂ€mförelser av ClickHouse med olika databaser. För om nĂ„got visar sig vara snabbare Ă€n ClickHouse, dĂ„ kan Lesha Milovidov inte sova pĂ„ natten och börjar snabba upp det snabbt. Jag har inte hört talas om en sĂ„dan jĂ€mförelse.
(Alexey Milovidov) Apache Phoenix Àr en SQL-motor pÄ Hbase. Hbase Àr huvudsakligen avsedd för nyckel-vÀrde-scenarier. Varje rad kan ha ett godtyckligt antal kolumner med godtyckliga namn. Detta kan sÀgas om system som Hbase, Cassandra. Och tunga analytiska frÄgor kommer inte att fungera normalt pÄ dem. Eller sÄ kanske du tror att de fungerar normalt om du inte har nÄgon erfarenhet av ClickHouse.
Tack
Hej! Jag Àr redan ganska intresserad av det hÀr Àmnet, eftersom jag har ett analytiskt delsystem. Men nÀr jag tittar pÄ ClickHouse fÄr jag kÀnslan av att ClickHouse Àr mycket vÀl lÀmpat för att analysera hÀndelser, det Àr förÀnderligt. Och om jag behöver analysera mycket affÀrsdata med en massa stora tabeller, dÄ Àr ClickHouse, sÄvitt jag förstÄr, inte sÀrskilt lÀmpligt för mig? SÀrskilt om de Àndras. StÀmmer detta eller finns det exempel som kan motbevisa detta?
Det stÀmmer. Och det stÀmmer om de flesta specialiserade analytiska databaser. De Àr utformade för en eller flera stora tabeller som Àr förÀnderliga, och mÄnga smÄ som Àndras lÄngsamt. Det vill sÀga, ClickHouse Àr inte som Oracle, dÀr man kan lÀgga in allt och bygga nÄgra vÀldigt komplexa frÄgor. För att kunna anvÀnda ClickHouse effektivt mÄste man bygga ett schema pÄ ett sÀtt som fungerar bra i ClickHouse. Det vill sÀga, undvik överdriven normalisering, anvÀnd ordböcker, försök att göra fÀrre lÄnga lÀnkar. Och om man bygger ett schema pÄ det hÀr sÀttet kan liknande affÀrsuppgifter pÄ ClickHouse lösas mycket mer effektivt Àn i en traditionell relationsdatabas.
Tack för rapporten! Jag har en frÄga om det senaste ekonomiska fallet. De hade analyser. Det var nödvÀndigt att jÀmföra hur de gÄr upp och ner. Och som jag förstÄr det, byggde ni systemet specifikt för denna analys? Om de till exempel behöver nÄgon annan rapport om dessa data imorgon, behöver de bygga om schemat och ladda in datan? Det vill sÀga, göra nÄgon förbehandling för att fÄ begÀran?
Naturligtvis anvÀnder man ClickHouse för en mycket specifik uppgift. Den skulle kunna lösas mer traditionellt inom Hadoop. För Hadoop Àr detta en idealisk uppgift. Men pÄ Hadoop Àr det vÀldigt lÄngsamt. Och mitt mÄl Àr att visa att ClickHouse kan lösa uppgifter som vanligtvis löses med helt andra metoder, men samtidigt kan det göras mycket mer effektivt. Detta Àr skrÀddarsytt för en specifik uppgift. Det Àr tydligt att om det finns en uppgift som Àr nÄgot liknande, sÄ kan den lösas pÄ ett liknande sÀtt.
Jag förstĂ„r. Du sa 50 timmars bearbetning. Ăr det frĂ„n allra första början, nĂ€r du laddade in data eller fick resultaten?
Jaja.
Okej, tack sÄ mycket.
Detta Àr pÄ ett kluster med 3 servrar.
Hej! Tack för rapporten! Allt Àr vÀldigt intressant. Jag frÄgar inte om funktionaliteten, utan om anvÀndningen av ClickHouse ur stabilitetssynpunkt. Det vill sÀga, har ni haft nÄgra, var ni tvungna att ÄterstÀlla? Hur beter sig ClickHouse i det hÀr fallet? Och har det nÄgonsin hÀnt att ni ocksÄ har haft en replikkrasch? Till exempel stötte vi pÄ ett problem med ClickHouse nÀr det ÀndÄ överskrider sin grÀns och kraschar.
Naturligtvis finns det inga ideala system. Och ClickHouse har sina egna problem. Men har du hört talas om att Yandex.Metrica inte har fungerat pÄ lÀnge? Förmodligen inte. Det har fungerat tillförlitligt sedan ungefÀr 2012-2013 pÄ ClickHouse. Jag kan ocksÄ tala om mina erfarenheter. Vi har aldrig haft fullstÀndiga fel. Vissa delvisa saker kunde hÀnda, men de var aldrig tillrÀckligt kritiska för att allvarligt pÄverka verksamheten. Detta har aldrig hÀnt. ClickHouse Àr ganska tillförlitligt och kraschar inte slumpmÀssigt. Du behöver inte oroa dig för det. Det Àr inte en rÄ sak. Detta har bevisats av mÄnga företag.
Hej! Du sa att du mÄste tÀnka igenom dataschemat direkt. Men tÀnk om det hÀr hÀnde? Min data strömmar in och ut. Ett halvÄr gÄr, och jag förstÄr att jag inte kan leva sÄ hÀr, jag mÄste ladda upp informationen igen och göra nÄgot med den.
Det beror naturligtvis pÄ ditt system. Det finns flera sÀtt att göra detta praktiskt utan att stoppa. Till exempel kan du skapa en Materialized View, dÀr du skapar en annan datastruktur, om den kan mappas entydigt. Det vill sÀga, om den tillÄter mappning med hjÀlp av ClickHouse, dvs. extrahera vissa saker, Àndra primÀrnyckeln, Àndra partitioneringen, dÄ kan du skapa en Materialized View. Skriv om dina gamla data dÀr, de nya kommer att skrivas automatiskt. Och sedan bara byta till att anvÀnda Materialized View, sedan byta post och avsluta den gamla tabellen. Detta Àr en metod utan att stoppa alls.
Tack.
KĂ€lla: will.com
