
Trots att det idag finns mycket data nÀstan överallt, Àr analytiska databaser fortfarande ganska exotiska. De Àr dÄligt kÀnda och Ànnu sÀmre anvÀnds effektivt. MÄnga fortsÀtter att "Àta kaktus" med MySQL eller PostgreSQL, som Àr designade för andra scenarier, eller sliter med NoSQL, eller betalar för mycket för kommersiella lösningar. ClickHouse Àndrar spelreglerna och sÀnker avsevÀrt tröskeln för att komma in i vÀrlden av analytiska DBMS.
Rapporten frÄn BackEnd Conf 2018 och den publiceras med talarens tillstÄnd.


Vem Àr jag och varför berÀttar jag om ClickHouse? Jag Àr utvecklingschef pÄ LifeStreet, som anvÀnder ClickHouse. Dessutom Àr jag grundare av Altinity. Detta Àr en partner till Yandex, som frÀmjar ClickHouse och hjÀlper Yandex att göra ClickHouse mer framgÄngsrikt. Jag Àr ocksÄ villig att dela med mig av kunskapen om ClickHouse.

Och förresten, jag Àr inte bror till Petya Zaitsev. Jag fÄr ofta frÄgor om detta. Nej, vi Àr inte bröder.

«Alla vet», att ClickHouse:
- Ăr mycket snabb,
- Ăr mycket anvĂ€ndarvĂ€nlig,
- AnvÀnds i Yandex.
Lite mindre kÀnt Àr vilka företag och hur det anvÀnds.

Jag ska berÀtta för er varför, var och hur ClickHouse anvÀnds, förutom Yandex.
Jag kommer att berÀtta hur specifika uppgifter löses med ClickHouse i olika företag, vilka verktyg ClickHouse ni kan anvÀnda för era uppgifter, och hur de har anvÀnts i olika företag.
Jag har valt tre exempel som visar ClickHouse frÄn olika sidor. Jag tror att det kommer att vara intressant.

Första frÄgan: «Varför behövs ClickHouse?». FrÄgan verkar ganska uppenbar, men det finns fler Àn ett svar.

- Det första svaret handlar om prestanda. ClickHouse Àr mycket snabb. Analys pÄ ClickHouse Àr ocksÄ mycket snabb. Det kan ofta anvÀndas dÀr nÄgot annat fungerar mycket lÄngsamt eller mycket dÄligt.
- Det andra svaret handlar om kostnad. Och framför allt kostnaden för skalning. Till exempel Àr Vertica en helt utmÀrkt databas. Den fungerar mycket bra om ni har en ganska liten mÀngd terabyte data. Men nÀr det handlar om hundratals terabyte eller petabyte, blir kostnaden för licens och support en ganska betydande summa. Och det Àr dyrt. Men ClickHouse Àr gratis.
- Det tredje svaret Àr driftskostnaden. Det hÀr angreppssÀttet kommer lite frÄn en annan sida. RedShift Àr ett utmÀrkt alternativ. Med RedShift kan man snabbt skapa en lösning. Det kommer att fungera bra, men varje timme, varje dag och varje mÄnad kommer du att betala ganska mycket till Amazon, eftersom det Àr en mycket dyr tjÀnst. Google BigQuery Àr detsamma. Om nÄgon har anvÀnt det vet man att man kan köra flera förfrÄgningar och plötsligt fÄ en rÀkning pÄ hundratals dollar.
I ClickHouse finns dessa problem inte.

Var anvÀnds ClickHouse nu? Förutom Yandex anvÀnds ClickHouse i en mÀngd olika företag och verksamheter.
- Framför allt anvÀnds det för analys av webbapplikationer, det vill sÀga det À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 driftsloggar frÄn olika kÀllor.
- Flera företag anvÀnder ClickHouse för övervakning av sÀkerhetsloggar. De laddar upp dem till ClickHouse, gör rapporter och fÄr de resultat de behöver.
- Företag börjar anvÀnda det för finansiell analys, det vill sÀga gradvis nÀrmar sig stora företag ocksÄ ClickHouse.
- CloudFlare. Om nÄgon följer ClickHouse har man sÀkert hört namnet pÄ detta företag. Det Àr en av de betydande bidragsgivarna i communityn. Och de har en mycket seriös ClickHouse-installation. Till exempel har de skapat Kafka Engine för ClickHouse.
- Telekomföretag har börjat anvÀnda det. Flera företag anvÀnder ClickHouse antingen som proof of concept eller redan i produktion.
- Ett företag anvĂ€nder ClickHouse för att övervaka produktionsprocesser. De testar chips, registrerar massor av parametrar, det handlar om cirka 2 000 egenskaper. Och de analyserar vidare â bra partier eller dĂ„liga.
- Blockkedjeanalys. Det finns ett sÄdant ryskt företag som Bloxy.info. Det handlar om analys av ethereum-nÀtverket. Det gjorde de ocksÄ med ClickHouse.

Och storleken spelar ingen roll. MÄnga företag anvÀnder en enda liten server. Och den gör det möjligt för dem att lösa sina problem. Och Ànnu fler företag anvÀnder stora kluster av mÄnga servrar eller tiotals servrar.
Och om man ser pÄ registreringarna, sÄ:
- Yandex: 500+ servrar, de sparar 25 miljarder poster per dag dÀr.
- LifeStreet: 60 servrar, cirka 75 miljarder poster per dag. FÀrre servrar, fler poster Àn hos Yandex.
- CloudFlare: 36 servrar, de sparar 200 miljarder poster per dag. De har Ànnu fÀrre servrar och Ànnu mer data som de sparar.
- Bloomberg: 102 servern, cirka en biljon poster per dag. RekordhÄllare för poster.

