Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Eftersom ClickHouse Àr ett specialiserat system, nÀr du anvÀnder det Àr det viktigt att ta hÀnsyn till funktionerna i dess arkitektur. I den hÀr rapporten kommer Alexey att prata om exempel pÄ vanliga misstag vid anvÀndning av ClickHouse, vilket kan leda till ineffektivt arbete. Praktiska exempel kommer att visa hur valet av ett eller annat databehandlingsschema kan förÀndra prestandan i storleksordningar.

Hej alla! Jag heter Alexey, jag gör ClickHouse.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

För det första skyndar jag mig att behaga dig direkt, idag kommer jag inte att berÀtta vad ClickHouse Àr. För att vara Àrlig sÄ Àr jag trött pÄ det. Varje gÄng jag berÀttar vad det Àr. Och det vet nog alla redan.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

IstÀllet ska jag berÀtta vilka möjliga fel som finns, det vill sÀga hur du kan anvÀnda ClickHouse felaktigt. Det finns faktiskt ingen anledning att vara rÀdd, eftersom vi utvecklar ClickHouse som ett system som Àr enkelt, bekvÀmt och fungerar direkt. Jag installerade det, inga problem.

Men du mÄste fortfarande ta hÀnsyn till att detta system Àr specialiserat och du kan lÀtt stöta pÄ ett ovanligt anvÀndningsfall som kommer att ta det hÀr systemet ur sin komfortzon.

SÄ, vilken typ av rake finns det? För det mesta kommer jag att prata om sjÀlvklara saker. Allt Àr sjÀlvklart för alla, alla förstÄr allt och kan vara glada över att de Àr sÄ smarta, och de som inte förstÄr kommer att lÀra sig nÄgot nytt.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Det första och enklaste exemplet, som tyvÀrr ofta förekommer, Àr ett stort antal skÀr med smÄ partier, d.v.s. ett stort antal smÄ skÀr.

Om vi ​​övervĂ€ger hur ClickHouse utför infogning, kan du skicka minst en terabyte data i en begĂ€ran. Det Ă€r inte ett problem.

Och lÄt oss se vad den typiska prestandan skulle vara. Till exempel har vi en tabell frÄn Yandex.Metrica-data. TrÀffar. 105 nÄgra kolumner. 700 byte okomprimerad. Och vi kommer att infoga pÄ ett bra sÀtt i satser om en miljon rader.

Vi infogar MergeTree i tabellen, det visar sig en halv miljon rader per sekund. Bra. I en replikerad tabell blir den lite mindre, ungefÀr 400 000 rader per sekund.

Och om du aktiverar kvoruminsÀttning fÄr du lite mindre, men ÀndÄ anstÀndig prestanda, 250 000 termer per sekund. InsÀttning av kvorum Àr en odokumenterad funktion i ClickHouse*.

* frÄn och med 2020, redan dokumenterat.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Vad hĂ€nder om du gör nĂ„got dĂ„ligt? Vi infogar en rad i MergeTree-tabellen och fĂ„r 59 rader per sekund. Det Ă€r 10 000 gĂ„nger lĂ„ngsammare. I ReplicatedMergeTree – 6 rader per sekund. Och om kvorumet Ă€r pĂ„slaget, visar det sig 2 rader per sekund. Enligt min Ă„sikt Ă€r detta nĂ„gon form av absolut skit. Hur kan du sakta ner sĂ„? Jag har till och med skrivit pĂ„ min t-shirt att ClickHouse inte ska sakta ner. Men Ă€ndĂ„ hĂ€nder det ibland.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

I sjÀlva verket Àr detta vÄr brist. Vi hade lÀtt kunnat fÄ allt att fungera bra, men det gjorde vi inte. Och vi gjorde det inte för att vÄrt manus inte krÀvde det. Vi hade redan butcher. Vi fick precis partier vid vÄr entré, och inga problem. Vi sÀtter in den och allt fungerar bra. Men naturligtvis Àr alla möjliga scenarier möjliga. Till exempel nÀr du har ett gÀng servrar som data genereras pÄ. Och de infogar inte data sÄ ofta, men de slutar ÀndÄ med frekventa inlÀgg. Och vi mÄste pÄ nÄgot sÀtt undvika detta.

Ur teknisk synvinkel Àr poÀngen att nÀr man gör en insert i ClickHouse sÄ hamnar inte datan i nÄgon memtable. Vi har inte ens en riktig loggstruktur MergeTree, utan bara en MergeTree, eftersom det varken finns en logg eller en memTable. Vi skriver helt enkelt omedelbart data till filsystemet, redan ordnade i kolumner. Och om du har 100 kolumner, mÄste mer Àn 200 filer skrivas till en separat katalog. Allt detta Àr vÀldigt krÄngligt.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Och frÄgan uppstÄr: "Hur gör man det rÀtt?" Om situationen Àr sÄdan att du fortfarande behöver registrera data pÄ nÄgot sÀtt i ClickHouse.

Metod 1. Detta Àr det enklaste sÀttet. AnvÀnd nÄgon form av distribuerad kö. Till exempel Kafka. Du extraherar helt enkelt data frÄn Kafka och batchar den en gÄng i sekunden. Och allt kommer att bli bra, du spelar in, allt fungerar bra.

Nackdelarna Àr att Kafka Àr ett annat skrymmande distribuerat system. Jag förstÄr ocksÄ om du redan har Kafka i ditt företag. Det Àr bra, det Àr bekvÀmt. Men om det inte finns, bör du tÀnka tre gÄnger innan du drar Ànnu ett distribuerat system till ditt projekt. Och dÀrför Àr det vÀrt att övervÀga alternativ.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Metod 2. Detta Àr ett gammaldags alternativ och samtidigt vÀldigt enkelt. Har du nÄgon sorts server som genererar dina loggar. Och den skriver bara dina loggar till en fil. Och en gÄng i sekunden döper vi till exempel om den hÀr filen och river av en ny. Och ett separat skript, antingen via cron eller nÄgon demon, tar den Àldsta filen och skriver den till ClickHouse. Om du spelar in loggar en gÄng i sekunden kommer allt att bli bra.

Men nackdelen med den hÀr metoden Àr att om din server som loggarna genereras pÄ försvinner nÄgonstans sÄ försvinner Àven data.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Metod 3. Det finns en annan intressant metod, som inte krÀver tillfÀlliga filer alls. Till exempel har du nÄgon form av reklamsnurra eller nÄgon annan intressant demon som genererar data. Och du kan samla en massa data direkt i RAM-minnet, i bufferten. Och nÀr tillrÀckligt med tid har gÄtt lÀgger du denna buffert Ät sidan, skapar en ny och i en separat trÄd infogar du det som redan har samlats i ClickHouse.

