{"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\/pt\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-clickhouse-v-realnyh-prilozheniyah-aleksandr-zajczev-2018g","title":{"rendered":"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/b46b964324a3311157d5df737526b1d1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Apesar de existirem muitos dados em quase todos os lugares, os bancos de dados anal\u00edticos ainda s\u00e3o bastante ex\u00f3ticos. Eles s\u00e3o mal compreendidos e pior ainda, mal utilizados de forma eficaz. Muitos continuam a \"comer cacto\" com MySQL ou PostgreSQL, que s\u00e3o projetados para outros cen\u00e1rios, sofrer com NoSQL ou pagar demais por solu\u00e7\u00f5es comerciais. O ClickHouse muda as regras do jogo e reduz significativamente a barreira de entrada no mundo dos SGBDs anal\u00edticos.<\/p>\n<p><\/p>\n<p>Apresenta\u00e7\u00e3o da BackEnd Conf 2018 e publicada com a permiss\u00e3o do palestrante.<\/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=\"Por que no hosting comum a administra\u00e7\u00e3o do PrestaShop \u00e9 lenta, e no seu n\u00e3o \u00e9?\" 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 pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/6c55b639d9703f460d99e0b0b1194507.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nQuem sou eu e por que estou falando sobre ClickHouse? Sou diretor de desenvolvimento na empresa LifeStreet, que utiliza ClickHouse. Al\u00e9m disso, sou fundador da Altinity. \u00c9 um parceiro da Yandex que promove ClickHouse e ajuda a Yandex a torn\u00e1-lo mais bem-sucedido. Tamb\u00e9m estou disposto a compartilhar conhecimentos sobre ClickHouse. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/36af6acba62271f7aa19dda2eb470870.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E ainda n\u00e3o sou irm\u00e3o de Petya Zaitsev. Frequentemente perguntam-me sobre isso. N\u00e3o, n\u00e3o somos irm\u00e3os.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/6ca605f97619a1373bb8a92f88d480d5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00ab\u00c9 de conhecimento geral\u00bb que ClickHouse:<\/p>\n<p><\/p>\n<ul>\n<li>\u00c9 muito r\u00e1pido,<\/li>\n<li>\u00c9 muito conveniente, <\/li>\n<li>\u00c9 usado na Yandex. <\/li>\n<\/ul>\n<p><\/p>\n<p>\u00c9 menos conhecido em quais empresas e como ele \u00e9 utilizado. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/c097b003bf8ea13b8a3bb765270e99c8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vou contar a voc\u00eas para que, onde e como o ClickHouse \u00e9 usado, al\u00e9m da Yandex. <\/p>\n<p><\/p>\n<p>Vou explicar como tarefas espec\u00edficas s\u00e3o resolvidas usando o ClickHouse em diferentes empresas, quais ferramentas ClickHouse voc\u00ea pode usar para suas tarefas e como elas foram utilizadas em v\u00e1rias empresas.<\/p>\n<p><\/p>\n<p>Escolhi tr\u00eas exemplos que mostram o ClickHouse de diferentes perspectivas. Acho que ser\u00e1 interessante.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/d3cab92ceccd6c7d01ca1f28b028803f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A primeira pergunta: \u00abPor que usar ClickHouse?\u00bb. Parece que a pergunta \u00e9 bastante \u00f3bvia, mas as respostas s\u00e3o mais de uma. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/1a4e14cc041a3c01ad0fd2a305aeeab0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>A primeira resposta \u00e9 por causa do desempenho. ClickHouse \u00e9 muito r\u00e1pido. A an\u00e1lise no ClickHouse tamb\u00e9m \u00e9 muito r\u00e1pida. Ele pode ser usado frequentemente onde algo mais funciona muito lentamente ou muito mal. <\/li>\n<li>A segunda resposta \u00e9 o custo. E, em primeiro lugar, o custo de escalonamento. Por exemplo, o Vertica \u00e9 um banco de dados excelente. Funciona muito bem se voc\u00ea n\u00e3o tiver muitos terabytes de dados. Mas, quando se trata de centenas de terabytes ou petabytes, o custo da licen\u00e7a e do suporte chega a uma quantia bastante significativa. E isso \u00e9 caro. E o ClickHouse \u00e9 gratuito. <\/li>\n<li>A terceira resposta \u00e9 o custo operacional. Este \u00e9 um enfoque um pouco diferente. RedShift \u00e9 uma excelente alternativa. No RedShift, \u00e9 poss\u00edvel criar solu\u00e7\u00f5es muito rapidamente. Elas funcionar\u00e3o bem, mas a cada hora, cada dia e cada m\u00eas, voc\u00ea pagar\u00e1 um valor consider\u00e1vel \u00e0 Amazon, pois \u00e9 um servi\u00e7o bastante caro. O Google BigQuery tamb\u00e9m. Quem j\u00e1 o utilizou sabe que \u00e9 poss\u00edvel executar v\u00e1rias consultas e, de repente, receber uma fatura de centenas de d\u00f3lares. <\/li>\n<\/ul>\n<p><\/p>\n<p>No ClickHouse, esses problemas n\u00e3o existem. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/3084a8bd9271f14726d73989946816c5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Onde o ClickHouse \u00e9 utilizado atualmente? Al\u00e9m da Yandex, o ClickHouse \u00e9 utilizado em uma s\u00e9rie de diferentes neg\u00f3cios e empresas. <\/p>\n<p><\/p>\n<ul>\n<li>Em primeiro lugar, \u00e9 a an\u00e1lise de aplica\u00e7\u00f5es web, ou seja, \u00e9 um caso de uso que veio da Yandex.<\/li>\n<li>Muitas empresas de AdTech utilizam o ClickHouse. <\/li>\n<li>In\u00fameras empresas que precisam analisar logs operacionais de diversas fontes.<\/li>\n<li>Algumas empresas utilizam o ClickHouse para monitorar logs de seguran\u00e7a. Elas os carregam no ClickHouse, geram relat\u00f3rios e obt\u00eam os resultados necess\u00e1rios.<\/li>\n<li>As empresas come\u00e7aram a utiliz\u00e1-lo na an\u00e1lise financeira, ou seja, gradativamente, grandes neg\u00f3cios tamb\u00e9m est\u00e3o se aproximando do ClickHouse. <\/li>\n<li>CloudFlare. Quem acompanha o ClickHouse certamente j\u00e1 ouviu o nome dessa empresa. \u00c9 um dos contribuintes significativos da comunidade. E eles possuem uma instala\u00e7\u00e3o de ClickHouse bastante robusta. Por exemplo, eles criaram o Kafka Engine para o ClickHouse. <\/li>\n<li>As empresas de telecomunica\u00e7\u00f5es come\u00e7aram a usar. Algumas empresas utilizam o ClickHouse ou como prova de conceito ou j\u00e1 em produ\u00e7\u00e3o.<\/li>\n<li>Uma empresa utiliza o ClickHouse para monitorar processos produtivos. Elas testam chips, anotam uma s\u00e9rie de par\u00e2metros, cerca de 2.000 caracter\u00edsticas, e depois analisam \u2013 \u00e9 um bom lote ou um ruim.<\/li>\n<li>An\u00e1lise de blockchain. Existe uma empresa russa chamada Bloxy.info. Eles fazem an\u00e1lise da rede Ethereum. Isso tamb\u00e9m foi feito no ClickHouse. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/8a0c1924a20ed2d15cd0f959e9b3e499.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E o tamanho n\u00e3o importa. H\u00e1 muitas empresas que utilizam um servidor pequeno. E isso lhes permite resolver seus problemas. E ainda mais empresas utilizam grandes clusters de muitos <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/pt\/server\/\"   title=\"servidores\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"1513\">servidores<\/a> ou dezenas de servidores. <\/p>\n<p><\/p>\n<p>E se olharmos para os recordes, temos:<\/p>\n<p><\/p>\n<ul>\n<li>Yandex: mais de 500 servidores, 25 bilh\u00f5es de registros por dia que eles armazenam l\u00e1.<\/li>\n<li>LifeStreet: 60 servidores, cerca de 75 bilh\u00f5es de registros por dia. Menos servidores, mais registros do que no Yandex. <\/li>\n<li>CloudFlare: 36 servidores, 200 bilh\u00f5es de registros por dia que eles mant\u00eam. Eles t\u00eam ainda menos servidores e ainda mais dados que eles armazenam. <\/li>\n<li>Bloomberg: 102 <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/pt\/server\/dts-los-angeles\/\"   title=\"servidor\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"3643\">servidor<\/a>, aproximadamente um trilh\u00e3o de registros por dia. Recordista em registros.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/49194030b6586221cb17029889ce33da.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Geograficamente \u2013 isso tamb\u00e9m \u00e9 muito. Este mapa mostra o heatmap onde o ClickHouse \u00e9 utilizado no mundo. Aqui, R\u00fassia, China e Am\u00e9rica se destacam. Existem poucas na\u00e7\u00f5es europeias. E podemos identificar 4 clusters.<\/p>\n<p><\/p>\n<p>Esta \u00e9 uma an\u00e1lise comparativa, n\u00e3o \u00e9 necess\u00e1rio buscar n\u00fameros absolutos. \u00c9 uma an\u00e1lise dos visitantes que leem conte\u00fados em ingl\u00eas no site da Altinity, pois n\u00e3o h\u00e1 usu\u00e1rios de l\u00edngua russa l\u00e1. E a R\u00fassia, Ucr\u00e2nia e Bielorr\u00fassia, ou seja, a parte de l\u00edngua russa da comunidade, s\u00e3o os usu\u00e1rios mais numerosos. Depois v\u00eam os EUA e Canad\u00e1. A China est\u00e1 se aproximando rapidamente. H\u00e1 seis meses, quase n\u00e3o havia tr\u00e1fego da China, agora a China j\u00e1 ultrapassou a Europa e continua crescendo. A velha Europa tamb\u00e9m n\u00e3o fica para tr\u00e1s, e, surpreendentemente, o l\u00edder no uso do ClickHouse \u00e9 a Fran\u00e7a. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/3a8305c51b1bd62f3467b795402df4ed.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Por que estou contando tudo isso? Para mostrar que o ClickHouse est\u00e1 se tornando a solu\u00e7\u00e3o padr\u00e3o para an\u00e1lise de grandes dados e j\u00e1 est\u00e1 sendo amplamente utilizado.<\/strong> Se voc\u00ea o utiliza, est\u00e1 seguindo a tend\u00eancia correta. Se ainda n\u00e3o o utiliza, n\u00e3o se preocupe em ficar sozinho e sem ajuda, pois muitas pessoas j\u00e1 est\u00e3o envolvidas com isso.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/6aa635f3a35034d3af837c78b2c8fe60.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Estes s\u00e3o exemplos reais de uso do ClickHouse em v\u00e1rias empresas. <\/p>\n<p><\/p>\n<ul>\n<li>O primeiro exemplo \u00e9 uma rede de publicidade: migra\u00e7\u00e3o do Vertica para o ClickHouse. E conhe\u00e7o v\u00e1rias empresas que migraram do Vertica ou est\u00e3o em processo de migra\u00e7\u00e3o. <\/li>\n<li>O segundo exemplo \u00e9 um reposit\u00f3rio transacional no ClickHouse. Este exemplo foi constru\u00eddo com base em antipadr\u00f5es. Tudo o que n\u00e3o deve ser feito no ClickHouse, segundo os desenvolvedores, foi feito aqui. E, ainda assim, isso funciona. E funciona muito melhor do que uma solu\u00e7\u00e3o transacional t\u00edpica. <\/li>\n<li>O terceiro exemplo \u00e9 o processamento distribu\u00eddo no ClickHouse. Houve uma pergunta sobre como integrar o ClickHouse no ecossistema Hadoop. Vou mostrar um exemplo de como uma empresa fez algo semelhante a um cont\u00eainer de map reduce no ClickHouse, cuidando da localiza\u00e7\u00e3o dos dados, e assim por diante, para resolver uma tarefa muito n\u00e3o trivial. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/e08ab5418500599f08d40324ccdfbcd0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>LifeStreet \u2013 \u00c9 uma empresa de Ad Tech que possui todas as tecnologias relacionadas a uma rede de publicidade. <\/li>\n<li>Ela se ocupa da otimiza\u00e7\u00e3o de an\u00fancios e do programmatic bidding. <\/li>\n<li>Muitos dados: cerca de 10 bilh\u00f5es de eventos por dia. Al\u00e9m disso, esses eventos podem ser divididos em v\u00e1rios subeventos.<\/li>\n<li>Muitos clientes desses dados, e n\u00e3o s\u00e3o apenas pessoas, muito mais \u2013 s\u00e3o v\u00e1rios algoritmos que lidam com programmatic bidding. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/2da99b53eb25f675a2431027f86db934.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A empresa passou por um longo e dif\u00edcil percurso. E eu falei sobre isso no HighLoad. Inicialmente, a LifeStreet migrou do MySQL (com uma breve parada no Oracle) para o Vertica. E voc\u00ea pode encontrar uma narrativa sobre isso. <\/p>\n<p><\/p>\n<p>E tudo estava muito bem, mas rapidamente ficou claro que os dados estavam crescendo e o Vertica era caro. Portanto, diversas alternativas foram buscadas. Algumas delas est\u00e3o listadas aqui. E, na verdade, fizemos um proof of concept ou, \u00e0s vezes, testes de desempenho em quase todos os bancos de dados que estavam dispon\u00edveis no mercado entre 2013 e 2016 e se adequavam em funcionalidade. E sobre alguns deles eu tamb\u00e9m falei no HighLoad.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/4bebd2f43892cbef9249ddded1b8a70a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A tarefa era migrar do Vertica em primeiro lugar, porque os dados estavam crescendo. E cresceram de forma exponencial por v\u00e1rios anos. Depois, eles estabilizaram, mas ainda assim. Prevendo esse crescimento, as exig\u00eancias do neg\u00f3cio em rela\u00e7\u00e3o ao volume de dados para os quais era necess\u00e1rio realizar alguma an\u00e1lise, ficou claro que em breve a conversa seria sobre petabytes. E pagar por petabytes j\u00e1 se tornava muito caro, ent\u00e3o alternativas foram buscadas. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/f170a4307168e8560122966eab85c24e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Para onde ir? E por muito tempo n\u00e3o ficou claro para onde ir, porque, por um lado, existem bancos de dados comerciais que parecem funcionar bem. Alguns funcionam quase t\u00e3o bem quanto o Vertica, outros menos. Mas todos s\u00e3o caros, n\u00e3o houve sucesso em encontrar algo mais barato e melhor. <\/p>\n<p><\/p>\n<p>Por outro lado, existem solu\u00e7\u00f5es open source, que n\u00e3o s\u00e3o muitas, ou seja, para an\u00e1lise elas podem ser contadas nos dedos. E elas s\u00e3o gratuitas ou baratas, mas funcionam lentamente. E frequentemente carecem de funcionalidades necess\u00e1rias e \u00fateis.<\/p>\n<p><\/p>\n<p>E para que pudesse combinar o que h\u00e1 de bom nos bancos de dados comerciais com tudo o que \u00e9 gratuito nos open source, n\u00e3o havia nada. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/abbefbf0d9578b554f81579b87213a50.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nada havia at\u00e9 que, inesperadamente, o Yandex tirou, como um m\u00e1gico tirando um coelho de uma cartola, o ClickHouse. E foi uma solu\u00e7\u00e3o inesperada, ainda se pergunta: 'Por qu\u00ea?', mas, no entanto. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/c88981aace9d5925396ca5171241b7d2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E logo no ver\u00e3o de 2016, come\u00e7amos a explorar o que \u00e9 o ClickHouse. E descobrimos que \u00e0s vezes ele pode ser mais r\u00e1pido que o Vertica. Testamos diferentes cen\u00e1rios em v\u00e1rias consultas. E se a consulta usasse apenas uma tabela, ou seja, sem nenhum tipo de join, o ClickHouse foi duas vezes mais r\u00e1pido que o Vertica. <\/p>\n<p><\/p>\n<p>N\u00e3o me dei ao trabalho e olhei outros testes do Yandex recentemente. O mesmo se aplica: o ClickHouse \u00e9 duas vezes mais r\u00e1pido que o Vertica, por isso falam muito sobre isso. <\/p>\n<p><\/p>\n<p>Mas se as consultas envolvem joins, as coisas ficam menos claras. E o ClickHouse pode ser duas vezes mais lento que o Vertica. Mas, se ajustarmos um pouco a consulta e reescrev\u00ea-la, os resultados ficam aproximadamente iguais. N\u00e3o \u00e9 ruim. E \u00e9 gratuito. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/188bf56b72123175a18d2cb97d989a47.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Depois de obter os resultados dos testes e olhar de diferentes \u00e2ngulos, a LifeStreet optou pelo ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/1183b9b7681916686c52786fc95ccb45.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lembro que estamos em 2016. Foi como na piada sobre os ratos que choravam e se espetavam, mas continuavam a comer o cacto. Isso foi discutido em detalhes, h\u00e1 um v\u00eddeo sobre isso, etc. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/993052ed83dc295c3777e614c7703456.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Portanto, n\u00e3o irei entrar em muitos detalhes sobre isso, falarei apenas sobre os resultados e algumas coisas interessantes que n\u00e3o mencionei na \u00e9poca. <\/p>\n<p><\/p>\n<p>Os resultados s\u00e3o:<\/p>\n<p><\/p>\n<ul>\n<li>Migra\u00e7\u00e3o bem-sucedida e o sistema j\u00e1 est\u00e1 em produ\u00e7\u00e3o h\u00e1 mais de um ano. <\/li>\n<li>O desempenho e a flexibilidade aumentaram. Dos 10 bilh\u00f5es de registros que pod\u00edamos armazenar por dia, e de forma tempor\u00e1ria, agora a LifeStreet armazena 75 bilh\u00f5es de registros por dia e pode manter isso por 3 meses ou mais. Em picos, isso representa at\u00e9 um milh\u00e3o de eventos por segundo. Mais de um milh\u00e3o de consultas SQL chegam a esse sistema diariamente, principalmente de v\u00e1rios rob\u00f4s. <\/li>\n<li>Embora o ClickHouse tenha come\u00e7ado a usar mais servidores do que o Vertica, houve economia em hardware, pois no Vertica eram utilizados discos SAS bastante caros. No ClickHouse, usamos SATA. E por qu\u00ea? Porque no Vertica, o insert \u00e9 s\u00edncrono. E a sincroniza\u00e7\u00e3o exige que os discos n\u00e3o sejam muito lentos, assim como a rede, ou seja, \u00e9 uma opera\u00e7\u00e3o bastante cara. J\u00e1 no ClickHouse, o insert \u00e9 ass\u00edncrono. Al\u00e9m disso, voc\u00ea pode sempre gravar localmente, n\u00e3o h\u00e1 custos adicionais para isso, portanto os dados no ClickHouse podem ser inseridos muito mais rapidamente do que no Vertica, mesmo em discos que n\u00e3o s\u00e3o os mais r\u00e1pidos. E a leitura \u00e9 mais ou menos a mesma. A leitura em SATA, se estiverem em RAID, \u00e9 bastante r\u00e1pida. <\/li>\n<li>N\u00e3o s\u00e3o limitados por licen\u00e7a, ou seja, 3 petabytes de dados em 60 servidores (20 servidores formam uma r\u00e9plica) e 6 trilh\u00f5es de registros em fatos e agregados. Nada semelhante podia ser permitido no Vertica. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/f461cdc12917ee655655dd7eb9c32bb2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Agora estou passando para as quest\u00f5es pr\u00e1ticas deste exemplo.<\/p>\n<p><\/p>\n<ul>\n<li>Primeiro \u2013 \u00e9 um esquema eficiente. O esquema depende de muitas vari\u00e1veis. <\/li>\n<li>Segundo \u2013 \u00e9 a gera\u00e7\u00e3o de SQL eficiente.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/e7dc2a217e77c8794ff6e8a754e78c85.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Uma consulta OLAP t\u00edpica \u00e9 um select. Parte das colunas vai para o group by, e parte vai para fun\u00e7\u00f5es agregadas. H\u00e1 um where, que pode ser visto como um corte do cubo. Todo o group by pode ser representado como uma proje\u00e7\u00e3o. E por isso \u00e9 chamado de an\u00e1lise de dados multidimensional. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/a03a2d7fd28905ae83183346f0c673e2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E isso geralmente \u00e9 modelado como um esquema estrela, onde h\u00e1 um fato central e caracter\u00edsticas desse fato dos lados, como raios. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/d9671af4b39cc83e1ae49e6fd75d0e02.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E do ponto de vista do design f\u00edsico, de como isso se assenta na tabela, normalmente faz-se uma representa\u00e7\u00e3o normalizada. Voc\u00ea pode desnormalizar, mas isso \u00e9 caro em termos de disco e n\u00e3o \u00e9 muito eficaz para consultas. Portanto, normalmente faz-se uma representa\u00e7\u00e3o normalizada, ou seja, uma tabela de fatos e muitas tabelas de dimens\u00f5es. <\/p>\n<p><\/p>\n<p>Mas no ClickHouse isso funciona mal. H\u00e1 duas raz\u00f5es: <\/p>\n<p><\/p>\n<ul>\n<li>A primeira \u2013 \u00e9 porque no ClickHouse os joins n\u00e3o s\u00e3o muito bons, ou seja, h\u00e1 joins, mas s\u00e3o ruins. Por enquanto, ainda ruins. <\/li>\n<li>A segunda \u2013 \u00e9 que as tabelas n\u00e3o s\u00e3o atualizadas. Normalmente, nessas tabelas ao redor do esquema estrela, \u00e9 necess\u00e1rio mudar algo. Por exemplo, o nome do cliente, o nome da empresa, etc. E isso n\u00e3o funciona. <\/li>\n<\/ul>\n<p><\/p>\n<p>E h\u00e1 uma solu\u00e7\u00e3o para isso no ClickHouse. Na verdade, s\u00e3o duas: <\/p>\n<p><\/p>\n<ul>\n<li>A primeira \u2013 \u00e9 o uso de dicion\u00e1rios. Dicion\u00e1rios Externos \u2013 isso ajuda a resolver 99% do problema com o esquema estrela, com atualiza\u00e7\u00f5es e afins. <\/li>\n<li>A segunda \u2013 \u00e9 o uso de arrays. Arrays tamb\u00e9m ajudam a evitar os joins e problemas com normaliza\u00e7\u00e3o. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/775972cc412651600799173407384492.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>N\u00e3o precisa de joins. <\/li>\n<li>Atualiz\u00e1veis. Desde mar\u00e7o de 2018, surgiu uma possibilidade n\u00e3o documentada (voc\u00ea n\u00e3o encontrar\u00e1 isso na documenta\u00e7\u00e3o) de atualizar dicion\u00e1rios parcialmente, ou seja, apenas os registros que mudaram. Praticamente \u2013 \u00e9 como uma tabela.<\/li>\n<li>Sempre na mem\u00f3ria, portanto, os joins com o dicion\u00e1rio funcionam mais r\u00e1pido do que se fosse uma tabela que est\u00e1 no disco e que n\u00e3o est\u00e1 garantido que esteja no cache, provavelmente n\u00e3o est\u00e1. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/f73176a650b6d885011e3265c2af2fc3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Tamb\u00e9m n\u00e3o precisa de joins.<\/li>\n<li>\u00c9 uma representa\u00e7\u00e3o compacta de um para muitos. <\/li>\n<li>E na minha opini\u00e3o, arrays s\u00e3o feitos para os geeks. Isso envolve fun\u00e7\u00f5es lambda e afins. <\/li>\n<\/ul>\n<p><\/p>\n<p>Isso n\u00e3o \u00e9 para efeito de linguagem. \u00c9 uma funcionalidade muito poderosa que permite fazer muitas coisas de maneira simples e elegante. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/5d813952ca8f3da7a74c6f2a15d80a9b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Exemplos t\u00edpicos que ajudam a resolver arrays. Esses exemplos s\u00e3o simples e bastante ilustrativos:<\/p>\n<p><\/p>\n<ul>\n<li>Busca por tags. Se voc\u00ea tem hashtags e quer encontrar algumas postagens por uma hashtag. <\/li>\n<li>Busca por pares key-value. Tamb\u00e9m h\u00e1 alguns atributos com valor. <\/li>\n<li>Armazenamento de listas de chaves que voc\u00ea precisa traduzir para algo diferente.<\/li>\n<\/ul>\n<p><\/p>\n<p>Todas essas tarefas podem ser resolvidas sem arrays. As tags podem ser colocadas em uma \u00fanica linha e escolhidas com express\u00f5es regulares ou em uma tabela separada, mas isso exigir\u00e1 fazer joins.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/dbbf90eee098c4564206532f24156823.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mas no ClickHouse, voc\u00ea n\u00e3o precisa fazer nada, basta descrever um array string para hashtags ou criar uma estrutura aninhada para sistemas do tipo key-value.<\/p>\n<p><\/p>\n<p>A estrutura aninhada pode n\u00e3o ser o nome mais adequado. S\u00e3o dois arrays que t\u00eam uma parte comum no nome e algumas caracter\u00edsticas relacionadas. <\/p>\n<p><\/p>\n<p>E a busca por tags \u00e9 muito simples. H\u00e1 uma fun\u00e7\u00e3o <code>has<\/code>, que verifica se um elemento est\u00e1 no array. Pronto, encontramos todos os registros que dizem respeito \u00e0 nossa confer\u00eancia.<\/p>\n<p><\/p>\n<p>A busca por subid \u00e9 um pouco mais complicada. Primeiro, precisamos encontrar o \u00edndice da chave, e depois pegar o elemento com esse \u00edndice e verificar se o valor \u00e9 o que precisamos. Mas, no entanto, \u00e9 muito simples e compacto.<\/p>\n<p><\/p>\n<p>A express\u00e3o regular que voc\u00ea gostaria de escrever, se voc\u00ea armazenasse tudo em uma \u00fanica linha, seria, em primeiro lugar, desajeitada. E, em segundo lugar, funcionaria muito mais devagar do que dois arrays. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/17664c3121b2b0d33188adbfaa653d4e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Outro exemplo. Voc\u00ea tem um array onde armazena IDs. E pode traduzi-los para nomes. A fun\u00e7\u00e3o <code>arrayMap<\/code>. Essa \u00e9 uma fun\u00e7\u00e3o lambda t\u00edpica. Voc\u00ea passa express\u00f5es lambda para ela. E ela extrai o valor do nome para cada ID do dicion\u00e1rio.<\/p>\n<p><\/p>\n<p>De maneira semelhante, a busca tamb\u00e9m pode ser feita. Uma fun\u00e7\u00e3o preditiva \u00e9 passada que verifica quais elementos correspondem. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/146917b71a35d38a550cd9accf6ab2f7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Essas coisas simplificam muito o esquema e resolvem uma s\u00e9rie de problemas. <\/p>\n<p><\/p>\n<p>Mas o pr\u00f3ximo problema que encontramos e que gostaria de mencionar \u00e9 sobre consultas eficientes. <\/p>\n<p><\/p>\n<ul>\n<li>No ClickHouse, n\u00e3o h\u00e1 um planejador de consultas. N\u00e3o existe. <\/li>\n<li>Mas, mesmo assim, consultas complexas ainda precisam ser planejadas. Em quais casos? <\/li>\n<li>Se no pedido houver v\u00e1rios joins que voc\u00ea encapsula em subconsultas, a ordem em que s\u00e3o executados \u00e9 importante. <\/li>\n<li>E o segundo ponto \u00e9 se o pedido \u00e9 distribu\u00eddo. Porque em um pedido distribu\u00eddo, apenas a subconsulta mais interna \u00e9 executada de forma distribu\u00edda, enquanto todo o resto \u00e9 enviado para um \u00fanico servidor ao qual voc\u00ea est\u00e1 conectado e executado l\u00e1. Portanto, se voc\u00ea tem pedidos distribu\u00eddos com muitos joins, \u00e9 necess\u00e1rio escolher a ordem. <\/li>\n<\/ul>\n<p><\/p>\n<p>E mesmo em casos mais simples, \u00e0s vezes \u00e9 necess\u00e1rio fazer o trabalho do planejador e reescrever um pouco as consultas. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/217d422b429e8b4bc13abbf0efdf6be1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aqui est\u00e1 um exemplo. \u00c0 esquerda, uma consulta que mostra o top 5 pa\u00edses, que leva 2,5 segundos para ser executada, se n\u00e3o me engano. E \u00e0 direita, a mesma consulta, mas ligeiramente reescrita. Em vez de agrupar por string, come\u00e7amos a agrupar por uma chave (int). E isso \u00e9 mais r\u00e1pido. Depois, conectamos um dicion\u00e1rio ao resultado. Em vez de 2,5 segundos, a consulta leva 1,5 segundos. Isso \u00e9 bom. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/f19fb7d7f0397a3b38b2a3bd179c156b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Um exemplo semelhante \u00e9 a reescrita de filtros. Aqui est\u00e1 uma consulta sobre a R\u00fassia, que leva 5 segundos. Se a reescrevermos de forma que comparemos novamente n\u00e3o por string, mas por n\u00fameros com um conjunto de chaves relacionadas \u00e0 R\u00fassia, ser\u00e1 muito mais r\u00e1pido. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/0c1dd1f317133d1d106ffef85f337079.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Existem muitos desses truques. E eles permitem acelerar significativamente as consultas que voc\u00ea acha que j\u00e1 est\u00e3o funcionando rapidamente ou, ao contr\u00e1rio, est\u00e3o funcionando lentamente. Elas podem ser feitas ainda mais r\u00e1pidas.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/25b132790b03f239e38237af5e92ab63.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>M\u00e1ximo trabalho em modo distribu\u00eddo. <\/li>\n<li>Ordena\u00e7\u00e3o por tipos m\u00ednimos, como eu fiz com os inteiros. <\/li>\n<li>Se houver alguns joins, dicion\u00e1rios, \u00e9 melhor faz\u00ea-los por \u00faltimo, quando voc\u00ea j\u00e1 tiver os dados pelo menos parcialmente agrupados, assim a opera\u00e7\u00e3o de join ou a chamada do dicion\u00e1rio ser\u00e1 feita menos vezes e ser\u00e1 mais r\u00e1pida. <\/li>\n<li>Substitui\u00e7\u00e3o de filtros. <\/li>\n<\/ul>\n<p><\/p>\n<p>Existem outras t\u00e9cnicas, n\u00e3o apenas aquelas que demonstrei. E todas elas, \u00e0s vezes, permitem acelerar significativamente a execu\u00e7\u00e3o das consultas.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/175832796bee525909d8875bd723a881.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vamos para o pr\u00f3ximo exemplo. A empresa X dos EUA. O que ela faz? <\/p>\n<p><\/p>\n<p>Havia uma tarefa: <\/p>\n<p><\/p>\n<ul>\n<li>Vincula\u00e7\u00e3o offline de transa\u00e7\u00f5es de publicidade. <\/li>\n<li>Modelagem de diferentes modelos de vincula\u00e7\u00e3o. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/0136b71a1205512d86f13e86761146f4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qual \u00e9 o cen\u00e1rio?<\/p>\n<p><\/p>\n<p>Um visitante comum acessa o site, por exemplo, 20 vezes por m\u00eas a partir de diferentes an\u00fancios ou, \u00e0s vezes, vem sem nenhum an\u00fancio, porque se lembra deste site. Ele observa alguns produtos, coloca-os no carrinho, retira-os do carrinho. E, no final, acaba comprando algo. <\/p>\n<p><\/p>\n<p>Perguntas pertinentes: \"Quem deve pagar pelo an\u00fancio, se necess\u00e1rio?\" e \"Qual an\u00fancio teve influ\u00eancia, se teve?\" Ou seja, por que ele comprou e como fazer para que pessoas semelhantes a ele tamb\u00e9m comprem?<\/p>\n<p><\/p>\n<p>Para resolver essa quest\u00e3o, \u00e9 necess\u00e1rio conectar os eventos que ocorrem no site de forma adequada, ou seja, criar alguma rela\u00e7\u00e3o entre eles. Depois, esses dados devem ser enviados para an\u00e1lise no DWH. Com base nessa an\u00e1lise, modelos ser\u00e3o constru\u00eddos para determinar a quem e qual an\u00fancio mostrar.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/e53ec81ce89150697d0eca4d72886638.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Uma transa\u00e7\u00e3o publicit\u00e1ria \u00e9 um conjunto de eventos relacionados ao usu\u00e1rio, que come\u00e7a com a exibi\u00e7\u00e3o do an\u00fancio, depois algo acontece, pode haver uma compra e, em seguida, podem ocorrer compras adicionais. Por exemplo, se for um aplicativo m\u00f3vel ou um jogo m\u00f3vel, normalmente a instala\u00e7\u00e3o do aplicativo \u00e9 gratuita, mas se algo adicional for necess\u00e1rio, pode haver custos associados. E quanto mais o usu\u00e1rio gastar no aplicativo, mais valioso ele se torna. Mas para isso, \u00e9 preciso vincular tudo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/a2213613f1ef660409124ef8bcdd4fe3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Existem v\u00e1rios modelos de vincula\u00e7\u00e3o. <\/p>\n<p><\/p>\n<p>Os mais populares s\u00e3o:<\/p>\n<p><\/p>\n<ul>\n<li>\u00daltima Intera\u00e7\u00e3o, onde intera\u00e7\u00e3o pode ser um clique ou uma exibi\u00e7\u00e3o.<\/li>\n<li>Primeira Intera\u00e7\u00e3o, ou seja, o primeiro momento que trouxe o usu\u00e1rio ao site.<\/li>\n<li>Combina\u00e7\u00e3o Linear \u2013 todos t\u00eam a mesma import\u00e2ncia. <\/li>\n<li>Desvanecimento.<\/li>\n<li>E outros. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/9523307d557e094d981da5b525ed0b59.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E como tudo isso funcionava originalmente? Havia o Runtime e o Cassandra. O Cassandra era usado como armazenamento de transa\u00e7\u00f5es, ou seja, todas as transa\u00e7\u00f5es relacionadas eram armazenadas nele. Quando um evento chegava ao Runtime, por exemplo, a exibi\u00e7\u00e3o de uma p\u00e1gina ou algo mais, uma consulta era feita ao Cassandra \u2013 se essa pessoa existia ou n\u00e3o. Depois, as transa\u00e7\u00f5es relacionadas eram obtidas e a vincula\u00e7\u00e3o era realizada.<\/p>\n<p><\/p>\n<p>E se tivesse sorte, que na consulta houvesse um id de transa\u00e7\u00e3o, seria f\u00e1cil. Mas geralmente n\u00e3o h\u00e1 sorte. Portanto, era necess\u00e1rio encontrar a \u00faltima transa\u00e7\u00e3o ou a transa\u00e7\u00e3o com o \u00faltimo clique, e assim por diante. <\/p>\n<p><\/p>\n<p>E tudo isso funcionou muito bem enquanto a vincula\u00e7\u00e3o era feita ao \u00faltimo clique. Porque temos 10 milh\u00f5es de cliques por dia, 300 milh\u00f5es por m\u00eas, se colocarmos uma janela mensal. E como no Cassandra tudo precisa estar na mem\u00f3ria para que funcione rapidamente, porque o Runtime precisa responder de forma r\u00e1pida, eram necess\u00e1rios cerca de 10 a 15 servidores. <\/p>\n<p><\/p>\n<p>Mas quando decidiram vincular a transa\u00e7\u00e3o \u00e0 exibi\u00e7\u00e3o, imediatamente n\u00e3o ficou t\u00e3o divertido. E por que? \u00c9 evidente que precisamos armazenar 30 vezes mais eventos. E, consequentemente, precisamos de 30 vezes mais servidores. E resulta numa cifra astron\u00f4mica. Manter at\u00e9 500 servidores para realizar a vincula\u00e7\u00e3o, considerando que no Runtime tem significativamente menos, \u00e9 um n\u00famero fora do normal. E come\u00e7aram a pensar no que fazer. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/7af35f1ade680232cc83a6887891bc5c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E chegaram ao ClickHouse. Mas como fazer isso no ClickHouse? \u00c0 primeira vista, parece um conjunto de antipadr\u00f5es. <\/p>\n<p><\/p>\n<ul>\n<li>A transa\u00e7\u00e3o cresce, e vamos conectando novos e novos eventos a ela, ou seja, ela \u00e9 mut\u00e1vel, e o ClickHouse n\u00e3o trabalha muito bem com objetos mut\u00e1veis. <\/li>\n<li>Quando um visitante chega a n\u00f3s, precisamos extrair suas transa\u00e7\u00f5es pela chave, pelo seu visit id. Isso tamb\u00e9m \u00e9 uma consulta pontual, o que n\u00e3o se faz no ClickHouse. Normalmente, no ClickHouse realizam-se grandes\u2026 escaneamentos, e aqui precisamos recuperar v\u00e1rias grava\u00e7\u00f5es. Tamb\u00e9m \u00e9 um antipadr\u00e3o. <\/li>\n<li>Al\u00e9m disso, a transa\u00e7\u00e3o estava em json, mas n\u00e3o queriam reescrever, portanto, desejavam armazenar o json de maneira n\u00e3o estruturada, e se necess\u00e1rio, extrair algo dele. E isso tamb\u00e9m \u00e9 um antipadr\u00e3o. <\/li>\n<\/ul>\n<p><\/p>\n<p>Ou seja, um conjunto de antipadr\u00f5es. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/2473129a5880ee3172b8ab7bf4afc376.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mas, no entanto, conseguiram criar um sistema que funcionava de forma muito eficiente. <\/p>\n<p><\/p>\n<p>O que foi feito? O ClickHouse foi introduzido, onde os logs eram enviados, divididos em registros. Foi criado um servi\u00e7o atribu\u00eddo que recebia os logs do ClickHouse. Depois disso, para cada registro por visit id, obteve transa\u00e7\u00f5es que poderiam ainda n\u00e3o ter sido processadas e al\u00e9m disso, snapshots, ou seja, transa\u00e7\u00f5es j\u00e1 vinculadas, que eram o resultado do trabalho anterior. A partir delas, elaborou a l\u00f3gica, selecionou a transa\u00e7\u00e3o correta e conectou novos eventos. Registrou novamente no log. O log retornava ao ClickHouse, ou seja, era um sistema c\u00edclico constante. Al\u00e9m disso, era enviado ao DWH para an\u00e1lise. <\/p>\n<p><\/p>\n<p>Foi exatamente assim que n\u00e3o funcionou muito bem. E para facilitar a ClickHouse, quando a consulta era feita pelo id de visita, agrupavam essas consultas em blocos de 1.000 a 2.000 ids de visita e extra\u00edam todas as transa\u00e7\u00f5es para 1.000 a 2.000 pessoas. E ent\u00e3o tudo come\u00e7ou a funcionar.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/d920ce231e6e4b5fd5b27ab28f848aed.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Se olharmos para dentro do ClickHouse, l\u00e1 existem apenas 3 tabelas principais que atendem a tudo isso. <\/p>\n<p><\/p>\n<p>A primeira tabela, na qual os logs s\u00e3o carregados, sendo que os logs s\u00e3o carregados praticamente sem processamento.<\/p>\n<p><\/p>\n<p>A segunda tabela. Atrav\u00e9s de uma view materializada, eram extra\u00eddos logs que ainda n\u00e3o tinham eventos atribu\u00eddos, ou seja, n\u00e3o estavam relacionados. E por meio da view materializada, as transa\u00e7\u00f5es eram extra\u00eddas para constru\u00e7\u00e3o do snapshot. Ou seja, uma view materializada especial constru\u00eda um snapshot, especificamente o \u00faltimo estado acumulado da transa\u00e7\u00e3o. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/12b0adb691f483923a6c35bb6e4a5017.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aqui est\u00e1 um texto em SQL. Eu gostaria de comentar sobre algumas coisas importantes nele. <\/p>\n<p><\/p>\n<p>A primeira coisa importante \u00e9 a possibilidade no ClickHouse de extrair colunas de json, ou seja, no ClickHouse existem alguns m\u00e9todos para trabalhar com json. Eles s\u00e3o muito, muito primitivos. <\/p>\n<p><\/p>\n<p>visitParamExtractInt permite extrair atributos de um json, ou seja, a primeira ocorr\u00eancia \u00e9 acionada. E assim \u00e9 poss\u00edvel extrair o id da transa\u00e7\u00e3o ou o id da visita. Isso \u00e9 um. <\/p>\n<p><\/p>\n<p>A segunda \u2013 aqui foi usado um campo materializado engenhoso. O que isso significa? Isso significa que voc\u00ea n\u00e3o pode inseri-lo na tabela, ou seja, ele n\u00e3o \u00e9 inserido, ele \u00e9 calculado e armazenado na inser\u00e7\u00e3o. Durante a inser\u00e7\u00e3o, ClickHouse realiza o trabalho para voc\u00ea. E j\u00e1 extrai do json aquilo que voc\u00ea precisar\u00e1 depois.<\/p>\n<p><\/p>\n<p>Neste caso, a view materializada \u00e9 para linhas n\u00e3o processadas. E exatamente a primeira tabela com logs quase brutos \u00e9 utilizada. E o que ela faz? Primeiro, altera a ordena\u00e7\u00e3o, ou seja, a ordena\u00e7\u00e3o agora \u00e9 feita pelo id da visita, porque precisamos extrair rapidamente a transa\u00e7\u00e3o espec\u00edfica de uma pessoa. <\/p>\n<p><\/p>\n<p>A segunda coisa importante \u00e9 a index_granularity. Se voc\u00ea viu o MergeTree, geralmente por padr\u00e3o a index_granularity \u00e9 8.192. O que \u00e9 isso? \u00c9 um par\u00e2metro de esparsidade do \u00edndice. No ClickHouse, o \u00edndice \u00e9 esparso, ele nunca indexa cada registro. Ele faz isso a cada 8.192. E isso \u00e9 bom quando \u00e9 necess\u00e1rio contar uma grande quantidade de dados, mas ruim quando \u00e9 pouco, porque h\u00e1 um grande overhead. E se voc\u00ea diminuir a granula\u00e7\u00e3o do \u00edndice, reduzimos o overhead. N\u00e3o \u00e9 poss\u00edvel reduzir para um, porque a mem\u00f3ria pode n\u00e3o ser suficiente. O \u00edndice \u00e9 sempre armazenado na mem\u00f3ria. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/5fe303061977cad64e6c0333b125d595.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E o snapshot utiliza algumas fun\u00e7\u00f5es interessantes do ClickHouse.<\/p>\n<p><\/p>\n<p>Primeiro, temos o AggregatingMergeTree. No AggregatingMergeTree, \u00e9 armazenado o argMax, ou seja, \u00e9 o estado da transa\u00e7\u00e3o correspondente ao \u00faltimo timestamp. Transa\u00e7\u00f5es novas s\u00e3o constantemente geradas para este visitante. E no estado mais recente desta transa\u00e7\u00e3o, adicionamos um evento e tivemos um novo estado. Ele novamente entrou no ClickHouse. E atrav\u00e9s do argMax nesta view materializada, sempre podemos obter o estado atual.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/d1b87301ab5206a36bf035679f79d35a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>A vincula\u00e7\u00e3o est\u00e1 \"desvinculada\" do Runtime. <\/li>\n<li>At\u00e9 3 bilh\u00f5es de transa\u00e7\u00f5es s\u00e3o armazenadas e processadas por m\u00eas. Isso \u00e9 uma ordem de magnitude maior do que era no Cassandra, ou seja, em um sistema transacional t\u00edpico. <\/li>\n<li>Cluster de 2x5 servidores ClickHouse. 5 servidores e cada servidor tem uma r\u00e9plica. Isso \u00e9 at\u00e9 menos do que era no Cassandra para realizar atribui\u00e7\u00e3o baseada em clique, e aqui temos atribui\u00e7\u00e3o baseada em impress\u00e3o. Ou seja, em vez de aumentar o n\u00famero de servidores em 30 vezes, conseguimos reduzi-lo. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/583779fe9e133df519411e2256401eb3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E o \u00faltimo exemplo \u00e9 a empresa financeira Y, que analisava correla\u00e7\u00f5es nas mudan\u00e7as de cota\u00e7\u00f5es de a\u00e7\u00f5es. <\/p>\n<p><\/p>\n<p>E a tarefa era a seguinte:<\/p>\n<p><\/p>\n<ul>\n<li>Existem cerca de 5.000 a\u00e7\u00f5es. <\/li>\n<li>As cota\u00e7\u00f5es s\u00e3o atualizadas a cada 100 milissegundos. <\/li>\n<li>Os dados foram acumulados ao longo de 10 anos. Evidentemente, para algumas empresas mais, para outras menos. <\/li>\n<li>No total, cerca de 100 bilh\u00f5es de linhas. <\/li>\n<\/ul>\n<p><\/p>\n<p>Era necess\u00e1rio calcular a correla\u00e7\u00e3o das mudan\u00e7as. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/b02051e6cadec8c51e7f6e351ef903f9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aqui temos duas a\u00e7\u00f5es e suas cota\u00e7\u00f5es. Se uma sobe e a outra tamb\u00e9m sobe, isso \u00e9 uma correla\u00e7\u00e3o positiva, ou seja, uma cresce, a outra cresce. Se uma sobe, como no final do gr\u00e1fico, e a outra desce, isso \u00e9 uma correla\u00e7\u00e3o negativa, ou seja, quando uma cresce, a outra cai. <\/p>\n<p><\/p>\n<p>Ao analisar essas mudan\u00e7as m\u00fatuas, \u00e9 poss\u00edvel fazer previs\u00f5es no mercado financeiro. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/31329cf7523eef6a167632d281a634ce.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mas a tarefa \u00e9 complexa. O que \u00e9 feito para isso? Temos 100 bilh\u00f5es de registros, que cont\u00eam: tempo, a\u00e7\u00e3o e pre\u00e7o. Precisamos primeiro calcular 100 bilh\u00f5es de vezes o runningDifference do algoritmo de pre\u00e7o. RunningDifference \u00e9 uma fun\u00e7\u00e3o no ClickHouse que calcula a diferen\u00e7a entre duas linhas sequencialmente. <\/p>\n<p><\/p>\n<p>E ap\u00f3s isso, precisamos calcular a correla\u00e7\u00e3o, sendo que a correla\u00e7\u00e3o deve ser feita para cada par. Para 5.000 a\u00e7\u00f5es, s\u00e3o 12,5 milh\u00f5es de pares. E isso \u00e9 muito, ou seja, precisamos calcular essa fun\u00e7\u00e3o de correla\u00e7\u00e3o 12,5 vezes. <\/p>\n<p><\/p>\n<p>E se algu\u00e9m esqueceu, ent\u00e3o x e y s\u00e3o a expectativa matem\u00e1tica da amostra. Ou seja, n\u00e3o \u00e9 apenas contar ra\u00edzes e somas, mas tamb\u00e9m calcular outras somas dentro dessas somas. \u00c9 necess\u00e1rio realizar uma infinidade de c\u00e1lculos 12,5 milh\u00f5es de vezes, e ainda agrupar por horas. E temos muitas horas tamb\u00e9m. E precisamos fazer tudo isso em 60 segundos. \u00c9 uma piada. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/567a07f586a824c91671820fe21ec305.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Precis\u00e1vamos conseguir isso de alguma forma, porque tudo estava funcionando muito, muito lentamente, antes da chegada do ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/3eca1af4c3f25ff4b23fce9b84e16659.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Eles tentaram calcular isso no Hadoop, no Spark e no Greenplum. E tudo isso era muito lento ou caro. Ou seja, era poss\u00edvel calcular de alguma forma, mas depois era caro. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/37608c7e87ddb9a7d54854643044c369.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A\u00ed veio o ClickHouse e tudo melhorou muito. <\/p>\n<p><\/p>\n<p>Lembro que o problema \u00e9 a localidade dos dados, pois as correla\u00e7\u00f5es n\u00e3o podem ser localizadas. N\u00e3o podemos dividir parte dos dados em um servidor, parte em outro e calcular; todos os dados precisam estar em todos os lugares. <\/p>\n<p><\/p>\n<p>O que eles fizeram? Inicialmente, os dados eram localizados. Em cada um dos servidores, s\u00e3o armazenados dados de precifica\u00e7\u00e3o de um conjunto espec\u00edfico de a\u00e7\u00f5es. E eles n\u00e3o se sobrep\u00f5em. Por isso, podemos calcular logReturn de forma paralela e independente, tudo isso ocorre ao mesmo tempo de forma paralela e distribu\u00edda. <\/p>\n<p><\/p>\n<p>Depois, decidiram reduzir esses dados sem perder expressividade. Reduzir usando arrays, ou seja, para cada intervalo de tempo criar um array de a\u00e7\u00f5es e um array de pre\u00e7os. Assim, isso ocupa muito menos espa\u00e7o. E \u00e9 um pouco mais f\u00e1cil trabalhar com eles. S\u00e3o opera\u00e7\u00f5es quase paralelas, ou seja, calculamos parte delas em paralelo e depois gravamos no servidor. <\/p>\n<p><\/p>\n<p>Ap\u00f3s isso, podemos replicar. A letra 'r' significa que esses dados foram replicados. Ou seja, temos os mesmos dados em todos os tr\u00eas servidores \u2013 esses arrays. <\/p>\n<p><\/p>\n<p>E, em seguida, com um script especial, desse conjunto de 12,5 milh\u00f5es de correla\u00e7\u00f5es a serem calculadas, podemos criar pacotes. Ou seja, 2.500 tarefas com 5.000 pares de correla\u00e7\u00f5es. E essa tarefa \u00e9 calculada em um servidor espec\u00edfico do ClickHouse. Todos os dados est\u00e3o l\u00e1, pois os dados s\u00e3o iguais e ele pode comput\u00e1-los sequencialmente. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/587c6d587a48f2407dd2687f5423d44a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mais uma vez, como isso funciona. Primeiro, temos todos os dados nesta estrutura: tempo, a\u00e7\u00f5es, pre\u00e7o. Depois calculamos o logReturn, ou seja, os dados da mesma estrutura, mas em vez de pre\u00e7o, j\u00e1 temos logReturn. Em seguida, os reorganizamos, resultando em tempo e groupArray para a\u00e7\u00f5es e pre\u00e7os. Fizemos a replica\u00e7\u00e3o. E depois disso, geramos um monte de tarefas e alimentamos o ClickHouse para que ele pudesse process\u00e1-las. E isso funciona. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/434e7385aebcffcc03d1bd1a2020c8bf.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>No proof of concept, a tarefa era uma subtarefa, ou seja, pegamos menos dados. E foi tudo em tr\u00eas servidores.<\/p>\n<p><\/p>\n<p>As duas primeiras etapas: c\u00e1lculo do Log_return e embalagem em arrays levaram cerca de uma hora cada. <\/p>\n<p><\/p>\n<p>J\u00e1 o c\u00e1lculo da correla\u00e7\u00e3o levou cerca de 50 horas. Mas 50 horas \u00e9 pouco, porque antes isso funcionava por semanas. Isso foi um grande sucesso. E se contabilizar, tudo foi calculado 70 vezes por segundo neste cluster.<\/p>\n<p><\/p>\n<p>Mas o mais importante \u00e9 que este sistema praticamente n\u00e3o tem gargalos, ou seja, ele escala quase linearmente. E eles verificaram isso. Escalaram-no com sucesso. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/5a595a84897e492b49dccfb0f058b1b8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Um esquema correto \u00e9 metade do sucesso. E um esquema correto \u00e9 utilizar todas as tecnologias necess\u00e1rias do ClickHouse. <\/li>\n<li>Summing\/AggregatingMergeTrees s\u00e3o tecnologias que permitem agregar ou contabilizar o snapshot state como um caso especial. E isso simplifica muitas coisas. <\/li>\n<li>As Views Materializadas permitem contornar a limita\u00e7\u00e3o de um \u00edndice. Talvez eu n\u00e3o tenha explicado isso muito claramente, mas quando carregamos os logs, os logs brutos estavam em uma tabela com um \u00edndice, enquanto os logs de atributo estavam em outra tabela, ou seja, os mesmos dados, apenas filtrados, mas o \u00edndice era totalmente diferente. Parecia que eram os mesmos dados, mas com diferentes ordena\u00e7\u00f5es. E as Views Materializadas permitem, se necess\u00e1rio, contornar tal limita\u00e7\u00e3o do ClickHouse. <\/li>\n<li>Reduza a granularidade do \u00edndice para consultas pontuais. <\/li>\n<li>E distribua os dados de forma inteligente, tente maximizar a localiza\u00e7\u00e3o dos dados dentro do servidor. E busque garantir que as consultas tamb\u00e9m utilizem essa localiza\u00e7\u00e3o sempre que poss\u00edvel. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/c0fc1737986e3f18ed1d3c53df9f0252.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E resumindo esta breve apresenta\u00e7\u00e3o, pode-se dizer que o ClickHouse agora ocupa firmemente o territ\u00f3rio tanto de bancos de dados comerciais quanto de bancos de dados open source, ou seja, especificamente para an\u00e1lise. Ele se integrou maravilhosamente a esse cen\u00e1rio. E mais, ele lentamente come\u00e7a a expulsar outros, porque, com ClickHouse, voc\u00ea n\u00e3o precisa do InfiniDB. A Vertica pode, em breve, n\u00e3o ser mais necess\u00e1ria, se eles oferecerem um suporte SQL adequado. Aproveitem!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018)\" src=\"\/wp-content\/uploads\/2020\/07\/6e9a65d32eb6de7f9f139a30e7ab0d25.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u2014<em>Obrigado pela apresenta\u00e7\u00e3o! Muito interessante! Houve alguma compara\u00e7\u00e3o com o Apache Phoenix?<\/em><\/p>\n<p><\/p>\n<p>- N\u00e3o, n\u00e3o ouvi falar de ningu\u00e9m que tenha comparado. N\u00f3s e o Yandex tentamos acompanhar todas as compara\u00e7\u00f5es do ClickHouse com diferentes bancos de dados. Porque se por acaso algo for mais r\u00e1pido que o ClickHouse, Alexei Milovidov n\u00e3o consegue dormir \u00e0 noite e come\u00e7a a aceler\u00e1-lo rapidamente. N\u00e3o ouvi falar de tal compara\u00e7\u00e3o. <\/p>\n<p><\/p>\n<ul>\n<li>\n<p><em>(Alexei Milovidov) Apache Phoenix \u00e9 um motor SQL sobre HBase. O HBase \u00e9 principalmente projetado para cen\u00e1rios de trabalho do tipo key-value. Em cada linha, pode haver um n\u00famero arbitr\u00e1rio de colunas com nomes arbitr\u00e1rios. Isso pode ser dito sobre sistemas como HBase e Cassandra. E para consultas anal\u00edticas pesadas, eles n\u00e3o funcionar\u00e3o de forma adequada. Ou voc\u00ea pode pensar que eles funcionam bem, se n\u00e3o teve nenhuma experi\u00eancia com o ClickHouse.<\/em><\/p>\n<p>\n<\/li>\n<li>\n<p>Obrigado<\/p>\n<p><\/p>\n<ul>\n<li>\n<p><em>Bom dia! J\u00e1 estou bastante interessado nesse tema, pois tenho um subsistema de an\u00e1lise. Mas quando olho para o ClickHouse, tenho a sensa\u00e7\u00e3o de que o ClickHouse \u00e9 muito bom para a an\u00e1lise de eventos, mut\u00e1veis. E se eu precisar analisar muitos dados de neg\u00f3cios com diversos grandes tabelas, ent\u00e3o, pelo que entendi, ClickHouse pode n\u00e3o ser muito adequado para mim? Especialmente se eles mudarem. Isso est\u00e1 correto ou existem exemplos que podem contradizer isso?<\/em><\/p>\n<p>\n<\/li>\n<li>\n<p>Isso \u00e9 correto. E isso \u00e9 verdade para a maioria dos bancos de dados anal\u00edticos especializados. Eles s\u00e3o projetados para ter uma ou v\u00e1rias grandes tabelas que s\u00e3o mut\u00e1veis, e muitas pequenas que mudam lentamente. Ou seja, ClickHouse n\u00e3o \u00e9 como Oracle, onde voc\u00ea pode colocar tudo e construir consultas muito complexas. Para utilizar ClickHouse de forma eficaz, \u00e9 necess\u00e1rio construir o esquema de uma maneira que funcione bem no ClickHouse. Ou seja, evitar normaliza\u00e7\u00e3o excessiva, usar dicion\u00e1rios, e tentar fazer menos rela\u00e7\u00f5es longas. Se o esquema for estruturado dessa forma, tarefas de neg\u00f3cios similares no ClickHouse podem ser resolvidas muito mais eficientemente do que em um banco de dados relacional tradicional. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><em>Obrigado pela apresenta\u00e7\u00e3o! Eu tenho uma pergunta sobre o \u00faltimo caso financeiro. Eles tinham an\u00e1lises. Era necess\u00e1rio comparar como as coisas subiam e desciam. E eu entendo que voc\u00ea construiu o sistema especificamente para essa an\u00e1lise? Se eles precisarem, digamos, de um outro relat\u00f3rio sobre esses dados amanh\u00e3, ser\u00e1 necess\u00e1rio reconstruir o esquema e recarregar os dados? Ou seja, fazer algum pr\u00e9-processamento para obter a consulta?<\/em><\/p>\n<p><\/p>\n<p>Claro, isso \u00e9 o uso do ClickHouse para uma tarefa bastante espec\u00edfica. Tradicionalmente, poderia ser resolvida dentro do Hadoop. Para o Hadoop, essa \u00e9 uma tarefa ideal. Mas no Hadoop isso \u00e9 muito lento. Meu objetivo \u00e9 demonstrar que \u00e9 poss\u00edvel resolver no ClickHouse tarefas que normalmente s\u00e3o abordadas com meios muito diferentes, mas de forma muito mais eficaz. Est\u00e1 ajustado para uma tarefa espec\u00edfica. \u00c9 compreens\u00edvel que, se houver uma tarefa semelhante, ela possa ser resolvida de maneira parecida. <\/p>\n<p><\/p>\n<p><em>Entendi. Voc\u00ea disse que foram 50 horas de processamento. Isso conta desde o in\u00edcio, quando os dados foram carregados ou quando os resultados foram obtidos?<\/em><\/p>\n<p><\/p>\n<p>Sim, sim.<\/p>\n<p><\/p>\n<p><em>Muito bem, muito obrigado.<\/em><\/p>\n<p><\/p>\n<p>Isso em um cluster de 3 servidores. <\/p>\n<p><\/p>\n<p><em>Sauda\u00e7\u00f5es! Obrigado pela apresenta\u00e7\u00e3o! Tudo \u00e9 muito interessante. Eu gostaria de perguntar um pouco n\u00e3o sobre a funcionalidade, mas sobre o uso do ClickHouse em termos de estabilidade. Ou seja, voc\u00ea teve algum problema, precisou recuperar? Como o ClickHouse se comporta nesses casos? E j\u00e1 aconteceu de uma r\u00e9plica cair tamb\u00e9m? N\u00f3s, por exemplo, j\u00e1 tivemos problemas com o ClickHouse quando ele, de fato, ultrapassou seu limite e falhou.<\/em><\/p>\n<p><\/p>\n<p>Claro, n\u00e3o existem sistemas perfeitos. E o ClickHouse tamb\u00e9m tem seus problemas. Mas voc\u00ea j\u00e1 ouviu falar de casos em que o Yandex.Metrica n\u00e3o funcionou por muito tempo? Provavelmente n\u00e3o. Ela funciona de forma confi\u00e1vel desde 2012-2013 no ClickHouse. Tamb\u00e9m posso falar sobre minha experi\u00eancia. Nunca tivemos falhas totais. Alguns problemas parciais podiam ocorrer, mas nunca foram cr\u00edticos a ponto de impactar seriamente os neg\u00f3cios. Nunca aconteceu. O ClickHouse \u00e9 bastante confi\u00e1vel e n\u00e3o trava aleatoriamente. Pode-se ficar tranquilo quanto a isso. N\u00e3o \u00e9 algo cru. Isso foi comprovado por muitas empresas. <\/p>\n<p><\/p>\n<p><em>Ol\u00e1! Voc\u00ea mencionou que \u00e9 necess\u00e1rio planejar bem o esquema de dados desde o in\u00edcio. E se isso n\u00e3o foi feito? Meus dados est\u00e3o fluindo continuamente. Passa um semestre, e eu percebo que n\u00e3o d\u00e1 mais para viver assim, preciso reprocessar os dados e fazer algo a respeito.<\/em> <\/p>\n<p><\/p>\n<p>Isso depende, claro, do seu sistema. Existem v\u00e1rias maneiras de fazer isso praticamente sem interrup\u00e7\u00e3o. Por exemplo, voc\u00ea pode criar uma Materialized View, onde pode ter uma estrutura de dados diferente, desde que ela possa ser mapeada de forma clara. Ou seja, se permite mapeamento por meio do ClickHouse, como extrair alguns elementos, mudar a chave prim\u00e1ria, alterar a parti\u00e7\u00e3o, voc\u00ea pode fazer uma Materialized View. Reescreva seus dados antigos nela, e os novos ser\u00e3o inseridos automaticamente. Depois, basta mudar para usar a Materialized View, mudar a grava\u00e7\u00e3o e eliminar a tabela antiga. Esse \u00e9 um m\u00e9todo que pode ser feito sem interrup\u00e7\u00f5es. <\/p>\n<p><\/p>\n<p><em>Obrigado.<\/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.3 - 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\/pt\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-clickhouse-v-realnyh-prilozheniyah-aleksandr-zajczev-2018g\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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 pr\u00e1tica do uso do ClickHouse em aplica\u00e7\u00f5es reais. Alexander Zaitsev (2018) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/pt\/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":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/89878","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=89878"}],"version-history":[{"count":2,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/89878\/revisions"}],"predecessor-version":[{"id":162171,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/89878\/revisions\/162171"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/89879"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=89878"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=89878"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=89878"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}