Geografiskt sett Àr det ocksÄ mycket. Denna karta visar heatmap dÀr ClickHouse anvÀnds i vÀrlden. HÀr framhÀvs Ryssland, Kina, Amerika tydligt. Det finns fÄ europeiska lÀnder. Man kan sÀrskilja 4 kluster.
Detta Àr en jÀmförande analys, hÀr behöver man inte 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Ägot rysksprÄkigt dÀr. Ryssland, Ukraina, Vitryssland, dvs. den rysktalande delen av samhÀllet, Àr de mest talrika anvÀndarna. DÀrefter följer USA och Kanada. Kina Àr snabbt pÄ vÀg ikapp. För sex mÄnader sedan fanns det nÀstan inget Kina, nu har Kina redan övertrÀffat Europa och fortsÀtter vÀxa. Gamla Europa hÀnger inte heller efter, och ledaren för anvÀndning av ClickHouse Àr, mÀrkligt nog, Frankrike.

Varför berÀttar jag allt detta? För att visa att ClickHouse blir en standardlösning för analys av stora data och anvÀnds redan pÄ mÄnga stÀllen. Om du anvÀnder det, Àr du pÄ rÀtt trend. Om du Ànnu inte anvÀnder det, behöver du inte vara rÀdd för att du kommer att bli ensam och ingen kommer att hjÀlpa dig, för mÄnga sysslar redan med detta.

Detta Àr exempel pÄ verklig anvÀndning av ClickHouse i flera företag.
- Det första exemplet Àr ett annonsnÀtverk: migration frÄn Vertica till ClickHouse. Och jag kÀnner flera företag som har övergÄtt frÄn Vertica eller Àr i processen att göra det.
- Det andra exemplet Àr ett transaktionellt datalager pÄ ClickHouse. Detta exempel bygger pÄ antipatterns. Allt som inte bör göras i ClickHouse enligt utvecklarnas rÄd har hÀr genomförts. 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 distribuerade berÀkningar pÄ ClickHouse. Det fanns en frÄga om hur ClickHouse kan integreras i Hadoop-ekosystemet. Jag kommer att visa ett exempel pÄ hur ett företag gjorde nÄgot som liknar en map-reduce container pÄ ClickHouse, med fokus pÄ lokalisering av data, osv., för att berÀkna en mycket icke-trivial uppgift.

- LifeStreet â Det Ă€r ett Ad Tech-företag som har allt teknologin som hör samman med ett annonsnĂ€tverk.
- Det sysslar med optimering av annonser, programmatisk budgivning.
- MÀngder av data: omkring 10 miljarder hÀndelser per dag. HÀndelserna kan dessutom delas upp i flera delhÀndelser.
- MĂ„nga kunder av dessa data, och det Ă€r inte bara mĂ€nniskor, utan mycket mer â det handlar om olika algoritmer som hanterar programmatisk budgivning.

Företaget har genomgÄtt en lÄng och svÄr vÀg. Jag har berÀttat om det pÄ HighLoad. Först flyttade LifeStreet frÄn MySQL (med ett kort stopp pÄ Oracle) till Vertica. Det gÄr att hitta berÀttelsen om detta.
Allt gick vÀldigt bra, men det blev snabbt tydligt att datamÀngderna vÀxte och Vertica blev dyrt. DÀrför letades efter olika alternativ. NÄgra av dem listas hÀr. Faktum Àr att vi gjorde proof of concept eller ibland prestandatestning av nÀstan alla databaser som var tillgÀngliga pÄ marknaden mellan 2013 och 2016 och som ungefÀr passade vÄra krav pÄ funktionalitet. Jag berÀttade ocksÄ om nÄgra av dem pÄ HighLoad.

Uppgiften var att migrera frÄn Vertica i första hand, eftersom datamÀngderna vÀxte. Och de vÀxte exponentiellt under flera Är. Sedan nÄdde de en platÄ, men ÀndÄ. NÀr vi prognostiserade denna tillvÀxt var det uppenbart att affÀrens krav pÄ datamÀngder som behövde analyseras snart skulle handla om petabyte. Och att betala för petabyte Àr redan mycket dyrt, sÄ vi letade efter alternativ för vart man skulle gÄ.

Vart skulle man gÄ? Under lÄng tid var det helt oklart vart man skulle ta vÀgen, eftersom det Ä ena sidan finns kommersiella databaser som fungerar ganska bra. Vissa fungerar nÀstan lika bra som Vertica, andra lite sÀmre. Men de Àr alla dyra, och ingenting billigare eller bÀttre har kunnat hittas.
à andra sidan finns det open source-lösningar, som inte Àr sÄ mÄnga, med andra ord kan de rÀknas pÄ hÀnderna nÀr det gÀller analys. De Àr gratis eller billiga, men fungerar lÄngsamt. Oftast saknar de nödvÀndig och anvÀndbar funktionalitet.
Det fanns ingenting som kombinerade det bra som finns i kommersiella databaser och allt det gratis som finns i open source â ingenting fanns.

Ingenting fanns förrÀn plötsligt Yandex, som en trollkarl med en kanin ur hatten, presenterade ClickHouse. Det var en ovÀntad lösning; fortfarande idag stÀlls frÄgan: "Varför?", men ÀndÄ.