Å andra sidan försvinner Ă€ven data med kill -9. Om din server kraschar kommer du att förlora denna data. Och ett annat problem Ă€r att om du inte kunde skriva till databasen, kommer dina data att samlas i RAM-minnet. Och antingen kommer RAM-minnet att ta slut, eller sĂ„ förlorar du helt enkelt data.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Metod 4. En annan intressant metod. Har du nÄgon form av serverprocess. Och det kan skicka data till ClickHouse omedelbart, men gör det i en anslutning. Till exempel skickade jag en http-förfrÄgan med transfer-encoding: chunked with insert. Och det genererar inte alltför sÀllan bitar, du kan skicka varje rad, Àven om det kommer att finnas overhead för att rama in denna data.

Men i det hÀr fallet kommer data att skickas till ClickHouse omedelbart. Och ClickHouse kommer att buffra dem sjÀlv.

Men problem uppstÄr ocksÄ. Nu kommer du att förlora data, inklusive nÀr din process Àr dödad och om ClickHouse-processen dödas, eftersom det kommer att vara en ofullstÀndig infogning. Och i ClickHouse Àr inlÀgg atomÀra upp till en viss specificerad tröskel i storleken pÄ rader. I princip Àr detta ett intressant sÀtt. Kan Àven anvÀndas.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Metod 5. HÀr Àr en annan intressant metod. Det hÀr Àr nÄgon slags gemenskapsutvecklad server för databatchning. Jag har inte tittat pÄ det sjÀlv, sÄ jag kan inte garantera nÄgot. DÀremot ges inga garantier för sjÀlva ClickHouse. Detta Àr ocksÄ öppen kÀllkod, men Ä andra sidan kanske du Àr van vid nÄgon kvalitetsstandard som vi försöker tillhandahÄlla. Men för den hÀr saken - jag vet inte, gÄ till GitHub, titta pÄ koden. Kanske skrev de nÄgot normalt.

* frÄn och med 2020, bör ocksÄ lÀggas till i övervÀgande KittenHouse.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Metod 6. En annan metod Àr att anvÀnda bufferttabeller. Fördelen med denna metod Àr att den Àr vÀldigt lÀtt att börja anvÀnda. Skapa en bufferttabell och infoga den i den.

Nackdelen Àr att problemet inte Àr helt löst. Om du i en takt som MergeTree mÄste gruppera data med en batch per sekund, sÄ mÄste du i en hastighet i en bufferttabell gruppera minst upp till flera tusen per sekund. Om det Àr mer Àn 10 000 per sekund blir det fortfarande dÄligt. Och om du sÀtter in det i omgÄngar, sÄ sÄg du att det visar sig vara hundra tusen rader per sekund. Och detta finns redan pÄ ganska tung data.

Och Àven bufferttabeller har ingen logg. Och om det Àr nÄgot fel pÄ din server kommer data att gÄ förlorade.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Och som en bonus fick vi nyligen möjligheten pÄ ClickHouse att hÀmta data frÄn Kafka. Det finns en bordsmotor - Kafka. Du skapar helt enkelt. Och du kan hÀnga materialiserade representationer pÄ den. I det hÀr fallet kommer den sjÀlv att extrahera data frÄn Kafka och infoga den i de tabeller du behöver.

Och det som Àr sÀrskilt glÀdjande med denna möjlighet Àr att det inte var vi som gjorde det. Detta Àr en gemenskapsfunktion. Och nÀr jag sÀger "gemenskapsinslag" menar jag det utan nÄgot förakt. Vi lÀste koden, gjorde en recension, den borde fungera bra.

* frÄn och med 2020 har liknande stöd dykt upp för RabbitMQ.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Vad mer kan vara obekvÀmt eller ovÀntat nÀr du infogar data? Om du gör en infoga vÀrdebegÀran och skriv nÄgra berÀknade uttryck i vÀrden. Till exempel Àr now() ocksÄ ett berÀknat uttryck. Och i det hÀr fallet tvingas ClickHouse att starta tolken av dessa uttryck pÄ varje rad, och prestandan kommer att sjunka i storleksordningar. Det Àr bÀttre att undvika detta.

* för tillfÀllet Àr problemet helt löst, det finns inte lÀngre nÄgon prestandaregression nÀr du anvÀnder uttryck i VALUES.

Ett annat exempel Àr nÀr det kan uppstÄ problem nÀr du har data pÄ en batch som tillhör ett gÀng partitioner. Som standard Àr ClickHouse-partitioner per mÄnad. Och om du infogar en sats pÄ en miljon rader och det finns data för flera Är, kommer du att ha flera dussin partitioner dÀr. Och detta motsvarar det faktum att det kommer att finnas partier flera tiotals gÄnger mindre i storlek, eftersom de inuti alltid först Àr uppdelade i partitioner.

* Nyligen, i experimentellt lÀge, lade ClickHouse till stöd för det kompakta formatet av bitar och bitar i RAM-minne med skriv-ahead-logg, vilket nÀstan helt löser problemet.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

LÄt oss nu titta pÄ den andra typen av problem - dataskrivning.

Datainmatning kan vara strikt eller strÀng. String Àr nÀr du precis tog den och förklarade att alla dina fÀlt Àr av typen string. Det hÀr suger. Det finns inget behov av att göra detta.

LÄt oss ta reda pÄ hur man gör det pÄ rÀtt sÀtt i de fall du vill sÀga att vi har ett fÀlt, en strÀng, och lÄt ClickHouse ta reda pÄ det pÄ egen hand, och jag ska inte bry mig. Men det Àr ÀndÄ vÀrt att anstrÀnga sig.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Vi har till exempel en IP-adress. I ett fall sparade vi det som ett snöre. Till exempel 192.168.1.1. Och i ett annat fall blir det ett antal av typen UInt32*. 32 bitar rÀcker för en IPv4-adress.

För det första kommer data mÀrkligt nog att komprimeras ungefÀr lika mycket. Det blir förstÄs skillnad, men inte sÄ stor. SÄ det finns inga speciella problem med disk I/O.

Men det finns en allvarlig skillnad i processortid och frÄgekörningstid.

LÄt oss rÀkna antalet unika IP-adresser om de lagras som nummer. Det blir 137 miljoner rader per sekund. Om samma Àr i form av strÀngar, dÄ 37 miljoner linjer per sekund. Jag vet inte varför denna slump hÀnde. Jag utförde dessa förfrÄgningar sjÀlv. Men fortfarande ca 4 gÄnger lÄngsammare.

