{"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'uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/b46b964324a3311157d5df737526b1d1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nonostante ci siano dati praticamente ovunque, i database analitici sono ancora piuttosto esotici. Sono poco conosciuti e ancora meno utilizzati in modo efficace. Molti continuano a \"mangiare il cactus\" con MySQL o PostgreSQL, progettati per altri scenari, a lottare con NoSQL o a pagare troppo per soluzioni commerciali. ClickHouse cambia le regole del gioco e abbassa significativamente la barriera d'ingresso nel mondo dei DBMS analitici.<\/p>\n<p><\/p>\n<p>Presentazione al 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=\"Guarda il 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;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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 dello sviluppo di LifeStreet, che utilizza ClickHouse. Inoltre, sono il fondatore di Altinity. Questo \u00e8 un partner di Yandex, che promuove ClickHouse e aiuta Yandex a rendere ClickHouse pi\u00f9 prospere. Sono anche pronto a condividere conoscenze su ClickHouse. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/36af6acba62271f7aa19dda2eb470870.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E non sono il fratello di Petya Zaytsev. Me lo chiedono spesso. No, non siamo fratelli.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/6ca605f97619a1373bb8a92f88d480d5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00ab\u00c8 risaputo\u00bb che ClickHouse:<\/p>\n<p><\/p>\n<ul>\n<li>\u00c8 molto veloce,<\/li>\n<li>\u00c8 molto comodo, <\/li>\n<li>\u00c8 usato in Yandex. <\/li>\n<\/ul>\n<p><\/p>\n<p>\u00c8 un po' meno noto in quali aziende e come viene utilizzato. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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 cosa, dove e come viene utilizzato ClickHouse, oltre a Yandex. <\/p>\n<p><\/p>\n<p>Parler\u00f2 di come compiti specifici vengono risolti utilizzando ClickHouse in diverse aziende, quali strumenti ClickHouse potete utilizzare per i vostri compiti e come sono stati utilizzati in diverse 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;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/d3cab92ceccd6c7d01ca1f28b028803f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La prima domanda: \u00abA cosa serve ClickHouse?\u00bb. Sembra una domanda piuttosto ovvia, ma ci sono pi\u00f9 risposte di una sola. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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 per le prestazioni. ClickHouse \u00e8 molto veloce. L'analisi su ClickHouse \u00e8 anche molto rapida. Spesso pu\u00f2 essere utilizzato dove qualcos'altro funziona molto lentamente o in modo molto scarso. <\/li>\n<li>La seconda risposta \u00e8 il costo. E prima di tutto il costo della scalabilit\u00e0. Ad esempio, Vertica \u00e8 un database completamente diverso. Funziona molto bene se non avete molte terabyte di dati. Ma quando si parla di centinaia di terabyte o petabyte, il costo della licenza e del supporto diventa una somma piuttosto sostanziosa. E questo \u00e8 costoso. Mentre ClickHouse \u00e8 gratuito. <\/li>\n<li>La terza risposta \u00e8 il costo operativo. Questo \u00e8 un approccio un po' diverso. RedShift \u00e8 un ottimo analogo. Su RedShift puoi implementare una soluzione molto rapidamente. Funzioner\u00e0 bene, ma ogni ora, ogni giorno e ogni mese dovrai pagare abbastanza caro Amazon, perch\u00e9 \u00e8 un servizio realmente costoso. Anche Google BigQuery lo \u00e8. Chiunque lo abbia utilizzato sa che puoi eseguire diverse query e ricevere all'improvviso una fattura di centinaia di dollari. <\/li>\n<\/ul>\n<p><\/p>\n<p>In ClickHouse non ci sono questi problemi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/3084a8bd9271f14726d73989946816c5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dove viene attualmente utilizzato ClickHouse? Oltre a Yandex, ClickHouse \u00e8 usato in un sacco di aziende e attivit\u00e0 diverse. <\/p>\n<p><\/p>\n<ul>\n<li>Prima di tutto, si tratta di analisi delle web app, cio\u00e8 \u00e8 un caso d'uso venuto da Yandex.<\/li>\n<li>Molte aziende AdTech utilizzano ClickHouse. <\/li>\n<li>Numerose aziende che hanno bisogno di analizzare i log operativi da diverse fonti.<\/li>\n<li>Alcune aziende utilizzano ClickHouse per monitorare i log di sicurezza. Li caricano in ClickHouse, generano report e ottengono i risultati di cui hanno bisogno.<\/li>\n<li>Le aziende iniziano a utilizzarlo per analisi finanziaria, cio\u00e8 gradualmente anche le grandi aziende si avvicinano a ClickHouse. <\/li>\n<li>CloudFlare. Chiunque segua ClickHouse avr\u00e0 sicuramente sentito il nome di questa azienda. \u00c8 uno dei principali contributori della community. Hanno anche un'installazione di ClickHouse molto seria. Ad esempio, hanno creato un Kafka Engine per ClickHouse. <\/li>\n<li>Le aziende di telecomunicazioni hanno iniziato ad usarlo. Diverse aziende utilizzano ClickHouse sia come prova di concetto che gi\u00e0 in produzione.<\/li>\n<li>Un'azienda utilizza ClickHouse per monitorare i processi produttivi. Testano i chip, annotano un sacco di parametri, circa 2.000 caratteristiche. E poi analizzano se il lotto \u00e8 buono o cattivo.<\/li>\n<li>Analisi della blockchain. C'\u00e8 un'azienda russa chiamata Bloxy.info. Si occupano dell'analisi della rete ethereum. Anche questo l'hanno realizzato su ClickHouse. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/8a0c1924a20ed2d15cd0f959e9b3e499.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tra l'altro, le dimensioni non contano. Ci sono molte aziende che utilizzano un piccolo server. E questo permette di risolvere i loro problemi. E ancora pi\u00f9 aziende utilizzano grandi cluster di 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, allora:<\/p>\n<p><\/p>\n<ul>\n<li>Yandex: oltre 500 server, 25 miliardi di record al giorno che salvano l\u00ec.<\/li>\n<li>LifeStreet: 60 server, circa 75 miliardi di record al giorno. Meno server, pi\u00f9 record rispetto a Yandex. <\/li>\n<li>CloudFlare: 36 server, 200 miliardi di record al giorno che conservano. Hanno ancora meno server e molti 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. Leader nel numero di record.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/49194030b6586221cb17029889ce33da.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Geograficamente, questo \u00e8 molto. Questa mappa mostra la heatmap, dove ClickHouse \u00e8 utilizzato nel mondo. Qui si evidenziano Russia, Cina, America. Ci sono poche nazioni europee. Si possono identificare 4 cluster.<\/p>\n<p><\/p>\n<p>Questo \u00e8 un'analisi comparativa, qui non \u00e8 necessario cercare cifre assolute. \u00c8 un'analisi dei visitatori che leggono materiale in inglese sul sito di Altinity, poich\u00e9 non ci sono materiali in russo. E Russia, Ucraina, Bielorussia, cio\u00e8 la parte russofona della comunit\u00e0, \u00e8 la pi\u00f9 numerosa. Seguono gli USA e il Canada. La Cina sta recuperando molto rapidamente. Sei mesi fa la Cina era quasi inesistente, ora ha gi\u00e0 superato l'Europa e continua a crescere. Anche la vecchia Europa non rimane indietro, e, sorprendentemente, il leader nell'uso di ClickHouse \u00e8 la Francia. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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 ampiamente utilizzato.<\/strong> Se lo usi, sei nel giusto trend. Se non lo stai ancora usando, non temere di rimanere solo e di non avere aiuto, perch\u00e9 gi\u00e0 molte persone lo stanno facendo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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: migrazione da Vertica a ClickHouse. Conosco diverse aziende che sono passate a ClickHouse da Vertica o sono in fase di transizione. <\/li>\n<li>Il secondo esempio \u00e8 un magazzino transazionale su ClickHouse. Questo esempio \u00e8 costruito su antipattern. Tutto ci\u00f2 che non si dovrebbe fare in ClickHouse secondo i consigli degli sviluppatori \u00e8 stato fatto qui. E, tuttavia, \u00e8 stato fatto in modo cos\u00ec efficace che funziona. E funziona molto meglio di una tipica soluzione transazionale. <\/li>\n<li>Il terzo esempio \u00e8 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 di map reduce, prestando attenzione alla localizzazione dei dati, ecc., per risolvere un compito molto non banale. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr 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 \u00c8 una azienda nel settore Ad Tech che ha tutte le tecnologie associate a una rete pubblicitaria. <\/li>\n<li>Si occupa di ottimizzazione degli annunci, programmatic bidding. <\/li>\n<li>Molti dati: circa 10 miliardi di eventi al giorno. Inoltre, gli eventi possono dividersi in pi\u00f9 sotto-eventi.<\/li>\n<li>Molti clienti per questi dati, e non sono solo persone; ci sono molti di pi\u00f9: sono vari algoritmi che si occupano dell'offerta programmatica. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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 a HighLoad. Inizialmente, LifeStreet \u00e8 passata da MySQL (con una breve sosta su Oracle) a Vertica. \u00c8 possibile trovare racconti al riguardo. <\/p>\n<p><\/p>\n<p>Tutto andava molto bene, ma \u00e8 diventato chiaro abbastanza rapidamente che i dati crescevano e Vertica era costoso. Quindi si cercavano varie alternative. Alcune di esse sono elencate qui. In effetti, abbiamo realizzato un proof of concept o test di performance per quasi tutti i database che erano disponibili sul mercato dal 2013 al 2016 e che erano abbastanza adeguati in termini di funzionalit\u00e0. Di parte di essi ho anche parlato a HighLoad.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/4bebd2f43892cbef9249ddded1b8a70a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La sfida era migrare da Vertica in primo luogo, perch\u00e9 i dati crescevano. E sono cresciuti esponenzialmente per diversi anni. Poi sono stati stabili, ma comunque. Prevedendo questa crescita e la richiesta aziendale relativa al volume dei dati per l'analisi, era chiaro che presto si sarebbe parlato di petabyte. E pagare per i petabyte \u00e8 gi\u00e0 molto costoso, quindi si cercava un'alternativa alla quale migrare. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/f170a4307168e8560122966eab85c24e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dove migrare? A lungo non \u00e8 stato chiaro dove andare, perch\u00e9 da un lato ci sono database commerciali, che sembrano funzionare piuttosto bene. Alcuni funzionano quasi altrettanto bene come Vertica, altri peggio. Ma sono tutti costosi; non si riusciva a trovare nulla di migliore e pi\u00f9 economico. <\/p>\n<p><\/p>\n<p>Dall'altro lato, ci sono soluzioni open source, non tante, cio\u00e8 per l'analisi si possono contare sulle dita. E sono gratuite o economiche, ma funzionano lentamente. E spesso mancano della funzionalit\u00e0 necessaria e utile.<\/p>\n<p><\/p>\n<p>E nulla riusciva a combinare il meglio delle basi di dati commerciali e tutto ci\u00f2 che \u00e8 disponibile gratuitamente nel mondo open source. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/abbefbf0d9578b554f81579b87213a50.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nulla finch\u00e9, inaspettatamente, Yandex non ha tirato fuori ClickHouse, come un coniglio da un cappello da prestigiatore. \u00c8 stata una soluzione inaspettata, ancora oggi si pongono domande: \u00abPerch\u00e9?\u00bb, ma tuttavia. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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 guardare cosa fosse ClickHouse. E si \u00e8 scoperto che a volte pu\u00f2 essere pi\u00f9 veloce di Vertica. Abbiamo testato diversi scenari su varie query. E se la query utilizzava solo una tabella, ossia senza alcun join, ClickHouse era due volte pi\u00f9 veloce di Vertica. <\/p>\n<p><\/p>\n<p>Non mi sono risparmiato e ho controllato ulteriori test di Yandex nei giorni scorsi. L\u00ec \u00e8 lo stesso: ClickHouse \u00e8 due volte pi\u00f9 veloce di Vertica, quindi ne parlano spesso. <\/p>\n<p><\/p>\n<p>Ma se nelle query ci sono join, le cose non sono molto chiare. E ClickHouse pu\u00f2 essere due volte pi\u00f9 lento di Vertica. Se si modifica leggermente la query e la si riscrive, allora sono pi\u00f9 o meno uguali. Non male. E gratuito. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/188bf56b72123175a18d2cb97d989a47.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E ottenuti i risultati dei test, e guardando da diverse angolazioni, LifeStreet \u00e8 passato a ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/1183b9b7681916686c52786fc95ccb45.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ricordo che siamo nel 2016. Era come nella barzelletta sui topi, che piangevano e si pungevano, ma continuavano a mangiare il cactus. Ne hanno parlato in dettaglio, ci sono video al riguardo, ecc. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/993052ed83dc295c3777e614c7703456.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Non entrer\u00f2 nei dettagli, parler\u00f2 solo dei risultati e di alcune cose interessanti che non ho menzionato allora. <\/p>\n<p><\/p>\n<p>I risultati sono questi:<\/p>\n<p><\/p>\n<ul>\n<li>Migrazione riuscita e il sistema funziona gi\u00e0 in produzione da oltre un anno. <\/li>\n<li>Le prestazioni e la flessibilit\u00e0 sono aumentate. Da 10 miliardi di record che potevamo permetterci di mantenere per un giorno e per poco tempo, ora LifeStreet conserva 75 miliardi di record al giorno e pu\u00f2 farlo per 3 mesi o pi\u00f9. Se calcoliamo ai picchi, si salvano fino a un milione di eventi al secondo. Pi\u00f9 di un milione di query SQL al giorno arrivano a questo sistema, principalmente da vari bot. <\/li>\n<li>Nonostante per ClickHouse siano stati utilizzati pi\u00f9 server rispetto a Vertica, c'\u00e8 stato un risparmio anche sull'hardware, poich\u00e9 in Vertica venivano utilizzati dischi SAS piuttosto costosi. In ClickHouse sono stati usati dischi SATA. E perch\u00e9? Perch\u00e9 in Vertica l'inserimento \u00e8 sincronizzato. E la sincronizzazione richiede che i dischi non rallentino troppo, cos\u00ec come che la rete non rallenti troppo, ossia \u00e8 un'operazione piuttosto costosa. In ClickHouse l'inserimento \u00e8 asincrono. Inoltre, si pu\u00f2 sempre scrivere in locale, senza costi aggiuntivi per questo, quindi i dati in ClickHouse possono essere inseriti molto pi\u00f9 velocemente che in Vertica anche su dischi non tra i pi\u00f9 veloci. E per la lettura \u00e8 pi\u00f9 o meno lo stesso. La lettura su SATA, se sono in RAID, \u00e8 sufficientemente veloce. <\/li>\n<li>Non limitato dalla licenza, ovvero 3 petabyte di dati su 60 server (20 server sono una replica) e 6 trilioni di record in fatti e aggregati. Nulla di simile poteva permettersi con Vertica. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/f461cdc12917ee655655dd7eb9c32bb2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ora passo alle questioni pratiche in questo esempio.<\/p>\n<p><\/p>\n<ul>\n<li>Primo: \u00e8 uno schema efficiente. Dallo schema dipende molto. <\/li>\n<li>Secondo: \u00e8 la generazione di SQL efficiente.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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. Parte delle colonne va in group by, parte delle colonne va in funzioni aggregate. C'\u00e8 un where, che pu\u00f2 essere visto come un'istantanea del cubo. L'intero group by pu\u00f2 essere considerato una proiezione. E per questo si chiama analisi multidimensionale dei dati. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/a03a2d7fd28905ae83183346f0c673e2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E spesso viene modellato come uno schema a stella, con un fatto centrale e le sue caratteristiche ai lati, ai raggi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/d9671af4b39cc83e1ae49e6fd75d0e02.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E dal punto di vista del design fisico, di come questo si dispone sulle tabelle, di solito si fa una rappresentazione normalizzata. Puoi denormalizzare, ma \u00e8 costosa in termini di spazio su disco e non molto efficiente per le query. Pertanto, di solito si fa una rappresentazione normalizzata, ovvero una tabella dei fatti e molte, molte tabelle di dimensioni. <\/p>\n<p><\/p>\n<p>Ma in ClickHouse questo funziona male. Ci sono due motivi: <\/p>\n<p><\/p>\n<ul>\n<li>Il primo \u00e8 che in ClickHouse non ci sono un buon supporto per i join, ovvero i join ci sono, ma sono scadenti. Attualmente scadenti. <\/li>\n<li>Il secondo \u00e8 che le tabelle non si aggiornano. Di solito in queste tabelle, che circondano lo schema a stella, c'\u00e8 bisogno di 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>E ci sono soluzioni a questo in ClickHouse. Anzi, ce ne sono due: <\/p>\n<p><\/p>\n<ul>\n<li>La prima \u00e8 l'uso dei dizionari. I Dizionari Esterni aiutano a risolvere il 99% del problema con lo schema a stella, con gli aggiornamenti e altro. <\/li>\n<li>La seconda \u00e8 l'uso degli array. Gli array aiutano anche a eliminare i join e i problemi di normalizzazione. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/775972cc412651600799173407384492.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Non \u00e8 necessario un join. <\/li>\n<li>Aggiornabili. Da marzo 2018 \u00e8 stata introdotta una possibilit\u00e0 non documentata (che non troverai nella documentazione) di aggiornare i dizionari parzialmente, cio\u00e8 solo quei record che sono cambiati. Praticamente \u00e8 come una tabella.<\/li>\n<li>Sempre in memoria, quindi i join con il dizionario funzionano pi\u00f9 velocemente rispetto a una tabella che \u00e8 sul disco e non \u00e8 nemmeno certo che sia nella cache, molto probabilmente no. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/f73176a650b6d885011e3265c2af2fc3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Nemmeno un join \u00e8 necessario.<\/li>\n<li>Questa \u00e8 una rappresentazione compatta 1 a molti. <\/li>\n<li>E a mio avviso, gli array sono fatti per i nerd. Sono funzioni lambda e altro. <\/li>\n<\/ul>\n<p><\/p>\n<p>Non \u00e8 solo una frase ad effetto. \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;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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 gestire gli array. Questi esempi sono semplici e abbastanza esplicativi:<\/p>\n<p><\/p>\n<ul>\n<li>Ricerca per tag. Se hai hashtag e desideri trovare alcune registrazioni per un hashtag. <\/li>\n<li>Ricerca per coppie chiave-valore. Ci sono anche alcuni attributi con un valore. <\/li>\n<li>Memorizzazione di elenchi di chiavi che devi convertire in qualcos'altro.<\/li>\n<\/ul>\n<p><\/p>\n<p>Tutte queste attivit\u00e0 possono essere svolte senza array. I tag possono essere messi in una riga e selezionati con un'espressione regolare o in una tabella separata, ma in tal caso dovrai fare join.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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 di stringhe per gli hashtag o creare una struttura annidata per sistemi di tipo chiave-valore.<\/p>\n<p><\/p>\n<p>La struttura annidata potrebbe non essere il termine pi\u00f9 accurato. 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. Esiste una funzione <code>has<\/code>, che verifica se un elemento \u00e8 presente nell'array. Ecco, abbiamo trovato tutte le registrazioni relative alla nostra conferenza.<\/p>\n<p><\/p>\n<p>La ricerca per subid \u00e8 un po' pi\u00f9 complessa. Prima dobbiamo trovare l'indice della chiave, poi prendere l'elemento con quell'indice e controllare se il valore \u00e8 quello che ci serve. Eppure, \u00e8 molto semplice e compatto.<\/p>\n<p><\/p>\n<p>L'espressione regolare che vorresti scrivere, se tutto ci\u00f2 fosse memorizzato in una sola riga, sarebbe, per prima cosa, molto goffa. E, per seconda, funzionerebbe molto pi\u00f9 a lungo rispetto a due array. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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 convertirli in nomi. La funzione <code>arrayMap<\/code>. \u00c8 una tipica funzione lambda. Le espressioni lambda vengono passate. E per ogni ID del dizionario estrae il valore del nome.<\/p>\n<p><\/p>\n<p>Allo stesso modo si pu\u00f2 fare anche la ricerca. Viene passata 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;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/146917b71a35d38a550cd9accf6ab2f7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Queste funzionalit\u00e0 semplificano notevolmente lo schema e risolvono molte problematiche. <\/p>\n<p><\/p>\n<p>Ma il problema successivo, con cui ci siamo confrontati 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, \u00e8 necessario pianificare comunque query complesse. In quali casi? <\/li>\n<li>Se nella query ci sono pi\u00f9 join che stai annidando in sottoquery. E l'ordine in cui vengono eseguiti \u00e8 importante. <\/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 passato a un singolo server a cui ti sei connesso e viene eseguito l\u00ec. Quindi, se hai query distribuite con molti join, devi selezionare l'ordine. <\/li>\n<\/ul>\n<p><\/p>\n<p>E anche nei casi pi\u00f9 semplici a volte \u00e8 opportuno fare il lavoro del pianificatore e riscrivere un po' le query. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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 c'\u00e8 la query che mostra le prime 5 nazioni. E impiega 2,5 secondi, secondo me. A destra c'\u00e8 la stessa query, ma leggermente riscritta. Invece di raggruppare per stringa, abbiamo iniziato a raggruppare per chiave (int). E questo \u00e8 pi\u00f9 veloce. Poi abbiamo collegato il dizionario al risultato. Invece di 2,5 secondi, la query impiega 1,5 secondi. Questo \u00e8 buono. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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 sulla Russia. Impiega 5 secondi. Se la riscriviamo in modo da confrontare di nuovo non stringhe, ma numeri con un certo insieme di chiavi che riguardano la Russia, sar\u00e0 molto pi\u00f9 veloce. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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 del genere. E permettono di accelerare notevolmente le query che sembra gi\u00e0 funzionino rapidamente, o al contrario, funzionino lentamente. Possono essere rese ancora pi\u00f9 veloci.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/25b132790b03f239e38237af5e92ab63.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Massima lavorazione in modalit\u00e0 distribuita. <\/li>\n<li>Ordinamento per tipologia minima, come ho fatto con gli interi. <\/li>\n<li>Se ci sono dei join, dizionari, \u00e8 meglio farli come ultima cosa, quando hai gi\u00e0 i dati almeno parzialmente raggruppati, cos\u00ec l'operazione di join o la chiamata al dizionario sar\u00e0 invocata meno volte e sar\u00e0 pi\u00f9 veloce. <\/li>\n<li>Sostituzione dei filtri. <\/li>\n<\/ul>\n<p><\/p>\n<p>Ci sono anche altre tecniche, non solo quelle che ho dimostrato. E tutte queste consentono di accelerare a volte in modo significativo l'esecuzione delle query.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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 un compito: <\/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;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/0136b71a1205512d86f13e86761146f4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qual \u00e8 lo scenario?<\/p>\n<p><\/p>\n<p>Un visitatore normale entra nel sito, ad esempio, 20 volte al mese da diversi annunci o semplicemente arriva occasionalmente senza alcun annuncio, perch\u00e9 ricorda questo sito. Osserva alcuni prodotti, li mette nel carrello, 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?\". Ossia, perch\u00e9 ha acquistato e come fare in modo che persone simili a lui acquistino anch'esse?<\/p>\n<p><\/p>\n<p>Per risolvere questo compito, \u00e8 necessario collegare correttamente gli eventi che si verificano sul sito web, ossia costruire un legame tra di essi. Poi \u00e8 necessario inviarli per analisi in DWH. E sulla base di questa analisi costruire modelli su chi e quale pubblicit\u00e0 mostrare.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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 collegati dell'utente, che inizia con la visualizzazione di un annuncio, poi accade qualcosa, e successivamente potrebbe esserci un acquisto, e poi ci potrebbero essere acquisti all'interno dell'acquisto. Ad esempio, se si tratta di un'app mobile o di un gioco mobile, di solito l'installazione dell'app \u00e8 gratuita, mentre se si fa qualcosa in pi\u00f9, potrebbero essere richiesti dei soldi. E pi\u00f9 una persona spende nell'app, pi\u00f9 \u00e8 preziosa. Ma per questo \u00e8 necessario collegare tutto. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/a2213613f1ef660409124ef8bcdd4fe3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ci sono molti 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 interaction pu\u00f2 essere un clic o una visualizzazione.<\/li>\n<li>First Interaction, ossia la prima cosa che ha portato l'utente sul sito.<\/li>\n<li>Combinazione lineare \u2013 a tutti lo stesso valore. <\/li>\n<li>Diminuzione.<\/li>\n<li>E altro ancora. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/9523307d557e094d981da5b525ed0b59.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E come ha funzionato tutto questo originariamente? C'era Runtime e Cassandra. Cassandra veniva utilizzata come archivio delle transazioni, ossia conteneva tutte le transazioni correlate. E quando arrivava un certo evento in Runtime, ad esempio, la visualizzazione di una certa pagina o altro, si faceva una richiesta a Cassandra \u2013 c'\u00e8 questa persona o no. Poi si estraevano le transazioni che le appartenevano. E si effettuava il collegamento.<\/p>\n<p><\/p>\n<p>E se si aveva fortuna, e nella richiesta c'era un transaction id, era facile. Ma di solito non si ha fortuna. Pertanto, era necessario trovare l'ultima transazione o la transazione con l'ultimo clic e cos\u00ec via. <\/p>\n<p><\/p>\n<p>E questo funzionava molto bene, fino a quando il collegamento era legato all'ultimo clic. Perch\u00e9 ci sono, diciamo, 10 milioni di clic al giorno, 300 milioni al mese, se si imposta una finestra di un mese. E poich\u00e9 in Cassandra tutto questo deve essere in memoria affinch\u00e9 funzioni rapidamente, dato che richiede a Runtime di rispondere velocemente, servivano circa 10-15 server. <\/p>\n<p><\/p>\n<p>Ma quando si \u00e8 voluto collegare la transazione alla visualizzazione, \u00e8 diventato subito meno divertente. E perch\u00e9? \u00c8 evidente che servono 30 volte pi\u00f9 eventi da memorizzare. E quindi ci vogliono 30 volte pi\u00f9 server. E risulta che \u00e8 una cifra astronomica. Mantenere fino a 500 server per fare il collegamento, mentre in Runtime ci sono significativamente meno server, \u00e8 una cifra non corretta. E hanno iniziato a pensare a cosa fare. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/7af35f1ade680232cc83a6887891bc5c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E sono arrivati a ClickHouse. Ma come farlo su ClickHouse? A prima vista sembra un insieme di antipattern. <\/p>\n<p><\/p>\n<ul>\n<li>La transazione cresce, noi le attacchiamo eventi sempre nuovi, cio\u00e8 \u00e8 mutabile, ed ClickHouse non lavora molto bene con oggetti mutabili. <\/li>\n<li>Quando un visitatore arriva, dobbiamo estrarre le sue transazioni per chiave, per il suo visit id. Anche questa \u00e8 una query punto, e in ClickHouse non si fa cos\u00ec. Di solito in ClickHouse ci sono grandi... scansioni, ma qui dobbiamo recuperare alcune registrazioni. Anche questo \u00e8 un antipattern. <\/li>\n<li>Inoltre, la transazione era in json, ma non volevano riscriverla, quindi volevano memorizzare json in modo non strutturato, e se necessario, estrarre qualcosa da esso. E questo \u00e8 anche 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;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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 fare un sistema che ha funzionato molto bene. <\/p>\n<p><\/p>\n<p>Cosa \u00e8 stato fatto? \u00c8 stato introdotto ClickHouse, nel quale venivano caricati i log, suddivisi in registrazioni. \u00c8 emerso un servizio attribuito, che riceveva i log da ClickHouse. Successivamente, per ogni registrazione, per visit id, si ottenevano le transazioni che potevano essere ancora non elaborate, pi\u00f9 gli snapshot, cio\u00e8 transazioni gi\u00e0 collegate, ovvero il risultato del lavoro precedente. Da esse si elaborava gi\u00e0 la logica, si selezionava la transazione corretta, si collegavano nuovi eventi. Si registrava di nuovo nel log. Il log tornava in ClickHouse, cio\u00e8 \u00e8 un sistema ciclico costante. Inoltre, andava in DWH per essere analizzato. <\/p>\n<p><\/p>\n<p>In questo modo non funzionava molto bene. E per facilitare le cose a ClickHouse, quando si effettuava una richiesta per visit id, raggruppavamo queste richieste in blocchi da 1.000 a 2.000 visit id 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;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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 si occupano di tutto ci\u00f2. <\/p>\n<p><\/p>\n<p>La prima tabella in cui vengono caricati i log, i quali vengono caricati praticamente senza elaborazione.<\/p>\n<p><\/p>\n<p>La seconda tabella. Attraverso una materialized view, venivano estratti dai log gli eventi non ancora attribuiti, cio\u00e8 non correlati. E attraverso la materialized view venivano estratte le transazioni per costruire uno snapshot. Cio\u00e8, una materiale view speciale costruiva lo snapshot, ovvero l'ultima stato accumulato della transazione. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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 in esso. <\/p>\n<p><\/p>\n<p>La prima cosa importante \u00e8 la possibilit\u00e0 in ClickHouse di estrarre colonne da json, campi. Cio\u00e8, in ClickHouse ci sono alcuni metodi per lavorare con json. Sono molto, molto primitivi. <\/p>\n<p><\/p>\n<p>visitParamExtractInt permette di estrarre attributi da json, cio\u00e8 il primo colpo funziona. E in questo modo \u00e8 possibile estrarre il transaction id o il visit id. Questo \u00e8 uno. <\/p>\n<p><\/p>\n<p>Il secondo \u00e8 che qui \u00e8 stato utilizzato un campo materialized astuto. Cosa significa? Significa che non puoi inserirlo nella tabella, cio\u00e8 non viene inserito, viene calcolato e memorizzato durante l'inserimento. Durante l'inserimento, ClickHouse fa il lavoro per te. E viene gi\u00e0 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. E si utilizza proprio la prima tabella con log praticamente grezzi. E cosa fa? Innanzitutto, cambia l'ordinamento, cio\u00e8 ora l'ordinamento avviene per visit id, perch\u00e9 abbiamo bisogno di 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 index_granularity \u00e8 impostato su 8.192. Cosa significa? \u00c8 un parametro di rarit\u00e0 dell'indice. In ClickHouse l'indice \u00e8 raro, non indicizza mai ogni singolo record. Lo fa ogni 8.192. Ed \u00e8 positivo quando \u00e8 necessario calcolare molti dati, ma negativo quando ce ne sono pochi, perch\u00e9 c'\u00e8 un grande overhead. E se si riduce la granularit\u00e0 dell'indice, si riduce l'overhead. Non si pu\u00f2 ridurre a uno, perch\u00e9 potrebbe non esserci abbastanza memoria. L'indice \u00e8 sempre memorizzato in memoria. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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 alcune funzioni interessanti di ClickHouse.<\/p>\n<p><\/p>\n<p>In primo luogo, c'\u00e8 l'AggregatingMergeTree. E in AggregatingMergeTree viene memorizzato l'argMax, cio\u00e8 quello \u00e8 lo stato della transazione corrispondente all'ultimo timestamp. Le transazioni 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. \u00c8 tornato in ClickHouse. E attraverso l'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;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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 'slegato' dal Runtime. <\/li>\n<li>Vengono memorizzati e elaborati fino a 3 miliardi di transazioni al mese. \u00c8 un ordine di grandezza superiore rispetto a quanto si aveva in Cassandra, cio\u00e8 in un sistema transazionale tipico. <\/li>\n<li>Cluster di 2x5 server ClickHouse. 5 server e ogni server ha una replica. \u00c8 anche meno di quanto fosse in Cassandra per fare attribuzione basata su clic, mentre qui abbiamo quella basata su impression. 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;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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 dei prezzi delle azioni. <\/p>\n<p><\/p>\n<p>E l'obiettivo era questo:<\/p>\n<p><\/p>\n<ul>\n<li>Ci sono circa 5.000 azioni. <\/li>\n<li>I prezzi sono noti ogni 100 millisecondi. <\/li>\n<li>I dati si sono accumulati per 10 anni. Evidentemente, per alcune aziende un po' di pi\u00f9, per altre un po' di meno. <\/li>\n<li>In totale circa 100 miliardi di righe. <\/li>\n<\/ul>\n<p><\/p>\n<p>E dovevamo calcolare la correlazione delle variazioni. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/b02051e6cadec8c51e7f6e351ef903f9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ci sono due azioni e i loro prezzi. Se una sale, e l'altra sale, allora questa \u00e8 una correlazione positiva, cio\u00e8 una cresce e l'altra cresce. Se una sale, come alla fine del grafico, mentre l'altra scende, allora questa \u00e8 una correlazione negativa, cio\u00e8 quando una cresce, l'altra scende. <\/p>\n<p><\/p>\n<p>Analizzando queste variazioni reciproche \u00e8 possibile fare previsioni sul mercato finanziario. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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 complesso. Cosa viene fatto per questo? Abbiamo 100 miliardi di registrazioni, che contengono: tempo, azione e prezzo. Dobbiamo prima calcolare 100 miliardi di volte il runningDifference dell'algoritmo del prezzo. Il runningDifference \u00e8 una funzione in ClickHouse che calcola la differenza tra due righe consecutivamente. <\/p>\n<p><\/p>\n<p>E dopo questo, dobbiamo calcolare la correlazione, anzi, la correlazione deve essere calcolata per ogni coppia. Per 5.000 azioni ci sono 12,5 milioni di coppie. E questo \u00e8 molto, cio\u00e8 12,5 volte bisogna calcolare una funzione di correlazione del genere. <\/p>\n<p><\/p>\n<p>E se qualcuno ha dimenticato, x e y rappresentano il valore atteso del campione. Cio\u00e8, non \u00e8 sufficiente calcolare solo le radici e le somme, ma bisogna anche calcolare altre somme all'interno di queste somme. Devono essere eseguiti un sacco di calcoli 12,5 milioni di volte e bisogna anche raggrupparli per ore. E le ore non sono poi cos\u00ec poche. E bisogna farlo in 60 secondi. \u00c8 uno scherzo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/567a07f586a824c91671820fe21ec305.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bisognava farlo in qualche modo, perch\u00e9 tutto funzionava molto, molto lentamente, prima che arrivasse ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/3eca1af4c3f25ff4b23fce9b84e16659.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hanno provato a calcolare questo su Hadoop, su Spark, su Greenplum. E tutto era molto lento o costoso. Cio\u00e8, era possibile calcolare in qualche modo, ma poi costava caro. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/37608c7e87ddb9a7d54854643044c369.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Poi \u00e8 arrivato ClickHouse e tutto \u00e8 migliorato notevolmente. <\/p>\n<p><\/p>\n<p>Ricordo che abbiamo un problema di localizzazione dei dati, quindi le correlazioni non possono essere localizzate. Non possiamo mettere parte dei dati su un server, parte 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 vengono memorizzati i dati di pricing di un determinato set di azioni. E non si sovrappongono. Pertanto, \u00e8 possibile calcolare il logReturn in modo parallelo e indipendente, tutto avviene mentre \u00e8 parallelo e distribuito. <\/p>\n<p><\/p>\n<p>Successivamente, hanno deciso di ridurre questi dati senza perderne l'espressivit\u00e0. Ridurre usando array, cio\u00e8 per ciascun intervallo di tempo creare un array delle azioni e un array dei prezzi. In questo modo i dati occupano molto meno spazio. E sono un po' pi\u00f9 facili da gestire. Queste sono operazioni quasi parallele, cio\u00e8 calcoliamo parzialmente in modo parallelo e poi registriamo sul server. <\/p>\n<p><\/p>\n<p>Dopo di ci\u00f2, questi dati possono essere replicati. La lettera \"r\" indica che questi dati sono stati replicati. Cio\u00e8, abbiamo gli stessi dati su tutti e tre i server \u2013 questi array. <\/p>\n<p><\/p>\n<p>E con uno script speciale, da questo insieme di 12,5 milioni di correlazioni che devono essere calcolate, \u00e8 possibile creare pacchetti. Cio\u00e8, 2.500 compiti da 5.000 coppie di correlazioni. E questi compiti possono essere calcolati su un particolare server ClickHouse. Ha tutti i dati, perch\u00e9 i dati sono uguali e pu\u00f2 calcolarli in sequenza. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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 si presenta. Innanzitutto, abbiamo tutti i dati in questa struttura: tempo, azioni, prezzo. Poi abbiamo calcolato il logReturn, cio\u00e8 i dati nella stessa struttura, solo che invece del prezzo abbiamo gi\u00e0 il logReturn. Successivamente li abbiamo rielaborati, quindi abbiamo ottenuto tempo e groupArray per le azioni e per i prezzi. Abbiamo unito i dati. E dopo abbiamo generato una moltitudine di task e li abbiamo alimentati a ClickHouse affinch\u00e9 li elaborasse. E funziona. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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 task era un sotto-task, cio\u00e8 con dati ridotti. E solo su tre server.<\/p>\n<p><\/p>\n<p>Questi primi due passaggi: il calcolo del Log_return e l'incapsulamento in array hanno impiegato 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 volevano settimane. \u00c8 stato un grande successo. E se consideriamo, a 70 volte al secondo, tutto veniva elaborato su questo cluster.<\/p>\n<p><\/p>\n<p>Ma la cosa pi\u00f9 importante \u00e8 che questo sistema \u00e8 praticamente privo di colli di bottiglia, cio\u00e8 scala praticamente in modo lineare. E questo \u00e8 stato verificato. \u00c8 stato scalato con successo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (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 prevede l'utilizzo di tutte le tecnologie necessarie di ClickHouse. <\/li>\n<li>Summing\/AggregatingMergeTrees sono tecnologie che consentono di aggregare o calcolare lo stato dello snapshot come caso particolare. E questo semplifica notevolmente molte cose. <\/li>\n<li>Le Materialized Views permettono di aggirare il vincolo di un solo indice. Forse non l'ho spiegato molto chiaramente, ma quando caricavamo i log, i log grezzi erano in una tabella con un solo indice, mentre sui log degli attribute erano in un'altra tabella, cio\u00e8 gli stessi dati, solo filtrati, ma l'indice era completamente diverso. Sembravano gli stessi dati, ma con un ordinamento diverso. E le Materialized Views consentono, se necessario, di aggirare tale vincolo di ClickHouse. <\/li>\n<li>Riduci la granularit\u00e0 dell'indice per le query puntuali. <\/li>\n<li>E distribuisci i dati in modo intelligente, cercando di localizzare al massimo i dati all'interno del server. E fai in modo che le query utilizzino anche la localizzazione dove possibile il pi\u00f9 possibile. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/c0fc1737986e3f18ed1d3c53df9f0252.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Riassumendo questo breve intervento, si pu\u00f2 dire che ClickHouse ha ora solidamente conquistato il territorio sia dei database commerciali che dei database open source, vale a dire, specificamente per l'analisi. Si \u00e8 inserito meravigliosamente in questo panorama. Inoltre, comincia lentamente a soppiantare altri, perch\u00e9 quando c'\u00e8 ClickHouse, non hai bisogno di InfiniDB. Verticale potrebbe presto diventare superflua, se forniscono un buon supporto per SQL. Usatelo!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/6e9a65d32eb6de7f9f139a30e7ab0d25.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>&#8212;<em>Grazie per la relazione! Molto interessante! Ci sono stati confronti con Apache Phoenix?<\/em><\/p>\n<p><\/p>\n<p>-No, non ho sentito che qualcuno abbia fatto un confronto. Noi e Yandex cerchiamo di seguire tutti i confronti di ClickHouse con vari database. Perch\u00e9 se qualcosa risulta essere pi\u00f9 veloce di ClickHouse, allora Alexey Milovidov non riesce a dormire la notte e inizia a velocizzarlo rapidamente. Non ho sentito di un confronto del genere. <\/p>\n<p><\/p>\n<ul>\n<li>\n<p><em>(Aleksey Milovidov) Apache Phoenix \u00e8 un motore SQL su Hbase. Hbase \u00e8 principalmente destinato a scenari di lavoro tipo key-value. In ogni riga pu\u00f2 esserci un numero arbitrario di colonne con nomi arbitrari. Questo vale per sistemi come Hbase e Cassandra. E su di essi le richieste analitiche pesanti non funzioneranno bene. Oppure potresti pensare che funzionino bene, se non hai 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! Sono interessato a questo argomento da un po', perch\u00e9 ho un sottosistema analitico. Ma quando guardo ClickHouse, ho l'impressione che ClickHouse sia molto adatto per l'analisi di eventi, di tipo mutable. E se devo analizzare molti dati aziendali con tonnellate di grandi tabelle, ClickHouse, per quello che capisco, non mi sembra molto adatto? Soprattutto se questi dati cambiano. \u00c8 corretto o ci sono esempi che possono smentirlo?<\/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 avere una o pi\u00f9 grandi tabelle, che sono mutevoli, e molte piccole, che cambiano lentamente. Cio\u00e8, ClickHouse non \u00e8 come Oracle, dove puoi mettere tutto e costruire query molto complesse. Per utilizzare ClickHouse in modo efficace, devi costruire lo schema in un modo che funzioni bene in ClickHouse. Cio\u00e8, evitare un'eccessiva normalizzazione, utilizzare dizionari e cercare di avere meno collegamenti lunghi. E se costruisci lo schema 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 relazione! Ho una domanda sull'ultimo caso finanziario. Avevano un'analisi. Dovevano confrontare come si muovono su e gi\u00f9. E capisco che avete costruito il sistema proprio per questa analisi? Se domani, per esempio, avessero bisogno di un altro report su questi dati, devono ricostruire lo schema e ricaricare i dati? Cio\u00e8, fare una qualche pre-elaborazione per ottenere la query?<\/em><\/p>\n<p><\/p>\n<p>Certo, \u00e8 un utilizzo di ClickHouse per un compito molto specifico. Questo potrebbe essere risolto in modo pi\u00f9 tradizionale nell'ambito di Hadoop. Per Hadoop, \u00e8 un compito ideale. Ma su Hadoop \u00e8 molto lento. E il mio obiettivo \u00e8 dimostrare che su ClickHouse \u00e8 possibile risolvere compiti che di solito sono affrontati con strumenti completamente diversi, ma in modo molto pi\u00f9 efficiente. \u00c8 dedicato a un compito specifico. \u00c8 chiaro che se c'\u00e8 un compito simile, pu\u00f2 essere risolto in modo simile. <\/p>\n<p><\/p>\n<p><em>Capisco. Hai detto che sono stati necessari 50 ore per l'elaborazione. Questi tempi partono dall'inizio, quando sono stati caricati i dati o dall'arrivo dei risultati?<\/em><\/p>\n<p><\/p>\n<p>S\u00ec-s\u00ec.<\/p>\n<p><\/p>\n<p><em>Va 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 relazione! \u00c8 tutto molto interessante. Vorrei chiedere non tanto sul funzionamento, quanto sull'uso di ClickHouse in termini di stabilit\u00e0. Cio\u00e8, si sono verificati problemi, avete dovuto ripristinare? Come si comporta ClickHouse in questo caso? E si \u00e8 verificato che vi sia stata una caduta e anche la replica? Noi, per esempio, abbiamo riscontrato problemi con ClickHouse quando supera il suo limite e va in crash.<\/em><\/p>\n<p><\/p>\n<p>Certo, non esistono sistemi perfetti. E anche ClickHouse ha i suoi problemi. Ma avete mai sentito che Yandex.Metrica non ha funzionato a lungo? Probabilmente no. Funziona in modo affidabile da circa il 2012-2013 su ClickHouse. Posso anche dire qualcosa sulla mia esperienza. Non abbiamo mai avuto interruzioni complete. Alcuni problemi parziali potrebbero verificarsi, ma non sono mai stati critici al punto da influenzare seriamente il business. Non \u00e8 mai successo. ClickHouse \u00e8 abbastanza affidabile e non si blocca casualmente. Non c'\u00e8 bisogno di preoccuparsi di questo. Non \u00e8 una cosa grezza. \u00c8 stato dimostrato da molte aziende. <\/p>\n<p><\/p>\n<p><em>Buongiorno! Hai detto che \u00e8 necessario pensare bene allo schema dei dati sin dall'inizio. E se \u00e8 successo? I miei dati stanno arrivando incessantemente. Passano sei mesi e capisco 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, in cui impostare una struttura dati diversa, se pu\u00f2 essere mappata in modo chiaro. Vale a dire, se permette il mapping tramite ClickHouse, cio\u00e8 estrarre alcune cose, cambiare la chiave primaria, modificare la partizione, allora puoi creare una Materialized View. L\u00ec puoi riscrivere i tuoi vecchi dati, i nuovi verranno scritti automaticamente. E poi puoi semplicemente passare all'utilizzo della Materialized View, poi cambiare la scrittura e eliminare la tabella vecchia. Questo \u00e8 un modo per farlo senza 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 5.0.1.1 - 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\/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) 5.0.1.1\" \/>\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: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'uso di ClickHouse in applicazioni reali. Aleksandr Zaitsev (2018) | ProHoster","description":"","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: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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}