Och redan 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 med olika frÄgor. Och om frÄgan anvÀnde bara en tabell, dvs. utan nÄgra joins, var ClickHouse tvÄ gÄnger snabbare Àn Vertica.
Jag tog mig friheten att titta pÄ mer tester frÄn Yandex hÀrom dagen. DÀr Àr det samma sak: ClickHouse Àr tvÄ gÄnger snabbare Àn Vertica, dÀrför pratar de ofta om det.
Men om frÄgorna innehÄller joins, sÄ blir det inte sÄ entydigt. Och ClickHouse kan vara lÄngsammare Àn Vertica med tvÄ gÄnger. Men om man gör smÄ justeringar av frÄgan och skriver om den, sÄ blir det ungefÀr lika. Inte dÄligt. Och gratis.

SÄ nÀr vi fick testresultaten och sÄg pÄ detta frÄn olika vinklar, Äkte LifeStreet över till ClickHouse.

Detta Àr 2016, pÄminner jag er. Det var som i en anekdot om möss som grÀt och stack sig, men fortsatte Àta kaktus. Det har beskrivits utförligt, det finns video om det osv.

Jag kommer dÀrför inte att gÄ in detaljerat pÄ detta, jag kommer bara att berÀtta om resultaten och nÄgra intressanta saker som jag inte berÀttade dÄ.
Resultaten Àr:
- Lyckad migrering och systemet har redan varit i produktion i mer Àn ett Är.
- Prestanda och flexibilitet har ökat. FrÄn 10 miljarder poster som vi kunde lagra pÄ en dag, och det under en kort tid, lagrar LifeStreet nu 75 miljarder poster per dag och kan göra det i tre mÄnader eller mer. Om man rÀknar pÄ max, kan det sparas upp till en miljon hÀndelser per sekund. Mer Àn en miljon SQL-frÄgor per dag kommer in i detta system, huvudsakligen frÄn olika robotar.
- Trots att fler servrar anvÀnds för ClickHouse Àn för Vertica, har vi sparat pengar pÄ hÄrdvara eftersom Vertica anvÀnde ganska dyra SAS-diskar. I ClickHouse anvÀndes SATA. Och varför? För att i Vertica Àr insert synkront. Och synkronisering krÀver att diskarna inte bromsar upp för mycket, och att nÀtverket inte heller bromsar, dvs. det Àr en ganska kostsam operation. Men i ClickHouse Àr insert asynkront. Dessutom kan man alltid skriva allt lokalt, inga extra kostnader för detta, sÄ att data i ClickHouse kan infogas mycket snabbare Àn i Vertica Àven pÄ inte de snabbaste diskarna. Och för lÀsning Àr det ungefÀr lika. LÀsningen pÄ SATA, om de sitter i RAID, Àr ganska snabb.
- Ingen licensbegrÀnsningar, det vill sÀga 3 petabyte data pÄ 60 servrar (20 servrar utgör en replik) och 6 triljoner poster i fakta och aggregat. Inget liknande kunde tillÄtas pÄ Vertica.

Nu gÄr jag över till praktiska aspekter i detta exempel.
- Första Àr en effektiv schema. Schema pÄverkar mycket.
- Andra Àr generering av effektiv SQL.

Typisk OLAP-frÄga Àr en select. Vissa kolumner gÄr i group by, andra kolumner gÄr i aggregatfunktioner. Det finns where, som kan betraktas som ett snitt av kuben. Hela group by kan ses som en projektion. DÀrför kallas detta multidimensionell dataanalys.

Och ofta modelleras detta som en stjÀrn-schema, dÀr det finns en central fakta och egenskaper för detta fakta pÄ sidorna, utefter strÄlar.

Och ur ett fysiskt designsynpunkt, hur detta lÀggs pÄ tabeller, sÄ görs vanligtvis en normaliserad representation. Du kan denormalisera, men det Àr kostsamt i disk och inte sÀrskilt effektivt för frÄgor. DÀrför görs vanligtvis en normaliserad representation, det vill sÀga en faktatabell och mÄnga mÄngdimensionella tabeller.
Men i ClickHouse fungerar detta dÄligt. Det finns tvÄ skÀl:
- Första Àr att ClickHouse inte har sÀrskilt bra joins, det vill sÀga joins finns, men de Àr dÄliga. Fortfarande dÄliga.
- Andra Àr att tabellerna inte uppdateras. Vanligtvis i dessa tabeller som omger stjÀrn-schema, behöver man Àndra nÄgot. Till exempel, kundens namn, företagets namn och sÄ vidare. Och detta fungerar inte.
Och det finns en lösning för detta i ClickHouse. Faktiskt tvÄ:
- Den första Àr att anvÀnda ordböcker. Externa ordböcker Àr det som hjÀlper till att lösa problemet med stjÀrn-schema till 99%, med uppdateringar och annat.
- Den andra Àr att anvÀnda arrayer. Arrayer hjÀlper ocksÄ till att slippa joins och problem med normalisering.

- Inga joins behövs.
- Uppdateringsbara. FrÄn och med mars 2018 introducerades en icke-dokumenterad funktion (du hittar inte detta i dokumentationen) att delvis uppdatera ordböcker, det vill sÀga de poster som har Àndrats. Praktiskt sett fungerar det som en tabell.
- Alltid i minnet, sÄ joins med ordböcker fungerar snabbare Àn om det vore en tabell som ligger pÄ disken och som kanske inte ens Àr i cache, sannolikt inte.

- Inga joins behövs heller.
- Detta Àr en kompakt representation 1 till mÄnga.
- Och enligt min Äsikt, Àr arrayer skapade för nördar. Det handlar om lambda-funktioner och mer.
Det hÀr Àr inget tomt prat. Det Àr en mycket kraftfull funktionalitet som gör att man kan göra mÄnga saker pÄ ett mycket enkelt och elegant sÀtt.