Och om du rÀknar ut skillnaden i diskutrymme, sÄ finns det ocksÄ en skillnad. Och skillnaden Àr ungefÀr en fjÀrdedel, eftersom det finns ganska mÄnga unika IP-adresser. Och om det fanns rader med ett litet antal olika betydelser, sÄ skulle de lÀtt komprimeras enligt ordboken till ungefÀr samma volym.

Och den fyrfaldiga tidsskillnaden ligger inte pÄ vÀgen. Man kanske inte bryr sig sÄklart, men nÀr jag ser en sÄdan skillnad blir jag ledsen.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

LÄt oss titta pÄ olika fall.

1. Ett fall nÀr du har fÄ olika unika vÀrden. I det hÀr fallet anvÀnder vi en enkel praxis som du förmodligen kÀnner till och kan anvÀnda för alla DBMS. Allt detta Àr vettigt inte bara för ClickHouse. Skriv bara numeriska identifierare i databasen. Och du kan konvertera till strÀngar och tillbaka pÄ sidan av din applikation.

Du har till exempel en region. Och du försöker spara den som en strÀng. Och det kommer att skrivas dÀr: Moskva och Moskvaregionen. Och nÀr jag ser att det stÄr "Moskva" Àr det ingenting, men nÀr det Àr Moskva blir det pÄ nÄgot sÀtt helt sorgligt. Detta Àr hur mÄnga byte.

IstÀllet skriver vi helt enkelt ner numret Ulnt32 och 250. Vi har 250 i Yandex, men ditt kan vara annorlunda. För sÀkerhets skull ska jag sÀga att ClickHouse har en inbyggd förmÄga att arbeta med en geobas. Du skriver helt enkelt ner en katalog med regioner, inklusive en hierarkisk, dvs det kommer att finnas Moskva, Moskvaregionen och allt du behöver. Och du kan konvertera pÄ begÀran nivÄ.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Det andra alternativet Àr ungefÀr detsamma, men med stöd inuti ClickHouse. Detta Àr datatypen Enum. Du skriver helt enkelt alla vÀrden du behöver inuti Enum. Till exempel typ av enhet och skriv dÀr: stationÀr, mobil, surfplatta, TV. Det finns totalt 4 alternativ.

Nackdelen Àr att du behöver Àndra den med jÀmna mellanrum. Bara ett alternativ har lagts till. LÄt oss Àndra tabell. Faktum Àr att Àndra tabell i ClickHouse Àr gratis. SÀrskilt gratis för Enum eftersom data pÄ disken inte Àndras. Men ÀndÄ fÄr alter ett lÄs* pÄ bordet och mÄste vÀnta tills alla val har utförts. Och först efter att denna Àndring kommer att utföras, d.v.s. det finns fortfarande nÄgra olÀgenheter.

* i de senaste versionerna av ClickHouse Àr ALTER helt icke-blockerande.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Ett annat alternativ som Àr ganska unikt för ClickHouse Àr att ansluta externa ordböcker. Du kan skriva siffror i ClickHouse och behÄlla dina kataloger i vilket system som helst som passar dig. Du kan till exempel anvÀnda: MySQL, Mongo, Postgres. Du kan till och med skapa din egen mikrotjÀnst som skickar denna data via http. Och pÄ ClickHouse-nivÄ skriver du en funktion som konverterar denna data frÄn siffror till strÀngar.

Detta Àr ett specialiserat men mycket effektivt sÀtt att utföra en join pÄ ett externt bord. Och det finns tvÄ alternativ. I en utföringsform kommer denna data att vara fullstÀndigt cachelagrad, helt nÀrvarande i RAM:et och uppdaterad med viss frekvens. Och i ett annat alternativ, om dessa data inte passar in i RAM-minnet, kan du delvis cache det.

HÀr Àr ett exempel. Det finns Yandex.Direct. Och det finns ett reklamföretag och banners. Det finns förmodligen ungefÀr tiotals miljoner reklamföretag. Och de passar ungefÀr in i RAM-minnet. Och det finns miljarder banderoller, de passar inte. Och vi anvÀnder en cachad ordbok frÄn MySQL.

Det enda problemet Àr att den cachade ordboken fungerar bra om trÀfffrekvensen Àr nÀra 100 %. Om den Àr mindre mÄste du faktiskt ta de saknade nycklarna och hÀmta data frÄn MySQL nÀr du bearbetar frÄgor för varje databatt. Om ClickHouse kan jag fortfarande garantera att - ja, det saktar inte ner, jag kommer inte att prata om andra system.

Och som en bonus Àr ordböcker ett mycket enkelt sÀtt att retroaktivt uppdatera data i ClickHouse. Det vill sÀga, du hade en rapport om reklamföretag, anvÀndaren Àndrade helt enkelt reklamföretaget och i alla gamla data, i alla rapporter, Àndrades Àven denna data. Om du skriver rader direkt till tabellen blir det omöjligt att uppdatera dem.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Ett annat sÀtt nÀr du inte vet var du kan fÄ tag i identifierarna för dina strÀngar. du kan helt enkelt hasha det. Dessutom Àr det enklaste alternativet att ta en 64-bitars hash.

Det enda problemet Àr att om hashen Àr 64-bitars kommer du nÀstan sÀkert att ha kollisioner. För om det finns en miljard rader dÀr, sÄ blir sannolikheten redan mÀrkbar.

Och det skulle inte vara sÀrskilt bra att hasha namnen pÄ reklamföretag pÄ det hÀr sÀttet. Om olika företags reklamkampanjer blandas ihop blir det nÄgot obegripligt.

Och det finns ett enkelt knep. Det Àr sant att det inte heller Àr sÀrskilt lÀmpligt för seriösa data, men om nÄgot inte Àr sÀrskilt allvarligt, lÀgg bara till klientidentifieraren i ordboksnyckeln. Och dÄ kommer du att ha kollisioner, men bara inom en klient. Och vi anvÀnder den hÀr metoden för lÀnkkartor i Yandex.Metrica. Vi har webbadresser dÀr, vi lagrar hash. Och vi vet att det förstÄs finns kollisioner. Men nÀr sidan visas kan sannolikheten att pÄ en sida hos en anvÀndare vissa webbadresser har fastnat ihop och detta kommer att mÀrkas försummas.

Som en bonus Àr det tillrÀckligt med hash för mÄnga operationer och sjÀlva strÀngarna behöver inte lagras nÄgonstans.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Ett annat exempel Àr om strÀngarna Àr korta, till exempel webbplatsdomÀner. De kan förvaras som de Àr. Eller, till exempel, webblÀsarsprÄket ru Àr 2 byte. Naturligtvis tycker jag verkligen synd om byten, men oroa dig inte, 2 byte Àr inte synd. BehÄll det som det Àr, oroa dig inte.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Ett annat fall Àr nÀr, tvÀrtom, det finns mÄnga rader och det finns mÄnga unika i dem, och Àven uppsÀttningen Àr potentiellt obegrÀnsad. Ett typiskt exempel Àr sökfraser eller webbadresser. Sökfraser, inklusive stavfel. LÄt oss se hur mÄnga unika sökfraser det finns per dag. Och det visar sig att de Àr nÀstan hÀlften av alla evenemang. Och i det hÀr fallet kanske du tror att du behöver normalisera data, rÀkna identifierarna och lÀgga dem i en separat tabell. Men du behöver inte göra det. BehÄll bara dessa rader som de Àr.

