{"id":89878,"date":"2020-07-27T01:42:42","date_gmt":"2020-07-26T23:42:42","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-clickhouse-v-realnyh-prilozheniyah-aleksandr-zajczev-2018g"},"modified":"2020-07-27T01:42:42","modified_gmt":"2020-07-26T23:42:42","slug":"teoriya-i-praktika-ispolzovaniya-clickhouse-v-realnyh-prilozheniyah-aleksandr-zajczev-2018g","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-clickhouse-v-realnyh-prilozheniyah-aleksandr-zajczev-2018g","title":{"rendered":"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/b46b964324a3311157d5df737526b1d1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Trots att det nu finns mycket data n\u00e4stan \u00f6verallt, \u00e4r analytiska databaser fortfarande ganska ovanliga. De \u00e4r d\u00e5ligt k\u00e4nda och \u00e4nnu s\u00e4mre anv\u00e4nda effektivt. M\u00e5nga forts\u00e4tter att \"\u00e4ta kaktus\" med MySQL eller PostgreSQL, som \u00e4r designade f\u00f6r andra scenarier, pl\u00e5gas med NoSQL eller betalar f\u00f6r mycket f\u00f6r kommersiella l\u00f6sningar. ClickHouse f\u00f6r\u00e4ndrar spelets regler och s\u00e4nker avsev\u00e4rt tr\u00f6skeln f\u00f6r att komma in i v\u00e4rlden av analytiska DBMS.<\/p>\n<p><\/p>\n<p>Rapporten fr\u00e5n BackEnd Conf 2018 och den publiceras med talarens tillst\u00e5nd.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<center><div class=\"youtube-placeholder\" data-id=\"9MwKE30aUPs\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/9MwKE30aUPs\/hqdefault.jpg\" alt=\"Spela video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/6c55b639d9703f460d99e0b0b1194507.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVem \u00e4r jag och varf\u00f6r ber\u00e4ttar jag om ClickHouse? Jag \u00e4r utvecklingschef p\u00e5 LifeStreet, som anv\u00e4nder ClickHouse. Dessutom \u00e4r jag grundare av Altinity. Detta \u00e4r en partner till Yandex, som fr\u00e4mjar ClickHouse och hj\u00e4lper Yandex att g\u00f6ra ClickHouse mer framg\u00e5ngsrikt. Jag \u00e4r ocks\u00e5 villig att dela med mig av kunskapen om ClickHouse. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/36af6acba62271f7aa19dda2eb470870.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och f\u00f6rresten, jag \u00e4r inte bror till Petya Zaitsev. Jag f\u00e5r ofta fr\u00e5gor om detta. Nej, vi \u00e4r inte br\u00f6der.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/6ca605f97619a1373bb8a92f88d480d5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00abAlla vet\u00bb, att ClickHouse:<\/p>\n<p><\/p>\n<ul>\n<li>\u00c4r mycket snabb,<\/li>\n<li>\u00c4r mycket anv\u00e4ndarv\u00e4nlig, <\/li>\n<li>Anv\u00e4nds i Yandex. <\/li>\n<\/ul>\n<p><\/p>\n<p>Lite mindre k\u00e4nt \u00e4r vilka f\u00f6retag och hur det anv\u00e4nds. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/c097b003bf8ea13b8a3bb765270e99c8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jag ska ber\u00e4tta f\u00f6r er varf\u00f6r, var och hur ClickHouse anv\u00e4nds, f\u00f6rutom Yandex. <\/p>\n<p><\/p>\n<p>Jag kommer att ber\u00e4tta hur specifika uppgifter l\u00f6ses med ClickHouse i olika f\u00f6retag, vilka verktyg ClickHouse ni kan anv\u00e4nda f\u00f6r era uppgifter, och hur de har anv\u00e4nts i olika f\u00f6retag.<\/p>\n<p><\/p>\n<p>Jag har valt tre exempel som visar ClickHouse fr\u00e5n olika sidor. Jag tror att det kommer att vara intressant.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/d3cab92ceccd6c7d01ca1f28b028803f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>F\u00f6rsta fr\u00e5gan: \u00abVarf\u00f6r beh\u00f6vs ClickHouse?\u00bb. Fr\u00e5gan verkar ganska uppenbar, men det finns fler \u00e4n ett svar. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/1a4e14cc041a3c01ad0fd2a305aeeab0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Det f\u00f6rsta svaret handlar om prestanda. ClickHouse \u00e4r mycket snabb. Analys p\u00e5 ClickHouse \u00e4r ocks\u00e5 mycket snabb. Det kan ofta anv\u00e4ndas d\u00e4r n\u00e5got annat fungerar mycket l\u00e5ngsamt eller mycket d\u00e5ligt. <\/li>\n<li>Det andra svaret handlar om kostnad. Och framf\u00f6r allt kostnaden f\u00f6r skalning. Till exempel \u00e4r Vertica en helt utm\u00e4rkt databas. Den fungerar mycket bra om ni har en ganska liten m\u00e4ngd terabyte data. Men n\u00e4r det handlar om hundratals terabyte eller petabyte, blir kostnaden f\u00f6r licens och support en ganska betydande summa. Och det \u00e4r dyrt. Men ClickHouse \u00e4r gratis. <\/li>\n<li>Det tredje svaret \u00e4r driftskostnaden. Det h\u00e4r angreppss\u00e4ttet kommer lite fr\u00e5n en annan sida. RedShift \u00e4r ett utm\u00e4rkt alternativ. Med RedShift kan man snabbt skapa en l\u00f6sning. Det kommer att fungera bra, men varje timme, varje dag och varje m\u00e5nad kommer du att betala ganska mycket till Amazon, eftersom det \u00e4r en mycket dyr tj\u00e4nst. Google BigQuery \u00e4r detsamma. Om n\u00e5gon har anv\u00e4nt det vet man att man kan k\u00f6ra flera f\u00f6rfr\u00e5gningar och pl\u00f6tsligt f\u00e5 en r\u00e4kning p\u00e5 hundratals dollar. <\/li>\n<\/ul>\n<p><\/p>\n<p>I ClickHouse finns dessa problem inte. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/3084a8bd9271f14726d73989946816c5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Var anv\u00e4nds ClickHouse nu? F\u00f6rutom Yandex anv\u00e4nds ClickHouse i en m\u00e4ngd olika f\u00f6retag och verksamheter. <\/p>\n<p><\/p>\n<ul>\n<li>Framf\u00f6r allt anv\u00e4nds det f\u00f6r analys av webbapplikationer, det vill s\u00e4ga det \u00e4r ett anv\u00e4ndningsfall som kommer fr\u00e5n Yandex.<\/li>\n<li>M\u00e5nga AdTech-f\u00f6retag anv\u00e4nder ClickHouse. <\/li>\n<li>M\u00e5nga f\u00f6retag som beh\u00f6ver analysera driftsloggar fr\u00e5n olika k\u00e4llor.<\/li>\n<li>Flera f\u00f6retag anv\u00e4nder ClickHouse f\u00f6r \u00f6vervakning av s\u00e4kerhetsloggar. De laddar upp dem till ClickHouse, g\u00f6r rapporter och f\u00e5r de resultat de beh\u00f6ver.<\/li>\n<li>F\u00f6retag b\u00f6rjar anv\u00e4nda det f\u00f6r finansiell analys, det vill s\u00e4ga gradvis n\u00e4rmar sig stora f\u00f6retag ocks\u00e5 ClickHouse. <\/li>\n<li>CloudFlare. Om n\u00e5gon f\u00f6ljer ClickHouse har man s\u00e4kert h\u00f6rt namnet p\u00e5 detta f\u00f6retag. Det \u00e4r en av de betydande bidragsgivarna i communityn. Och de har en mycket seri\u00f6s ClickHouse-installation. Till exempel har de skapat Kafka Engine f\u00f6r ClickHouse. <\/li>\n<li>Telekomf\u00f6retag har b\u00f6rjat anv\u00e4nda det. Flera f\u00f6retag anv\u00e4nder ClickHouse antingen som proof of concept eller redan i produktion.<\/li>\n<li>Ett f\u00f6retag anv\u00e4nder ClickHouse f\u00f6r att \u00f6vervaka produktionsprocesser. De testar chips, registrerar massor av parametrar, det handlar om cirka 2 000 egenskaper. Och de analyserar vidare \u2013 bra partier eller d\u00e5liga.<\/li>\n<li>Blockkedjeanalys. Det finns ett s\u00e5dant ryskt f\u00f6retag som Bloxy.info. Det handlar om analys av ethereum-n\u00e4tverket. Det gjorde de ocks\u00e5 med ClickHouse. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/8a0c1924a20ed2d15cd0f959e9b3e499.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och storleken spelar ingen roll. M\u00e5nga f\u00f6retag anv\u00e4nder en enda liten server. Och den g\u00f6r det m\u00f6jligt f\u00f6r dem att l\u00f6sa sina problem. Och \u00e4nnu fler f\u00f6retag anv\u00e4nder stora kluster av m\u00e5nga <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/sv\/server\/\"   title=\"servrar\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"1513\">servrar<\/a> eller tiotals servrar. <\/p>\n<p><\/p>\n<p>Och om man ser p\u00e5 registreringarna, s\u00e5:<\/p>\n<p><\/p>\n<ul>\n<li>Yandex: 500+ servrar, de sparar 25 miljarder poster per dag d\u00e4r.<\/li>\n<li>LifeStreet: 60 servrar, cirka 75 miljarder poster per dag. F\u00e4rre servrar, fler poster \u00e4n hos Yandex. <\/li>\n<li>CloudFlare: 36 servrar, de sparar 200 miljarder poster per dag. De har \u00e4nnu f\u00e4rre servrar och \u00e4nnu mer data som de sparar. <\/li>\n<li>Bloomberg: 102 <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/sv\/server\/dts-los-angeles\/\"   title=\"servern\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"3643\">servern<\/a>, cirka en biljon poster per dag. Rekordh\u00e5llare f\u00f6r poster.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/49194030b6586221cb17029889ce33da.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Geografiskt sett \u00e4r det ocks\u00e5 mycket. Denna karta visar heatmap d\u00e4r ClickHouse anv\u00e4nds i v\u00e4rlden. H\u00e4r framh\u00e4vs Ryssland, Kina, Amerika tydligt. Det finns f\u00e5 europeiska l\u00e4nder. Man kan s\u00e4rskilja 4 kluster.<\/p>\n<p><\/p>\n<p>Detta \u00e4r en j\u00e4mf\u00f6rande analys, h\u00e4r beh\u00f6ver man inte leta efter absoluta siffror. Detta \u00e4r en analys av bes\u00f6kare som l\u00e4ser engelskspr\u00e5kigt material p\u00e5 Altinitys webbplats, eftersom det inte finns n\u00e5got ryskspr\u00e5kigt d\u00e4r. Ryssland, Ukraina, Vitryssland, dvs. den rysktalande delen av samh\u00e4llet, \u00e4r de mest talrika anv\u00e4ndarna. D\u00e4refter f\u00f6ljer USA och Kanada. Kina \u00e4r snabbt p\u00e5 v\u00e4g ikapp. F\u00f6r sex m\u00e5nader sedan fanns det n\u00e4stan inget Kina, nu har Kina redan \u00f6vertr\u00e4ffat Europa och forts\u00e4tter v\u00e4xa. Gamla Europa h\u00e4nger inte heller efter, och ledaren f\u00f6r anv\u00e4ndning av ClickHouse \u00e4r, m\u00e4rkligt nog, Frankrike. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/3a8305c51b1bd62f3467b795402df4ed.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Varf\u00f6r ber\u00e4ttar jag allt detta? F\u00f6r att visa att ClickHouse blir en standardl\u00f6sning f\u00f6r analys av stora data och anv\u00e4nds redan p\u00e5 m\u00e5nga st\u00e4llen.<\/strong> Om du anv\u00e4nder det, \u00e4r du p\u00e5 r\u00e4tt trend. Om du \u00e4nnu inte anv\u00e4nder det, beh\u00f6ver du inte vara r\u00e4dd f\u00f6r att du kommer att bli ensam och ingen kommer att hj\u00e4lpa dig, f\u00f6r m\u00e5nga sysslar redan med detta.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/6aa635f3a35034d3af837c78b2c8fe60.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Detta \u00e4r exempel p\u00e5 verklig anv\u00e4ndning av ClickHouse i flera f\u00f6retag. <\/p>\n<p><\/p>\n<ul>\n<li>Det f\u00f6rsta exemplet \u00e4r ett annonsn\u00e4tverk: migration fr\u00e5n Vertica till ClickHouse. Och jag k\u00e4nner flera f\u00f6retag som har \u00f6verg\u00e5tt fr\u00e5n Vertica eller \u00e4r i processen att g\u00f6ra det. <\/li>\n<li>Det andra exemplet \u00e4r ett transaktionellt datalager p\u00e5 ClickHouse. Detta exempel bygger p\u00e5 antipatterns. Allt som inte b\u00f6r g\u00f6ras i ClickHouse enligt utvecklarnas r\u00e5d har h\u00e4r genomf\u00f6rts. Och det g\u00f6rs s\u00e5 effektivt att det fungerar. Och det fungerar mycket b\u00e4ttre \u00e4n en typisk transaktionell l\u00f6sning. <\/li>\n<li>Det tredje exemplet \u00e4r distribuerade ber\u00e4kningar p\u00e5 ClickHouse. Det fanns en fr\u00e5ga om hur ClickHouse kan integreras i Hadoop-ekosystemet. Jag kommer att visa ett exempel p\u00e5 hur ett f\u00f6retag gjorde n\u00e5got som liknar en map-reduce container p\u00e5 ClickHouse, med fokus p\u00e5 lokalisering av data, osv., f\u00f6r att ber\u00e4kna en mycket icke-trivial uppgift. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/e08ab5418500599f08d40324ccdfbcd0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>LifeStreet \u2013 Det \u00e4r ett Ad Tech-f\u00f6retag som har allt teknologin som h\u00f6r samman med ett annonsn\u00e4tverk. <\/li>\n<li>Det sysslar med optimering av annonser, programmatisk budgivning. <\/li>\n<li>M\u00e4ngder av data: omkring 10 miljarder h\u00e4ndelser per dag. H\u00e4ndelserna kan dessutom delas upp i flera delh\u00e4ndelser.<\/li>\n<li>M\u00e5nga kunder av dessa data, och det \u00e4r inte bara m\u00e4nniskor, utan mycket mer \u2013 det handlar om olika algoritmer som hanterar programmatisk budgivning. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/2da99b53eb25f675a2431027f86db934.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>F\u00f6retaget har genomg\u00e5tt en l\u00e5ng och sv\u00e5r v\u00e4g. Jag har ber\u00e4ttat om det p\u00e5 HighLoad. F\u00f6rst flyttade LifeStreet fr\u00e5n MySQL (med ett kort stopp p\u00e5 Oracle) till Vertica. Det g\u00e5r att hitta ber\u00e4ttelsen om detta. <\/p>\n<p><\/p>\n<p>Allt gick v\u00e4ldigt bra, men det blev snabbt tydligt att datam\u00e4ngderna v\u00e4xte och Vertica blev dyrt. D\u00e4rf\u00f6r letades efter olika alternativ. N\u00e5gra av dem listas h\u00e4r. Faktum \u00e4r att vi gjorde proof of concept eller ibland prestandatestning av n\u00e4stan alla databaser som var tillg\u00e4ngliga p\u00e5 marknaden mellan 2013 och 2016 och som ungef\u00e4r passade v\u00e5ra krav p\u00e5 funktionalitet. Jag ber\u00e4ttade ocks\u00e5 om n\u00e5gra av dem p\u00e5 HighLoad.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/4bebd2f43892cbef9249ddded1b8a70a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Uppgiften var att migrera fr\u00e5n Vertica i f\u00f6rsta hand, eftersom datam\u00e4ngderna v\u00e4xte. Och de v\u00e4xte exponentiellt under flera \u00e5r. Sedan n\u00e5dde de en plat\u00e5, men \u00e4nd\u00e5. N\u00e4r vi prognostiserade denna tillv\u00e4xt var det uppenbart att aff\u00e4rens krav p\u00e5 datam\u00e4ngder som beh\u00f6vde analyseras snart skulle handla om petabyte. Och att betala f\u00f6r petabyte \u00e4r redan mycket dyrt, s\u00e5 vi letade efter alternativ f\u00f6r vart man skulle g\u00e5. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/f170a4307168e8560122966eab85c24e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vart skulle man g\u00e5? Under l\u00e5ng tid var det helt oklart vart man skulle ta v\u00e4gen, eftersom det \u00e5 ena sidan finns kommersiella databaser som fungerar ganska bra. Vissa fungerar n\u00e4stan lika bra som Vertica, andra lite s\u00e4mre. Men de \u00e4r alla dyra, och ingenting billigare eller b\u00e4ttre har kunnat hittas. <\/p>\n<p><\/p>\n<p>\u00c5 andra sidan finns det open source-l\u00f6sningar, som inte \u00e4r s\u00e5 m\u00e5nga, med andra ord kan de r\u00e4knas p\u00e5 h\u00e4nderna n\u00e4r det g\u00e4ller analys. De \u00e4r gratis eller billiga, men fungerar l\u00e5ngsamt. Oftast saknar de n\u00f6dv\u00e4ndig och anv\u00e4ndbar funktionalitet.<\/p>\n<p><\/p>\n<p>Det fanns ingenting som kombinerade det bra som finns i kommersiella databaser och allt det gratis som finns i open source \u2014 ingenting fanns. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/abbefbf0d9578b554f81579b87213a50.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ingenting fanns f\u00f6rr\u00e4n pl\u00f6tsligt Yandex, som en trollkarl med en kanin ur hatten, presenterade ClickHouse. Det var en ov\u00e4ntad l\u00f6sning; fortfarande idag st\u00e4lls fr\u00e5gan: \"Varf\u00f6r?\", men \u00e4nd\u00e5. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/c88981aace9d5925396ca5171241b7d2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och redan sommaren 2016 b\u00f6rjade vi titta p\u00e5 vad ClickHouse \u00e4r. Och det visade sig att det ibland kan vara snabbare \u00e4n Vertica. Vi testade olika scenarier med olika fr\u00e5gor. Och om fr\u00e5gan anv\u00e4nde bara en tabell, dvs. utan n\u00e5gra joins, var ClickHouse tv\u00e5 g\u00e5nger snabbare \u00e4n Vertica. <\/p>\n<p><\/p>\n<p>Jag tog mig friheten att titta p\u00e5 mer tester fr\u00e5n Yandex h\u00e4rom dagen. D\u00e4r \u00e4r det samma sak: ClickHouse \u00e4r tv\u00e5 g\u00e5nger snabbare \u00e4n Vertica, d\u00e4rf\u00f6r pratar de ofta om det. <\/p>\n<p><\/p>\n<p>Men om fr\u00e5gorna inneh\u00e5ller joins, s\u00e5 blir det inte s\u00e5 entydigt. Och ClickHouse kan vara l\u00e5ngsammare \u00e4n Vertica med tv\u00e5 g\u00e5nger. Men om man g\u00f6r sm\u00e5 justeringar av fr\u00e5gan och skriver om den, s\u00e5 blir det ungef\u00e4r lika. Inte d\u00e5ligt. Och gratis. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/188bf56b72123175a18d2cb97d989a47.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S\u00e5 n\u00e4r vi fick testresultaten och s\u00e5g p\u00e5 detta fr\u00e5n olika vinklar, \u00e5kte LifeStreet \u00f6ver till ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/1183b9b7681916686c52786fc95ccb45.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Detta \u00e4r 2016, p\u00e5minner jag er. Det var som i en anekdot om m\u00f6ss som gr\u00e4t och stack sig, men fortsatte \u00e4ta kaktus. Det har beskrivits utf\u00f6rligt, det finns video om det osv. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/993052ed83dc295c3777e614c7703456.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jag kommer d\u00e4rf\u00f6r inte att g\u00e5 in detaljerat p\u00e5 detta, jag kommer bara att ber\u00e4tta om resultaten och n\u00e5gra intressanta saker som jag inte ber\u00e4ttade d\u00e5. <\/p>\n<p><\/p>\n<p>Resultaten \u00e4r:<\/p>\n<p><\/p>\n<ul>\n<li>Lyckad migrering och systemet har redan varit i produktion i mer \u00e4n ett \u00e5r. <\/li>\n<li>Prestanda och flexibilitet har \u00f6kat. Fr\u00e5n 10 miljarder poster som vi kunde lagra p\u00e5 en dag, och det under en kort tid, lagrar LifeStreet nu 75 miljarder poster per dag och kan g\u00f6ra det i tre m\u00e5nader eller mer. Om man r\u00e4knar p\u00e5 max, kan det sparas upp till en miljon h\u00e4ndelser per sekund. Mer \u00e4n en miljon SQL-fr\u00e5gor per dag kommer in i detta system, huvudsakligen fr\u00e5n olika robotar. <\/li>\n<li>Trots att fler servrar anv\u00e4nds f\u00f6r ClickHouse \u00e4n f\u00f6r Vertica, har vi sparat pengar p\u00e5 h\u00e5rdvara eftersom Vertica anv\u00e4nde ganska dyra SAS-diskar. I ClickHouse anv\u00e4ndes SATA. Och varf\u00f6r? F\u00f6r att i Vertica \u00e4r insert synkront. Och synkronisering kr\u00e4ver att diskarna inte bromsar upp f\u00f6r mycket, och att n\u00e4tverket inte heller bromsar, dvs. det \u00e4r en ganska kostsam operation. Men i ClickHouse \u00e4r insert asynkront. Dessutom kan man alltid skriva allt lokalt, inga extra kostnader f\u00f6r detta, s\u00e5 att data i ClickHouse kan infogas mycket snabbare \u00e4n i Vertica \u00e4ven p\u00e5 inte de snabbaste diskarna. Och f\u00f6r l\u00e4sning \u00e4r det ungef\u00e4r lika. L\u00e4sningen p\u00e5 SATA, om de sitter i RAID, \u00e4r ganska snabb. <\/li>\n<li>Ingen licensbegr\u00e4nsningar, det vill s\u00e4ga 3 petabyte data p\u00e5 60 servrar (20 servrar utg\u00f6r en replik) och 6 triljoner poster i fakta och aggregat. Inget liknande kunde till\u00e5tas p\u00e5 Vertica. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/f461cdc12917ee655655dd7eb9c32bb2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nu g\u00e5r jag \u00f6ver till praktiska aspekter i detta exempel.<\/p>\n<p><\/p>\n<ul>\n<li>F\u00f6rsta \u00e4r en effektiv schema. Schema p\u00e5verkar mycket. <\/li>\n<li>Andra \u00e4r generering av effektiv SQL.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/e7dc2a217e77c8794ff6e8a754e78c85.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Typisk OLAP-fr\u00e5ga \u00e4r en select. Vissa kolumner g\u00e5r i group by, andra kolumner g\u00e5r i aggregatfunktioner. Det finns where, som kan betraktas som ett snitt av kuben. Hela group by kan ses som en projektion. D\u00e4rf\u00f6r kallas detta multidimensionell dataanalys. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/a03a2d7fd28905ae83183346f0c673e2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och ofta modelleras detta som en stj\u00e4rn-schema, d\u00e4r det finns en central fakta och egenskaper f\u00f6r detta fakta p\u00e5 sidorna, utefter str\u00e5lar. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/d9671af4b39cc83e1ae49e6fd75d0e02.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och ur ett fysiskt designsynpunkt, hur detta l\u00e4ggs p\u00e5 tabeller, s\u00e5 g\u00f6rs vanligtvis en normaliserad representation. Du kan denormalisera, men det \u00e4r kostsamt i disk och inte s\u00e4rskilt effektivt f\u00f6r fr\u00e5gor. D\u00e4rf\u00f6r g\u00f6rs vanligtvis en normaliserad representation, det vill s\u00e4ga en faktatabell och m\u00e5nga m\u00e5ngdimensionella tabeller. <\/p>\n<p><\/p>\n<p>Men i ClickHouse fungerar detta d\u00e5ligt. Det finns tv\u00e5 sk\u00e4l: <\/p>\n<p><\/p>\n<ul>\n<li>F\u00f6rsta \u00e4r att ClickHouse inte har s\u00e4rskilt bra joins, det vill s\u00e4ga joins finns, men de \u00e4r d\u00e5liga. Fortfarande d\u00e5liga. <\/li>\n<li>Andra \u00e4r att tabellerna inte uppdateras. Vanligtvis i dessa tabeller som omger stj\u00e4rn-schema, beh\u00f6ver man \u00e4ndra n\u00e5got. Till exempel, kundens namn, f\u00f6retagets namn och s\u00e5 vidare. Och detta fungerar inte. <\/li>\n<\/ul>\n<p><\/p>\n<p>Och det finns en l\u00f6sning f\u00f6r detta i ClickHouse. Faktiskt tv\u00e5: <\/p>\n<p><\/p>\n<ul>\n<li>Den f\u00f6rsta \u00e4r att anv\u00e4nda ordb\u00f6cker. Externa ordb\u00f6cker \u00e4r det som hj\u00e4lper till att l\u00f6sa problemet med stj\u00e4rn-schema till 99%, med uppdateringar och annat. <\/li>\n<li>Den andra \u00e4r att anv\u00e4nda arrayer. Arrayer hj\u00e4lper ocks\u00e5 till att slippa joins och problem med normalisering. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/775972cc412651600799173407384492.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Inga joins beh\u00f6vs. <\/li>\n<li>Uppdateringsbara. Fr\u00e5n och med mars 2018 introducerades en icke-dokumenterad funktion (du hittar inte detta i dokumentationen) att delvis uppdatera ordb\u00f6cker, det vill s\u00e4ga de poster som har \u00e4ndrats. Praktiskt sett fungerar det som en tabell.<\/li>\n<li>Alltid i minnet, s\u00e5 joins med ordb\u00f6cker fungerar snabbare \u00e4n om det vore en tabell som ligger p\u00e5 disken och som kanske inte ens \u00e4r i cache, sannolikt inte. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/f73176a650b6d885011e3265c2af2fc3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Inga joins beh\u00f6vs heller.<\/li>\n<li>Detta \u00e4r en kompakt representation 1 till m\u00e5nga. <\/li>\n<li>Och enligt min \u00e5sikt, \u00e4r arrayer skapade f\u00f6r n\u00f6rdar. Det handlar om lambda-funktioner och mer. <\/li>\n<\/ul>\n<p><\/p>\n<p>Det h\u00e4r \u00e4r inget tomt prat. Det \u00e4r en mycket kraftfull funktionalitet som g\u00f6r att man kan g\u00f6ra m\u00e5nga saker p\u00e5 ett mycket enkelt och elegant s\u00e4tt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/5d813952ca8f3da7a74c6f2a15d80a9b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Typiska exempel som hj\u00e4lper till att hantera arrayer. Dessa exempel \u00e4r enkla och ganska tydliga:<\/p>\n<p><\/p>\n<ul>\n<li>S\u00f6kning efter taggar. Om du har hashtags d\u00e4r och vill hitta vissa poster med en hashtag. <\/li>\n<li>S\u00f6kning efter key-value-par. Det finns ocks\u00e5 vissa attribut med ett v\u00e4rde. <\/li>\n<li>Lagring av listor med nycklar som du beh\u00f6ver \u00f6vers\u00e4tta till n\u00e5got annat.<\/li>\n<\/ul>\n<p><\/p>\n<p>Alla dessa uppgifter kan l\u00f6sas utan arrayer. Taggar kan l\u00e4ggas i en str\u00e4ng och v\u00e4ljas med ett regulj\u00e4rt uttryck eller i en separat tabell, men d\u00e5 m\u00e5ste man g\u00f6ra joins.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/dbbf90eee098c4564206532f24156823.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I ClickHouse beh\u00f6ver man inte g\u00f6ra n\u00e5got alls, det r\u00e4cker med att beskriva en array string f\u00f6r hashtags eller skapa en inb\u00e4ddad struktur f\u00f6r system som key-value.<\/p>\n<p><\/p>\n<p>Inb\u00e4ddad struktur \u2013 kanske inte det mest lyckade namnet. Det \u00e4r tv\u00e5 arrayer med en gemensam del i namnet och vissa relaterade egenskaper. <\/p>\n<p><\/p>\n<p>Och att s\u00f6ka efter taggen \u00e4r mycket enkelt. Det finns en funktion <code>has<\/code>, som kontrollerar om det finns ett element i arrayen. Allt, vi har hittat alla poster som r\u00f6r v\u00e5r konferens.<\/p>\n<p><\/p>\n<p>S\u00f6kning efter subid \u00e4r lite mer komplicerad. F\u00f6rst m\u00e5ste vi hitta indexet f\u00f6r nyckeln, och sedan ta elementet med det indexet och kontrollera att v\u00e4rdet \u00e4r det vi beh\u00f6ver. Men \u00e4nd\u00e5 mycket enkelt och kompakt.<\/p>\n<p><\/p>\n<p>Ett regulj\u00e4rt uttryck som du skulle vilja skriva om du h\u00f6ll allting i en str\u00e4ng skulle f\u00f6r det f\u00f6rsta vara klumpigt. F\u00f6r det andra skulle det ta mycket l\u00e4ngre tid \u00e4n tv\u00e5 arrayer. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/17664c3121b2b0d33188adbfaa653d4e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ett annat exempel. Du har en array d\u00e4r du lagrar ID. Och du kan \u00f6vers\u00e4tta dem till namn. Funktionen <code>arrayMap<\/code>. Det \u00e4r en typisk lambda-funktion. Du skickar lambda-uttryck till den. Och den h\u00e4mtar namnv\u00e4rdet f\u00f6r varje ID fr\u00e5n ordboken.<\/p>\n<p><\/p>\n<p>P\u00e5 liknande s\u00e4tt kan man g\u00f6ra en s\u00f6kning. En predikatfunktion skickas, som kontrollerar vilken \u00f6verenskommelse elementen har. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/146917b71a35d38a550cd9accf6ab2f7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dessa saker f\u00f6renklar schemat kraftigt och l\u00f6ser m\u00e5nga problem. <\/p>\n<p><\/p>\n<p>Men n\u00e4sta problem som vi st\u00f6tte p\u00e5 och som jag vill n\u00e4mna \u00e4r effektiva f\u00f6rfr\u00e5gningar. <\/p>\n<p><\/p>\n<ul>\n<li>I ClickHouse finns det ingen f\u00f6rfr\u00e5gningsplanerare. \u00d6verhuvudtaget ingen. <\/li>\n<li>Men \u00e4nd\u00e5 m\u00e5ste man planera komplexa f\u00f6rfr\u00e5gningar. I vilka fall? <\/li>\n<li>Om det finns flera joinkommandon i en f\u00f6rfr\u00e5gan som du kapslar in i delfr\u00e5gor, \u00e4r ordningen f\u00f6r hur de utf\u00f6rs viktig. <\/li>\n<li>F\u00f6r det andra, om f\u00f6rfr\u00e5gan \u00e4r distribuerad. F\u00f6r i en distribuerad f\u00f6rfr\u00e5gan utf\u00f6rs endast den innersta delfr\u00e5gan distribuerat, medan allt annat skickas till en server som du \u00e4r ansluten till och utf\u00f6rs d\u00e4r. S\u00e5 om du har distribuerade f\u00f6rfr\u00e5gningar med m\u00e5nga join, \u00e4r det viktigt att v\u00e4lja r\u00e4tt ordning. <\/li>\n<\/ul>\n<p><\/p>\n<p>Och \u00e4ven i enklare fall kan det ibland vara bra att g\u00f6ra schemal\u00e4ggarens arbete och skriva om f\u00f6rfr\u00e5gningen lite. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/217d422b429e8b4bc13abbf0efdf6be1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>H\u00e4r \u00e4r ett exempel. P\u00e5 v\u00e4nster sida en f\u00f6rfr\u00e5gan som visar de fem b\u00e4sta l\u00e4nderna. Den k\u00f6rs p\u00e5 2,5 sekunder, om jag minns r\u00e4tt. P\u00e5 h\u00f6ger sida samma f\u00f6rfr\u00e5gan, men lite omskriven. Ist\u00e4llet f\u00f6r att gruppera p\u00e5 str\u00e4ngar, grupperar vi p\u00e5 nycklar (int). Och det g\u00e5r snabbare. Sedan kopplade vi en ordbok till resultatet. Ist\u00e4llet f\u00f6r 2,5 sekunder k\u00f6rs f\u00f6rfr\u00e5gan p\u00e5 1,5 sekunder. Det \u00e4r bra. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/f19fb7d7f0397a3b38b2a3bd179c156b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ett liknande exempel med omformulering av filter. H\u00e4r \u00e4r en f\u00f6rfr\u00e5gan om Ryssland. Den k\u00f6rs p\u00e5 5 sekunder. Om vi skriver om den s\u00e5 att vi j\u00e4mf\u00f6r siffror med en upps\u00e4ttning av de nycklar som h\u00f6r till Ryssland, kommer det att bli mycket snabbare. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/0c1dd1f317133d1d106ffef85f337079.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det finns m\u00e5nga s\u00e5dana knep. Och de kan avsev\u00e4rt snabba upp f\u00f6rfr\u00e5gningar som du tror redan fungerar snabbt, eller tv\u00e4rtom, som fungerar l\u00e5ngsamt. De kan g\u00f6ras \u00e4nnu snabbare.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/25b132790b03f239e38237af5e92ab63.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Maximalt med arbete i distribuerat l\u00e4ge. <\/li>\n<li>Sortering efter de minsta typerna, som jag gjorde med ints. <\/li>\n<li>Om det finns n\u00e5gra joins, ordb\u00f6cker, \u00e4r det b\u00e4ttre att utf\u00f6ra dem i sista hand, n\u00e4r du har data som \u00e5tminstone delvis \u00e4r grupperad, s\u00e5 att joinoperationen eller anropet till ordboken kommer att kr\u00e4vas f\u00e4rre g\u00e5nger och d\u00e4rmed g\u00e5 snabbare. <\/li>\n<li>Ers\u00e4ttning av filter. <\/li>\n<\/ul>\n<p><\/p>\n<p>Det finns \u00e4ven andra tekniker, inte bara de jag demonstrerade. Och alla dessa kan ibland avsev\u00e4rt snabba upp exekveringen av f\u00f6rfr\u00e5gningar.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/175832796bee525909d8875bd723a881.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi g\u00e5r vidare till n\u00e4sta exempel. F\u00f6retag X fr\u00e5n USA. Vad g\u00f6r de? <\/p>\n<p><\/p>\n<p>Det fanns en uppgift: <\/p>\n<p><\/p>\n<ul>\n<li>Offline-l\u00e4nkning av reklamtransaktioner. <\/li>\n<li>Modellering av olika l\u00e4nkningar. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/0136b71a1205512d86f13e86761146f4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vad best\u00e5r scenariot av?<\/p>\n<p><\/p>\n<p>En vanlig bes\u00f6kare g\u00e5r in p\u00e5 webbplatsen, till exempel 20 g\u00e5nger i m\u00e5naden, fr\u00e5n olika annonser eller bara ibland utan annonser, eftersom de kommer ih\u00e5g sidan. De tittar p\u00e5 olika produkter, l\u00e4gger dem i kundvagnen och tar sedan bort dem. Och till slut k\u00f6per de n\u00e5got. <\/p>\n<p><\/p>\n<p>Rimliga fr\u00e5gor: 'Vem ska betala f\u00f6r annonseringen, om det beh\u00f6vs?' och 'Vilken annons p\u00e5verkade dem, om den gjorde det?'. Det vill s\u00e4ga, varf\u00f6r k\u00f6pte de och hur g\u00f6r man f\u00f6r att m\u00e4nniskor som liknar denna person ocks\u00e5 skall k\u00f6pa?<\/p>\n<p><\/p>\n<p>F\u00f6r att l\u00f6sa denna uppgift m\u00e5ste man koppla samman h\u00e4ndelser som intr\u00e4ffar p\u00e5 webbplatsen p\u00e5 r\u00e4tt s\u00e4tt, det vill s\u00e4ga bygga en relation mellan dem. Sedan m\u00e5ste de skickas f\u00f6r analys till DWH. Och p\u00e5 grundval av denna analys bygga modeller f\u00f6r vem och vilken annons som ska visas.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/e53ec81ce89150697d0eca4d72886638.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En reklamtransaktion \u00e4r en upps\u00e4ttning relaterade h\u00e4ndelser f\u00f6r en anv\u00e4ndare som b\u00f6rjar med visning av en annons, sedan sker n\u00e5got, och eventuellt ett k\u00f6p, och sedan kan det bli fler k\u00f6p. Till exempel, om det handlar om en mobilapplikation eller ett mobilspel, s\u00e5 brukar installationen av appen ske gratis, men om det g\u00f6rs n\u00e5got mer d\u00e4r, kan det kr\u00e4va pengar. Ju mer en person spenderar i appen, desto mer v\u00e4rdefull \u00e4r de. Men f\u00f6r detta m\u00e5ste allt kopplas samman. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/a2213613f1ef660409124ef8bcdd4fe3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det finns m\u00e5nga modeller f\u00f6r att koppla samman. <\/p>\n<p><\/p>\n<p>De mest popul\u00e4ra \u00e4r:<\/p>\n<p><\/p>\n<ul>\n<li>Last Interaction, d\u00e4r interaction \u00e4r antingen ett klick eller en visning.<\/li>\n<li>First Interaction, det vill s\u00e4ga det f\u00f6rsta som ledde personen till webbplatsen.<\/li>\n<li>Linj\u00e4r kombination \u2013 alla f\u00e5r lika. <\/li>\n<li>Avtagande.<\/li>\n<li>Och andra. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/9523307d557e094d981da5b525ed0b59.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och hur fungerade allt detta ursprungligen? Det fanns Runtime och Cassandra. Cassandra anv\u00e4ndes som transaktionslagring, det vill s\u00e4ga den lagrade alla relaterade transaktioner. N\u00e4r en h\u00e4ndelse kom till Runtime, till exempel visning av en sida eller n\u00e5got annat, gjordes en f\u00f6rfr\u00e5gan till Cassandra \u2013 finns denna person eller inte. Sedan h\u00e4mtades transaktionerna som r\u00f6r dem. Och kopplingen gjordes.<\/p>\n<p><\/p>\n<p>Och om man hade tur att f\u00f6rfr\u00e5gan inneh\u00f6ll transaction id, var det l\u00e4tt. Men vanligtvis har man inte tur. D\u00e4rf\u00f6r beh\u00f6vde man leta efter den senaste transaktionen eller transaktionen med den senaste klicket och s\u00e5 vidare. <\/p>\n<p><\/p>\n<p>Och allt fungerade v\u00e4ldigt bra s\u00e5 l\u00e4nge kopplingen var till den senaste klickningen. F\u00f6r det finns det, s\u00e4g, 10 miljoner klick om dagen, 300 miljoner per m\u00e5nad, om man s\u00e4tter f\u00f6nstret till en m\u00e5nad. Och eftersom det h\u00e4r m\u00e5ste finnas helt i minnet i Cassandra f\u00f6r att det ska fungera snabbt, eftersom det kr\u00e4vs en snabb Runtime-respons, beh\u00f6vdes ungef\u00e4r 10-15 servrar. <\/p>\n<p><\/p>\n<p>Men n\u00e4r man ville koppla transaktionen till visningen s\u00e5 blev det genast inte lika roligt. Och varf\u00f6r? Det \u00e4r tydligt att man beh\u00f6ver lagra 30 g\u00e5nger fler h\u00e4ndelser. Och d\u00e4rmed beh\u00f6vs 30 g\u00e5nger fler servrar. S\u00e5 det blir n\u00e5got astronomiskt siffror. Att ha upp till 500 servrar f\u00f6r att g\u00f6ra kopplingen, men att det faktiskt \u00e4r betydligt f\u00e4rre servrar under Runtime, det \u00e4r n\u00e5gon slags felaktig siffra. S\u00e5 man b\u00f6rjade t\u00e4nka p\u00e5 vad man skulle g\u00f6ra. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/7af35f1ade680232cc83a6887891bc5c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och man kom till ClickHouse. Men hur g\u00f6r man det p\u00e5 ClickHouse? Vid f\u00f6rsta anblick verkar det vara en upps\u00e4ttning anti-m\u00f6nster. <\/p>\n<p><\/p>\n<ul>\n<li>Transaktionen v\u00e4xer, vi kopplar till den fler och fler h\u00e4ndelser, dvs. den \u00e4r muterbar, och ClickHouse fungerar inte s\u00e4rskilt bra med muterbara objekt. <\/li>\n<li>N\u00e4r en bes\u00f6kare kommer till oss, m\u00e5ste vi h\u00e4mta dennes transaktioner med nyckeln, baserat p\u00e5 dennes bes\u00f6ks-ID. Det \u00e4r ocks\u00e5 en punktfr\u00e5ga, vilket inte g\u00f6rs s\u00e5 i ClickHouse. Normalt i ClickHouse g\u00f6rs stora ...scanningar, men h\u00e4r m\u00e5ste vi h\u00e4mta flera poster. Det \u00e4r ocks\u00e5 ett anti-m\u00f6nster. <\/li>\n<li>Dessutom var transaktionen i json, men man ville inte skriva om den, s\u00e5 man ville lagra json ostrukturerat, och om det beh\u00f6vdes, extrahera n\u00e5got fr\u00e5n den. Och det \u00e4r ocks\u00e5 ett anti-m\u00f6nster. <\/li>\n<\/ul>\n<p><\/p>\n<p>Dvs. en upps\u00e4ttning anti-m\u00f6nster. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/2473129a5880ee3172b8ab7bf4afc376.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Men trots allt lyckades man skapa ett system som fungerade mycket bra. <\/p>\n<p><\/p>\n<p>Vad gjordes? ClickHouse inf\u00f6rdes, dit loggar samlades i poster. En attributtj\u00e4nst inf\u00f6rdes som h\u00e4mtade loggar fr\u00e5n ClickHouse. Efter detta h\u00e4mtade man transaktioner f\u00f6r varje post baserat p\u00e5 bes\u00f6ks-ID, som kanske \u00e4nnu inte var f\u00e4rdigbehandlade, plus snapshotar, dvs. redan kopplade transaktioner, det vill s\u00e4ga resultatet av tidigare arbete. Fr\u00e5n dem byggde man logik, valde r\u00e4tt transaktion, kopplade nya h\u00e4ndelser. Loggade p\u00e5 nytt i loggen. Loggen skickades tillbaka till ClickHouse, dvs. det \u00e4r ett st\u00e4ndigt cykliskt system. Dessutom skickades den till DWH f\u00f6r analys. <\/p>\n<p><\/p>\n<p>Det fungerade inte s\u00e5 bra i den formen. F\u00f6r att g\u00f6ra det enklare f\u00f6r ClickHouse n\u00e4r det kom f\u00f6rfr\u00e5gningar baserade p\u00e5 visit-id, grupperade vi dessa f\u00f6rfr\u00e5gningar i block om 1 000-2 000 visit-id och h\u00e4mtade alla transaktioner f\u00f6r 1 000-2 000 personer. D\u00e5 fungerade allt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/d920ce231e6e4b5fd5b27ab28f848aed.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Om man tittar inuti ClickHouse finns det totalt 3 huvudtabeller som hanterar allt detta. <\/p>\n<p><\/p>\n<p>Den f\u00f6rsta tabellen dit loggarna laddas, och loggarna laddas n\u00e4stan utan bearbetning.<\/p>\n<p><\/p>\n<p>Den andra tabellen. Genom en materialiserad vy extraherades de loggar som \u00e4nnu inte fick tilldelade h\u00e4ndelser, dvs. osammanh\u00e4ngande. Och genom den materialiserade vyn extraherades transaktionerna f\u00f6r att bygga en snapshot. Det vill s\u00e4ga, en speciell materialiserad vy byggde snapshoten, som var det senaste ackumulerade tillst\u00e5ndet av transaktionen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/12b0adb691f483923a6c35bb6e4a5017.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>H\u00e4r \u00e4r texten skriven p\u00e5 SQL. Jag skulle vilja kommentera n\u00e5gra viktiga punkter i den. <\/p>\n<p><\/p>\n<p>Den f\u00f6rsta viktiga punkten \u00e4r m\u00f6jligheten i ClickHouse att extrahera kolumner, f\u00e4lt fr\u00e5n json. Det finns n\u00e5gra metoder i ClickHouse f\u00f6r att arbeta med json. De \u00e4r mycket, mycket primitiva. <\/p>\n<p><\/p>\n<p>visitParamExtractInt till\u00e5ter att extrahera attribut fr\u00e5n json, dvs. f\u00f6rsta tr\u00e4ffen aktiveras. Och p\u00e5 s\u00e5 s\u00e4tt kan man h\u00e4mta transaktions-id eller visit-id. Det \u00e4r en. <\/p>\n<p><\/p>\n<p>Det andra \u2013 h\u00e4r anv\u00e4nds ett smart materialiserat f\u00e4lt. Vad inneb\u00e4r detta? Det betyder att du inte kan infoga det i tabellen, dvs. det infogas inte, det ber\u00e4knas och lagras vid infogningen. Vid infogningen g\u00f6r ClickHouse arbetet \u00e5t dig. Och det som senare beh\u00f6vs extraheras fr\u00e5n json.<\/p>\n<p><\/p>\n<p>I det h\u00e4r fallet \u00e4r den materialiserade vyn f\u00f6r obearbetade rader. Den anv\u00e4nder f\u00f6rsta tabellen med n\u00e4stan r\u00e5a loggar. Vad g\u00f6r den? F\u00f6r det f\u00f6rsta \u00e4ndrar den sorteringen, dvs. sorteringen sker nu baserat p\u00e5 visit-id, eftersom vi snabbt beh\u00f6ver h\u00e4mta just den specifika personens transaktion. <\/p>\n<p><\/p>\n<p>Den andra viktiga punkten \u00e4r index_granularity. Om du har sett MergeTree \u00e4r index_granularity normalt st\u00e4llt p\u00e5 8 192 som standard. Vad inneb\u00e4r detta? Det \u00e4r en parameter f\u00f6r indexets sparsitet. I ClickHouse \u00e4r indexet sparsam, det indexerar aldrig varje post. Det g\u00f6r detta var 8 192. Detta \u00e4r bra n\u00e4r mycket data ska r\u00e4knas, men d\u00e5ligt n\u00e4r det \u00e4r lite, eftersom overheaden blir stor. Genom att minska index_granularity minskar vi overheaden. Det g\u00e5r inte att minska till ett eftersom minnet kan vara otillr\u00e4ckligt. Indexet lagras alltid i minnet. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/5fe303061977cad64e6c0333b125d595.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Snapshotet anv\u00e4nder n\u00e5gra intressanta funktioner fr\u00e5n ClickHouse.<\/p>\n<p><\/p>\n<p>F\u00f6r det f\u00f6rsta, AggregatingMergeTree. I AggregatingMergeTree lagras argMax, dvs. det \u00e4r tillst\u00e5ndet f\u00f6r transaktionen som motsvarar den senaste tidsst\u00e4mpeln. Nya transaktioner genereras kontinuerligt f\u00f6r varje bes\u00f6kare. I det senaste tillst\u00e5ndet av den h\u00e4r transaktionen har vi lagt till en h\u00e4ndelse och f\u00e5tt ett nytt tillst\u00e5nd. Det hamnade \u00e5ter i ClickHouse. Genom argMax i denna materialiserade vy kan vi alltid f\u00e5 den aktuella statusen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/d1b87301ab5206a36bf035679f79d35a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Bindning 'frikopplad' fr\u00e5n Runtime. <\/li>\n<li>Upp till 3 miljarder transaktioner lagras och bearbetas varje m\u00e5nad. Det \u00e4r avsev\u00e4rt mer \u00e4n vad som var fallet med Cassandra, dvs. i ett typiskt transaktionssystem. <\/li>\n<li>En kluster av 2x5 ClickHouse-servrar. 5 servrar och varje server har en replika. Det \u00e4r till och med f\u00e4rre \u00e4n vad som kr\u00e4vdes i Cassandra f\u00f6r att g\u00f6ra click based atribuering, h\u00e4r har vi impression based. Det vill s\u00e4ga, ist\u00e4llet f\u00f6r att \u00f6ka antalet servrar 30 g\u00e5nger, har de lyckats minska det. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/583779fe9e133df519411e2256401eb3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och det sista exemplet \u2013 ett finansf\u00f6retag Y som analyserade korrelationer i aktiekurser. <\/p>\n<p><\/p>\n<p>Och uppgiften var f\u00f6ljande:<\/p>\n<p><\/p>\n<ul>\n<li>Det finns ungef\u00e4r 5 000 aktier. <\/li>\n<li>Kursen \u00e4r k\u00e4nd var 100:e millisekund. <\/li>\n<li>Data har samlats in under 10 \u00e5r. Tydligen har en del f\u00f6retag mer data, andra mindre. <\/li>\n<li>Totalt ungef\u00e4r 100 miljarder rader. <\/li>\n<\/ul>\n<p><\/p>\n<p>Och man beh\u00f6vde ber\u00e4kna korrelationen i f\u00f6r\u00e4ndringarna. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/b02051e6cadec8c51e7f6e351ef903f9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>H\u00e4r \u00e4r tv\u00e5 aktier och deras kurser. Om den ena g\u00e5r upp och den andra g\u00e5r upp, s\u00e5 \u00e4r det en positiv korrelation, dvs. n\u00e4r den ena v\u00e4xer, v\u00e4xer den andra. Om den ena g\u00e5r upp, som i slutet av grafen, och den andra g\u00e5r ner, s\u00e5 \u00e4r det en negativ korrelation, dvs. n\u00e4r den ena v\u00e4xer, faller den andra. <\/p>\n<p><\/p>\n<p>Genom att analysera dessa \u00f6msesidiga f\u00f6r\u00e4ndringar kan man g\u00f6ra f\u00f6ruts\u00e4gelser p\u00e5 den finansiella marknaden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/31329cf7523eef6a167632d281a634ce.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Men uppgiften \u00e4r sv\u00e5r. Vad g\u00f6rs f\u00f6r detta? Vi har 100 miljarder poster som inneh\u00e5ller: tid, aktie och pris. F\u00f6rst m\u00e5ste vi ber\u00e4kna 100 miljarder g\u00e5nger runningDifference fr\u00e5n algoritmen f\u00f6r priset. RunningDifference \u00e4r en funktion i ClickHouse som ber\u00e4knar skillnaden mellan tv\u00e5 rader sekventiellt. <\/p>\n<p><\/p>\n<p>D\u00e4refter m\u00e5ste vi ber\u00e4kna korrelationen, och korrelationen m\u00e5ste ber\u00e4knas f\u00f6r varje par. F\u00f6r 5 000 aktier \u00e4r paren 12,5 miljoner. Och det \u00e4r mycket, dvs. 12,5 g\u00e5nger m\u00e5ste vi ber\u00e4kna en s\u00e5dan korrelationsfunktion. <\/p>\n<p><\/p>\n<p>Och om n\u00e5gon har gl\u00f6mt, s\u00e5 \u00e4r \u035ex och \u035ey \u2013 det matematiska f\u00f6rv\u00e4ntade v\u00e4rdet enligt urvalet. Det inneb\u00e4r att man inte bara m\u00e5ste ber\u00e4kna r\u00f6tter och summor, utan ocks\u00e5 ber\u00e4kna ytterligare summor inom dessa summor. En massa ber\u00e4kningar m\u00e5ste g\u00f6ras 12,5 miljoner g\u00e5nger, och dessutom m\u00e5ste vi gruppera efter timmar. Vi har ocks\u00e5 m\u00e5nga timmar. Och allt m\u00e5ste g\u00f6ras p\u00e5 60 sekunder. Det \u00e4r ett sk\u00e4mt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/567a07f586a824c91671820fe21ec305.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi m\u00e5ste verkligen hinna med p\u00e5 n\u00e5got s\u00e4tt, eftersom allt detta fungerade v\u00e4ldigt, v\u00e4ldigt l\u00e5ngsamt, innan ClickHouse kom.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/3eca1af4c3f25ff4b23fce9b84e16659.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De f\u00f6rs\u00f6kte ber\u00e4kna detta p\u00e5 Hadoop, p\u00e5 Spark, p\u00e5 Greenplum. Och allt var antingen mycket l\u00e5ngsamt eller dyrt. Det vill s\u00e4ga, det gick att ber\u00e4kna, men det blev senare dyrt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/37608c7e87ddb9a7d54854643044c369.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och sedan kom ClickHouse och allt blev mycket b\u00e4ttre. <\/p>\n<p><\/p>\n<p>Jag p\u00e5minner om att v\u00e5rt problem handlar om datalokalitet, s\u00e5 korrelationerna kan inte lokaliseras. Vi kan inte samla en del av datan p\u00e5 en server, en annan del p\u00e5 en annan och ber\u00e4kna, vi m\u00e5ste ha all data \u00f6verallt. <\/p>\n<p><\/p>\n<p>Vad gjorde de? Ursprungligen var datan lokaliserad. P\u00e5 varje server lagrades data f\u00f6r priss\u00e4ttning av ett visst aktieutbud. Och de \u00f6verlappar inte. S\u00e5 man kan parallellt och oberoende ber\u00e4kna logReturn, allt detta sker parallellt och distribuerat. <\/p>\n<p><\/p>\n<p>D\u00e4refter beslutade man att minska datam\u00e4ngden utan att f\u00f6rlora uttrycksfullheten. Minska det med hj\u00e4lp av arrayer, det vill s\u00e4ga att f\u00f6r varje tidssegment skapa en array av aktier och en array av priser. P\u00e5 s\u00e5 s\u00e4tt tar datan mycket mindre utrymme. Och det \u00e4r mer bekv\u00e4mt att arbeta med dem. Det \u00e4r n\u00e4stan parallella operationer, det vill s\u00e4ga vi ber\u00e4knar delvis parallellt och skriver sedan till servern. <\/p>\n<p><\/p>\n<p>Efter detta kan det replikeras. Bokstaven \u00abr\u00bb betyder att vi har replikerat dessa data. Det vill s\u00e4ga, vi har samma data p\u00e5 alla tre servrar \u2013 dessa arrayer. <\/p>\n<p><\/p>\n<p>Och sedan med ett speciellt skript fr\u00e5n detta urval av 12,5 miljoner korrelationer som m\u00e5ste ber\u00e4knas, kan man g\u00f6ra paket. Det vill s\u00e4ga, 2 500 uppgifter med 5 000 par korrelationer. Och denna uppgift ber\u00e4knas p\u00e5 en specifik ClickHouse-server. Den har all data, eftersom datan \u00e4r identisk och den kan ber\u00e4kna dem sekventiellt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/587c6d587a48f2407dd2687f5423d44a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c4nnu en g\u00e5ng, hur det ser ut. F\u00f6rst har vi alla data i f\u00f6ljande struktur: tid, aktier, pris. Sedan ber\u00e4knade vi logReturn, det vill s\u00e4ga data i samma struktur, men ist\u00e4llet f\u00f6r pris har vi nu logReturn. D\u00e4refter omarbetade vi dem, det vill s\u00e4ga vi fick tid och groupArray f\u00f6r aktier och priser. Vi replikerade dem. Och efter detta genererade vi en m\u00e4ngd uppgifter och matade ClickHouse s\u00e5 att den kunde r\u00e4kna dem. Och det fungerar. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/434e7385aebcffcc03d1bd1a2020c8bf.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u00e5 proof of concept-uppgiften var det en deluppgift, det vill s\u00e4ga vi tog mindre data. Och allt p\u00e5 tre servrar.<\/p>\n<p><\/p>\n<p>De f\u00f6rsta tv\u00e5 stegen: ber\u00e4kning av log_return och inpackning i arrayer tog ungef\u00e4r en timme vardera. <\/p>\n<p><\/p>\n<p>Ber\u00e4kningen av korrelationen tog cirka 50 timmar. Men 50 timmar \u00e4r lite, eftersom det tidigare tog dem veckor. Det var en stor framg\u00e5ng. Och om man r\u00e4knar s\u00e5 ber\u00e4knades allt 70 g\u00e5nger per sekund p\u00e5 detta kluster.<\/p>\n<p><\/p>\n<p>Men det viktigaste \u00e4r att detta system praktiskt taget \u00e4r utan flaskhalsar, det vill s\u00e4ga det skalas n\u00e4stan linj\u00e4rt. Och de har verifierat det. Framg\u00e5ngsrikt skalade de det. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/5a595a84897e492b49dccfb0f058b1b8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>En korrekt struktur \u00e4r h\u00e4lften av framg\u00e5ngen. Och en korrekt struktur inneb\u00e4r anv\u00e4ndning av alla n\u00f6dv\u00e4ndiga ClickHouse-teknologier. <\/li>\n<li>Summing\/AggregatingMergeTrees \u00e4r teknologier som m\u00f6jligg\u00f6r aggregering eller ber\u00e4kning av snapshot-state som ett s\u00e4rskilt fall. Och det f\u00f6renklar m\u00e5nga saker avsev\u00e4rt. <\/li>\n<li>Materialized Views g\u00f6r det m\u00f6jligt att kringg\u00e5 begr\u00e4nsningen med en index. Kanske uttryckte jag mig inte s\u00e5 tydligt, men n\u00e4r vi laddade loggar, var de r\u00e5a loggarna i en tabell med ett index, medan p\u00e5 attributloggarna var de i en tabell, det vill s\u00e4ga samma data, bara filtrerade, men indexet var helt annat. Det verkar som samma data, men olika sortering. Och Materialized Views g\u00f6r det m\u00f6jligt, om du beh\u00f6ver det, att kringg\u00e5 s\u00e5dana begr\u00e4nsningar i ClickHouse. <\/li>\n<li>Minska indexets granul\u00e4ritet f\u00f6r punktf\u00f6rfr\u00e5gningar. <\/li>\n<li>Och f\u00f6rdela data smart, f\u00f6rs\u00f6k att maximalt lokalisera data inom servern. Och se till att f\u00f6rfr\u00e5gningar ocks\u00e5 anv\u00e4nder lokaliseringen d\u00e4r det \u00e4r m\u00f6jligt. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/c0fc1737986e3f18ed1d3c53df9f0252.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sammanfattningsvis kan man s\u00e4ga att ClickHouse nu har etablerat sig inom b\u00e5de kommersiella databaser och open source-databaser, dvs. fr\u00e4mst f\u00f6r analytiska syften. Det passar utm\u00e4rkt in i detta landskap. Dessutom b\u00f6rjar det sakta men s\u00e4kert att tr\u00e4nga undan andra alternativ, eftersom du inte beh\u00f6ver InfiniDB n\u00e4r du har ClickHouse. Vertica kan snart bli overfl\u00f6dig om de inte f\u00f6rb\u00e4ttrar sitt SQL-st\u00f6d. Anv\u00e4nd det!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teori och praktik av att anv\u00e4nda ClickHouse i verkliga applikationer. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/6e9a65d32eb6de7f9f139a30e7ab0d25.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u2014<em>Tack f\u00f6r presentationen! Mycket intressant! Har det gjorts n\u00e5gra j\u00e4mf\u00f6relser med Apache Phoenix?<\/em><\/p>\n<p><\/p>\n<p>- Nej, jag har inte h\u00f6rt att n\u00e5gon har gjort s\u00e5dana j\u00e4mf\u00f6relser. Vi p\u00e5 Yandex f\u00f6rs\u00f6ker h\u00e5lla koll p\u00e5 alla j\u00e4mf\u00f6relser mellan ClickHouse och olika databaser. F\u00f6r om det n\u00e5gon g\u00e5ng visar sig att n\u00e5got \u00e4r snabbare \u00e4n ClickHouse, kan Aleksej Milovidov inte sova om n\u00e4tterna och b\u00f6rjar snabbt \u00f6ka hastigheten. Jag har inte h\u00f6rt talas om en s\u00e5dan j\u00e4mf\u00f6relse. <\/p>\n<p><\/p>\n<ul>\n<li>\n<p><em>(Aleksej Milovidov) Apache Phoenix \u00e4r en SQL-motor p\u00e5 HBase. HBase \u00e4r huvudsakligen avsedd f\u00f6r nyckel-v\u00e4rde-arbetsfl\u00f6den. Varje rad kan ha ett godtyckligt antal kolumner med godtyckliga namn. Detta g\u00e4ller ocks\u00e5 f\u00f6r system som HBase och Cassandra. D\u00e4r fungerar inte tunga analytiska fr\u00e5gor s\u00e4rskilt bra. Eller s\u00e5 kan du tro att de fungerar bra om du inte har n\u00e5gon erfarenhet av ClickHouse.<\/em><\/p>\n<p>\n<\/li>\n<li>\n<p>Tack<\/p>\n<p><\/p>\n<ul>\n<li>\n<p><em>God dag! Jag har redan varit ganska intresserad av detta \u00e4mne eftersom jag har ett analytiskt subsystem. Men n\u00e4r jag tittar p\u00e5 ClickHouse f\u00e5r jag intrycket att ClickHouse \u00e4r v\u00e4ldigt bra f\u00f6r analys av h\u00e4ndelser, mutable. Och om jag beh\u00f6ver analysera mycket aff\u00e4rsdata med massor av stora tabeller, passar ClickHouse, s\u00e5vitt jag f\u00f6rst\u00e5r, inte s\u00e4rskilt bra? S\u00e4rskilt om de f\u00f6r\u00e4ndras. St\u00e4mmer det eller finns det exempel som kan motbevisa detta?<\/em><\/p>\n<p>\n<\/li>\n<li>\n<p>Det \u00e4r sant. Och det g\u00e4ller f\u00f6r merparten av specialiserade analytiska databaser. De \u00e4r anpassade f\u00f6r en eller flera stora tabeller som \u00e4r mutabla, och f\u00f6r m\u00e5nga sm\u00e5 som f\u00f6r\u00e4ndras l\u00e5ngsamt. Det vill s\u00e4ga, ClickHouse fungerar inte som Oracle, d\u00e4r man kan lagra allt och bygga mycket komplexa fr\u00e5gor. F\u00f6r att effektivt anv\u00e4nda ClickHouse m\u00e5ste man bygga schemat p\u00e5 ett s\u00e5dant s\u00e4tt som fungerar bra i ClickHouse. Det inneb\u00e4r att man ska undvika \u00f6verdriven normalisering, anv\u00e4nda ordb\u00f6cker och f\u00f6rs\u00f6ka g\u00f6ra f\u00e4rre l\u00e5nga relationer. Om man bygger schemat p\u00e5 det h\u00e4r s\u00e4ttet kan man l\u00f6sa liknande aff\u00e4rsproblem i ClickHouse mycket mer effektivt \u00e4n i en traditionell relationsdatabas. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><em>Tack f\u00f6r presentationen! Jag har en fr\u00e5ga ang\u00e5ende det senaste finansiella fallet. De hade analys. Det var n\u00f6dv\u00e4ndigt att j\u00e4mf\u00f6ra hur det g\u00e5r upp och ner. Och jag f\u00f6rst\u00e5r att ni byggde systemet just f\u00f6r den analysen? Om de imorgon till exempel skulle beh\u00f6va en annan rapport baserad p\u00e5 dessa data, m\u00e5ste man bygga om schemat och ladda data igen? Det vill s\u00e4ga, g\u00f6ra n\u00e5gon form av f\u00f6rbearbetning f\u00f6r att f\u00e5 fram en fr\u00e5ga?<\/em><\/p>\n<p><\/p>\n<p>Sj\u00e4lvklart, det handlar om att anv\u00e4nda ClickHouse f\u00f6r en mycket specifik uppgift. Den skulle mer traditionellt kunna l\u00f6sas inom ramen f\u00f6r Hadoop. F\u00f6r Hadoop \u00e4r det en perfekt uppgift. Men det \u00e4r v\u00e4ldigt l\u00e5ngsamt p\u00e5 Hadoop. Min avsikt \u00e4r att visa att man kan l\u00f6sa uppgifter p\u00e5 ClickHouse som vanligtvis hanteras med helt andra medel, men g\u00f6ra det mycket mer effektivt. Det \u00e4r verkligen skr\u00e4ddarsytt f\u00f6r en specifik uppgift. Sj\u00e4lvklart, om det finns en liknande uppgift kan den l\u00f6sas p\u00e5 liknande s\u00e4tt. <\/p>\n<p><\/p>\n<p><em>F\u00f6rst\u00e5tt. Ni sa att det tog 50 timmar. \u00c4r det fr\u00e5n b\u00f6rjan, n\u00e4r data laddades eller n\u00e4r ni fick resultaten?<\/em><\/p>\n<p><\/p>\n<p>Ja, ja.<\/p>\n<p><\/p>\n<p><em>Bra, tack s\u00e5 mycket.<\/em><\/p>\n<p><\/p>\n<p>Det \u00e4r p\u00e5 en 3-server kluster. <\/p>\n<p><\/p>\n<p><em>Hej! Tack f\u00f6r presentationen! Allt \u00e4r v\u00e4ldigt intressant. Jag ska fr\u00e5ga lite mindre om funktionaliteten, utan mer om anv\u00e4ndningen av ClickHouse ur ett stabilitetsperspektiv. Har ni r\u00e5kat ut f\u00f6r n\u00e5gra problem, har ni beh\u00f6vt \u00e5terst\u00e4lla? Hur beter sig ClickHouse i s\u00e5 fall? Och har ni n\u00e5gonsin upplevt att en replik ocks\u00e5 kraschar? Vi har, till exempel, st\u00f6tt p\u00e5 problemet med att ClickHouse ibland g\u00e5r \u00f6ver sina gr\u00e4nser och kraschar.<\/em><\/p>\n<p><\/p>\n<p>Sj\u00e4lvklart finns det inga perfekta system. Och ClickHouse har sina egna problem. Men har ni h\u00f6rt talas om att Yandex.Metrica har haft l\u00e5ngvariga driftstopp? Antagligen inte. Den har fungerat p\u00e5litligt sedan ungef\u00e4r 2012-2013 med ClickHouse. Jag kan ocks\u00e5 ber\u00e4tta om min erfarenhet. Vi har aldrig haft totala driftstopp. Vissa delvisa problem har kunnat uppst\u00e5, men de har aldrig varit kritiska nog f\u00f6r att p\u00e5verka verksamheten seri\u00f6st. S\u00e5dant har aldrig h\u00e4nt. ClickHouse \u00e4r tillr\u00e4ckligt p\u00e5litligt och kraschar inte slumpm\u00e4ssigt. Man beh\u00f6ver inte oroa sig f\u00f6r det. Det \u00e4r inget of\u00e4rdigt system. Det har bevisats av m\u00e5nga f\u00f6retag. <\/p>\n<p><\/p>\n<p><em>Hej! Du sa att man m\u00e5ste t\u00e4nka igenom datastrukturen noggrant fr\u00e5n b\u00f6rjan. Men vad h\u00e4nder om det redan har intr\u00e4ffat? Jag har data som str\u00f6mmar p\u00e5. Det har g\u00e5tt sex m\u00e5nader, och jag inser att jag inte kan forts\u00e4tta s\u00e5 h\u00e4r; jag m\u00e5ste ladda om data och hantera dem p\u00e5 n\u00e5got s\u00e4tt.<\/em> <\/p>\n<p><\/p>\n<p>Det beror sj\u00e4lvklart p\u00e5 ditt system. Det finns flera s\u00e4tt att g\u00f6ra detta praktiskt taget utan avbrott. Till exempel kan du skapa en Materialized View, d\u00e4r du skapar en annan databasstruktur, om den kan mappas entydigt. Det vill s\u00e4ga, om det till\u00e5ter mappning med hj\u00e4lp av ClickHouse, det vill s\u00e4ga extrahera vissa saker, \u00e4ndra prim\u00e4rnyckel, \u00e4ndra partitionering, s\u00e5 kan du skapa en Materialized View. Du kan skriva \u00f6ver dina gamla data d\u00e4r, och nya kommer att skrivas automatiskt. Sedan kan du enkelt v\u00e4xla till att anv\u00e4nda Materialized View, och d\u00e4refter byta skrivning och ta bort den gamla tabellen. Det \u00e4r verkligen ett s\u00e4tt utan avbrott. <\/p>\n<p><\/p>\n<p><em>Tack.<\/em><\/p>\n<p>K\u00e4lla: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/512304\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0447\u0442\u0438 \u0432\u0435\u0437\u0434\u0435, \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0411\u0414 \u0432\u0441\u0435 \u0435\u0449\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u044d\u043a\u0437\u043e\u0442\u0438\u0447\u043d\u044b. \u0418\u0445 \u043f\u043b\u043e\u0445\u043e \u0437\u043d\u0430\u044e\u0442 \u0438 \u0435\u0449\u0435 \u0445\u0443\u0436\u0435 \u0443\u043c\u0435\u044e\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u041c\u043d\u043e\u0433\u0438\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 &quot;\u0435\u0441\u0442\u044c \u043a\u0430\u043a\u0442\u0443\u0441&quot; \u0441 MySQL \u0438\u043b\u0438 PostgreSQL, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438, \u043c\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0441 NoSQL \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043f\u043b\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0437\u0430 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f. ClickHouse \u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438\u0433\u0440\u044b \u0438 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433 \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0432 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":89879,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-89878","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-clickhouse-v-realnyh-prilozheniyah-aleksandr-zajczev-2018g\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0422\u0435\u043e\u0440\u0438\u044f \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f ClickHouse \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445. \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0417\u0430\u0439\u0446\u0435\u0432 (2018\u0433) | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-clickhouse-v-realnyh-prilozheniyah-aleksandr-zajczev-2018g\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-07-26T23:42:42+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-26T23:42:42+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Teori och praktik av anv\u00e4ndning av ClickHouse i verkliga till\u00e4mpningar. Alexander Zaytsev (2018) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-clickhouse-v-realnyh-prilozheniyah-aleksandr-zajczev-2018g","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0422\u0435\u043e\u0440\u0438\u044f \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f ClickHouse \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445. \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0417\u0430\u0439\u0446\u0435\u0432 (2018\u0433) | ProHoster","og:url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-clickhouse-v-realnyh-prilozheniyah-aleksandr-zajczev-2018g","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-07-26T23:42:42+00:00","article:modified_time":"2020-07-26T23:42:42+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"89878","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 13:02:37","updated":"2026-02-22 15:29:33","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/89878","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=89878"}],"version-history":[{"count":2,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/89878\/revisions"}],"predecessor-version":[{"id":162171,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/89878\/revisions\/162171"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/89879"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=89878"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=89878"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=89878"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}