Typiska exempel som hjÀlper till att hantera arrayer. Dessa exempel Àr enkla och ganska tydliga:
- Sökning efter taggar. Om du har hashtags dÀr och vill hitta vissa poster med en hashtag.
- Sökning efter key-value-par. Det finns ocksÄ vissa attribut med ett vÀrde.
- Lagring av listor med nycklar som du behöver översÀtta till nÄgot annat.
Alla dessa uppgifter kan lösas utan arrayer. Taggar kan lÀggas i en strÀng och vÀljas med ett reguljÀrt uttryck eller i en separat tabell, men dÄ mÄste man göra joins.

I ClickHouse behöver man inte göra nÄgot alls, det rÀcker med att beskriva en array string för hashtags eller skapa en inbÀddad struktur för system som key-value.
InbĂ€ddad struktur â kanske inte det mest lyckade namnet. Det Ă€r tvĂ„ arrayer med en gemensam del i namnet och vissa relaterade egenskaper.
Och att söka efter taggen Àr mycket enkelt. Det finns en funktion has, som kontrollerar om det finns ett element i arrayen. Allt, vi har hittat alla poster som rör vÄr konferens.
Sökning efter subid Àr lite mer komplicerad. Först mÄste vi hitta indexet för nyckeln, och sedan ta elementet med det indexet och kontrollera att vÀrdet Àr det vi behöver. Men ÀndÄ mycket enkelt och kompakt.
Ett reguljÀrt uttryck som du skulle vilja skriva om du höll allting i en strÀng skulle för det första vara klumpigt. För det andra skulle det ta mycket lÀngre tid Àn tvÄ arrayer.

Ett annat exempel. Du har en array dÀr du lagrar ID. Och du kan översÀtta dem till namn. Funktionen arrayMap. Det Àr en typisk lambda-funktion. Du skickar lambda-uttryck till den. Och den hÀmtar namnvÀrdet för varje ID frÄn ordboken.
PÄ liknande sÀtt kan man göra en sökning. En predikatfunktion skickas, som kontrollerar vilken överenskommelse elementen har.

Dessa saker förenklar schemat kraftigt och löser mÄnga problem.
Men nÀsta problem som vi stötte pÄ och som jag vill nÀmna Àr effektiva förfrÄgningar.
- I ClickHouse finns det ingen förfrĂ„gningsplanerare. Ăverhuvudtaget ingen.
- Men ÀndÄ mÄste man planera komplexa förfrÄgningar. I vilka fall?
- Om det finns flera joinkommandon i en förfrÄgan som du kapslar in i delfrÄgor, Àr ordningen för hur de utförs viktig.
- För det andra, om förfrÄgan Àr distribuerad. För i en distribuerad förfrÄgan utförs endast den innersta delfrÄgan distribuerat, medan allt annat skickas till en server som du Àr ansluten till och utförs dÀr. SÄ om du har distribuerade förfrÄgningar med mÄnga join, Àr det viktigt att vÀlja rÀtt ordning.
Och Àven i enklare fall kan det ibland vara bra att göra schemalÀggarens arbete och skriva om förfrÄgningen lite.

HÀr Àr ett exempel. PÄ vÀnster sida en förfrÄgan som visar de fem bÀsta lÀnderna. Den körs pÄ 2,5 sekunder, om jag minns rÀtt. PÄ höger sida samma förfrÄgan, men lite omskriven. IstÀllet för att gruppera pÄ strÀngar, grupperar vi pÄ nycklar (int). Och det gÄr snabbare. Sedan kopplade vi en ordbok till resultatet. IstÀllet för 2,5 sekunder körs förfrÄgan pÄ 1,5 sekunder. Det Àr bra.

Ett liknande exempel med omformulering av filter. HÀr Àr en förfrÄgan om Ryssland. Den körs pÄ 5 sekunder. Om vi skriver om den sÄ att vi jÀmför siffror med en uppsÀttning av de nycklar som hör till Ryssland, kommer det att bli mycket snabbare.

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

- Maximalt med arbete i distribuerat lÀge.
- Sortering efter de minsta typerna, som jag gjorde med ints.
- Om det finns nÄgra joins, ordböcker, Àr det bÀttre att utföra dem i sista hand, nÀr du har data som Ätminstone delvis Àr grupperad, sÄ att joinoperationen eller anropet till ordboken kommer att krÀvas fÀrre gÄnger och dÀrmed gÄ snabbare.
- ErsÀttning av filter.
Det finns Àven andra tekniker, inte bara de jag demonstrerade. Och alla dessa kan ibland avsevÀrt snabba upp exekveringen av förfrÄgningar.

Vi gÄr vidare till nÀsta exempel. Företag X frÄn USA. Vad gör de?
Det fanns en uppgift:
- Offline-lÀnkning av reklamtransaktioner.
- Modellering av olika lÀnkningar.

Vad bestÄr scenariot av?
En vanlig besökare gÄr in pÄ webbplatsen, till exempel 20 gÄnger i mÄnaden, frÄn olika annonser eller bara ibland utan annonser, eftersom de kommer ihÄg sidan. De tittar pÄ olika produkter, lÀgger dem i kundvagnen och tar sedan bort dem. Och till slut köper de nÄgot.
Rimliga frÄgor: 'Vem ska betala för annonseringen, om det behövs?' och 'Vilken annons pÄverkade dem, om den gjorde det?'. Det vill sÀga, varför köpte de och hur gör man för att mÀnniskor som liknar denna person ocksÄ skall köpa?
För att lösa denna uppgift mÄste man koppla samman hÀndelser som intrÀffar pÄ webbplatsen pÄ rÀtt sÀtt, det vill sÀga bygga en relation mellan dem. Sedan mÄste de skickas för analys till DWH. Och pÄ grundval av denna analys bygga modeller för vem och vilken annons som ska visas.