Det Àr bÀttre att inte uppfinna nÄgot, för om du lagrar det separat mÄste du göra en koppling. Och denna sammanfogning Àr i bÀsta fall en slumpmÀssig tillgÄng till minnet, om den fortfarande fÄr plats i minnet. Om det inte passar sÄ blir det problem.

Och om data lagras pÄ plats lÀses den helt enkelt i önskad ordning frÄn filsystemet och allt Àr bra.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Om du har webbadresser eller nÄgon annan komplex lÄng strÀng, Àr det vÀrt att tÀnka pÄ att du kan berÀkna nÄgon form av extrakt i förvÀg och skriva det i en separat kolumn.

För webbadresser, till exempel, kan du lagra domÀnen separat. Och om du verkligen behöver en domÀn, anvÀnd bara den hÀr kolumnen, sÄ kommer webbadresserna att ligga dÀr, och du kommer inte ens att röra dem.

LÄt oss se vad skillnaden Àr. ClickHouse har en specialiserad funktion som berÀknar domÀnen. Det Àr vÀldigt snabbt, vi har optimerat det. Och, för att vara Àrlig, överensstÀmmer den inte ens med RFC, men ÀndÄ tar den hÀnsyn till allt vi behöver.

Och i ett fall fÄr vi helt enkelt webbadresserna och berÀknar domÀnen. Det blir 166 millisekunder. Och om du tar en fÀrdig domÀn, sÄ visar det sig att det bara Àr 67 millisekunder, dvs nÀstan tre gÄnger snabbare. Och det Àr snabbare inte för att vi behöver göra nÄgra berÀkningar, utan för att vi lÀser mindre data.

Det Àr dÀrför en begÀran, som Àr lÄngsammare, har en högre hastighet pÄ gigabyte per sekund. Eftersom den lÀser mer gigabyte. Detta Àr helt onödiga uppgifter. BegÀran verkar gÄ snabbare, men det tar lÀngre tid att slutföra.

Och om du tittar pÄ mÀngden data pÄ disken, visar det sig att URL:en Àr 126 megabyte, och domÀnen Àr bara 5 megabyte. Det visar sig 25 gÄnger mindre. Men inte desto mindre exekveras begÀran bara 4 gÄnger snabbare. Men det beror pÄ att data Àr heta. Och om det vore kallt skulle det förmodligen vara 25 gÄnger snabbare pÄ grund av disk I/O.

Förresten, om man uppskattar hur mycket mindre en domÀn Àr Àn en URL sÄ visar den sig vara cirka 4 gÄnger mindre.Men av nÄgon anledning tar data upp 25 gÄnger mindre pÄ disken. Varför? PÄ grund av kompression. Och URL:en Àr komprimerad, och domÀnen Àr komprimerad. Men ofta innehÄller webbadressen en massa skrÀp.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Och, naturligtvis, lönar det sig att anvÀnda rÀtt datatyper som Àr utformade specifikt för de önskade vÀrdena eller som Àr lÀmpliga. Om du anvÀnder IPv4, lagra dÄ UInt32*. Om IPv6, dÄ FixedString(16), eftersom IPv6-adressen Àr 128 bitar, dvs lagras direkt i binÀrt format.

Men vad hÀnder om du ibland har IPv4-adresser och ibland IPv6? Ja, du kan lagra bÄda. En kolumn för IPv4, en annan för IPv6. Naturligtvis finns det ett alternativ att visa IPv4 i IPv6. Detta kommer ocksÄ att fungera, men om du ofta behöver en IPv4-adress i förfrÄgningar, sÄ skulle det vara trevligt att lÀgga den i en separat kolumn.

* ClickHouse har nu separata IPv4, IPv6 datatyper som lagrar data lika effektivt som siffror, men representerar dem lika bekvÀmt som strÀngar.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Det Àr ocksÄ viktigt att notera att det Àr vÀrt att förbehandla data i förvÀg. Till exempel fÄr du nÄgra rÄloggar. Och du kanske inte bara ska lÀgga dem i ClickHouse direkt, Àven om det Àr vÀldigt frestande att inte göra nÄgonting och allt kommer att fungera. Men det Àr ÀndÄ vÀrt att genomföra de berÀkningar som Àr möjliga.

Till exempel webblÀsarversion. I nÄgon nÀrliggande avdelning, som jag inte vill peka finger pÄ, lagras webblÀsarversionen sÄ hÀr, det vill sÀga som en strÀng: 12.3. Och sedan, för att göra en rapport, tar de den hÀr strÀngen och delar upp den i en array och sedan i det första elementet i arrayen. Naturligtvis saktar allt ner. Jag frÄgade varför de gör sÄ hÀr. De sa till mig att de inte gillar för tidig optimering. Och jag gillar inte för tidig pessimisering.

SÄ i det hÀr fallet skulle det vara mer korrekt att dela upp i 4 kolumner. Var inte rÀdd hÀr, för det hÀr Àr ClickHouse. ClickHouse Àr en kolumnformad databas. Och ju mer prydliga smÄ kolumner, desto bÀttre. Det kommer att finnas 5 webblÀsarversioner, skapa 5 kolumner. Det hÀr Àr okej.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

LÄt oss nu titta pÄ vad du ska göra om du har mÄnga vÀldigt lÄnga strÀngar, vÀldigt lÄnga arrayer. De behöver inte förvaras i ClickHouse alls. IstÀllet kan du bara lagra en identifierare i ClickHouse. Och lÀgg dessa lÄnga rader i nÄgot annat system.

Till exempel har en av vÄra analystjÀnster nÄgra hÀndelseparametrar. Och om det finns mÄnga parametrar för hÀndelser sparar vi helt enkelt de första 512 som stöter pÄ. För 512 Àr inte synd.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Och om du inte kan bestÀmma dig för dina datatyper kan du ocksÄ spela in data i ClickHouse, men i en tillfÀllig tabell av typen Logg, speciellt för temporÀr data. Efter detta kan du analysera vilken fördelning av vÀrden du har dÀr, vad som finns dÀr i allmÀnhet och skapa rÀtt typer.

*ClickHouse har nu en datatyp LÄg kardinalitet vilket gör att du kan lagra strÀngar effektivt med mindre anstrÀngning.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

