{"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\/it\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-clickhouse-v-realnyh-prilozheniyah-aleksandr-zajczev-2018g","title":{"rendered":"Teoria e pratica dell'utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/b46b964324a3311157d5df737526b1d1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Anche se oggi sono disponibili dati ovunque, i database analitici rimangono ancora piuttosto rari. Sono poco conosciuti e ancor meno efficientemente utilizzati. Molti continuano a \"mangiare cactus\" con MySQL o PostgreSQL, progettati per scenari diversi, a soffrire con NoSQL o a pagare troppo per soluzioni commerciali. ClickHouse cambia le regole del gioco e riduce significativamente la barriera all'ingresso nel mondo dei DBMS analitici.<\/p>\n<p><\/p>\n<p>Relazione dal BackEnd Conf 2018 e pubblicata con il permesso del relatore.<\/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=\"Riproduci 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=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/6c55b639d9703f460d99e0b0b1194507.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nChi sono e perch\u00e9 parlo di ClickHouse? Sono il Direttore Sviluppo di LifeStreet, che utilizza ClickHouse. Inoltre, sono il fondatore di Altinity, partner di Yandex, che promuove ClickHouse e aiuta Yandex a rendere ClickHouse ancora pi\u00f9 di successo. Sono anche disponibile a condividere conoscenze su ClickHouse. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/36af6acba62271f7aa19dda2eb470870.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E no, non sono il fratello di Petya Zaitsev. Spesso mi fanno questa domanda. No, non siamo fratelli.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/6ca605f97619a1373bb8a92f88d480d5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00ab\u00c8 di pubblico dominio\u00bb che ClickHouse:<\/p>\n<p><\/p>\n<ul>\n<li>\u00c8 molto veloce,<\/li>\n<li>\u00c8 molto conveniente, <\/li>\n<li>\u00c8 utilizzato in Yandex. <\/li>\n<\/ul>\n<p><\/p>\n<p>\u00c8 meno noto in quali aziende e come venga utilizzato. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/c097b003bf8ea13b8a3bb765270e99c8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi parler\u00f2 di come, dove e per cosa viene utilizzato ClickHouse, oltre a Yandex. <\/p>\n<p><\/p>\n<p>Ti spiegher\u00f2 come compiti specifici vengono risolti con ClickHouse in diverse aziende, quali strumenti ClickHouse puoi utilizzare per le tue esigenze e come sono stati utilizzati in varie aziende.<\/p>\n<p><\/p>\n<p>Ho selezionato tre esempi che mostrano ClickHouse da angolazioni diverse. Penso che sar\u00e0 interessante.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/d3cab92ceccd6c7d01ca1f28b028803f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La prima domanda \u00e8: \u00abA cosa serve ClickHouse?\u00bb. Sembra una domanda piuttosto ovvia, ma le risposte sono pi\u00f9 di una. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/1a4e14cc041a3c01ad0fd2a305aeeab0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>La prima risposta \u00e8 legata alle prestazioni. ClickHouse \u00e8 molto veloce. L'analisi su ClickHouse \u00e8 altrettanto veloce. Pu\u00f2 spesso essere utilizzato dove altri strumenti funzionano molto lentamente o in modo inefficace. <\/li>\n<li>La seconda risposta riguarda il costo. E soprattutto il costo di scalabilit\u00e0. Ad esempio, Vertica \u00e8 un ottimo database. Funziona molto bene se hai un numero limitato di terabyte di dati. Ma quando si tratta di centinaia di terabyte o petabyte, il costo delle licenze e del supporto diventa considerevole. Ed \u00e8 costoso. ClickHouse, invece, \u00e8 gratuito. <\/li>\n<li>La terza risposta riguarda il costo operativo. Questo approccio \u00e8 un po' diverso. RedShift \u00e8 un'ottima alternativa. Su RedShift puoi creare rapidamente una soluzione. Funzioner\u00e0 bene, ma ogni ora, ogni giorno e ogni mese pagherai un costo piuttosto elevato ad Amazon, perch\u00e9 \u00e8 un servizio piuttosto costoso. Anche Google BigQuery \u00e8 simile. Chi lo ha utilizzato sa che pu\u00f2 lanciare alcune query e ricevere fatture improvvise da centinaia di dollari. <\/li>\n<\/ul>\n<p><\/p>\n<p>In ClickHouse questi problemi non ci sono. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/3084a8bd9271f14726d73989946816c5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dove viene utilizzato ClickHouse oggi? Oltre a Yandex, ClickHouse \u00e8 utilizzato in molte diverse aziende e attivit\u00e0. <\/p>\n<p><\/p>\n<ul>\n<li>Prima di tutto, \u00e8 usato per l'analisi delle applicazioni web, cio\u00e8 \u00e8 un caso d'uso nato da Yandex.<\/li>\n<li>Molte aziende AdTech utilizzano ClickHouse. <\/li>\n<li>Numerose aziende che necessitano di analizzare i log operativi provenienti da fonti diverse.<\/li>\n<li>Alcune aziende utilizzano ClickHouse per il monitoraggio dei log di sicurezza. Li caricano in ClickHouse, generano rapporti e ottengono i risultati di cui hanno bisogno.<\/li>\n<li>Le aziende iniziano a utilizzarlo anche per l'analisi finanziaria, cio\u00e8 gradualmente anche le grandi imprese si stanno avvicinando a ClickHouse. <\/li>\n<li>CloudFlare. Se qualcuno segue ClickHouse, sicuramente ha sentito parlare di questa azienda. \u00c8 uno dei contributori pi\u00f9 importanti della community. Hanno un'installazione di ClickHouse molto significativa. Ad esempio, hanno creato il Kafka Engine per ClickHouse. <\/li>\n<li>Le compagnie di telecomunicazione hanno cominciato a utilizzarlo. Diverse aziende utilizzano ClickHouse sia come proof of concept che gi\u00e0 in produzione.<\/li>\n<li>Un'azienda utilizza ClickHouse per monitorare i processi produttivi. Testano i microchip, registrando un gran numero di parametri, circa 2.000 caratteristiche. Poi analizzano \u2013 se si tratta di un buon lotto o di un cattivo lotto.<\/li>\n<li>Analisi blockchain. C'\u00e8 un'azienda russa, Bloxy.info. Si dedicano all'analisi della rete Ethereum. Anche questo lo hanno realizzato su ClickHouse. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/8a0c1924a20ed2d15cd0f959e9b3e499.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Inoltre, la dimensione non conta. Ci sono molte aziende che utilizzano un piccolo server. E questo consente loro di risolvere i loro problemi. E ancora pi\u00f9 aziende utilizzano grandi cluster composti da molti <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/it\/server\/\"   title=\"server\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"1513\">server<\/a> o decine di server. <\/p>\n<p><\/p>\n<p>E se guardiamo ai record, abbiamo:<\/p>\n<p><\/p>\n<ul>\n<li>Yandex: oltre 500 server, conservano 25 miliardi di registrazioni al giorno.<\/li>\n<li>LifeStreet: 60 server, circa 75 miliardi di registrazioni al giorno. Meno server, pi\u00f9 registrazioni rispetto a Yandex. <\/li>\n<li>CloudFlare: 36 server, 200 miliardi di record al giorno che conservano. Hanno anche meno server e ancora pi\u00f9 dati che conservano. <\/li>\n<li>Bloomberg: 102 <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/it\/server\/dts-los-angeles\/\"   title=\"server\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"3643\">server<\/a>, circa un trilione di record al giorno. Record per numero di record.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/49194030b6586221cb17029889ce33da.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Geograficamente, anche questo \u00e8 molto. Questa mappa mostra la heatmap in cui ClickHouse \u00e8 utilizzato nel mondo. Qui si evidenzia chiaramente la Russia, la Cina e l'America. Ci sono poche nazioni europee. Si possono individuare 4 cluster.<\/p>\n<p><\/p>\n<p>Questa \u00e8 un'analisi comparativa, qui non bisogna cercare cifre assolute. \u00c8 un'analisi dei visitatori che leggono materiali in lingua inglese sul sito di Altinity, perch\u00e9 non ci sono parlanti russi. E Russia, Ucraina, Bielorussia, quindi la parte di lingua russa della comunit\u00e0, sono gli utenti pi\u00f9 numerosi. Poi ci sono gli Stati Uniti e il Canada. La Cina sta recuperando rapidamente. Sei mesi fa, la Cina era quasi assente, ora ha gi\u00e0 superato l'Europa e continua a crescere. Anche l'anziana Europa non resta indietro, e, stranamente, la Francia \u00e8 il leader nell'uso di ClickHouse. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/3a8305c51b1bd62f3467b795402df4ed.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Perch\u00e9 sto raccontando tutto questo? Per mostrare che ClickHouse sta diventando la soluzione standard per l'analisi dei big data ed \u00e8 gi\u00e0 molto utilizzato in vari ambiti.<\/strong> Se lo stai gi\u00e0 utilizzando, sei sulla strada giusta. Se non lo stai ancora usando, non preoccuparti: non sarai solo e non mancher\u00e0 il supporto, poich\u00e9 molte persone gi\u00e0 lo stanno adottando.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/6aa635f3a35034d3af837c78b2c8fe60.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questi sono esempi di utilizzo reale di ClickHouse in diverse aziende. <\/p>\n<p><\/p>\n<ul>\n<li>Il primo esempio \u00e8 una rete pubblicitaria: la migrazione da Vertica a ClickHouse. Conosco diverse aziende che hanno gi\u00e0 effettuato il passaggio da Vertica o sono in fase di migrazione. <\/li>\n<li>Il secondo esempio riguarda un data warehouse transazionale su ClickHouse. Questo esempio \u00e8 costruito su anti-pattern. Tutto ci\u00f2 che non si dovrebbe fare in ClickHouse secondo i consigli degli sviluppatori \u00e8 stato fatto qui. E nonostante ci\u00f2, funziona cos\u00ec bene che \u00e8 decisamente pi\u00f9 efficace rispetto a una tipica soluzione transazionale. <\/li>\n<li>Il terzo esempio riguarda il calcolo distribuito su ClickHouse. C'era una domanda su come integrare ClickHouse nell'ecosistema Hadoop. Mostrer\u00f2 un esempio di come un'azienda ha realizzato su ClickHouse qualcosa di simile a un contenitore map reduce, gestendo la localizzazione dei dati, per affrontare un compito molto complesso. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/e08ab5418500599f08d40324ccdfbcd0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>LifeStreet \u00e8 un'azienda Ad Tech che dispone di tutte le tecnologie correlate a una rete pubblicitaria. <\/li>\n<li>Si occupa dell'ottimizzazione degli annunci e del bidding programmatico. <\/li>\n<li>Una grande quantit\u00e0 di dati: circa 10 miliardi di eventi al giorno. Inoltre, gli eventi possono suddividersi in diversi sotto-eventi.<\/li>\n<li>Molti clienti utilizzano questi dati, non solo persone, ma anche vari algoritmi che si occupano del bidding programmatico. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/2da99b53eb25f675a2431027f86db934.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L'azienda ha percorso un lungo e difficile cammino. Ne ho parlato al HighLoad. Inizialmente, LifeStreet \u00e8 passata da MySQL (con una breve sosta su Oracle) a Vertica. \u00c8 possibile trovare questa storia. <\/p>\n<p><\/p>\n<p>All'inizio tutto \u00e8 andato molto bene, ma \u00e8 diventato chiaro abbastanza rapidamente che i dati crescevano e Vertica era costoso. Pertanto, abbiamo cercato diverse alternative. Alcune di esse sono elencate qui. In effetti, abbiamo realizzato un proof of concept o talvolta dei test di prestazioni su quasi tutti i database disponibili sul mercato dal 2013 al 2016, che erano compatibili con le funzionalit\u00e0 richieste. E su alcuni di essi ne ho parlato anche al HighLoad.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/4bebd2f43892cbef9249ddded1b8a70a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>C'era la necessit\u00e0 di migrare da Vertica in primo luogo, poich\u00e9 i dati stavano crescendo. E cresceva in modo esponenziale da diversi anni. Poi hanno raggiunto un punto di stallo, ma nonostante ci\u00f2. Prevedendo questa crescita, le esigenze aziendali riguardo al volume di dati per cui fare analytics, era chiaro che presto si sarebbe parlato di petabyte. E pagare per i petabyte \u00e8 gi\u00e0 molto costoso, quindi si cercava un'alternativa dove andare. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/f170a4307168e8560122966eab85c24e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dove andare? Per un lungo periodo, non era affatto chiaro dove dirigersi, perch\u00e9 da un lato ci sono database commerciali, che sembrano funzionare bene. Alcuni funzionano quasi altrettanto bene di Vertica, altri meno. Ma sono tutti costosi, non si riusciva a trovare nulla di pi\u00f9 economico e migliore. <\/p>\n<p><\/p>\n<p>Dall'altro lato, ci sono soluzioni open source, che non sono molte, cio\u00e8, per l'analisi, si possono contare sulle dita. E sono gratuite o a basso costo, ma funzionano lentamente. E spesso mancano delle funzionalit\u00e0 necessarie e utili.<\/p>\n<p><\/p>\n<p>E per unire ci\u00f2 che c'\u00e8 di buono nei database commerciali e tutto ci\u00f2 che \u00e8 gratuito nel mondo open source, non c'era nulla. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/abbefbf0d9578b554f81579b87213a50.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Non c'era nulla fino a quando improvvisamente Yandex non tir\u00f2 fuori, come un coniglio da un cappello, ClickHouse. E fu una soluzione inaspettata, ma ancora oggi ci si domanda: \u00abPerch\u00e9?\u00bb, eppure. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/c88981aace9d5925396ca5171241b7d2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E subito nell'estate del 2016 abbiamo iniziato a esplorare cos'\u00e8 ClickHouse. E si \u00e8 rivelato che a volte pu\u00f2 essere pi\u00f9 veloce di Vertica. Abbiamo testato diversi scenari su diverse query. E se la query utilizzava solo una tabella, ossia senza join, ClickHouse era due volte pi\u00f9 veloce di Vertica. <\/p>\n<p><\/p>\n<p>Non mi sono risparmiato e ho controllato altri test di Yandex qualche giorno fa. L\u00ec la situazione \u00e8 la stessa: ClickHouse \u00e8 due volte pi\u00f9 veloce di Vertica, quindi ne parlano frequentemente. <\/p>\n<p><\/p>\n<p>Ma se ci sono join nelle query, le cose diventano meno chiare. E ClickHouse pu\u00f2 risultare pi\u00f9 lento di Vertica di due volte. Ma se si modifica leggermente la query e la si riscrive, sono pi\u00f9 o meno equivalenti. Non male. E gratis. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/188bf56b72123175a18d2cb97d989a47.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E avendo ottenuto i risultati dei test e avendo guardato la situazione da diversi angoli, LifeStreet ha optato per ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/1183b9b7681916686c52786fc95ccb45.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ricordo che era il 2016. Era come nella barzelletta sui topi che piangevano e si pungerebbero, ma continuavano a mangiare il cactus. E se ne \u00e8 parlato dettagliatamente, ci sono video e altro. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/993052ed83dc295c3777e614c7703456.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Per questo motivo non entrer\u00f2 nei dettagli, ma condivider\u00f2 solo i risultati e alcune cose interessanti di cui non avevo parlato all'epoca. <\/p>\n<p><\/p>\n<p>I risultati sono:<\/p>\n<p><\/p>\n<ul>\n<li>Migrazione riuscita e il sistema \u00e8 gi\u00e0 in produzione da oltre un anno. <\/li>\n<li>Le prestazioni e la flessibilit\u00e0 sono aumentate. Delle 10 miliardi di registrazioni che eravamo in grado di conservare al giorno per poco tempo, ora LifeStreet ne conserva 75 miliardi al giorno e pu\u00f2 farlo per 3 mesi o pi\u00f9. In picco, si salvano fino a un milione di eventi al secondo. Oltre un milione di query SQL al giorno arrivano in questo sistema, principalmente da vari bot. <\/li>\n<li>Sebbene ClickHouse utilizzi pi\u00f9 server rispetto a Vertica, ci sono stati risparmi anche sull'hardware, poich\u00e9 Vertica usava dischi SAS piuttosto costosi. In ClickHouse venivano usati dischi SATA. Perch\u00e9? Perch\u00e9 in Vertica l'inserimento \u00e8 sincronizzato. E la sincronizzazione richiede dischi che non rallentino troppo, e anche una rete veloce, quindi \u00e8 un'operazione abbastanza costosa. In ClickHouse, invece, l'inserimento \u00e8 asincrono. Inoltre, \u00e8 possibile scrivere tutto localmente, senza costi aggiuntivi, il che consente di inserire i dati in ClickHouse molto pi\u00f9 rapidamente, anche su dischi non tra i pi\u00f9 veloci. Per quanto riguarda la lettura, \u00e8 pi\u00f9 o meno la stessa: la lettura su dischi SATA, se sono in RAID, \u00e8 comunque abbastanza veloce. <\/li>\n<li>Nonostante non ci siano limitazioni di licenza, ovvero 3 petabyte di dati su 60 server (20 server costituiscono una replica) e 6 trilioni di record tra fatti e aggregati. Niente di simile era possibile con Vertica. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/f461cdc12917ee655655dd7eb9c32bb2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ora passer\u00f2 a cose pratiche in questo esempio.<\/p>\n<p><\/p>\n<ul>\n<li>Primo: uno schema efficace. Molto dipende dallo schema. <\/li>\n<li>Secondo: generazione di SQL efficace.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/e7dc2a217e77c8794ff6e8a754e78c85.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Una tipica query OLAP \u00e8 un select. Alcune colonne vanno in group by, altre colonne vanno in funzioni aggregate. C'\u00e8 un where, che pu\u00f2 essere considerato come un taglio del cubo. L'intero group by pu\u00f2 essere visto come una proiezione. Per questo motivo si parla di analisi multidimensionale dei dati. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/a03a2d7fd28905ae83183346f0c673e2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Spesso questo \u00e8 modellato sotto forma di uno schema a stella, dove c'\u00e8 un fatto centrale e le caratteristiche di quel fatto ai lati, nei raggi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/d9671af4b39cc83e1ae49e6fd75d0e02.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dal punto di vista del design fisico, di come questo \u00e8 rappresentato nelle tabelle, di solito si crea una rappresentazione normalizzata. \u00c8 possibile denormalizzare, ma ci\u00f2 comporta un costo elevato per lo spazio su disco e non \u00e8 molto efficiente per le query. Pertanto, di solito si crea una rappresentazione normalizzata, ossia una tabella dei fatti e molte tabelle di dimensioni. <\/p>\n<p><\/p>\n<p>Tuttavia, in ClickHouse questo funziona male. Ci sono due motivi: <\/p>\n<p><\/p>\n<ul>\n<li>Il primo \u00e8 che in ClickHouse i join non sono molto buoni, ci sono dei join, ma non sono ottimali. Al momento sono carenti. <\/li>\n<li>Il secondo \u00e8 che le tabelle non vengono aggiornate. Di solito in queste piccole tabelle intorno allo schema a stella, \u00e8 necessario cambiare qualcosa. Ad esempio, il nome del cliente, il nome dell'azienda e altro. E questo non funziona. <\/li>\n<\/ul>\n<p><\/p>\n<p>Tuttavia, esistono due soluzioni a questo problema in ClickHouse: <\/p>\n<p><\/p>\n<ul>\n<li>Il primo consiste nell'uso dei dizionari. Gli External Dictionaries sono ci\u00f2 che aiuta a risolvere il 99% dei problemi relativi allo schema star, agli aggiornamenti e cos\u00ec via. <\/li>\n<li>Il secondo \u00e8 l'uso degli array. Anche gli array aiutano a eliminare le join e i problemi di normalizzazione. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/775972cc412651600799173407384492.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Non sono necessarie le join. <\/li>\n<li>Aggiornabili. Da marzo 2018 \u00e8 emersa una possibilit\u00e0 non documentata (non la troverete nella documentazione) di aggiornare i dizionari parzialmente, ovvero quelle voci che sono cambiate. Praticamente \u00e8 come una tabella.<\/li>\n<li>Sempre in memoria, quindi le join con il dizionario funzionano pi\u00f9 velocemente rispetto a una tabella che si trova su disco e che probabilmente non \u00e8 nemmeno in cache. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/f73176a650b6d885011e3265c2af2fc3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Anche in questo caso non sono necessarie le join.<\/li>\n<li>\u00c8 una rappresentazione compatta di 1 a molti. <\/li>\n<li>E a mio avviso, gli array sono fatti per i geek. Queste sono funzioni lambda e altro. <\/li>\n<\/ul>\n<p><\/p>\n<p>Non \u00e8 solo per effetto scenico. \u00c8 una funzionalit\u00e0 molto potente che consente di fare molte cose in modo semplice ed elegante. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/5d813952ca8f3da7a74c6f2a15d80a9b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Esempi tipici che aiutano a risolvere mediante array. Questi esempi sono semplici e abbastanza chiari:<\/p>\n<p><\/p>\n<ul>\n<li>Ricerca per tag. Se hai degli hashtag e vuoi trovare delle voci in base a un hashtag. <\/li>\n<li>Ricerca per parametri key-value. Ci sono anche alcuni attributi con valore. <\/li>\n<li>Archiviazione di elenchi di chiavi che \u00e8 necessario tradurre in qualcos'altro.<\/li>\n<\/ul>\n<p><\/p>\n<p>Tutte queste operazioni possono essere eseguite senza array. I tag possono essere collocati in una riga e selezionati con espressioni regolari o in una tabella separata, ma in tal caso sar\u00e0 necessario fare join.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/dbbf90eee098c4564206532f24156823.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In ClickHouse non \u00e8 necessario fare nulla, basta descrivere un array string per gli hashtag o creare una struttura annidata per sistemi tipo key-value.<\/p>\n<p><\/p>\n<p>Una struttura annidata pu\u00f2 non essere il termine pi\u00f9 appropriato. Si tratta di due array che hanno una parte comune nel nome e alcune caratteristiche correlate. <\/p>\n<p><\/p>\n<p>E cercare per tag \u00e8 molto semplice. C'\u00e8 una funzione <code>has<\/code>, che verifica se un elemento \u00e8 presente nell'array. Abbiamo trovato tutte le registrazioni relative alla nostra conferenza.<\/p>\n<p><\/p>\n<p>La ricerca per subid \u00e8 leggermente pi\u00f9 complicata. Dobbiamo prima trovare l'indice della chiave, e poi prendere l'elemento con quell'indice e verificare che il valore sia quello di cui abbiamo bisogno. Tuttavia, \u00e8 comunque molto semplice e compatto.<\/p>\n<p><\/p>\n<p>Un'espressione regolare che vorresti scrivere, se tutto fosse memorizzato in una sola riga, sarebbe, prima di tutto, goffa. E, in secondo luogo, funzionerebbe molto pi\u00f9 lentamente di due array. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/17664c3121b2b0d33188adbfaa653d4e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un altro esempio. Hai un array in cui memorizzi gli ID. E puoi tradurli in nomi. La funzione <code>arrayMap<\/code>. Questa \u00e8 una tipica funzione lambda. Passi al suo interno un'espressione lambda. E per ogni ID nel dizionario estrae il valore del nome.<\/p>\n<p><\/p>\n<p>Allo stesso modo si pu\u00f2 fare anche la ricerca. Si passa una funzione predicato che verifica a cosa corrispondono gli elementi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/146917b71a35d38a550cd9accf6ab2f7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Queste cose semplificano molto lo schema e risolvono molti problemi. <\/p>\n<p><\/p>\n<p>Ma il prossimo problema con cui ci siamo imbattuti e di cui vorrei parlare, sono le query efficienti. <\/p>\n<p><\/p>\n<ul>\n<li>In ClickHouse non c'\u00e8 un pianificatore di query. Non esiste affatto. <\/li>\n<li>Tuttavia, anche le query complesse devono comunque essere pianificate. In quali casi? <\/li>\n<li>Se la query ha pi\u00f9 join che avvolgi in sotto-selezioni. E l'ordine in cui vengono eseguiti ha importanza. <\/li>\n<li>E in secondo luogo, se la query \u00e8 distribuita. Perch\u00e9 in una query distribuita solo la sottoquery pi\u00f9 interna viene eseguita in modo distribuito, mentre tutto il resto viene inviato a un server specifico, a cui sei connesso e viene eseguito l\u00ec. Quindi, se hai query distribuite con molti join, devi scegliere l'ordine. <\/li>\n<\/ul>\n<p><\/p>\n<p>E anche nei casi pi\u00f9 semplici, a volte \u00e8 utile che il pianificatore lavori e riscrivere leggermente le query. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/217d422b429e8b4bc13abbf0efdf6be1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ecco un esempio. A sinistra la query che mostra le prime 5 nazioni. E ci impiega 2,5 secondi, se non sbaglio. A destra la stessa query, ma leggermente riscritta. Invece di raggruppare per stringa, abbiamo iniziato a raggruppare per chiave (int). Ed \u00e8 pi\u00f9 veloce. Poi abbiamo unito il dizionario al risultato. Invece di 2,5 secondi, la query impiega 1,5 secondi. \u00c8 un ottimo risultato. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/f19fb7d7f0397a3b38b2a3bd179c156b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un esempio simile riguarda la riscrittura dei filtri. Qui c'\u00e8 una query per la Russia. Ci impiega 5 secondi. Se la riscriviamo in modo da confrontare non pi\u00f9 le stringhe, ma i numeri con un certo insieme di chiavi che si riferiscono alla Russia, sar\u00e0 molto pi\u00f9 veloce. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/0c1dd1f317133d1d106ffef85f337079.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ci sono molti trucchi. Questi possono velocizzare notevolmente le query che pensate gi\u00e0 stiano funzionando velocemente o, al contrario, che stiano funzionando lentamente. Possono essere resi ancora pi\u00f9 veloci.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/25b132790b03f239e38237af5e92ab63.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Massimo lavoro in modalit\u00e0 distribuita. <\/li>\n<li>Ordinamento per i tipi minimi, come ho fatto con gli indici. <\/li>\n<li>Se ci sono delle join, dizionari, \u00e8 meglio farle per ultime, quando i dati sono gi\u00e0 parzialmente raggruppati; in questo modo l'operazione di join o la chiamata al dizionario saranno meno frequenti e quindi pi\u00f9 veloci. <\/li>\n<li>Sostituzione dei filtri. <\/li>\n<\/ul>\n<p><\/p>\n<p>Ci sono altre tecniche oltre a quelle che ho dimostrato. E tutte possono talvolta velocizzare notevolmente l'esecuzione delle query.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/175832796bee525909d8875bd723a881.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Passiamo al prossimo esempio. L'azienda X dagli Stati Uniti. Cosa fa? <\/p>\n<p><\/p>\n<p>C'era una richiesta: <\/p>\n<p><\/p>\n<ul>\n<li>Collegamento offline delle transazioni pubblicitarie. <\/li>\n<li>Modellazione di diversi modelli di collegamento. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/0136b71a1205512d86f13e86761146f4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In cosa consiste lo scenario?<\/p>\n<p><\/p>\n<p>Un visitatore normale accede al sito, ad esempio, 20 volte al mese tramite diversi annunci o semplicemente torna di tanto in tanto senza alcun annuncio, perch\u00e9 ricorda il sito. Guarda alcuni prodotti, li mette nel carrello e poi li toglie dal carrello. E, alla fine, acquista qualcosa. <\/p>\n<p><\/p>\n<p>Domande ragionevoli: \"A chi bisogna pagare per la pubblicit\u00e0, se necessario?\" e \"Quale pubblicit\u00e0 lo ha influenzato, se lo ha fatto?\" Cio\u00e8, perch\u00e9 ha acquistato e come fare in modo che anche le persone simili a lui comprino?<\/p>\n<p><\/p>\n<p>Per risolvere questo problema, \u00e8 necessario collegare in modo appropriato gli eventi che si verificano sul sito web, cio\u00e8 stabilire una connessione tra di essi. Poi trasmetterli per l'analisi al DWH. E sulla base di questa analisi, costruire modelli per capire a chi e quale pubblicit\u00e0 mostrare.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/e53ec81ce89150697d0eca4d72886638.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Una transazione pubblicitaria \u00e8 un insieme di eventi utente correlati che inizia con la visualizzazione di un annuncio, prosegue con ulteriori azioni e pu\u00f2 culminare in un acquisto, seguito eventualmente da acquisti successivi. Ad esempio, nel caso di un'app mobile o di un gioco mobile, solitamente l'installazione dell'app \u00e8 gratuita, ma se vengono effettuate ulteriori azioni, potrebbero essere necessari dei pagamenti. Pi\u00f9 un utente spende nell'app, maggiore \u00e8 il suo valore. Ma prima \u00e8 necessario collegare tutto. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/a2213613f1ef660409124ef8bcdd4fe3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Esistono diversi modelli di collegamento. <\/p>\n<p><\/p>\n<p>I pi\u00f9 popolari sono:<\/p>\n<p><\/p>\n<ul>\n<li>Last Interaction, dove l'interaction pu\u00f2 essere un clic o una visualizzazione.<\/li>\n<li>First Interaction, ovvero la prima azione che ha portato l'utente al sito.<\/li>\n<li>Combinazione lineare \u2013 equa per tutti. <\/li>\n<li>Attenuazione.<\/li>\n<li>E altro ancora. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/9523307d557e094d981da5b525ed0b59.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E come funzionava tutto questo inizialmente? C'era Runtime e Cassandra. Cassandra veniva utilizzata come transaction storage, ovvero conteneva tutte le transazioni correlate. Quando un evento si presentava in Runtime, ad esempio la visualizzazione di una pagina o altro, veniva effettuata una richiesta a Cassandra per verificare se l'utente esisteva. Successivamente venivano recuperate le transazioni ad esso collegate e veniva effettuato il collegamento.<\/p>\n<p><\/p>\n<p>E se per caso nel tuo ticket c'\u00e8 un ID di transazione, allora \u00e8 semplice. Ma spesso non \u00e8 cos\u00ec. Pertanto, era necessario trovare l'ultima transazione o quella dell'ultimo clic, e cos\u00ec via. <\/p>\n<p><\/p>\n<p>E tutto ci\u00f2 ha funzionato molto bene finch\u00e9 il legame era impostato sull'ultimo clic. Parliamo di 10 milioni di clic al giorno, 300 milioni al mese, se consideriamo un intervallo mensile. E poich\u00e9 in Cassandra tutto deve essere in memoria per garantire un funzionamento rapido, poich\u00e9 \u00e8 necessario rispondere rapidamente a Runtime, erano necessari circa 10-15 server. <\/p>\n<p><\/p>\n<p>Ma quando hanno voluto collegare la transazione alla visualizzazione, la situazione \u00e8 cambiata drasticamente. Perch\u00e9? \u00c8 evidente che ora ci sono 30 volte pi\u00f9 eventi da memorizzare. Di conseguenza, sono necessari 30 volte pi\u00f9 server. E questo porta a una cifra astronomica. Mantenere fino a 500 server per effettuare il collegamento, considerando che i server in Runtime sono significativamente meno, produce una cifra inaccettabile. E si \u00e8 iniziato a riflettere su cosa fare. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/7af35f1ade680232cc83a6887891bc5c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E siamo arrivati a ClickHouse. Ma come si pu\u00f2 fare con ClickHouse? A prima vista, sembra una serie di antipattern. <\/p>\n<p><\/p>\n<ul>\n<li>Le transazioni stanno crescendo, e noi stiamo integrando sempre pi\u00f9 eventi, ovvero sono mutate, e ClickHouse non gestisce bene gli oggetti mutabili. <\/li>\n<li>Quando riceviamo un visitatore, dobbiamo estrarre le sue transazioni in base alla chiave, tramite il suo visit id. Anche questo \u00e8 una query puntuale, che non si fa in ClickHouse. Di solito in ClickHouse si effettuano grandi ...scan, mentre qui dobbiamo recuperare solo alcune righe. Anche questo \u00e8 un antipattern. <\/li>\n<li>Inoltre, la transazione era in json, ma non volevano modificarla, quindi desideravano conservare il json in modo non strutturato e, se necessario, estrarre qualcosa da esso. Anche questo \u00e8 un antipattern. <\/li>\n<\/ul>\n<p><\/p>\n<p>Cio\u00e8, un insieme di antipattern. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/2473129a5880ee3172b8ab7bf4afc376.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tuttavia, siamo riusciti a creare un sistema che funziona molto bene. <\/p>\n<p><\/p>\n<p>Cosa \u00e8 stato fatto? \u00c8 stato introdotto ClickHouse, nel quale venivano inviati i log suddivisi in record. \u00c8 emerso un servizio attributo che riceveva i log da ClickHouse. Successivamente, per ogni record, in base all'ID della visita, si ottenevano le transazioni che potevano essere ancora in fase di elaborazione, insieme agli snapshot, ossia transazioni gi\u00e0 collegate, ovvero il risultato del lavoro precedente. Da l\u00ec, gi\u00e0 impostavo la logica, selezionavo la transazione corretta, associavo nuovi eventi. Riscrivevo di nuovo nel log. Il log tornava a ClickHouse, quindi era un sistema continuamente ciclico. Inoltre, veniva inviato all'DWH per l'analisi. <\/p>\n<p><\/p>\n<p>In una tale forma, questo non funzionava molto bene. Per rendere pi\u00f9 semplice ClickHouse, quando arrivava una richiesta per l'ID della visita, raggruppavamo queste richieste in blocchi di 1.000-2.000 ID di visita e estraevamo per 1.000-2.000 persone tutte le transazioni. E cos\u00ec tutto ha cominciato a funzionare.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/d920ce231e6e4b5fd5b27ab28f848aed.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Se si guarda all'interno di ClickHouse, ci sono solo 3 tabelle principali che gestiscono tutto ci\u00f2. <\/p>\n<p><\/p>\n<p>La prima tabella, nella quale vengono caricati i log, \u00e8 in gran parte alimentata senza alcuna elaborazione.<\/p>\n<p><\/p>\n<p>La seconda tabella. Attraverso la vista materializzata, venivano estratti dai log eventi non attribuiti, ovvero quelli non correlati. E attraverso la vista materializzata venivano estratte le transazioni per costruire lo snapshot. Quindi, una vista materializzata speciale costruiva lo snapshot, ossia l'ultima stato accumulato della transazione. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/12b0adb691f483923a6c35bb6e4a5017.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qui \u00e8 scritto un testo in SQL. Vorrei commentare alcune cose importanti. <\/p>\n<p><\/p>\n<p>La prima cosa importante \u00e8 la possibilit\u00e0 di estrarre colonne e campi da json in ClickHouse. Ci sono alcuni metodi in ClickHouse per lavorare con json. Sono molto, molto primitivi. <\/p>\n<p><\/p>\n<p>visitParamExtractInt consente di estrarre attributi da json, ossia il primo trovato scatta. In questo modo \u00e8 possibile estrarre l'ID della transazione o l'ID della visita. Questo \u00e8 uno. <\/p>\n<p><\/p>\n<p>Il secondo punto \u00e8 che qui viene utilizzato un campo materializzato astuto. Cosa significa? Significa che non puoi inserirlo nella tabella, ovvero non viene inserito, viene calcolato e memorizzato al momento dell'inserimento. Durante l'inserimento, ClickHouse fa il lavoro per te. E viene estratto da json ci\u00f2 di cui avrai bisogno in seguito.<\/p>\n<p><\/p>\n<p>In questo caso, la materialized view \u00e8 per le righe non elaborate. Viene utilizzata la prima tabella con log praticamente grezzi. E cosa fa? Prima di tutto, cambia l'ordinamento, cio\u00e8 ora l'ordinamento avviene per visit id, perch\u00e9 dobbiamo estrarre rapidamente la transazione di una specifica persona. <\/p>\n<p><\/p>\n<p>La seconda cosa importante \u00e8 index_granularity. Se hai visto MergeTree, di solito per default si imposta index_granularity a 8.192. Cos'\u00e8? \u00c8 un parametro di sparseness dell'indice. In ClickHouse, l'indice \u00e8 sparso, non indicizza mai ogni singolo record. Lo fa ogni 8.192 record. Questo \u00e8 utile quando \u00e8 necessario calcolare molti dati, ma problematico quando ce ne sono pochi, perch\u00e9 provoca un overhead elevato. E se riduciamo l'index granularity, diminuiamo l'overhead. Non possiamo ridurlo a uno, perch\u00e9 potremmo non avere abbastanza memoria. L'indice \u00e8 sempre conservato in memoria. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/5fe303061977cad64e6c0333b125d595.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E lo snapshot utilizza anche alcune funzioni interessanti di ClickHouse.<\/p>\n<p><\/p>\n<p>Innanzitutto, si tratta di AggregatingMergeTree. E in AggregatingMergeTree viene memorizzato argMax, ovvero lo stato della transazione corrispondente all'ultimo timestamp. Transazioni nuove vengono continuamente generate per questo visitatore. E nello stato pi\u00f9 recente di questa transazione abbiamo aggiunto un evento e abbiamo ottenuto un nuovo stato. Questo \u00e8 tornato in ClickHouse. E attraverso argMax in questa vista materializzata possiamo sempre ottenere lo stato attuale.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/d1b87301ab5206a36bf035679f79d35a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Il legame \u00e8 'disaccoppiato' da Runtime. <\/li>\n<li>Fino a 3 miliardi di transazioni vengono memorizzate e elaborate al mese. Questo \u00e8 di gran lunga superiore rispetto a quanto avveniva in Cassandra, cio\u00e8 in un tipico sistema di transazioni. <\/li>\n<li>Cluster di 2x5 server ClickHouse. 5 server e ogni server ha una replica. Questo \u00e8 addirittura inferiore rispetto a quanto era in Cassandra per realizzare l'attribuzione basata sui click, mentre qui abbiamo l'attribuzione basata sulle impressioni. Cio\u00e8, invece di aumentare il numero di server di 30 volte, siamo riusciti a ridurlo. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/583779fe9e133df519411e2256401eb3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E l'ultimo esempio \u00e8 una compagnia finanziaria Y, che analizzava le correlazioni delle variazioni delle quotazioni azionarie. <\/p>\n<p><\/p>\n<p>La sfida era questa:<\/p>\n<p><\/p>\n<ul>\n<li>Ci sono circa 5.000 azioni. <\/li>\n<li>Le quotazioni sono note ogni 100 millisecondi. <\/li>\n<li>I dati si sono accumulati in 10 anni. Evidentemente, per alcune aziende sono di pi\u00f9, per altre di meno. <\/li>\n<li>In totale ci sono circa 100 miliardi di righe. <\/li>\n<\/ul>\n<p><\/p>\n<p>E bisognava calcolare la correlazione dei cambiamenti. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/b02051e6cadec8c51e7f6e351ef903f9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qui ci sono due azioni e le loro quotazioni. Se una sale e l'altra sale, c'\u00e8 una correlazione positiva, ossia una cresce e l'altra cresce. Se una sale, come alla fine del grafico, e l'altra scende, c'\u00e8 una correlazione negativa, ossia quando una cresce, l'altra scende. <\/p>\n<p><\/p>\n<p>Analizzando queste mutue variazioni, \u00e8 possibile fare previsioni sul mercato finanziario. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/31329cf7523eef6a167632d281a634ce.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ma il compito \u00e8 difficile. Cosa viene fatto per questo? Abbiamo 100 miliardi di registrazioni, in cui ci sono: tempo, azione e prezzo. Dobbiamo prima calcolare 100 miliardi di volte il runningDifference dell'algoritmo del prezzo. RunningDifference \u00e8 una funzione in ClickHouse che calcola la differenza tra due righe in modo sequenziale. <\/p>\n<p><\/p>\n<p>E dopo questo, bisogna calcolare la correlazione, e la correlazione deve essere calcolata per ogni coppia. Per 5.000 azioni, le coppie sono 12,5 milioni. E questo \u00e8 molto, ossia ci sono 12,5 volte di necessit\u00e0 di calcolare una funzione di correlazione. <\/p>\n<p><\/p>\n<p>E se qualcuno si fosse dimenticato, \u035ex e \u035ey sono la media ponderata del campione. Cio\u00e8, non \u00e8 solo necessario calcolare radici e somme, ma anche eseguire altre somme all'interno di queste somme. Bisogna effettuare un sacco di calcoli 12,5 milioni di volte, e bisogna anche raggrupparli per ore. E le ore sono molte anche per noi. E dobbiamo farlo entro 60 secondi. \u00c8 uno scherzo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/567a07f586a824c91671820fe21ec305.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dovevamo riuscire a fare qualcosa, perch\u00e9 tutto questo funzionava molto, molto lentamente, prima che arrivasse ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/3eca1af4c3f25ff4b23fce9b84e16659.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hanno provato a calcolarlo su Hadoop, su Spark, su Greenplum. E tutto ci\u00f2 era molto lento o costoso. Cio\u00e8, si poteva calcolare in un certo modo, ma poi era costoso. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/37608c7e87ddb9a7d54854643044c369.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E poi \u00e8 arrivato ClickHouse e tutto \u00e8 migliorato notevolmente. <\/p>\n<p><\/p>\n<p>Ricordo che abbiamo un problema di localit\u00e0 dei dati, quindi non possiamo localizzare le correlazioni. Non possiamo dividere alcuni dati su un server, altri su un altro e calcolare, dobbiamo avere tutti i dati ovunque. <\/p>\n<p><\/p>\n<p>Cosa hanno fatto? I dati erano inizialmente localizzati. Su ciascun server sono memorizzati i dati relativi ai prezzi di un determinato insieme di azioni. E non si sovrappongono. Pertanto, \u00e8 possibile calcolare logReturn in parallelo e indipendentemente, tutto avviene mentre \u00e8 parallelo e distribuito. <\/p>\n<p><\/p>\n<p>In seguito abbiamo deciso di ridurre questi dati senza perdere espressivit\u00e0. Ridurre utilizzando array, cio\u00e8 creare un array di azioni e un array di prezzi per ogni segmento temporale. In questo modo i dati occupano molto meno spazio. E sono anche un po' pi\u00f9 facili da gestire. Si tratta quasi di operazioni parallele, cio\u00e8 calcoliamo parzialmente in parallelo e poi scriviamo sul server. <\/p>\n<p><\/p>\n<p>Dopo questo, \u00e8 possibile replicare. La lettera 'r' indica che questi dati sono stati replicati. Cio\u00e8 abbiamo dati identici su tutti e tre i server - questi array. <\/p>\n<p><\/p>\n<p>Inoltre, con uno script speciale da questo insieme di 12,5 milioni di correlazioni che devono essere calcolate, possiamo creare pacchetti. Cio\u00e8, 2.500 compiti con 5.000 coppie di correlazioni ciascuno. E calcolare questa operazione su un determinato server ClickHouse. Tutti i dati sono disponibili, poich\u00e9 i dati sono identici e pu\u00f2 calcolarli in modo sequenziale. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/587c6d587a48f2407dd2687f5423d44a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ancora una volta, ecco come appare. Innanzitutto, abbiamo tutti i dati in questa struttura: tempo, azioni, prezzo. Poi abbiamo calcolato il logReturn, ovvero dati della stessa struttura, solo che al posto del prezzo abbiamo il logReturn. Successivamente, li abbiamo rielaborati, quindi abbiamo ottenuto tempo e groupArray per le azioni e i prezzi. Abbiamo effettuato la replica. E dopo questo abbiamo generato una serie di task e li abbiamo dati a ClickHouse affinch\u00e9 li elaborasse. E funziona. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/434e7385aebcffcc03d1bd1a2020c8bf.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nel proof of concept, il compito era una sotto-area, cio\u00e8 abbiamo preso meno dati. E solo su tre server.<\/p>\n<p><\/p>\n<p>Questi primi due passaggi: il calcolo del Log_return e l'imballaggio in array hanno preso circa un'ora ciascuno. <\/p>\n<p><\/p>\n<p>Il calcolo della correlazione ha richiesto circa 50 ore. Ma 50 ore sono poche, perch\u00e9 in passato ci riuscivano solo dopo settimane. \u00c8 stato un grande successo. E se si conta, 70 volte al secondo su questo cluster tutto veniva calcolato.<\/p>\n<p><\/p>\n<p>Ma la cosa pi\u00f9 importante \u00e8 che questo sistema \u00e8 praticamente senza colli di bottiglia, cio\u00e8 scala praticamente in modo lineare. E lo hanno verificato. L'hanno scalato con successo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/5a595a84897e492b49dccfb0f058b1b8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Uno schema corretto \u00e8 met\u00e0 del successo. E uno schema corretto \u00e8 l'uso di tutte le tecnologie necessarie di ClickHouse. <\/li>\n<li>Summing\/AggregatingMergeTrees \u00e8 una tecnologia che consente di aggregare o calcolare uno snapshot di stato come un caso particolare. Questo semplifica notevolmente molte operazioni. <\/li>\n<li>Le Materialized Views consentono di superare la limitazione di un solo indice. Forse non l'ho spiegato chiaramente, ma quando caricavamo i log, i log grezzi erano in una tabella con un solo indice, mentre i log degli attributi erano in un'altra tabella, cio\u00e8 gli stessi dati, ma filtrati, sebbene l'indice fosse completamente diverso. Sembra trattarsi degli stessi dati, ma con ordinamenti diversi. Le Materialized Views permettono, se necessario, di bypassare questa limitazione di ClickHouse. <\/li>\n<li>Riduci la granularit\u00e0 dell'indice per le query puntuali. <\/li>\n<li>Distribuisci i dati in modo intelligente, cercando di localizzare al massimo i dati all'interno del server. E cerca di far s\u00ec che le query utilizzino la localizzazione dove possibile. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/c0fc1737986e3f18ed1d3c53df9f0252.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In sintesi, si pu\u00f2 dire che ClickHouse ha ormai consolidato la sua posizione sia nel campo dei database commerciali che nelle soluzioni open source, in particolare per l'analisi. Si \u00e8 perfettamente integrato in questo panorama e, anzi, sta lentamente iniziando a soppiantare altri sistemi; quando c'\u00e8 ClickHouse, non avete bisogno di InfiniDB. Forse Vertica diventer\u00e0 superflua, se implementeranno un buon supporto per SQL. Utilizzatelo!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;utilizzo di ClickHouse in applicazioni reali. Alessandro Zaicev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/6e9a65d32eb6de7f9f139a30e7ab0d25.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u2014<em>Grazie per la presentazione! \u00c8 stato molto interessante! Ci sono stati confronti con Apache Phoenix?<\/em><\/p>\n<p><\/p>\n<p>-No, non ho sentito parlare di confronti. Noi di Yandex cerchiamo di monitorare tutti i confronti di ClickHouse con altri database. Se per caso qualcosa si dimostra pi\u00f9 veloce di ClickHouse, allora Alexey Milovidov non riesce a dormire e inizia rapidamente a migliorarlo. Non sono a conoscenza di tale confronto. <\/p>\n<p><\/p>\n<ul>\n<li>\n<p><em>(\u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041c\u0438\u043b\u043e\u0432\u0438\u0434\u043e\u0432) Apache Phoenix \u00e8 un motore SQL basato su Hbase. Hbase \u00e8 principalmente progettato per scenari di lavoro tipo key-value. Ogni riga pu\u00f2 avere un numero arbitrario di colonne con nomi a piacere. Questo vale per sistemi come Hbase e Cassandra. Tuttavia, su di essi, le query analitiche pesanti non funzioneranno bene. Oppure potreste pensare che funzionino normalmente, se non avete avuto esperienza con ClickHouse.<\/em><\/p>\n<p>\n<\/li>\n<li>\n<p>Grazie<\/p>\n<p><\/p>\n<ul>\n<li>\n<p><em>Buongiorno! Mi sono interessato a questo argomento da un po' di tempo, perch\u00e9 ho un sottosistema analitico. Ma quando guardo ClickHouse, ho l'impressione che ClickHouse sia molto adatto per l'analisi di eventi e dati mutabili. E se devo analizzare molti dati di business con enormi tabelle, ClickHouse, a quanto pare, non \u00e8 molto adatto per me? Soprattutto se i dati cambiano. \u00c8 corretto o ci sono esempi che potrebbero contraddirlo?<\/em><\/p>\n<p>\n<\/li>\n<li>\n<p>\u00c8 corretto. E questo \u00e8 vero per la maggior parte dei database analitici specializzati. Sono progettati per gestire una o pi\u00f9 grandi tabelle che sono mutabili, e molte piccole tabelle che cambiano lentamente. Cio\u00e8, ClickHouse non \u00e8 come Oracle, dove puoi inserire tutto e costruire query molto complesse. Per utilizzare ClickHouse in modo efficace, \u00e8 necessario costruire lo schema in un modo che funzioni bene in ClickHouse. Cio\u00e8, evitare l'eccessiva normalizzazione, utilizzare dizionari e cercare di avere meno legami lunghi. Se lo schema viene costruito in questo modo, allora compiti aziendali simili su ClickHouse possono essere risolti in modo molto pi\u00f9 efficiente rispetto a un tradizionale database relazionale. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><em>Grazie per la presentazione! Ho una domanda riguardo all'ultimo caso finanziario. Avevano un'analisi. Dovevano confrontare come andavano su e gi\u00f9. E ho capito che avete costruito il sistema proprio per questa analisi? Se domani, ad esempio, avessero bisogno di un altro report su questi dati, devono ricostruire nuovamente lo schema e caricare i dati? Cio\u00e8, fare qualche pre-elaborazione per ottenere la query?<\/em><\/p>\n<p><\/p>\n<p>Certo, si tratta di utilizzare ClickHouse per un compito specifico. Tradizionalmente, questo potrebbe essere risolto all'interno di Hadoop. Per Hadoop, \u00e8 un compito ideale. Ma su Hadoop \u00e8 molto lento. E il mio obiettivo \u00e8 dimostrare che con ClickHouse si possono affrontare compiti che di solito sono risolti con mezzi completamente diversi, ma in modo molto pi\u00f9 efficiente. \u00c8 adattato a un compito specifico. \u00c8 chiaro che se c'\u00e8 un compito simile, allora pu\u00f2 essere affrontato in modo simile. <\/p>\n<p><\/p>\n<p><em>Chiaro. Ha detto che sono state elaborate 50 ore. Questo a partire dall'inizio, quando avete caricato i dati o dopo aver ottenuto i risultati?<\/em><\/p>\n<p><\/p>\n<p>S\u00ec, s\u00ec.<\/p>\n<p><\/p>\n<p><em>Bene, grazie mille.<\/em><\/p>\n<p><\/p>\n<p>Questo su un cluster di 3 server. <\/p>\n<p><\/p>\n<p><em>Salve! Grazie per la presentazione! \u00c8 tutto molto interessante. Vorrei chiedere un po' meno sulle funzionalit\u00e0 e pi\u00f9 sull'uso di ClickHouse in termini di stabilit\u00e0. \u00c8 successo che vi siano stati problemi, avete dovuto ripristinare? Come si comporta ClickHouse in queste situazioni? \u00c8 mai capitato che si verificassero dei downtime anche per la replica? Noi, ad esempio, abbiamo riscontrato un problema con ClickHouse, dove comunque supera il suo limite e va in crash.<\/em><\/p>\n<p><\/p>\n<p>Certo, non esistono sistemi perfetti. Anche ClickHouse ha i suoi problemi. Ma avete mai sentito parlare di Yandex.Metrica che non funziona a lungo? Probabilmente no. Funziona in modo affidabile dal 2012-2013 su ClickHouse. Posso anche condividere la mia esperienza. Non abbiamo mai avuto guasti completi. Alcuni problemi parziali possono verificarsi, ma non sono mai stati critici al punto da influenzare seriamente il business. Non \u00e8 mai successo. ClickHouse \u00e8 suficiente affidabile e non cade casualmente. Non c'\u00e8 bisogno di preoccuparsi. Non \u00e8 una cosa grezza. \u00c8 dimostrato da molte aziende. <\/p>\n<p><\/p>\n<p><em>Buongiorno! Hai detto che \u00e8 necessario pensare attentamente allo schema dei dati fin dall'inizio. E se questo non \u00e8 successo? I miei dati fluiscono e fluiscono. Passa mezzo anno e realizzo che non posso continuare cos\u00ec, devo ricaricare i dati e fare qualcosa con essi.<\/em> <\/p>\n<p><\/p>\n<p>Dipende, ovviamente, dal tuo sistema. Ci sono diversi modi per farlo praticamente senza interruzioni. Ad esempio, puoi creare una Materialized View con una diversa struttura dati, se pu\u00f2 essere mappata in modo univoco. Cio\u00e8, se consente di mappare attraverso ClickHouse, quindi estrarre alcune cose, cambiare la chiave primaria, modificare la partizione, si pu\u00f2 creare una Materialized View. L\u00ec puoi riscrivere i tuoi vecchi dati, i nuovi verranno scritti automaticamente. E poi basta passare all'utilizzo della Materialized View, poi cambiare la scrittura e eliminare la vecchia tabella. Questo \u00e8 un metodo che non richiede interruzioni. <\/p>\n<p><\/p>\n<p><em>Grazie.<\/em><\/p>\n<p>Fonte: <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 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\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\" \/>\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\/it\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-clickhouse-v-realnyh-prilozheniyah-aleksandr-zajczev-2018g\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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:description\" content=\"\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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/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\udd47Teoria e pratica dell'utilizzo di ClickHouse in applicazioni reali. Alexander Zaytsev (2018) | ProHoster","description":"Nonostante ci siano molti dati praticamente ovunque, i database analitici sono ancora piuttosto esotici. Sono poco conosciuti e ancor meno utilizzati in modo efficace. Molti continuano a \"mangiare il cactus\" con MySQL o PostgreSQL, che sono progettati per altri scenari, a lottare con NoSQL o a pagare troppo per soluzioni commerciali. ClickHouse cambia le regole del gioco e riduce significativamente la barriera all'ingresso.","canonical_url":"https:\/\/prohoster.info\/it\/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":"it_IT","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:description":"\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","og:url":"https:\/\/prohoster.info\/it\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/89878","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=89878"}],"version-history":[{"count":2,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/89878\/revisions"}],"predecessor-version":[{"id":162171,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/89878\/revisions\/162171"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/89879"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=89878"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=89878"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=89878"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}