En reklamtransaktion Àr en uppsÀttning relaterade hÀndelser för en anvÀndare som börjar med visning av en annons, sedan sker nÄgot, och eventuellt ett köp, och sedan kan det bli fler köp. Till exempel, om det handlar om en mobilapplikation eller ett mobilspel, sÄ brukar installationen av appen ske gratis, men om det görs nÄgot mer dÀr, kan det krÀva pengar. Ju mer en person spenderar i appen, desto mer vÀrdefull Àr de. Men för detta mÄste allt kopplas samman.

Det finns mÄnga modeller för att koppla samman.
De mest populÀra Àr:
- Last Interaction, dÀr interaction Àr antingen ett klick eller en visning.
- First Interaction, det vill sÀga det första som ledde personen till webbplatsen.
- LinjĂ€r kombination â alla fĂ„r lika.
- Avtagande.
- Och andra.

Och hur fungerade allt detta ursprungligen? Det fanns Runtime och Cassandra. Cassandra anvĂ€ndes som transaktionslagring, det vill sĂ€ga den lagrade alla relaterade transaktioner. NĂ€r en hĂ€ndelse kom till Runtime, till exempel visning av en sida eller nĂ„got annat, gjordes en förfrĂ„gan till Cassandra â finns denna person eller inte. Sedan hĂ€mtades transaktionerna som rör dem. Och kopplingen gjordes.
Och om man hade tur att förfrÄgan innehöll transaction id, var det lÀtt. Men vanligtvis har man inte tur. DÀrför behövde man leta efter den senaste transaktionen eller transaktionen med den senaste klicket och sÄ vidare.
Och allt fungerade vÀldigt bra sÄ lÀnge kopplingen var till den senaste klickningen. För det finns det, sÀg, 10 miljoner klick om dagen, 300 miljoner per mÄnad, om man sÀtter fönstret till en mÄnad. Och eftersom det hÀr mÄste finnas helt i minnet i Cassandra för att det ska fungera snabbt, eftersom det krÀvs en snabb Runtime-respons, behövdes ungefÀr 10-15 servrar.
Men nÀr man ville koppla transaktionen till visningen sÄ blev det genast inte lika roligt. Och varför? Det Àr tydligt att man behöver lagra 30 gÄnger fler hÀndelser. Och dÀrmed behövs 30 gÄnger fler servrar. SÄ det blir nÄgot astronomiskt siffror. Att ha upp till 500 servrar för att göra kopplingen, men att det faktiskt Àr betydligt fÀrre servrar under Runtime, det Àr nÄgon slags felaktig siffra. SÄ man började tÀnka pÄ vad man skulle göra.

Och man kom till ClickHouse. Men hur gör man det pÄ ClickHouse? Vid första anblick verkar det vara en uppsÀttning anti-mönster.
- Transaktionen vÀxer, vi kopplar till den fler och fler hÀndelser, dvs. den Àr muterbar, och ClickHouse fungerar inte sÀrskilt bra med muterbara objekt.
- NÀr en besökare kommer till oss, mÄste vi hÀmta dennes transaktioner med nyckeln, baserat pÄ dennes besöks-ID. Det Àr ocksÄ en punktfrÄga, vilket inte görs sÄ i ClickHouse. Normalt i ClickHouse görs stora ...scanningar, men hÀr mÄste vi hÀmta flera poster. Det Àr ocksÄ ett anti-mönster.
- Dessutom var transaktionen i json, men man ville inte skriva om den, sÄ man ville lagra json ostrukturerat, och om det behövdes, extrahera nÄgot frÄn den. Och det Àr ocksÄ ett anti-mönster.
Dvs. en uppsÀttning anti-mönster.

Men trots allt lyckades man skapa ett system som fungerade mycket bra.
Vad gjordes? ClickHouse infördes, dit loggar samlades i poster. En attributtjÀnst infördes som hÀmtade loggar frÄn ClickHouse. Efter detta hÀmtade man transaktioner för varje post baserat pÄ besöks-ID, som kanske Ànnu inte var fÀrdigbehandlade, plus snapshotar, dvs. redan kopplade transaktioner, det vill sÀga resultatet av tidigare arbete. FrÄn dem byggde man logik, valde rÀtt transaktion, kopplade nya hÀndelser. Loggade pÄ nytt i loggen. Loggen skickades tillbaka till ClickHouse, dvs. det Àr ett stÀndigt cykliskt system. Dessutom skickades den till DWH för analys.
Det fungerade inte sÄ bra i den formen. För att göra det enklare för ClickHouse nÀr det kom förfrÄgningar baserade pÄ visit-id, grupperade vi dessa förfrÄgningar i block om 1 000-2 000 visit-id och hÀmtade alla transaktioner för 1 000-2 000 personer. DÄ fungerade allt.

Om man tittar inuti ClickHouse finns det totalt 3 huvudtabeller som hanterar allt detta.
Den första tabellen dit loggarna laddas, och loggarna laddas nÀstan utan bearbetning.
Den andra tabellen. Genom en materialiserad vy extraherades de loggar som Ànnu inte fick tilldelade hÀndelser, dvs. osammanhÀngande. Och genom den materialiserade vyn extraherades transaktionerna för att bygga en snapshot. Det vill sÀga, en speciell materialiserad vy byggde snapshoten, som var det senaste ackumulerade tillstÄndet av transaktionen.