LÄt oss nu titta pÄ ett annat intressant fall. Ibland fungerar saker konstigt för mÀnniskor. Jag kommer in och ser det hÀr. Och det verkar direkt som att detta gjordes av en mycket erfaren, smart administratör som har lÄng erfarenhet av att konfigurera MySQL version 3.23.

HĂ€r ser vi tusen tabeller, som var och en registrerar resten av att dividera vem som vet vad med tusen.

I princip respekterar jag andra mÀnniskors erfarenheter, inklusive förstÄelsen för det lidande som kan uppnÄs genom denna erfarenhet.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Och skÀlen Àr mer eller mindre tydliga. Det hÀr Àr gamla stereotyper som kan ha ackumulerats under arbetet med andra system. Till exempel har MyISAM-tabeller inte en klustrad primÀrnyckel. Och det hÀr sÀttet att dela upp data kan vara ett desperat försök att fÄ samma funktionalitet.

En annan anledning Ă€r att det Ă€r svĂ„rt att göra nĂ„gra Ă€ndringsoperationer pĂ„ stora bord. Allt kommer att blockeras. Även om detta problem inte lĂ€ngre Ă€r sĂ„ allvarligt i moderna versioner av MySQL.

Eller till exempel microsharding, men mer om det senare.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Det finns inget behov av att göra detta i ClickHouse, eftersom primÀrnyckeln för det första Àr klustrad, data sorteras efter primÀrnyckeln.

Och ibland frÄgar folk mig: "Hur varierar prestandan för intervallfrÄgor i ClickHouse beroende pÄ tabellstorleken?" Jag sÀger att det inte förÀndras alls. Till exempel har du en tabell med en miljard rader och du lÀser ett intervall pÄ en miljon rader. Allt Àr bra. Om det finns en biljon rader i en tabell och du lÀser en miljon rader blir det nÀstan detsamma.

Och för det andra krÀvs inte alla möjliga saker som manuella partitioner. Om du gÄr in och tittar pÄ vad som finns i filsystemet ser du att tabellen Àr en ganska stor sak. Och det finns nÄgot som skiljer inuti. Det vill sÀga, ClickHouse gör allt för dig och du behöver inte lida.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Ändra i ClickHouse Ă€r gratis om Ă€ndra lĂ€gg till/slĂ€pp kolumn.

Och du bör inte göra smÄ tabeller, för om du har 10 rader eller 10 000 rader i en tabell, sÄ spelar det ingen roll. ClickHouse Àr ett system som optimerar genomströmning, inte latens, sÄ det Àr ingen mening att bearbeta 10 rader.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Det Àr korrekt att anvÀnda ett stort bord. Bli av med gamla stereotyper, allt blir bra.

Och som en bonus, i den senaste versionen har vi nu möjlighet att skapa en godtycklig partitioneringsnyckel för att utföra alla typer av underhÄllsoperationer pÄ enskilda partitioner.

Till exempel behöver du mÄnga smÄ tabeller, till exempel nÀr det finns ett behov av att bearbeta en del mellanliggande data fÄr du bitar och du behöver utföra en transformation pÄ dem innan du skriver till finalbordet. För det hÀr fallet finns det en underbar bordsmotor - StripeLog. Det Àr ungefÀr som TinyLog, bara bÀttre.

* nu har ClickHouse ocksÄ tabellfunktionsingÄng.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Ett annat antimönster Àr microsharding. Till exempel behöver du klippa data och du har 5 servrar, och imorgon kommer det att finnas 6 servrar. Och du tÀnker pÄ hur du ska balansera om denna data. Och istÀllet bryter du inte i 5 skÀrvor, utan i 1 000 skÀrvor. Och sedan mappar du var och en av dessa mikroskÀrvor till en separat server. Och du fÄr till exempel 200 ClickHouses pÄ en server till exempel. Separata instanser pÄ separata portar eller separata databaser.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Men detta Àr inte sÀrskilt bra i ClickHouse. Eftersom Àven en ClickHouse-instans försöker anvÀnda alla tillgÀngliga serverresurser för att behandla en begÀran. Det vill sÀga att du har nÄgon slags server och den har till exempel 56 processorkÀrnor. Du kör en frÄga som tar en sekund och den kommer att anvÀnda 56 kÀrnor. Och om du placerade 200 ClickHouses dÀr pÄ en server, sÄ visar det sig att 10 000 trÄdar kommer att starta. I allmÀnhet kommer allt att vara vÀldigt dÄligt.

En annan anledning Àr att arbetsfördelningen mellan dessa instanser blir ojÀmn. Vissa kommer att sluta tidigare, vissa kommer att sluta senare. Om allt detta hÀnde i en instans, skulle ClickHouse sjÀlv ta reda pÄ hur man korrekt distribuerar data mellan trÄdarna.

Och en annan anledning Àr att du kommer att ha interprocessorkommunikation via TCP. Data kommer att behöva serialiseras, deserialiseras, och detta Àr ett stort antal mikroskÀrvor. Det kommer helt enkelt inte att fungera effektivt.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Ett annat antimönster, Àven om det knappast kan kallas ett antimönster. Detta Àr en stor mÀngd föraggregation.

I allmÀnhet Àr föraggregation bra. Du hade en miljard rader, du aggregerade det och det blev 1 000 rader, och nu körs frÄgan omedelbart. Allt Àr bra. Du kan göra det hÀr. Och för detta har Àven ClickHouse en speciell tabelltyp, AggregatingMergeTree, som utför inkrementell aggregering nÀr data infogas.

Men det finns tillfÀllen dÄ du tror att vi kommer att aggregera data som denna och aggregerade data som denna. Och i nÄgon angrÀnsande avdelning vill jag inte heller sÀga vilken, de anvÀnder SummingMergeTree-tabeller för att sammanfatta med primÀrnyckeln, och cirka 20 kolumner anvÀnds som primÀrnyckel. För sÀkerhets skull Àndrade jag namnen pÄ nÄgra kolumner för sekretess, men det Àr i stort sett det.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Och sÄdana problem uppstÄr. För det första minskar inte din datavolym för mycket. Den minskar till exempel tre gÄnger. Tre gÄnger skulle vara ett bra pris för att ha rÄd med de obegrÀnsade analysmöjligheterna som uppstÄr om din data inte Àr aggregerad. Om uppgifterna Àr aggregerade fÄr du istÀllet för analyser bara ynklig statistik.

