Trots att det nu finns mycket data nÀstan överallt Àr analytiska databaser fortfarande ganska exotiska. De Àr dÄligt kÀnda och Ànnu vÀrre kan de anvÀnda dem effektivt. MÄnga fortsÀtter att "Àta kaktus" med MySQL eller PostgreSQL, som Àr designade för andra scenarier, lider av NoSQL eller betalar för mycket för kommersiella lösningar. ClickHouse Àndrar spelets regler och sÀnker avsevÀrt tröskeln för att komma in i en vÀrld av analytisk DBMS.
Rapport frÄn BackEnd Conf 2018 och den publiceras med tillstÄnd av talaren.
Vem Àr jag och varför pratar jag om ClickHouse? Jag Àr utvecklingsdirektör pÄ LifeStreet, som anvÀnder ClickHouse. Jag Àr ocksÄ grundaren av Altinity. Det Àr en Yandex-partner som marknadsför ClickHouse och hjÀlper Yandex att göra ClickHouse mer framgÄngsrik. OcksÄ redo att dela kunskap om ClickHouse.
Och jag Àr inte bror till Petya Zaitsev. Jag fÄr ofta frÄgan om detta. Nej, vi Àr inte bröder.
"Alla vet" att ClickHouse:
- VĂ€ldigt snabbt,
- VÀldigt bekvÀm
- AnvÀnds i Yandex.
Lite mindre Àr kÀnt i vilka företag och hur det anvÀnds.
Jag kommer att 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 plockade upp tre exempel som visar ClickHouse frÄn olika vinklar. 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 sjÀlvklar frÄga, men det finns mer Àn ett svar pÄ den.
- Det första svaret Àr för prestanda. ClickHouse Àr vÀldigt snabbt. Analytics pÄ ClickHouse Àr ocksÄ mycket snabb. Det kan ofta anvÀndas dÀr nÄgot annat Àr vÀldigt lÄngsamt eller vÀldigt dÄligt.
- Det andra svaret Àr kostnad. Och först av allt, kostnaden för skalning. Till exempel Àr Vertica en helt fantastisk databas. Det fungerar vÀldigt bra om du inte har mÄnga terabyte med data. Men nÀr det kommer till hundratals terabyte eller petabyte gÄr kostnaden för en licens och support in i en ganska betydande summa. Och det Àr dyrt. Och ClickHouse Àr gratis.
- Det tredje svaret Àr driftskostnad. Detta Àr ett lite annorlunda tillvÀgagÄngssÀtt. RedShift Àr en fantastisk analog. PÄ RedShift kan du fatta ett beslut mycket snabbt. Det kommer att fungera bra, men samtidigt, varje timme, varje dag och varje mÄnad, kommer du att betala Amazon ganska dyrt, eftersom detta Àr en mycket dyr tjÀnst. Google BigQuery ocksÄ. Om nÄgon anvÀnde det, dÄ vet han att dÀr kan du köra flera förfrÄgningar och fÄ en rÀkning pÄ hundratals dollar helt plötsligt.
ClickHouse har inte dessa problem.
Var anvÀnds ClickHouse nu? Förutom Yandex anvÀnds ClickHouse i ett gÀng olika företag och företag.
- Först och frÀmst Àr detta webbapplikationsanalys, det vill sÀga det hÀr Àr ett anvÀndningsfall som kom frÄn Yandex.
- MÄnga AdTech-företag anvÀnder ClickHouse.
- MÄnga företag som behöver analysera transaktionsloggar frÄn olika kÀllor.
- Flera företag anvÀnder ClickHouse för att övervaka 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 i finansiell analys, det vill sÀga gradvis nÀrmar sig Àven stora företag ClickHouse.
- molnflamma. Om nÄgon följer ClickHouse har de förmodligen hört namnet pÄ detta företag. Detta Àr en av de viktigaste bidragsgivarna frÄn samhÀllet. Och de har en mycket seriös ClickHouse-installation. Till exempel gjorde de Kafka Engine för ClickHouse.
- Teleföretag började anvÀnda. Flera företag anvÀnder ClickHouse antingen som bevis pÄ koncept eller redan i produktion.
- Ett företag anvÀnder ClickHouse för att övervaka produktionsprocesser. De testar mikrokretsar, skriver av en massa parametrar, det finns cirka 2 000 egenskaper. Och sedan analyserar de om spelet Àr bra eller dÄligt.
- Blockkedjeanalys. Det finns ett sÄdant ryskt företag som Bloxy.info. Detta Àr en analys av ethereum-nÀtverket. Det gjorde de ocksÄ pÄ ClickHouse.
Och storleken spelar ingen roll. Det finns mÄnga företag som anvÀnder en liten server. Och han lÄter dem lösa sina problem. Och Ànnu fler företag anvÀnder stora kluster av mÄnga servrar eller dussintals servrar.
Och om du tittar pÄ posterna, dÄ:
- Yandex: 500+ servrar, de lagrar 25 miljarder poster om dagen dÀr.
- LifeStreet: 60 servrar, cirka 75 miljarder poster per dag. Det finns fÀrre servrar, fler poster Àn i Yandex.
- CloudFlare: 36 servrar, de sparar 200 miljarder poster om dagen. De har Ànnu fÀrre servrar och lagrar Ànnu mer data.
- Bloomberg: 102 servrar, ungefÀr en biljon poster per dag. RekordhÄllare.
Geografiskt Àr detta ocksÄ mycket. Denna karta hÀr visar en vÀrmekarta över var ClickHouse anvÀnds i vÀrlden. Ryssland, Kina, Amerika sticker ut tydligt hÀr. Det finns fÄ europeiska lÀnder. Och det finns 4 kluster.
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Ä Altinity-webbplatsen, eftersom det inte finns nÄgra rysktalande dÀr. Och Ryssland, Ukraina, Vitryssland, det vill sÀga den rysktalande delen av samhÀllet, dessa Àr de mest talrika anvÀndarna. Sedan kommer USA och Kanada. Kina Àr mycket ikapp. Det fanns nÀstan inget Kina dÀr för ett halvÄr sedan, nu har Kina redan gÄtt om Europa och fortsÀtter att vÀxa. Gamla Europa ligger inte heller lÄngt efter, och ledande i 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 big data-analys och redan anvÀnds pÄ mÄnga stÀllen. Om du anvÀnder den Àr du inne i rÀtt trend. Om du inte anvÀnder det Ànnu, dÄ kan du inte vara rÀdd att du blir lÀmnad ensam och ingen kommer att hjÀlpa dig, eftersom mÄnga redan gör detta.
Det hÀr Àr exempel pÄ verklig ClickHouse-anvÀndning i flera företag.
- Det första exemplet Àr ett annonsnÀtverk: migrering frÄn Vertica till ClickHouse. Och jag kÀnner nÄgra företag som har gÄtt över frÄn Vertica eller som hÄller pÄ att gÄ över.
- Det andra exemplet Àr transaktionslagring pÄ ClickHouse. Detta Àr ett exempel byggt pÄ antimönster. Allt som inte bör göras i ClickHouse pÄ rÄd frÄn utvecklare görs hÀr. Och det Àr gjort sÄ effektivt att det fungerar. Och det fungerar mycket bÀttre Àn den typiska transaktionslösningen.
- Det tredje exemplet Àr distribuerad datoranvÀndning 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 liknande en kartreduceringsbehÄllare pÄ ClickHouse, hÄlla reda pÄ datalokalisering, etc., för att berÀkna en mycket icke-trivial uppgift.
- LifeStreet Àr ett Ad Tech-företag som har all teknik som följer med ett annonsnÀtverk.
- Hon Àr engagerad i annonsoptimering, programmatisk budgivning.
- Massor av data: cirka 10 miljarder hÀndelser per dag. Samtidigt kan evenemang dÀr delas upp i flera delevenemang.
- Det finns mÄnga klienter av denna data, och dessa Àr inte bara mÀnniskor, mycket mer - det hÀr Àr olika algoritmer som Àr engagerade i programmatisk budgivning.
Företaget har gÄtt en lÄng och trÄkig vÀg. 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 berÀttelse om det.
Och allt var vÀldigt bra, men det stod snabbt klart att datan vÀxer och Vertica Àr dyrt. DÀrför sökte man olika alternativ. NÄgra av dem Àr listade hÀr. Och faktiskt gjorde vi proof of concept eller ibland prestandatester av nÀstan alla databaser som fanns pÄ marknaden frÄn 13:e till 16:e Äret och var ungefÀr lÀmpliga vad gÀller funktionalitet. Och jag pratade ocksÄ om nÄgra av dem pÄ HighLoad.
Uppgiften var att migrera frÄn Vertica i första hand, eftersom datan vÀxte. Och de vÀxte exponentiellt under Ären. Sedan gick de pÄ hyllan, men inte desto mindre. Och nÀr man förutspÄdde denna tillvÀxt, affÀrskrav pÄ mÀngden data som nÄgon form av analys behövde göras pÄ, stod det klart att petabyte snart skulle diskuteras. Och att betala för petabyte Àr redan vÀldigt dyrt, sÄ vi letade efter ett alternativ vart vi skulle gÄ.
Vart ska man gÄ? Och lÀnge var det inte alls klart 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 sÀmre. Men de Àr alla dyra, inget billigare och bÀttre kunde inte hittas.
à andra sidan finns det open source-lösningar, som inte Àr sÀrskilt mÄnga, det vill sÀga för analys kan de rÀknas pÄ fingrarna. Och de Àr gratis eller billiga, men lÄngsamma. Och de saknar ofta den nödvÀndiga och anvÀndbara funktionaliteten.
Och det fanns inget att kombinera det goda som finns i kommersiella databaser och allt gratis som finns i öppen kÀllkod.
Det var ingenting förrÀn, ovÀntat, Yandex drog ut ClickHouse, som en trollkarl frÄn en hatt, som en kanin. Och det var ett ovÀntat beslut, de stÀller 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 önskemÄl. Och om frÄgan endast anvÀnde en tabell, det vill sÀga utan nÄgra joins (join), sÄ var ClickHouse dubbelt sÄ snabb som Vertica.
Jag var inte för lat och tittade pÄ Yandex-tester hÀromdagen. Det Àr samma sak dÀr: ClickHouse Àr dubbelt sÄ snabbt som Vertica, sÄ de pratar ofta om det.
Men om det finns anslutningar i frÄgorna visar allt sig inte sÀrskilt entydigt. Och ClickHouse kan vara dubbelt sÄ lÄngsam som Vertica. Och om du korrigerar begÀran nÄgot och skriver om den, sÄ Àr de ungefÀr lika. Inte dÄligt. Och gratis.
Och efter att ha fÄtt testresultaten och tittat pÄ det frÄn olika vinklar, gick LifeStreet till ClickHouse.
Det hÀr Àr 16:e Äret, vill jag pÄminna dig. Det var som ett skÀmt om möss som grÀt och stickade sig, men som fortsatte Àta kaktusen. Och detta beskrevs i detalj, det finns en video om detta osv.
DÀrför kommer jag inte att prata om det i detalj, jag kommer bara att prata om resultaten och nÄgra intressanta saker som jag inte pratade om dÄ.
Resultaten Àr:
- FramgÄngsrik migrering och mer Àn ett Är fungerar systemet redan i produktion.
- Produktiviteten och flexibiliteten har ökat. Av de 10 miljarder poster som vi hade rÄd att lagra per dag och sedan under en kort tid, lagrar LifeStreet nu 75 miljarder poster per dag och kan göra detta i 3 mÄnader eller mer. Om du rÀknar pÄ toppen Àr detta upp till en miljon hÀndelser per sekund. Mer Àn en miljon SQL-frÄgor per dag kommer in i detta system, mestadels frÄn olika robotar.
- Trots att fler servrar anvÀndes för ClickHouse Àn för Vertica sparade man Àven pÄ hÄrdvaran, eftersom ganska dyra SAS-diskar anvÀndes i Vertica. ClickHouse anvÀnde SATA. Och varför? Eftersom i Vertica Àr insatsen synkron. Och synkronisering krÀver att diskarna inte saktar ner för mycket, och Àven att nÀtverket inte saktar ner för mycket, det vill sÀga en ganska dyr operation. Och i ClickHouse Àr infogningen asynkron. Dessutom kan du alltid skriva allt lokalt, det finns inga extra kostnader för detta, sÄ data kan infogas i ClickHouse mycket snabbare Àn i Vertika, Àven pÄ lÄngsammare enheter. Och lÀsning Àr ungefÀr detsamma. NÀr man lÀser pÄ SATA, om de Àr i RAID, sÄ Àr allt tillrÀckligt snabbt.
- Inte begrÀnsat av licens, det vill sÀga 3 petabyte data pÄ 60 servrar (20 servrar Àr en replik) och 6 biljoner poster i fakta och sammanstÀllningar. Inget sÄdant hÀr hade man rÄd med pÄ Vertica.
Jag övergÄr nu till praktiska saker i detta exempel.
- Det första Àr ett effektivt system. Mycket beror pÄ schemat.
- Den andra Àr effektiv SQL-generering.
En typisk OLAP-frÄga Àr ett urval. NÄgra av kolumnerna gÄr till gruppera efter, nÄgra av kolumnerna gÄr till aggregerade funktioner. Det finns dÀr, som kan representeras som en bit av en kub. Hela gruppen kan ses som en projektion. Och det Àr dÀrför det kallas multivariat dataanalys.
Och ofta modelleras detta i form av ett stjÀrnschema, nÀr det finns ett centralt faktum och egenskaper hos detta faktum lÀngs sidorna, lÀngs strÄlarna.
Och nÀr det gÀller fysisk design, hur det passar pÄ bordet, gör de vanligtvis en normaliserad representation. Du kan avnormalisera, men det Àr dyrt pÄ disken och inte sÀrskilt effektivt pÄ frÄgor. DÀrför gör de vanligtvis en normaliserad representation, det vill sÀga en faktatabell och mÄnga, mÄnga dimensionstabeller.
Men det fungerar inte bra i ClickHouse. Det finns tvÄ anledningar:
- Den första Ă€r för att ClickHouse inte har sĂ€rskilt bra joins, det vill sĂ€ga det finns joins, men de Ă€r dĂ„liga. Ăven om det Ă€r dĂ„ligt.
- Det andra Àr att tabellerna inte uppdateras. Vanligtvis i dessa plattor, som finns runt stjÀrnkretsen, behöver nÄgot Àndras. Till exempel kundnamn, företagsnamn osv. Och det fungerar inte.
Och det finns en vÀg ut ur detta i ClickHouse. Àven tvÄ:
- Den första Àr anvÀndningen av ordböcker. Externa ordböcker Àr det som hjÀlper 99% att lösa problemet med stjÀrnschemat, med uppdateringar och sÄ vidare.
- Det andra Àr anvÀndningen av arrayer. Arrayer hjÀlper ocksÄ till att bli av med sammanfogningar och problem med normalisering.
- Ingen anslutning behövs.
- Uppgraderbar. Sedan mars 2018 har det dykt upp en odokumenterad möjlighet (du hittar inte detta i dokumentationen) att uppdatera ordböcker delvis, det vill sÀga de poster som har Àndrats. I praktiken Àr det som ett bord.
- Alltid i minnet, sÄ gÄr med i en ordbok fungerar snabbare Àn om det vore en tabell som finns pÄ disk och det Àr Ànnu inte ett faktum att det finns i cachen, troligen inte.
- Du behöver inte ansluta 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 för röda ord. Detta Àr en mycket kraftfull funktion som lÄter dig göra mÄnga saker pÄ ett mycket enkelt och elegant sÀtt.
Typiska exempel som hjÀlper till att lösa arrayer. Dessa exempel Àr enkla och tydliga nog:
- Sök efter taggar. Om du har hashtags dÀr och vill hitta nÄgra inlÀgg efter hashtag.
- Sök efter nyckel-vÀrdepar. Det finns ocksÄ nÄgra attribut med ett vÀrde.
- Lagra 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 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 strÀngarrayen för hashtags eller skapa en kapslad struktur för nyckel-vÀrdesystem.
Kapslad struktur kanske inte Àr det bÀsta namnet. Dessa À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. Ha en funktion has
, som kontrollerar att arrayen innehÄller ett element. Alla har hittat alla bidrag som rör vÄr konferens.
Sök efter subid Àr lite mer komplicerat. Vi mÄste först hitta nyckelns index och sedan ta elementet med detta index och kontrollera att detta vÀrde Àr vad vi behöver. Det Àr dock vÀldigt enkelt och kompakt.
Det reguljÀra uttrycket som du skulle vilja skriva om du höll allt pÄ en rad, det skulle för det första vara klumpigt. Och för det andra fungerade det mycket lÀngre Àn tvÄ arrayer.
Ett annat exempel. Du har en array dÀr du lagrar ID:t. Och du kan översÀtta dem till namn. Fungera arrayMap
. Detta Àr en typisk lambdafunktion. Du passerar lambda-uttryck dÀr. Och hon tar fram vÀrdet pÄ namnet för varje ID frÄn ordboken.
Sökning kan göras pÄ samma sÀtt. En predikatfunktion skickas som kontrollerar vad elementen matchar.
Dessa saker förenklar kretsen avsevÀrt och löser en massa problem.
Men nÀsta problem vi stÄr inför, och som jag skulle vilja nÀmna, Àr effektiva frÄgor.
- ClickHouse har ingen frÄgeplanerare. Absolut inte.
- ĂndĂ„ behöver komplexa frĂ„gor fortfarande planeras. I vilka fall?
- Om det finns flera kopplingar i frÄgan lindar du in dem i underval. Och ordningen i vilken de avrÀttas spelar roll.
- Och den andra - om begÀran distribueras. För i en distribuerad frÄga exekveras bara den innersta subselect distribuerad, och allt annat skickas till en server som du anslutit till och exekverat dÀr. DÀrför, om du har distribuerat frÄgor med mÄnga joins (join), mÄste du vÀlja ordning.
Och Àven i enklare fall Àr det ibland ocksÄ nödvÀndigt att göra schemalÀggarens arbete och skriva om frÄgorna lite.
HÀr Àr ett exempel. PÄ vÀnster sida finns en frÄga som visar de 5 bÀsta lÀnderna. Och det tar 2,5 sekunder, enligt mig. Och pÄ höger sida, 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 sÄ kopplade vi en ordbok till resultatet. IstÀllet för 2,5 sekunder tar begÀran 1,5 sekunder. Det hÀr Àr bra.
Ett liknande exempel med omskrivningsfilter. HĂ€r Ă€r en förfrĂ„gan för Ryssland. Den gĂ„r i 5 sekunder. Om vi ââskriver om det pĂ„ ett sĂ„dant sĂ€tt att vi inte jĂ€mför en strĂ€ng, utan siffror med nĂ„gon uppsĂ€ttning av de nycklar som relaterar till Ryssland, sĂ„ kommer det att gĂ„ mycket snabbare.
Det finns mÄnga sÄdana knep. Och de tillÄter dig att avsevÀrt snabba upp frÄgor som du tror redan kör snabbt, eller tvÀrtom, gÄr lÄngsamt. De kan göras Ànnu snabbare.
- Maximalt arbete i distribuerat lÀge.
- Sortering efter minimityper, som jag gjorde efter ints.
- Om det finns nÄgra anslutningar (join), ordböcker, Àr det bÀttre att göra dem som en sista utvÀg, nÀr du redan har data Ätminstone delvis grupperade, dÄ kommer joinoperationen eller ordboksanropet att anropas fÀrre gÄnger och det kommer att gÄ snabbare .
- Byte av filter.
Det finns andra tekniker, och inte bara de som jag har demonstrerat. Och alla kan ibland avsevÀrt pÄskynda utförandet av frÄgor.
LÄt oss gÄ vidare till nÀsta exempel. Företag X frÄn USA. Vad gör hon?
Det fanns en uppgift:
- OfflinelÀnkning av reklamtransaktioner.
- Modellering av olika bindningsmodeller.
Vad Àr scenariot?
En vanlig besökare kommer till sidan till exempel 20 gÄnger i mÄnaden frÄn olika annonser, eller bara sÄ kommer ibland utan nÄgra annonser, eftersom han kommer ihÄg den hÀr sidan. Tittar pÄ nÄgra produkter, lÀgger dem i korgen, tar upp dem ur korgen. Och i slutÀndan köper nÄgot.
Rimliga frÄgor: "Vem ska betala för reklam, om det behövs?" och "Vilken reklam pÄverkade honom, om nÄgon?". Det vill sÀga, varför köpte han och hur fÄr man mÀnniskor som denna person att köpa ocksÄ?
För att lösa detta problem mÄste du koppla de hÀndelser som intrÀffar pÄ webbplatsen pÄ rÀtt sÀtt, det vill sÀga pÄ nÄgot sÀtt bygga en koppling mellan dem. Sedan skickas de för analys till DWH. Och baserat pÄ denna analys kan du bygga modeller för vem och vilka annonser som ska visas.
En annonstransaktion Àr en uppsÀttning relaterade anvÀndarhÀndelser som börjar frÄn att en annons visas, sedan hÀnder nÄgot, sedan kanske ett köp, och sedan kan det bli köp inom ett köp. Om det till exempel Àr en mobilapplikation eller ett mobilspel, sÄ sker vanligtvis installationen av applikationen gratis, och om nÄgot görs dÀr kan det krÀvas pengar för detta. Och ju mer en person spenderar i applikationen, desto mer vÀrdefull Àr den. Men för detta mÄste du ansluta allt.
Det finns mÄnga bindningsmodeller.
De mest populÀra Àr:
- Senaste interaktion, dÀr interaktion Àr antingen ett klick eller en visning.
- Första interaktion, det vill sÀga det första som förde en person till webbplatsen.
- LinjÀr kombination - alla lika.
- Försvagning.
- Och sÄ vidare.
Och hur fungerade det hela frÄn början? Det var Runtime och Cassandra. Cassandra anvÀndes som transaktionslagring, det vill sÀga alla relaterade transaktioner lagrades i den. Och nÀr nÄgon hÀndelse kommer i Runtime, till exempel, visar nÄgon sida eller nÄgot annat, dÄ gjordes en förfrÄgan till Cassandra - finns det en sÄdan person eller inte. Sedan erhölls de transaktioner som hÀnför sig till den. Och anslutningen skapades.
Och om det Àr tur att förfrÄgan har ett transaktions-id, dÄ Àr det enkelt. Men oftast ingen tur. DÀrför var det nödvÀndigt att hitta den senaste transaktionen eller transaktionen med det senaste klicket osv.
Och det hela fungerade vÀldigt bra sÄ lÀnge bindningen var till sista klicket. För det finns, sÀg, 10 miljoner klick per dag, 300 miljoner per mÄnad, om vi sÀtter ett fönster pÄ en mÄnad. Och eftersom det i Cassandra mÄste finnas allt i minnet för att köra snabbt, eftersom Runtime mÄste svara snabbt, tog det cirka 10-15 servrar.
Och nÀr de ville koppla en transaktion till displayen visade det sig genast inte sÄ roligt. Och varför? Det kan ses att 30 gÄnger fler hÀndelser behöver lagras. Och följaktligen behöver du 30 gÄnger fler servrar. Och det visar sig att detta Àr nÄgon slags astronomisk figur. För att behÄlla upp till 500 servrar för att kunna göra lÀnkningen, trots att det finns betydligt fÀrre servrar i Runtime, sÄ Àr detta nÄgot slags fel 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 att detta Àr en uppsÀttning antimönster.
- Transaktionen vÀxer, vi kopplar upp fler och fler hÀndelser till den, d.v.s. den Àr förÀnderlig, och ClickHouse fungerar inte sÀrskilt bra med förÀnderliga objekt.
- NÀr en besökare kommer till oss mÄste vi hÀmta ut hans transaktioner med nyckel, efter hans besöks-ID. Detta Àr ocksÄ en punktfrÄga, det gör de inte i ClickHouse. Vanligtvis har ClickHouse stora ... skanningar, men hÀr mÄste vi fÄ nÄgra poster. OcksÄ ett antimönster.
- Dessutom var transaktionen i json, men de ville inte skriva om den, sÄ de ville lagra json pÄ ett ostrukturerat sÀtt och vid behov dra ut nÄgot ur det. Och detta Àr ocksÄ ett antimönster.
Det vill sÀga en uppsÀttning antimönster.
Men det visade sig ÀndÄ göra ett system som fungerade mycket bra.
Vad gjordes? ClickHouse dök upp, i vilket loggar kastades, uppdelat i poster. En tillskriven tjÀnst dök upp som fick loggar frÄn ClickHouse. Efter det, för varje post, genom besöks-id, fick jag transaktioner som kanske inte har behandlats Ànnu och plus ögonblicksbilder, dvs transaktioner som redan Àr anslutna, nÀmligen resultatet av tidigare arbete. Jag har redan gjort logik ur dem, valt rÀtt transaktion, kopplat nya hÀndelser. Loggade igen. Loggen gick tillbaka till ClickHouse, dvs det Àr ett stÀndigt cykliskt system. Och dessutom gick jag till DWH för att analysera det dÀr.
Det var i den hÀr formen det inte fungerade sÀrskilt bra. Och för att göra det enklare för ClickHouse, nÀr det fanns en begÀran per besöks-id, grupperade de dessa förfrÄgningar i block med 1 000-2 000 besöks-ID och drog ut alla transaktioner för 1 000-2 000 personer. Och sedan fungerade allt.
Om du tittar inuti ClickHouse, sÄ finns det bara 3 huvudbord som serverar allt detta.
Den första tabellen som loggar laddas upp till, och loggarna laddas upp nÀstan utan bearbetning.
Andra bordet. Genom den materialiserade synen bitades hÀndelser som Ànnu inte har tillskrivits, det vill sÀga orelaterade sÄdana, ur dessa loggar. Och genom den materialiserade vyn drogs transaktioner ut ur dessa loggar för att skapa en ögonblicksbild. Det vill sÀga, en speciell materialiserad vy byggde en ögonblicksbild, nÀmligen det sista ackumulerade tillstÄndet för transaktionen.
HÀr Àr texten skriven i SQL. Jag skulle vilja kommentera nÄgra viktiga saker i den.
Det första viktiga Àr möjligheten att dra ut 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, dvs den första trÀffen fungerar. Och pÄ sÄ sÀtt kan du dra ut transaktions-ID eller besöks-ID. Den hÀr gÄngen.
För det andra anvÀnds hÀr ett knepigt materialiserat fÀlt. Vad betyder det? Det betyder att du inte kan infoga den i tabellen, d.v.s. den infogas inte, den berÀknas och lagras vid insÀttning. NÀr du klistrar in gör ClickHouse jobbet Ät dig. Och det du behöver senare Àr redan borttaget frÄn json.
I det hÀr fallet Àr materialiserad vy för rÄrader. Och det första bordet med praktiskt taget rÄa stockar anvÀnds precis. Och vad gör han? För det första Àndrar det sorteringen, det vill sÀga sorteringen gÄr nu efter besöks-id, eftersom vi snabbt mÄste dra ut hans transaktion för en specifik person.
Den andra viktiga saken Àr index_granularity. Om du har sett MergeTree Àr det vanligtvis 8 som standard index_granularity. Vad det Àr? Detta Àr indexgleshetsparametern. I ClickHouse Àr indexet sparsamt, det indexerar aldrig varje post. Den gör detta var 192 8. Och det hÀr Àr bra nÀr det krÀvs mycket data för att berÀknas, men dÄligt nÀr det Àr lite, eftersom det finns en stor overhead. Och om vi minskar indexgranulariteten, minskar vi omkostnaderna. Det kan inte reduceras till ett, eftersom det kanske inte finns tillrÀckligt med minne. Indexet lagras alltid i minnet.
Snapshot anvÀnder ocksÄ nÄgra andra intressanta ClickHouse-funktioner.
För det första Àr det AggregatingMergeTree. Och AggregatingMergeTree lagrar argMax, det vill sÀga detta Àr tillstÄndet för transaktionen som motsvarar den senaste tidsstÀmpeln. Transaktioner genereras hela tiden för en given besökare. Och i det allra sista tillstÄndet av denna transaktion lade vi till en hÀndelse och vi har ett nytt tillstÄnd. Det slog ClickHouse igen. Och genom argMax i denna materialiserade vy kan vi alltid fÄ det aktuella tillstÄndet.
- Bindningen Àr "frikopplad" frÄn Runtime.
- Upp till 3 miljarder transaktioner per mÄnad lagras och bearbetas. Detta Àr en storleksordning mer Àn det var i Cassandra, det vill sÀga i ett typiskt transaktionssystem.
- Kluster av 2x5 ClickHouse-servrar. 5 servrar och varje server har en replik. Detta Àr Ànnu mindre Àn 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, lyckades de minska dem.
Och det sista exemplet Àr finansföretaget Y, som analyserade korrelationerna mellan förÀndringar i aktiekurser.
Och uppgiften var:
- Det finns cirka 5 000 aktier.
- Citat var 100:e millisekund Àr kÀnda.
- Uppgifterna har ackumulerats under 10 Är. Tydligen, för vissa företag mer, för vissa mindre.
- Det finns cirka 100 miljarder rader totalt.
Och det var nödvÀndigt att berÀkna korrelationen av förÀndringar.
HÀr Àr tvÄ aktier och deras kurser. Om den ena gÄr upp och den andra gÄr upp sÄ Àr detta en positiv korrelation, dvs en gÄr upp och den andra gÄr upp. Om den ena gÄr upp, som i slutet av grafen, och den andra gÄr ner, Àr detta en negativ korrelation, dvs nÀr den ena stiger, faller den andra.
Genom att analysera dessa ömsesidiga förÀndringar kan man göra förutsÀgelser pÄ finansmarknaden.
Men uppgiften Àr svÄr. Vad görs för detta? Vi har 100 miljarder poster som har: tid, lager och pris. Vi mÄste berÀkna första 100 miljarder gÄnger löpskillnaden frÄn prisalgoritmen. RunningDifference Àr en funktion i ClickHouse som sekventiellt berÀknar skillnaden mellan tvÄ strÀngar.
Och efter det mÄste du berÀkna korrelationen, och korrelationen mÄste berÀknas för varje par. För 5 000 aktier Àr paren 12,5 miljoner. Och detta Àr mycket, det vill sÀga 12,5 gÄnger Àr det nödvÀndigt att berÀkna just en sÄdan korrelationsfunktion.
Och om nĂ„gon glömt, dĂ„ Ă€r Íx och Íy en schackmatt. provtagningsförvĂ€ntningar. Det vill sĂ€ga, det Ă€r nödvĂ€ndigt att inte bara berĂ€kna rötterna och summorna, utan ocksĂ„ ytterligare en summa inuti dessa summor. En massa berĂ€kningar mĂ„ste göras 12,5 miljoner gĂ„nger, och till och med grupperas efter timmar. Vi har ocksĂ„ mĂ„nga timmar. Och du mĂ„ste göra det pĂ„ 60 sekunder. Det Ă€r ett skĂ€mt.
Det var nödvÀndigt att ha tid Ätminstone pÄ nÄgot sÀtt, för allt detta fungerade vÀldigt, vÀldigt lÄngsamt innan ClickHouse kom.
De försökte berÀkna det pÄ Hadoop, pÄ Spark, pÄ Greenplum. Och allt detta var vÀldigt lÄngsamt eller dyrt. Dvs det gick att rÀkna pÄ nÄgot sÀtt, men dÄ var det dyrt.
Och sedan kom ClickHouse och det blev mycket bÀttre.
Jag pÄminner dig om att vi har ett problem med datalokalitet, eftersom korrelationer inte kan lokaliseras. Vi kan inte lÀgga en del av datan pÄ en server, en del pÄ en annan och berÀkna, vi mÄste ha all data överallt.
Vad gjorde de? Inledningsvis Àr data lokaliserad. Varje server lagrar data om prissÀttningen för en viss uppsÀttning aktier. Och de överlappar inte varandra. DÀrför Àr det möjligt att berÀkna logReturn parallellt och oberoende, allt detta sker hittills parallellt och distribuerat.
Sedan bestÀmde vi oss för att minska dessa data, utan att tappa uttrycksförmÄgan. Minska genom att anvÀnda arrayer, d.v.s. skapa en array av aktier och en array av priser för varje tidsperiod. DÀrför tar det mycket mindre datautrymme. Och de Àr lite lÀttare att arbeta med. Detta Àr nÀstan parallella operationer, det vill sÀga vi lÀser delvis parallellt och skriver sedan till servern.
Efter det kan det replikeras. Bokstaven "r" betyder att vi replikerade denna data. Det vill sÀga, vi har samma data pÄ alla tre servrarna - det hÀr Àr arrayerna.
Och sedan med ett speciellt skript frÄn denna uppsÀttning av 12,5 miljoner korrelationer som mÄste berÀknas, kan du göra paket. Det vill sÀga 2 500 uppgifter med 5 000 par av korrelationer. Och denna uppgift ska berÀknas pÄ en specifik ClickHouse-server. Han har alla data, eftersom uppgifterna Àr desamma och han kan berÀkna dem sekventiellt.
à terigen Àr det sÄ hÀr det ser ut. För det första har vi all data i denna struktur: tid, aktier, pris. Sedan berÀknade vi logReturn, det vill sÀga data av samma struktur, men istÀllet för priset har vi redan logReturn. Sedan gjordes de om, det vill sÀga vi fick tid och groupArray för lager och priser. Replikerad. Och efter det genererade vi ett gÀng uppgifter och matade dem till ClickHouse sÄ att det skulle rÀkna dem. Och det fungerar.
PÄ proof of concept var uppgiften en deluppgift, det vill sÀga mindre data togs. Och bara tre servrar.
Dessa tvÄ första steg: berÀkning av Log_return och inpackning i arrayer tog ungefÀr en timme.
Och berÀkningen av korrelationen Àr cirka 50 timmar. Men 50 timmar rÀcker inte, för de brukade jobba i veckor. Det blev en stor succé. Och om du rÀknar, dÄ rÀknades allt 70 gÄnger per sekund pÄ detta kluster.
Men det viktigaste Àr att det hÀr systemet Àr praktiskt taget utan flaskhalsar, det vill sÀga det skalar nÀstan linjÀrt. Och de kollade upp det. Har framgÄngsrikt skalat upp det.
- RÀtt schema Àr halva framgÄngen. Och det rÀtta schemat Àr anvÀndningen av alla nödvÀndiga ClickHouse-teknologier.
- Summering/AggregatingMergeTrees Àr tekniker som lÄter dig sammanstÀlla eller betrakta en tillstÄndsbild som ett specialfall. Och det förenklar mycket.
- Materialiserade vyer lÄter dig kringgÄ grÀnsen för ett index. Jag kanske inte sa det sÄ tydligt, men nÀr vi laddade loggarna fanns rÄloggarna i tabellen med ett index, och attributloggarna fanns i tabellen, dvs samma data, bara filtrerade, men indexet var helt andra. Det verkar vara samma data, men olika sortering. Och materialiserade vyer lÄter dig, om du behöver det, kringgÄ en sÄdan ClickHouse-begrÀnsning.
- Minska indexgranulariteten för punktfrÄgor.
- Och distribuera data smart, försök att lokalisera data inom servern sÄ mycket som möjligt. Och försök att se till att förfrÄgningar ocksÄ anvÀnder lokalisering dÀr det Àr möjligt sÄ mycket som möjligt.
Och för att sammanfatta detta korta anförande kan vi sÀga att ClickHouse nu bestÀmt har ockuperat territoriet för bÄde kommersiella databaser och databaser med öppen kÀllkod, det vill sÀga specifikt för analys. Han passar perfekt in i detta landskap. Och dessutom börjar det sakta trÀnga ut andra, för nÀr du har ClickHouse behöver du inte InfiniDB. Vertika kanske inte behövs snart om de har normalt SQL-stöd. Njut av!
-Tack för rapporten! Mycket intressant! Fanns det nÄgra jÀmförelser med Apache Phoenix?
Nej, jag har inte hört nÄgon jÀmföra. Vi och Yandex försöker hÄlla reda pÄ alla ClickHouse-jÀmförelser med olika databaser. För om nÄgot plötsligt visar sig vara snabbare Àn ClickHouse, kan Lesha Milovidov inte sova pÄ natten och börjar snabbt pÄskynda det. Jag har inte hört talas om en sÄdan jÀmförelse.
-
(Aleksey Milovidov) Apache Phoenix Àr en SQL-motor som drivs av Hbase. Hbase Àr frÀmst för nyckel-vÀrde arbetsscenario. DÀr, pÄ varje rad, kan det finnas ett godtyckligt antal kolumner med godtyckliga namn. Detta kan sÀgas om sÄdana system som Hbase, Cassandra. Och det Àr just tunga analytiska frÄgor som inte fungerar normalt för dem. Eller sÄ kanske du tycker att de fungerar bra om du inte har nÄgon erfarenhet av ClickHouse.
-
Tack
-
God eftermiddag Jag Àr redan ganska intresserad av detta Àmne, eftersom jag har ett analytiskt delsystem. Men nÀr jag tittar pÄ ClickHouse fÄr jag en kÀnsla av att ClickHouse lÀmpar sig vÀldigt bra för hÀndelseanalys, förÀnderligt. Och om jag behöver analysera mycket affÀrsdata med ett gÀng stora tabeller, sÄ Àr ClickHouse, sÄ vitt jag förstÄr, inte sÀrskilt lÀmplig för mig? Speciellt om de Àndras. StÀmmer detta eller finns det exempel som kan motbevisa detta?
-
Detta Àr rÀtt. Och detta gÀller de flesta specialiserade analytiska databaser. De Àr skrÀddarsydda för att det finns ett eller flera stora bord som Àr förÀnderliga, och för mÄnga smÄ som förÀndras lÄngsamt. Det vill sÀga, ClickHouse Àr inte som Oracle, dÀr du kan lÀgga allt och bygga nÄgra mycket komplexa frÄgor. För att kunna anvÀnda ClickHouse effektivt mÄste du 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 schemat Àr uppbyggt pÄ detta sÀtt kan liknande affÀrsuppgifter lösas pÄ ClickHouse mycket mer effektivt Àn pÄ 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 jag förstÄr att du byggde systemet specifikt för denna analys? Om de till exempel i morgon behöver nÄgon annan rapport om denna data, behöver de bygga om systemet och ladda upp data? Det vill sÀga att göra nÄgon form av förbearbetning för att fÄ begÀran?
Naturligtvis Àr detta anvÀndningen av ClickHouse för en mycket specifik uppgift. Det skulle mer traditionellt kunna lösas inom Hadoop. För Hadoop Àr detta en idealisk uppgift. Men pÄ Hadoop gÄr det vÀldigt lÄngsamt. Och mitt mÄl Àr att visa att ClickHouse kan lösa uppgifter som vanligtvis löses pÄ helt andra sÀtt, men samtidigt göra det mycket mer effektivt. Detta Àr skrÀddarsytt för en specifik uppgift. Det Àr klart att om det finns ett problem med nÄgot liknande sÄ kan det lösas pÄ liknande sÀtt.
Kusten Ă€r klar. Du sa att 50 timmar behandlades. Ăr det frĂ„n första början, nĂ€r laddade du in data eller fick resultaten?
Jaja.
OK tack sÄ mycket.
Detta Àr pÄ ett 3-serverkluster.
HÀlsningar! Tack för rapporten! Allt Àr vÀldigt intressant. Jag kommer inte frÄga lite om funktionaliteten utan om anvÀndandet av ClickHouse nÀr det gÀller stabilitet. Det vill sÀga, hade du nÄgra, var du tvungen att ÄterstÀlla? Hur beter sig ClickHouse i det hÀr fallet? Och hÀnde det att du hade en kopia ocksÄ? Till exempel stötte vi pÄ ett problem med ClickHouse nÀr det ÀndÄ kommer över sin grÀns och faller.
Naturligtvis finns det inga idealiska system. Och ClickHouse har ocksÄ sina egna problem. Men har du hört talas om att Yandex.Metrica inte har fungerat pÄ lÀnge? Antagligen inte. Det har fungerat tillförlitligt sedan 2012-2013 pÄ ClickHouse. Jag kan sÀga detsamma om min erfarenhet. Vi har aldrig haft fullstÀndiga misslyckanden. Vissa delar kunde hÀnda, men de var aldrig tillrÀckligt kritiska för att allvarligt pÄverka verksamheten. Det hÀnde aldrig. ClickHouse Àr ganska pÄlitlig och kraschar inte slumpmÀssigt. Du behöver inte oroa dig för det. Det Àr inte en rÄ sak. Detta har mÄnga företag bevisat.
HallÄ! Du sa att du mÄste tÀnka över dataschemat direkt. TÀnk om det hÀnde? Min data öser och öser. Sex mÄnader gÄr, och jag förstÄr att det Àr omöjligt att leva sÄ hÀr, jag mÄste ladda upp data igen och göra nÄgot med dem.
Detta beror naturligtvis pÄ ditt system. Det finns flera sÀtt att göra detta nÀstan utan stopp. Du kan till exempel skapa en materialiserad vy dÀr du kan skapa en annan datastruktur om den kan mappas unikt. Det vill sÀga, om det tillÄter kartlÀggning med ClickHouse, det vill sÀga extrahera vissa saker, Àndra primÀrnyckeln, Àndra partitionering, sÄ kan du göra en materialiserad vy. Skriv över dina gamla data dÀr, nya kommer att skrivas automatiskt. Och sedan Àr det bara att byta till att anvÀnda den materialiserade vyn, sedan byta posten och döda den gamla tabellen. Detta Àr i allmÀnhet en non-stop metod.
Tack.
KĂ€lla: will.com