HÀr Àr texten skriven pÄ SQL. Jag skulle vilja kommentera nÄgra viktiga punkter i den.
Den första viktiga punkten Àr möjligheten i ClickHouse att extrahera kolumner, fÀlt frÄn json. Det finns nÄgra metoder i ClickHouse för att arbeta med json. De Àr mycket, mycket primitiva.
visitParamExtractInt tillÄter att extrahera attribut frÄn json, dvs. första trÀffen aktiveras. Och pÄ sÄ sÀtt kan man hÀmta transaktions-id eller visit-id. Det Àr en.
Det andra â hĂ€r anvĂ€nds ett smart materialiserat fĂ€lt. Vad innebĂ€r detta? Det betyder att du inte kan infoga det i tabellen, dvs. det infogas inte, det berĂ€knas och lagras vid infogningen. Vid infogningen gör ClickHouse arbetet Ă„t dig. Och det som senare behövs extraheras frĂ„n json.
I det hÀr fallet Àr den materialiserade vyn för obearbetade rader. Den anvÀnder första tabellen med nÀstan rÄa loggar. Vad gör den? För det första Àndrar den sorteringen, dvs. sorteringen sker nu baserat pÄ visit-id, eftersom vi snabbt behöver hÀmta just den specifika personens transaktion.
Den andra viktiga punkten Àr index_granularity. Om du har sett MergeTree Àr index_granularity normalt stÀllt pÄ 8 192 som standard. Vad innebÀr detta? Det Àr en parameter för indexets sparsitet. I ClickHouse Àr indexet sparsam, det indexerar aldrig varje post. Det gör detta var 8 192. Detta Àr bra nÀr mycket data ska rÀknas, men dÄligt nÀr det Àr lite, eftersom overheaden blir stor. Genom att minska index_granularity minskar vi overheaden. Det gÄr inte att minska till ett eftersom minnet kan vara otillrÀckligt. Indexet lagras alltid i minnet.

Snapshotet anvÀnder nÄgra intressanta funktioner frÄn ClickHouse.
För det första, AggregatingMergeTree. I AggregatingMergeTree lagras argMax, dvs. det Àr tillstÄndet för transaktionen som motsvarar den senaste tidsstÀmpeln. Nya transaktioner genereras kontinuerligt för varje besökare. I det senaste tillstÄndet av den hÀr transaktionen har vi lagt till en hÀndelse och fÄtt ett nytt tillstÄnd. Det hamnade Äter i ClickHouse. Genom argMax i denna materialiserade vy kan vi alltid fÄ den aktuella statusen.

- Bindning 'frikopplad' frÄn Runtime.
- Upp till 3 miljarder transaktioner lagras och bearbetas varje mÄnad. Det Àr avsevÀrt mer Àn vad som var fallet med Cassandra, dvs. i ett typiskt transaktionssystem.
- En kluster av 2x5 ClickHouse-servrar. 5 servrar och varje server har en replika. Det Àr till och med fÀrre Àn vad som krÀvdes i Cassandra för att göra click based atribuering, hÀr har vi impression based. Det vill sÀga, istÀllet för att öka antalet servrar 30 gÄnger, har de lyckats minska det.

Och det sista exemplet â ett finansföretag Y som analyserade korrelationer i aktiekurser.
Och uppgiften var följande:
- Det finns ungefÀr 5 000 aktier.
- Kursen Àr kÀnd var 100:e millisekund.
- Data har samlats in under 10 Är. Tydligen har en del företag mer data, andra mindre.
- Totalt ungefÀr 100 miljarder rader.
Och man behövde berÀkna korrelationen i förÀndringarna.

HÀr Àr tvÄ aktier och deras kurser. Om den ena gÄr upp och den andra gÄr upp, sÄ Àr det en positiv korrelation, dvs. nÀr den ena vÀxer, vÀxer den andra. Om den ena gÄr upp, som i slutet av grafen, och den andra gÄr ner, sÄ Àr det en negativ korrelation, dvs. 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Ä den finansiella marknaden.

Men uppgiften Àr svÄr. Vad görs för detta? Vi har 100 miljarder poster som innehÄller: tid, aktie och pris. Först mÄste vi berÀkna 100 miljarder gÄnger runningDifference frÄn algoritmen för priset. RunningDifference Àr en funktion i ClickHouse som berÀknar skillnaden mellan tvÄ rader sekventiellt.
DÀrefter mÄste vi berÀkna korrelationen, och korrelationen mÄste berÀknas för varje par. För 5 000 aktier Àr paren 12,5 miljoner. Och det Àr mycket, dvs. 12,5 gÄnger mÄste vi berÀkna en sÄdan korrelationsfunktion.
Och om nĂ„gon har glömt, sĂ„ Ă€r Íx och Íy â det matematiska förvĂ€ntade vĂ€rdet enligt urvalet. Det innebĂ€r att man inte bara mĂ„ste berĂ€kna rötter och summor, utan ocksĂ„ berĂ€kna ytterligare summor inom dessa summor. En massa berĂ€kningar mĂ„ste göras 12,5 miljoner gĂ„nger, och dessutom mĂ„ste vi gruppera efter timmar. Vi har ocksĂ„ mĂ„nga timmar. Och allt mĂ„ste göras pĂ„ 60 sekunder. Det Ă€r ett skĂ€mt.

Vi mÄste verkligen hinna med pÄ nÄgot sÀtt, eftersom allt detta fungerade vÀldigt, vÀldigt lÄngsamt, innan ClickHouse kom.