Och vad Àr det som Àr sÄ speciellt med det? Faktum Àr att dessa personer frÄn grannavdelningen ibland gÄr och ber om att fÄ lÀgga till ytterligare en kolumn till primÀrnyckeln. Det vill sÀga att vi aggregerade uppgifterna sÄ hÀr, men nu vill vi ha lite mer. Men ClickHouse har inte en alter-primÀrnyckel. DÀrför mÄste vi skriva nÄgra skript i C++. Och jag gillar inte skript, Àven om de Àr i C++.

Och om du tittar pÄ vad ClickHouse skapades för, sÄ Àr icke-aggregerad data exakt det scenario som det föddes för. Om du anvÀnder ClickHouse för icke-aggregerad data, gör du det rÀtt. Om du sammanstÀller Àr detta ibland förlÄtligt.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Ett annat intressant fall Àr frÄgor i en oÀndlig loop. Ibland gÄr jag till nÄgon produktionsserver och tittar pÄ show processlist dÀr. Och varje gÄng upptÀcker jag att nÄgot hemskt hÀnder.

Till exempel sÄ hÀr. Det Àr direkt klart att allt kan göras pÄ en begÀran. Skriv bara in webbadressen och listan dÀr.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Varför Àr mÄnga sÄdana frÄgor i en oÀndlig loop dÄliga? Om ett index inte anvÀnds kommer du att ha mÄnga pass över samma data. Men om indexet anvÀnds, till exempel, har du en primÀrnyckel för ru och du skriver url = nÄgot dÀr. Och du tror att om bara en webbadress lÀses frÄn tabellen kommer allt att bli bra. Men faktiskt nej. Eftersom ClickHouse gör allt i omgÄngar.

NÀr han behöver lÀsa en viss mÀngd data lÀser han lite mer, eftersom indexet i ClickHouse Àr sparsamt. Detta index tillÄter dig inte att hitta en enskild rad i tabellen, bara ett intervall av nÄgot slag. Och data komprimeras i block. För att kunna lÀsa en rad mÄste du ta hela blocket och lossa det. Och om du gör en massa frÄgor kommer du att ha mycket överlappning, och du kommer att ha mycket arbete att göra om och om igen.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Och som en bonus kan du notera att i ClickHouse bör du inte vara rÀdd för att överföra till och med megabyte och till och med hundratals megabyte till IN-sektionen. Jag minns frÄn vÄr praktik att om vi i MySQL överför ett gÀng vÀrden till IN-sektionen, till exempel överför vi 100 megabyte av vissa nummer dit, dÄ Àter MySQL upp 10 gigabyte minne och inget annat hÀnder med det, allt fungerar dÄligt.

Och det andra Àr att i ClickHouse, om dina frÄgor anvÀnder ett index, Àr det alltid inte lÄngsammare Àn en fullstÀndig skanning, det vill sÀga om du behöver lÀsa nÀstan hela tabellen, kommer den att gÄ sekventiellt och lÀsa hela tabellen. I allmÀnhet kommer han att ta reda pÄ det pÄ egen hand.

Men ÀndÄ finns det vissa svÄrigheter. Till exempel det faktum att IN med en underfrÄga inte anvÀnder indexet. Men det hÀr Àr vÄrt problem och vi mÄste ÄtgÀrda det. Det finns inget grundlÀggande hÀr. Vi fixar det*.

Och en annan intressant sak Àr att om du har en mycket lÄng förfrÄgan och distribuerad förfrÄgningsbehandling pÄgÄr, sÄ kommer denna mycket lÄnga begÀran att skickas till varje server utan komprimering. Till exempel 100 megabyte och 500 servrar. Och följaktligen kommer du att ha 50 gigabyte överförda över nÀtverket. Det kommer att överföras och sedan kommer allt att slutföras framgÄngsrikt.

* anvÀnder redan; Allt fixades som utlovat.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Och ett ganska vanligt fall Àr nÀr förfrÄgningar kommer frÄn API:et. Till exempel skapade du nÄgon form av din egen tjÀnst. Och om nÄgon behöver din tjÀnst, dÄ öppnar du API:t och bokstavligen tvÄ dagar senare ser du att nÄgot obegripligt hÀnder. Allt Àr överbelastat och det kommer in nÄgra hemska förfrÄgningar som aldrig borde ha hÀnt.

Och det finns bara en lösning. Om du har öppnat API:et mÄste du klippa det. Till exempel införa nÄgon form av kvotering. Det finns inga andra normala alternativ. Annars kommer de genast att skriva ett manus och det blir problem.

Och ClickHouse har en speciell funktion - kvotberÀkning. Dessutom kan du överföra din kvotnyckel. Detta Àr till exempel det interna anvÀndar-ID:t. Och kvoter kommer att berÀknas oberoende för var och en av dem.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Nu en annan intressant sak. Detta Àr manuell replikering.

Jag kÀnner till mÄnga fall dÀr, trots att ClickHouse har inbyggt replikeringsstöd, mÀnniskor replikerar ClickHouse manuellt.

Vad Àr principen? Du har en pipeline för databehandling. Och det fungerar sjÀlvstÀndigt, till exempel i olika datacenter. Du skriver samma data pÄ samma sÀtt i ClickHouse. Det Àr sant att praxis visar att data fortfarande kommer att skilja sig pÄ grund av vissa funktioner i din kod. Jag hoppas att den finns i din.

Och frÄn tid till annan mÄste du fortfarande synkronisera manuellt. Till exempel, en gÄng i mÄnaden gör administratörer rsync.

Faktum Àr att det Àr mycket lÀttare att anvÀnda replikeringen som Àr inbyggd i ClickHouse. Men det kan finnas nÄgra kontraindikationer, för för detta mÄste du anvÀnda ZooKeeper. Jag ska inte sÀga nÄgot dÄligt om ZooKeeper, i princip fungerar systemet, men det hÀnder att folk inte anvÀnder det pÄ grund av java-fobi, eftersom ClickHouse Àr ett sÄ bra system, skrivet i C++, som du kan anvÀnda och allt kommer att bli bra. Och ZooKeeper Àr i java. Och pÄ nÄgot sÀtt vill du inte ens titta, men dÄ kan du anvÀnda manuell replikering.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

ClickHouse Àr ett praktiskt system. Hon tar hÀnsyn till dina behov. Om du har manuell replikering kan du skapa en distribuerad tabell som tittar pÄ dina manuella repliker och gör en failover mellan dem. Och det finns till och med ett speciellt alternativ som lÄter dig undvika floppar, Àven om dina linjer systematiskt divergerar.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Ytterligare problem kan uppstÄ om du anvÀnder primitiva bordsmotorer. ClickHouse Àr en konstruktör som har en massa olika bordsmotorer. För alla allvarliga fall, som skrivet i dokumentationen, anvÀnd tabeller frÄn MergeTree-familjen. Och allt annat - det Àr sÄ, för enskilda fall eller för tester.

I en MergeTree-tabell behöver du inte ha nÄgot datum och tid. Du kan fortfarande anvÀnda den. Om det inte finns nÄgot datum och tid, skriv att standard Àr 2000. Detta kommer att fungera och kommer inte att krÀva resurser.

Och i den nya versionen av servern kan du till och med ange att du har anpassad partitionering utan en partitionsnyckel. Det blir samma sak.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Å andra sidan kan du anvĂ€nda primitiva bordsmotorer. Fyll till exempel i uppgifterna en gĂ„ng och titta, vrid och radera. Du kan anvĂ€nda Log.

Eller att lagra smÄ volymer för mellanbehandling Àr StripeLog eller TinyLog.

Minne kan anvÀndas om mÀngden data Àr liten och du kan helt enkelt snurra nÄgot i RAM-minnet.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

ClickHouse gillar inte renormaliserad data.

HÀr Àr ett typiskt exempel. Detta Àr ett stort antal webbadresser. Du lÀgger dem i nÀsta tabell. Och sedan bestÀmde de sig för att göra JOIN med dem, men detta kommer inte att fungera, som regel, eftersom ClickHouse bara stöder Hash JOIN. Om det inte finns tillrÀckligt med RAM-minne för mycket data som behöver anslutas, sÄ fungerar inte JOIN*.

Om data Àr av hög kardinalitet, oroa dig inte, lagra den i en denormaliserad form, webbadresserna Àr direkt pÄ plats i huvudtabellen.

* och nu har ClickHouse ocksÄ en merge join, och den fungerar under förhÄllanden dÀr mellanliggande data inte passar in i RAM-minnet. Men detta Àr ineffektivt och rekommendationen förblir i kraft.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Ett par exempel till, men jag tvivlar redan pÄ om de Àr antimönster eller inte.

ClickHouse har ett kÀnt fel. Den vet inte hur man uppdaterar*. PÄ vissa sÀtt Àr detta till och med bra. Om du har nÄgra viktiga uppgifter, till exempel bokföring, kommer ingen att kunna skicka det, eftersom det inte finns nÄgra uppdateringar.

* stöd för uppdatering och radering i batchlÀge har lagts till för lÀnge sedan.

Men det finns nÄgra speciella sÀtt som tillÄter uppdateringar som i bakgrunden. Till exempel tabeller som ReplaceMergeTree. De gör uppdateringar under bakgrundssammanslagningar. Du kan tvinga fram detta med hjÀlp av optimeringstabell. Men gör inte detta för ofta, eftersom det kommer att skriva över partitionen helt.

Distribuerade JOINs i ClickHouse hanteras ocksÄ dÄligt av frÄgeplaneraren.

DĂ„ligt, men ibland ok.

AnvÀnder endast ClickHouse för att lÀsa tillbaka data med select*.

Jag skulle inte rekommendera att anvÀnda ClickHouse för krÄngliga berÀkningar. Men detta Àr inte helt sant, eftersom vi redan gÄr bort frÄn denna rekommendation. Och vi har nyligen lagt till möjligheten att tillÀmpa maskininlÀrningsmodeller i ClickHouse - Catboost. Och det stör mig för jag tÀnker: "Vilken fasa. SÄ hÀr mÄnga cykler per byte blir det! Jag hatar verkligen att slösa klockor pÄ bytes.

Effektiv anvÀndning av ClickHouse. Alexey Milovidov (Yandex)

Men var inte rÀdd, installera ClickHouse, allt kommer att bli bra. Om nÄgot sÄ har vi en gemenskap. Förresten, gemenskapen Àr du. Och om du har nÄgra problem kan du Ätminstone gÄ in pÄ vÄr chatt, och förhoppningsvis hjÀlper de dig.

frÄgor

Tack för rapporten! Var kan jag klaga pÄ att ClickHouse kraschar?

Du kan klaga till mig personligen just nu.

Jag började nyligen anvÀnda ClickHouse. Jag tappade omedelbart cli-grÀnssnittet.

Du har tur.

Lite senare kraschade jag servern med ett litet urval.

Du har talang.

Jag öppnade en GitHub-bugg, men den ignorerades.

Vi kommer att se.

Alexey lurade mig att delta i rapporten och lovade att berÀtta för mig hur du kommer Ät data inuti.

Mycket enkelt.

Jag insÄg detta igÄr. Mer detaljer.

Det finns inga hemska knep dÀr. Det Àr bara block-för-block-komprimering. Standard Àr LZ4, du kan aktivera ZSTD*. Blockerar frÄn 64 kilobyte till 1 megabyte.

* det finns ocksÄ stöd för specialiserade komprimeringskodekar som kan anvÀndas i en kedja med andra algoritmer.

Är blocken bara rĂ„data?

Inte helt rÄ. Det finns arrayer. Om du har en numerisk kolumn, placeras siffror i en rad i en matris.

Kusten Àr klar.

Alexey, ett exempel som var med uniqExact över IP:er, dvs det faktum att uniqExact tar lĂ€ngre tid att berĂ€kna med rader Ă€n med siffror, och sĂ„ vidare. TĂ€nk om vi anvĂ€nder en finta med öronen och kasta vid korrekturlĂ€sningen? Det vill sĂ€ga, du verkar ha sagt att pĂ„ vĂ„r disk Ă€r det inte sĂ€rskilt annorlunda. Om vi ​​lĂ€ser rader frĂ„n disk och cast, blir vĂ„ra aggregat snabbare eller inte? Eller kommer vi fortfarande att vinna lite hĂ€r? Det verkar för mig att du testat detta, men av nĂ„gon anledning inte angett det i riktmĂ€rket.

Jag tror att det blir lĂ„ngsammare Ă€n utan casting. I det hĂ€r fallet mĂ„ste IP-adressen analyseras frĂ„n strĂ€ngen. Naturligtvis, pĂ„ ClickHouse Ă€r vĂ„r IP-adressanalys ocksĂ„ optimerad. Vi försökte mycket, men dĂ€r har du siffrorna skrivna i tiotusendel. VĂ€ldigt obekvĂ€mt. Å andra sidan kommer uniqExact-funktionen att arbeta lĂ„ngsammare pĂ„ strĂ€ngar, inte bara för att dessa Ă€r strĂ€ngar, utan ocksĂ„ för att en annan specialisering av algoritmen Ă€r vald. StrĂ€ngar bearbetas helt enkelt annorlunda.

Vad hÀnder om vi tar en mer primitiv datatyp? Vi skrev till exempel ner anvÀndar-id, som vi har i, skrev ner det som en rad och sedan förvrÀngde det, blir det roligare eller inte?