De försökte berÀkna detta pÄ Hadoop, pÄ Spark, pÄ Greenplum. Och allt var antingen mycket lÄngsamt eller dyrt. Det vill sÀga, det gick att berÀkna, men det blev senare dyrt.

Och sedan kom ClickHouse och allt blev mycket bÀttre.
Jag pÄminner om att vÄrt problem handlar om datalokalitet, sÄ korrelationerna kan inte lokaliseras. Vi kan inte samla en del av datan pÄ en server, en annan del pÄ en annan och berÀkna, vi mÄste ha all data överallt.
Vad gjorde de? Ursprungligen var datan lokaliserad. PÄ varje server lagrades data för prissÀttning av ett visst aktieutbud. Och de överlappar inte. SÄ man kan parallellt och oberoende berÀkna logReturn, allt detta sker parallellt och distribuerat.
DÀrefter beslutade man att minska datamÀngden utan att förlora uttrycksfullheten. Minska det med hjÀlp av arrayer, det vill sÀga att för varje tidssegment skapa en array av aktier och en array av priser. PÄ sÄ sÀtt tar datan mycket mindre utrymme. Och det Àr mer bekvÀmt att arbeta med dem. Det Àr nÀstan parallella operationer, det vill sÀga vi berÀknar delvis parallellt och skriver sedan till servern.
Efter detta kan det 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 ett speciellt skript frÄn detta urval av 12,5 miljoner korrelationer som mÄste berÀknas, kan man göra paket. Det vill sÀga, 2 500 uppgifter med 5 000 par korrelationer. Och denna uppgift berÀknas pÄ en specifik ClickHouse-server. Den har all data, eftersom datan Àr identisk och den kan berÀkna dem sekventiellt.

Ănnu en gĂ„ng, hur det ser ut. Först har vi alla data i följande struktur: tid, aktier, pris. Sedan berĂ€knade vi logReturn, det vill sĂ€ga data i samma struktur, men istĂ€llet för pris har vi nu logReturn. DĂ€refter omarbetade vi dem, det vill sĂ€ga vi fick tid och groupArray för aktier och priser. Vi replikerade dem. Och efter detta genererade vi en mĂ€ngd uppgifter och matade ClickHouse sĂ„ att den kunde rĂ€kna dem. Och det fungerar.

PÄ proof of concept-uppgiften var det en deluppgift, det vill sÀga vi tog mindre data. Och allt pÄ tre servrar.
De första tvÄ stegen: berÀkning av log_return och inpackning i arrayer tog ungefÀr en timme vardera.
BerÀkningen av korrelationen tog cirka 50 timmar. Men 50 timmar Àr lite, eftersom det tidigare tog dem veckor. Det var en stor framgÄng. Och om man rÀknar sÄ berÀknades allt 70 gÄnger per sekund pÄ detta kluster.
Men det viktigaste Àr att detta system praktiskt taget Àr utan flaskhalsar, det vill sÀga det skalas nÀstan linjÀrt. Och de har verifierat det. FramgÄngsrikt skalade de det.

- En korrekt struktur Àr hÀlften av framgÄngen. Och en korrekt struktur innebÀr anvÀndning av alla nödvÀndiga ClickHouse-teknologier.
- Summing/AggregatingMergeTrees Àr teknologier som möjliggör aggregering eller berÀkning av snapshot-state som ett sÀrskilt fall. Och det förenklar mÄnga saker avsevÀrt.
- Materialized Views gör det möjligt att kringgÄ begrÀnsningen med en index. Kanske uttryckte jag mig inte sÄ tydligt, men nÀr vi laddade loggar, var de rÄa loggarna i en tabell med ett index, medan pÄ attributloggarna var de i en tabell, det vill sÀga samma data, bara filtrerade, men indexet var helt annat. Det verkar som samma data, men olika sortering. Och Materialized Views gör det möjligt, om du behöver det, att kringgÄ sÄdana begrÀnsningar i ClickHouse.
- Minska indexets granulÀritet för punktförfrÄgningar.
- Och fördela data smart, försök att maximalt lokalisera data inom servern. Och se till att förfrÄgningar ocksÄ anvÀnder lokaliseringen dÀr det Àr möjligt.

Sammanfattningsvis kan man sÀga att ClickHouse nu har etablerat sig inom bÄde kommersiella databaser och open source-databaser, dvs. frÀmst för analytiska syften. Det passar utmÀrkt in i detta landskap. Dessutom börjar det sakta men sÀkert att trÀnga undan andra alternativ, eftersom du inte behöver InfiniDB nÀr du har ClickHouse. Vertica kan snart bli overflödig om de inte förbÀttrar sitt SQL-stöd. AnvÀnd det!