Jag tvivlar. Jag tror att det kommer att bli Ànnu trÄkigare, för trots allt Àr det ett allvarligt problem att analysera siffror. Det förefaller mig som om den hÀr kollegan till och med gav en rapport om hur svÄrt det Àr att analysera siffror i tiotusendelsform, men kanske inte.

Alexey, tack sÄ mycket för rapporten! Och tack sÄ mycket för ClickHouse! Jag har en frÄga om planerna. Finns det nÄgra planer pÄ en funktion för att uppdatera ordböcker ofullstÀndigt?

Det vill sÀga en partiell omstart?

Jaja. Som möjligheten att stÀlla in ett MySQL-fÀlt dÀr, dvs uppdatera efter sÄ att endast denna data laddas om ordboken Àr vÀldigt stor.

En mycket intressant funktion. Och jag tror att nÄgon person föreslog det i vÄr chatt. Kanske var det till och med du.

Jag tror inte det.

JĂ€ttebra, nu visar det sig att det finns tvĂ„ förfrĂ„gningar. Och du kan sakta börja göra det. Men jag vill genast varna dig för att den hĂ€r funktionen Ă€r ganska enkel att implementera. Det vill sĂ€ga, i teorin behöver du bara skriva versionsnumret i tabellen och sedan skriva: version mindre Ă€n sĂ„ och sĂ„. Det betyder att vi med största sannolikhet kommer att erbjuda detta till entusiaster. Är du en entusiast?

Ja, men tyvÀrr inte i C++.

Vet dina kollegor hur man skriver i C++?

Jag hittar nÄgon.

Bra*.

* funktionen lades till tvÄ mÄnader efter rapporten - författaren till frÄgan utvecklade den och skickade sin dra förfrÄgan.

Tack!

HallĂ„! Tack för rapporten! Du nĂ€mnde att ClickHouse Ă€r vĂ€ldigt bra pĂ„ att konsumera alla tillgĂ€ngliga resurser. Och talaren bredvid Luxoft pratade om sin lösning för Russian Post. Han sa att de verkligen gillade ClickHouse, men de anvĂ€nde det inte istĂ€llet för sin huvudkonkurrent just för att det Ă€ter upp all CPU. Och de kunde inte koppla in den i sin arkitektur, till sin ZooKeeper med hamnarbetare. Är det möjligt att pĂ„ nĂ„got sĂ€tt begrĂ€nsa ClickHouse sĂ„ att det inte konsumerar allt som blir tillgĂ€ngligt för det?

Ja, det Àr möjligt och vÀldigt enkelt. Om du vill konsumera fÀrre kÀrnor Àr det bara att skriva set max_threads = 1. Och det Àr det, det kommer att utföra begÀran i en kÀrna. Dessutom kan du ange olika instÀllningar för olika anvÀndare. SÄ inga problem. Och berÀtta för dina kollegor frÄn Luxoft att det inte Àr bra att de inte hittade den hÀr instÀllningen i dokumentationen.

Alexey, hej! Jag skulle vilja frÄga om denna frÄga. Det Àr inte första gÄngen jag har hört att mÄnga mÀnniskor börjar anvÀnda ClickHouse som lagring för loggar. I rapporten sa du att du inte skulle göra detta, d.v.s. du behöver inte lagra lÄnga strÀngar. Vad tycker du om det?

För det första Àr stockar som regel inte lÄnga strÀngar. Det finns naturligtvis undantag. Till exempel, nÄgon tjÀnst skriven i java ger ett undantag, det loggas. Och sÄ vidare i en oÀndlig loop, och utrymmet pÄ hÄrddisken tar slut. Lösningen Àr vÀldigt enkel. Om linjerna Àr mycket lÄnga, klipp sedan av dem. Vad betyder lÄng? Tiotals kilobyte Àr dÄliga*.

* i de senaste versionerna av ClickHouse Àr "adaptive index granularity" aktiverad, vilket eliminerar problemet med att lagra lÄnga rader för det mesta.

Är en kilobyte normalt?

Det Àr normalt.

HallÄ! Tack för rapporten! Jag har redan frÄgat om detta i chatten, men jag kommer inte ihÄg om jag fick svar. Finns det planer pÄ att pÄ nÄgot sÀtt utöka WITH-sektionen pÄ samma sÀtt som CTE?

Inte Àn. VÄr WITH-sektion Àr nÄgot oseriös. Det Àr som en liten funktion för oss.

Jag förstÄr. Tack!

Tack för rapporten! Mycket intressant! Global frÄga. Finns det nÄgra planer pÄ att Àndra dataradering, kanske i form av nÄgon form av stubbar?

NödvÀndigtvis. Detta Àr vÄr första uppgift i vÄr kö. Vi funderar nu aktivt pÄ hur vi ska göra allt korrekt. Och du bör börja trycka pÄ tangentbordet*.

* tryckte pÄ knapparna pÄ tangentbordet och gjorde allt.

Kommer detta att pÄverka systemets prestanda pÄ nÄgot sÀtt eller inte? Kommer insÀttningen att gÄ lika snabbt som nu?

Kanske kommer sjÀlva borttagningarna och sjÀlva uppdateringarna att vara mycket tunga, men detta kommer inte att pÄverka prestandan för urval eller prestandan för insatser.

Och en liten frÄga till. Vid presentationen pratade du om primÀrnyckel. Följaktligen har vi partitionering, som Àr mÄnadsvis som standard, eller hur? Och nÀr vi stÀller in ett datumintervall som passar in i en mÄnad Àr det bara den hÀr partitionen som lÀses, eller hur?

Ja.

En frĂ„ga. Om vi ​​inte kan vĂ€lja nĂ„gon primĂ€rnyckel, Ă€r det dĂ„ korrekt att göra det specifikt enligt "Datum"-fĂ€ltet sĂ„ att det i bakgrunden blir mindre omarrangemang av denna data sĂ„ att den passar pĂ„ ett mer ordnat sĂ€tt? Om du inte har intervallfrĂ„gor och du inte ens kan vĂ€lja nĂ„gon primĂ€rnyckel, Ă€r det vĂ€rt att ange ett datum i primĂ€rnyckeln?

Ja.

Kanske Àr det vettigt att lÀgga ett fÀlt i primÀrnyckeln som kommer att komprimera data bÀttre om det sorteras efter detta fÀlt. Till exempel anvÀndar-ID. AnvÀndare, till exempel, gÄr till samma webbplats. I det hÀr fallet anger du anvÀndar-ID och tid. Och dÄ blir din data bÀttre komprimerad. NÀr det gÀller datumet, om du verkligen inte har och aldrig har intervallfrÄgor pÄ datum, behöver du inte ange datumet i primÀrnyckeln.

OK tack sÄ mycket!

KĂ€lla: will.com

LĂ€gg en kommentar