âTack för presentationen! Mycket intressant! Har det gjorts nĂ„gra jĂ€mförelser med Apache Phoenix?
- Nej, jag har inte hört att nÄgon har gjort sÄdana jÀmförelser. Vi pÄ Yandex försöker hÄlla koll pÄ alla jÀmförelser mellan ClickHouse och olika databaser. För om det nÄgon gÄng visar sig att nÄgot Àr snabbare Àn ClickHouse, kan Aleksej Milovidov inte sova om nÀtterna och börjar snabbt öka hastigheten. Jag har inte hört talas om en sÄdan jÀmförelse.
(Aleksej Milovidov) Apache Phoenix Àr en SQL-motor pÄ HBase. HBase Àr huvudsakligen avsedd för nyckel-vÀrde-arbetsflöden. Varje rad kan ha ett godtyckligt antal kolumner med godtyckliga namn. Detta gÀller ocksÄ för system som HBase och Cassandra. DÀr fungerar inte tunga analytiska frÄgor sÀrskilt bra. Eller sÄ kan du tro att de fungerar bra om du inte har nÄgon erfarenhet av ClickHouse.
Tack
God dag! Jag har redan varit ganska intresserad av detta Àmne eftersom jag har ett analytiskt subsystem. Men nÀr jag tittar pÄ ClickHouse fÄr jag intrycket att ClickHouse Àr vÀldigt bra för analys av hÀndelser, mutable. Och om jag behöver analysera mycket affÀrsdata med massor av stora tabeller, passar ClickHouse, sÄvitt jag förstÄr, inte sÀrskilt bra? SÀrskilt om de förÀndras. StÀmmer det eller finns det exempel som kan motbevisa detta?
Det Àr sant. Och det gÀller för merparten av specialiserade analytiska databaser. De Àr anpassade för en eller flera stora tabeller som Àr mutabla, och för mÄnga smÄ som förÀndras lÄngsamt. Det vill sÀga, ClickHouse fungerar inte som Oracle, dÀr man kan lagra allt och bygga mycket komplexa frÄgor. För att effektivt anvÀnda ClickHouse mÄste man bygga schemat pÄ ett sÄdant sÀtt som fungerar bra i ClickHouse. Det innebÀr att man ska undvika överdriven normalisering, anvÀnda ordböcker och försöka göra fÀrre lÄnga relationer. Om man bygger schemat pÄ det hÀr sÀttet kan man lösa liknande affÀrsproblem i ClickHouse mycket mer effektivt Àn i en traditionell relationsdatabas.
Tack för presentationen! Jag har en frÄga angÄende det senaste finansiella fallet. De hade analys. Det var nödvÀndigt att jÀmföra hur det gÄr upp och ner. Och jag förstÄr att ni byggde systemet just för den analysen? Om de imorgon till exempel skulle behöva en annan rapport baserad pÄ dessa data, mÄste man bygga om schemat och ladda data igen? Det vill sÀga, göra nÄgon form av förbearbetning för att fÄ fram en frÄga?
SjÀlvklart, det handlar om att anvÀnda ClickHouse för en mycket specifik uppgift. Den skulle mer traditionellt kunna lösas inom ramen för Hadoop. För Hadoop Àr det en perfekt uppgift. Men det Àr vÀldigt lÄngsamt pÄ Hadoop. Min avsikt Àr att visa att man kan lösa uppgifter pÄ ClickHouse som vanligtvis hanteras med helt andra medel, men göra det mycket mer effektivt. Det Àr verkligen skrÀddarsytt för en specifik uppgift. SjÀlvklart, om det finns en liknande uppgift kan den lösas pÄ liknande sÀtt.
FörstĂ„tt. Ni sa att det tog 50 timmar. Ăr det frĂ„n början, nĂ€r data laddades eller nĂ€r ni fick resultaten?
Ja, ja.
Bra, tack sÄ mycket.
Det Àr pÄ en 3-server kluster.
Hej! Tack för presentationen! Allt Àr vÀldigt intressant. Jag ska frÄga lite mindre om funktionaliteten, utan mer om anvÀndningen av ClickHouse ur ett stabilitetsperspektiv. Har ni rÄkat ut för nÄgra problem, har ni behövt ÄterstÀlla? Hur beter sig ClickHouse i sÄ fall? Och har ni nÄgonsin upplevt att en replik ocksÄ kraschar? Vi har, till exempel, stött pÄ problemet med att ClickHouse ibland gÄr över sina grÀnser och kraschar.
SjÀlvklart finns det inga perfekta system. Och ClickHouse har sina egna problem. Men har ni hört talas om att Yandex.Metrica har haft lÄngvariga driftstopp? Antagligen inte. Den har fungerat pÄlitligt sedan ungefÀr 2012-2013 med ClickHouse. Jag kan ocksÄ berÀtta om min erfarenhet. Vi har aldrig haft totala driftstopp. Vissa delvisa problem har kunnat uppstÄ, men de har aldrig varit kritiska nog för att pÄverka verksamheten seriöst. SÄdant har aldrig hÀnt. ClickHouse Àr tillrÀckligt pÄlitligt och kraschar inte slumpmÀssigt. Man behöver inte oroa sig för det. Det Àr inget ofÀrdigt system. Det har bevisats av mÄnga företag.
Hej! Du sa att man mÄste tÀnka igenom datastrukturen noggrant frÄn början. Men vad hÀnder om det redan har intrÀffat? Jag har data som strömmar pÄ. Det har gÄtt sex mÄnader, och jag inser att jag inte kan fortsÀtta sÄ hÀr; jag mÄste ladda om data och hantera dem pÄ nÄgot sÀtt.
Det beror sjÀlvklart pÄ ditt system. Det finns flera sÀtt att göra detta praktiskt taget utan avbrott. Till exempel kan du skapa en Materialized View, dÀr du skapar en annan databasstruktur, om den kan mappas entydigt. Det vill sÀga, om det tillÄter mappning med hjÀlp av ClickHouse, det vill sÀga extrahera vissa saker, Àndra primÀrnyckel, Àndra partitionering, sÄ kan du skapa en Materialized View. Du kan skriva över dina gamla data dÀr, och nya kommer att skrivas automatiskt. Sedan kan du enkelt vÀxla till att anvÀnda Materialized View, och dÀrefter byta skrivning och ta bort den gamla tabellen. Det Àr verkligen ett sÀtt utan avbrott.
Tack.
KĂ€lla: habr.com
