Nous accélérons le traitement des événements à 1,6 million par seconde

Lorsque les participants de HighLoad ++ sont arrivés au rapport d' Alexander Krasheninnikov , ils espéraient entendre parler du traitement de 1 600 000 événements par seconde. Les attentes ne se sont pas réalisées ... Parce que lors de la préparation de la performance, ce chiffre a volé jusqu'à 1 800 000 - donc, sur HighLoad ++, la réalité dépasse les attentes.

Il y a 3 ans, Alexander a expliqué comment il avait construit un systÚme évolutif de traitement des événements en temps quasi réel à Badoo. Depuis lors, il a évolué, les volumes ont augmenté dans le processus, il était nécessaire de résoudre les problÚmes de mise à l'échelle et de tolérance aux pannes, et à un moment donné, des mesures radicales étaient nécessaires - un changement dans la pile technologique .



Grùce au déchiffrement, vous apprendrez comment, dans Badoo, vous avez remplacé le pack Spark + Hadoop par ClickHouse, économisé 3 fois le matériel et augmenté la charge 6 fois , pourquoi et par quels moyens collecter des statistiques dans le projet, puis quoi faire avec ces données.



À propos de l'orateur: Alexander Krasheninnikov ( alexkrash ) - Responsable de l'ingĂ©nierie des donnĂ©es chez Badoo. Il est engagĂ© dans l'infrastructure BI, la mise Ă  l'Ă©chelle des charges de travail et gĂšre les Ă©quipes qui construisent l'infrastructure de traitement des donnĂ©es. Il aime tout ce qui est distribuĂ©: Hadoop, Spark, ClickHouse. Je suis sĂ»r que des systĂšmes distribuĂ©s sympas peuvent ĂȘtre prĂ©parĂ©s Ă  partir d'OpenSource.

Collecte de statistiques


Si nous n'avons pas de donnĂ©es, nous sommes aveugles et ne pouvons pas gĂ©rer notre projet. C'est pourquoi nous avons besoin de statistiques - pour contrĂŽler la viabilitĂ© du projet. En tant qu'ingĂ©nieurs, nous devons nous efforcer d'amĂ©liorer nos produits et, si vous voulez vous amĂ©liorer, les mesurer. C'est ma devise au travail. Tout d'abord, notre objectif est les avantages commerciaux. Les statistiques fournissent des rĂ©ponses aux questions des entreprises . Les mĂ©triques techniques sont des mĂ©triques techniques, mais l'entreprise est Ă©galement intĂ©ressĂ©e par les indicateurs, et ils doivent Ă©galement ĂȘtre pris en considĂ©ration.

Cycle de vie des statistiques


Je définis le cycle de vie des statistiques par 4 points, dont nous discuterons chacun séparément.



Définir la phase - Formalisation


Dans l'application, nous collectons plusieurs métriques. Tout d'abord, ce sont des mesures commerciales . Si vous avez un service photo, par exemple, vous vous demandez combien de photos sont téléchargées par jour, par heure, par seconde. Les métriques suivantes sont «semi-techniques» : réactivité d'une application ou d'un site mobile, travail de l'API, rapidité avec laquelle un utilisateur interagit avec un site, installation d'application, UX. Le suivi du comportement des utilisateurs est la troisiÚme mesure importante. Ce sont des systÚmes comme Google Analytics et Yandex.Metrics. Nous avons notre propre systÚme de suivi cool, dans lequel nous investissons beaucoup.

Dans le processus de travail avec les statistiques, de nombreux utilisateurs sont impliquĂ©s - ce sont des dĂ©veloppeurs et des analyses commerciales. Il est important que tout le monde parle la mĂȘme langue, vous devez donc ĂȘtre d'accord.

Il est possible de négocier verbalement, mais c'est beaucoup mieux lorsque cela se produit formellement - dans une structure claire des événements.

Formaliser la structure des événements commerciaux, c'est lorsque le développeur dit combien d'inscriptions nous avons, l'analyste comprend qu'il a reçu des informations non seulement sur le nombre total d'inscriptions, mais aussi par pays, sexe et autres paramÚtres. Et toutes ces informations sont formalisées et sont dans le domaine public pour tous les utilisateurs de l'entreprise . L'événement a une structure typée et une description formelle. Par exemple, nous stockons ces informations au format Protocol Buffers .

Description de l'événement "Inscription":

enum Gender { FEMALE = 1; MALE = 2; } message Registration { required int32 userid =1; required Gender usergender = 2; required int32 time =3; required int32 countryid =4; } 

L'événement d'enregistrement contient des informations sur l' utilisateur, le champ, l'heure de l' événement et le pays d' enregistrement de l'utilisateur. Ces informations sont disponibles pour les analystes et, à l'avenir, l'entreprise comprend ce que nous collectons.

Pourquoi ai-je besoin d'une description formelle?


Une description formelle est l' uniformité pour les développeurs, les analystes et le service produit. Ensuite, ces informations imprÚgnent la description de la logique métier de l'application. Par exemple, nous avons un systÚme interne pour décrire les processus métier et c'est dans un écran que nous avons une nouvelle fonctionnalité.



Dans le document des exigences du produit, il y a une section avec l'instruction que lorsque l'utilisateur interagit avec l'application de cette maniĂšre, nous devons envoyer un Ă©vĂ©nement avec exactement les mĂȘmes paramĂštres. Par la suite, nous serons en mesure de valider le fonctionnement de nos fonctionnalitĂ©s et de les mesurer correctement. Une description formelle nous permet de mieux comprendre comment enregistrer ces donnĂ©es dans une base de donnĂ©es: NoSQL, SQL ou autres. Nous avons un schĂ©ma de donnĂ©es , et c'est cool.

Dans certains systĂšmes analytiques fournis en tant que service, il n'y a que 10 Ă  15 Ă©vĂ©nements dans le stockage secret. Dans notre pays, ce nombre a augmentĂ© de plus de 1000 et ne va pas s'arrĂȘter - il est impossible de vivre sans un seul registre .

Définir le résumé de la phase


Nous avons décidé que les statistiques - c'est important et décrit un certain sujet - c'est bien, vous pouvez vivre.

Phase de collecte - collecte de données


Nous avons dĂ©cidĂ© de construire le systĂšme de sorte que lorsqu'un Ă©vĂ©nement commercial se produit - enregistrement, envoi d'un message, comme - en mĂȘme temps que l'enregistrement de ces informations, nous envoyions sĂ©parĂ©ment un certain Ă©vĂ©nement statistique.

Dans le code, les statistiques sont envoyées simultanément avec l'événement commercial.

Il est traité complÚtement indépendamment des magasins de données dans lesquels l'application s'exécute, car le flux de données passe par un pipeline de traitement distinct.

Description via EDL:

 enum Gender { FEMALE = 1; MALE = 2; } message Registration { required int32 user_id =1; required Gender user_gender = 2; required int32 time =3; required int32 country_id =4; } 

Nous avons une description de l'événement d'inscription. Une API est générée automatiquement, accessible aux développeurs à partir de code, qui en 4 lignes vous permet d'envoyer des statistiques.

API basée sur EDL:

 \EDL\Event\Regist ration::create() ->setUserId(100500) ->setGender(Gender: :MALE) ->setTime(time()) ->send(); 

Livraison d'événement


Ceci est notre systÚme externe. Nous le faisons parce que nous avons des services incroyables qui fournissent une API pour travailler avec des données photo, sur autre chose. Ils stockent tous des données dans des bases de données innovantes, telles que Aerospike et CockroachDB.

Lorsque vous avez besoin de créer une sorte de rapport, vous n'avez pas à vous battre: "Les gars, combien avez-vous et combien?" - Toutes les données sont envoyées dans un flux séparé. Convoyeur de traitement - systÚme externe. Dans le contexte de l'application, nous délions toutes les données du référentiel de logique métier et les envoyons vers un pipeline séparé.

La phase de collecte suppose la disponibilité des serveurs d'applications. Nous avons ce PHP.



Le transport


Il s'agit d'un sous-systÚme qui nous permet d'envoyer à un autre pipeline ce que nous avons fait à partir du contexte d'application. Le transport est sélectionné uniquement selon vos besoins, en fonction de la situation du projet.

Le transport a des caractéristiques, et le premier est les garanties de livraison. Caractéristiques du transport: au moins une fois, exactement une fois, vous choisissez des statistiques pour vos tùches, en fonction de l'importance de ces données. Par exemple, pour les systÚmes de facturation, il est inacceptable que les statistiques montrent plus de transactions qu'il n'y en a - c'est de l'argent, ce n'est pas possible.

Le deuxiÚme paramÚtre concerne les liaisons pour les langages de programmation. Nous devons en quelque sorte interagir avec le transport, il est donc sélectionné en fonction de la langue dans laquelle le projet est écrit.

Le troisiÚme paramÚtre est l' évolutivité. Comme nous parlons de millions d'événements par seconde, il serait bon de garder à l'esprit la future évolutivité.

Il existe de nombreuses options de transport: applications RDBMS, Flume, Kafka ou LSD. Nous utilisons du LSD - c'est notre façon spéciale.

Démon de streaming en direct


Le LSD n'a rien à voir avec les substances interdites. Il s'agit d'un démon de streaming trÚs rapide et dynamique qui ne fournit aucun agent pour y écrire. Nous pouvons le régler, nous avons l' intégration avec d'autres systÚmes : HDFS, Kafka - nous pouvons réorganiser les données envoyées. Le LSD n'a pas d'appel réseau sur INSERT et vous pouvez y contrÎler la topologie du réseau.

Plus important encore, c'est OpenSource de Badoo - il n'y a aucune raison de ne pas faire confiance Ă  ce logiciel.

Si c'était un démon parfait, au lieu de Kafka, nous discuterions du LSD à chaque conférence, mais chaque LSD a une mouche dans la pommade. Nous avons nos propres limites avec lesquelles nous sommes à l'aise: nous n'avons pas de support de réplication en LSD et il a au moins une garantie de livraison. En outre, pour les transactions monétaires, ce n'est pas le moyen de transport le plus approprié, mais vous devez généralement communiquer avec de l'argent exclusivement via des bases de données "acides" - prenant en charge ACID .

Récapitulatif de la phase de collecte


Sur la base des résultats de la série précédente, nous avons reçu une description formelle des données, généré une excellente API pratique pour les répartiteurs d'événements , et trouvé comment transférer ces données du contexte d'application vers un pipeline séparé . Déjà pas mal, et nous approchons de la prochaine phase.

Processus de phase - Traitement des données


Nous avons collectĂ© des donnĂ©es sur les inscriptions, tĂ©lĂ©chargĂ© des photos, des sondages - que faire de tout cela? À partir de ces donnĂ©es, nous voulons obtenir des graphiques avec une longue histoire et des donnĂ©es brutes . Les graphiques comprennent tout - vous n'avez pas besoin d'ĂȘtre un dĂ©veloppeur pour comprendre Ă  partir de la courbe que les revenus de l'entreprise augmentent. Nous utilisons des donnĂ©es brutes pour les rapports en ligne et ad-hoc. Pour les cas plus complexes, nos analystes souhaitent effectuer des requĂȘtes analytiques sur ces donnĂ©es. Cela et cette fonctionnalitĂ© nous sont nĂ©cessaires.

Graphiques


Les graphiques se présentent sous plusieurs formes.



Ou, par exemple, un graphique avec un historique qui montre les données sur 10 ans.



Les graphiques sont mĂȘme comme ça.



C'est le résultat d'un test AB, et il est étonnamment similaire au bùtiment Chrysler à New York.

Il existe deux façons de dessiner un graphique: une requĂȘte de donnĂ©es brutes et une sĂ©rie chronologique . Les deux approches prĂ©sentent des inconvĂ©nients et des avantages sur lesquels nous ne nous attarderons pas en dĂ©tail. Nous utilisons une approche hybride : nous nous tenons Ă  l'Ă©cart des donnĂ©es brutes pour les rapports opĂ©rationnels et des sĂ©ries chronologiques pour le stockage Ă  long terme. Le second est calculĂ© Ă  partir du premier.

Comment nous sommes passés à 1,8 million d'événements par seconde


C'est une longue histoire - des millions de RPS n'arrivent pas en une journée. Badoo est une entreprise avec une décennie d'histoire, et nous pouvons dire que le systÚme de traitement des données a grandi avec l'entreprise.



Au dĂ©but, nous n'avions rien. Nous avons commencĂ© Ă  collecter des donnĂ©es - il s'est avĂ©rĂ© 5000 Ă©vĂ©nements par seconde. Un hĂŽte MySQL et rien d'autre! N'importe quel SGBD relationnel fera face Ă  cette tĂąche, et il sera Ă  l'aise avec cela: vous aurez la transactionnalitĂ© - mettez les donnĂ©es, recevez des requĂȘtes - tout fonctionne bien et bien. Nous avons donc vĂ©cu un certain temps.

À un moment donnĂ©, un partage fonctionnel s'est produit: les donnĂ©es d'enregistrement - ici et sur les photos - lĂ . Nous avons donc vĂ©cu jusqu'Ă  200 000 Ă©vĂ©nements par seconde et avons commencĂ© Ă  utiliser diverses approches combinĂ©es: pour stocker non pas des donnĂ©es brutes, mais agrĂ©gĂ©es , mais jusqu'Ă  prĂ©sent dans la base de donnĂ©es relationnelle. Nous stockons des compteurs, mais l'essence de la plupart des bases de donnĂ©es relationnelles est telle qu'il sera alors impossible d'exĂ©cuter une requĂȘte DISTINCT sur ces donnĂ©es - le modĂšle algĂ©brique des compteurs ne permet pas de calculer DISTINCT.

Chez Badoo, nous avons la devise «Force imparable» . Nous n'allions pas nous arrĂȘter et grandir davantage. Au moment oĂč nous avons franchi le seuil des 200 000 Ă©vĂ©nements par seconde , nous avons dĂ©cidĂ© de crĂ©er une description formelle, dont j'ai parlĂ© plus haut. Avant cela, il y avait du chaos, et maintenant nous avons un registre structurĂ© des Ă©vĂ©nements: nous avons commencĂ© Ă  faire Ă©voluer le systĂšme, Hadoop connectĂ© , toutes les donnĂ©es sont entrĂ©es dans les tables Hive.

Hadoop est un Ă©norme progiciel, systĂšme de fichiers. Pour l'informatique distribuĂ©e, Hadoop dit: «Mettez les donnĂ©es ici, je vous laisse effectuer des requĂȘtes analytiques sur elles.» Nous avons donc fait - Ă©crit un calcul rĂ©gulier de tous les graphiques - cela s'est bien passĂ©. Mais les graphiques sont utiles lorsqu'ils sont mis Ă  jour rapidement - une fois par jour, regarder une mise Ă  jour des graphiques n'est pas si amusant. Si nous dĂ©ployions quelque chose conduisant Ă  une erreur fatale sur la production, nous aimerions voir le graphique tomber immĂ©diatement, et pas tous les deux jours. Par consĂ©quent, l'ensemble du systĂšme a commencĂ© Ă  se dĂ©grader aprĂšs un certain temps. Cependant, nous avons rĂ©alisĂ© qu'Ă  ce stade, vous pouvez vous en tenir Ă  la pile technologique sĂ©lectionnĂ©e.

Pour nous, Java Ă©tait nouveau, nous l'avons aimĂ© et nous avons compris ce qui pouvait ĂȘtre fait diffĂ©remment.

Au stade de 400 000 Ă  800 000 Ă©vĂ©nements par seconde , nous avons remplacĂ© Hadoop dans sa forme la plus pure et Hive, car l'exĂ©cuteur des requĂȘtes analytiques, avec Spark Streaming , a Ă©crit une carte gĂ©nĂ©rique / rĂ©duire et un calcul incrĂ©mentiel des mĂ©triques. Il y a 3 ans, j'ai racontĂ© comment nous l'avons fait. Ensuite, il nous a semblĂ© que Spark vivrait Ă©ternellement, mais la vie en a dĂ©cidĂ© autrement - nous avons rencontrĂ© les limites de Hadoop. Peut-ĂȘtre que si nous avions d'autres conditions, nous continuerions Ă  vivre avec Hadoop.

Un autre problĂšme, en plus du calcul des graphiques sur Hadoop, Ă©tait les incroyables requĂȘtes SQL Ă  quatre Ă©tages qui Ă©taient conduites par les analystes, et les graphiques n'Ă©taient pas mis Ă  jour rapidement. Le fait est qu'il y a un travail assez dĂ©licat avec le traitement des donnĂ©es opĂ©rationnelles, de sorte qu'il est en temps rĂ©el, rapide et cool.

Badoo est desservi par deux centres de donnĂ©es situĂ©s des deux cĂŽtĂ©s de l'ocĂ©an Atlantique - en Europe et en AmĂ©rique du Nord. Pour crĂ©er un rapport unifiĂ©, vous devez envoyer des donnĂ©es d'AmĂ©rique vers l'Europe. C'est dans le centre de donnĂ©es europĂ©en que nous conservons toutes les statistiques statistiques, car il y a plus de puissance de calcul. Un aller - retour entre les centres de donnĂ©es d'environ 200 ms - le rĂ©seau est assez dĂ©licat - faire une demande Ă  un autre contrĂŽleur de domaine n'est pas la mĂȘme chose que d'aller au rack suivant.

Lorsque nous avons commencĂ© Ă  formaliser les Ă©vĂ©nements et les dĂ©veloppeurs, et que les chefs de produit se sont impliquĂ©s, tout le monde a tout aimĂ© - il y avait juste une croissance explosive des Ă©vĂ©nements . À cette Ă©poque, il Ă©tait temps d'acheter du fer dans le cluster, mais nous ne voulions pas vraiment le faire.

Lorsque nous avons dépassé le pic de 800 000 événements par seconde , nous avons découvert ce que Yandex avait téléchargé sur OpenSource ClickHouse et avons décidé de l'essayer. Ils ont rempli un train de cÎnes pendant qu'ils essayaient de faire quelque chose, et en conséquence, quand tout a fonctionné, ils ont fait un petit buffet au sujet du premier million d'événements. Probablement, ClickHouse aurait pu terminer le rapport.

Prenez ClickHouse et vivez avec.

Mais ce n'est pas intéressant, nous allons donc continuer à parler de traitement des données.

Clickhouse


ClickHouse est un battage mĂ©diatique des deux derniĂšres annĂ©es et n'a pas besoin d'ĂȘtre introduit: seulement dans HighLoad ++ en 2018, je me souviens d' environ cinq rapports Ă  ce sujet, ainsi que de sĂ©minaires et de rĂ©unions.

Cet outil est conçu pour rĂ©soudre exactement les tĂąches que nous nous fixons. Il existe des mises Ă  jour et des puces en temps rĂ©el que nous avons reçues Ă  un moment donnĂ© de Hadoop: rĂ©plication, partitionnement. Il n'y avait aucune raison de ne pas essayer ClickHouse, car ils comprenaient qu'avec l'implĂ©mentation sur Hadoop, nous avions dĂ©jĂ  cassĂ© le fond. L'outil est cool, et la documentation est gĂ©nĂ©ralement du feu - j'y ai Ă©crit moi-mĂȘme, j'aime vraiment tout, et tout est super. Mais nous avons dĂ» rĂ©soudre un certain nombre de problĂšmes.

Comment déplacer l'intégralité du flux d'événements dans ClickHouse? Comment combiner les données de deux centres de données? Du fait que nous sommes venus aux administrateurs et avons dit: "Les gars, installons ClickHouse", ils ne rendront pas le réseau deux fois plus épais, et le retard est moitié moins. Non, le réseau est toujours aussi mince et petit que le premier salaire.

Comment conserver les résultats ? Chez Hadoop, nous avons compris comment dessiner des graphiques - mais comment le faire sur la ClickHouse magique? La baguette magique n'est pas incluse. Comment fournir des résultats au stockage de séries chronologiques?

Comme mon professeur à l'institut l'a dit, considérez 3 schémas de données: stratégique, logique et physique.

Schéma de stockage stratégique


Nous avons 2 centres de donnĂ©es . Nous avons appris que ClickHouse ne sait rien des contrĂŽleurs de domaine et nous avons simplement ajoutĂ© le cluster dans chaque contrĂŽleur de domaine. Maintenant, les donnĂ©es ne transitent pas par le cĂąble transatlantique - toutes les donnĂ©es qui se sont produites dans le contrĂŽleur de domaine sont stockĂ©es localement dans son cluster. Lorsque nous voulons faire une demande sur les donnĂ©es combinĂ©es, par exemple, pour savoir combien d'inscriptions sont dans les deux contrĂŽleurs de domaine, ClickHouse nous donne cette opportunitĂ©. Faible latence et disponibilitĂ© pour la demande - juste un chef-d'Ɠuvre!



Schéma de stockage physique


Encore une fois, des questions: comment nos donnĂ©es entreront-elles dans le modĂšle relationnel ClickHouse, que faire pour ne pas perdre la rĂ©plication et le sharding? Tout est largement dĂ©crit dans la documentation ClickHouse , et si vous avez plusieurs serveurs, vous rencontrerez cet article. Par consĂ©quent, nous ne nous pencherons pas sur ce qui est dans le manuel: rĂ©plications, partitionnement et requĂȘtes sur toutes les donnĂ©es sur les fragments.

Logique de stockage


Le diagramme logique est le plus intĂ©ressant. Dans un pipeline, nous traitons des Ă©vĂ©nements hĂ©tĂ©rogĂšnes. Cela signifie que nous avons un flux d'Ă©vĂ©nements hĂ©tĂ©rogĂšnes : enregistrement, voix, tĂ©lĂ©chargement de photos, mesures techniques, suivi du comportement des utilisateurs - tous ces Ă©vĂ©nements ont des attributs complĂštement diffĂ©rents . Par exemple, j'ai regardĂ© l'Ă©cran sur un tĂ©lĂ©phone mobile - j'ai besoin d'un identifiant d'Ă©cran, j'ai votĂ© pour quelqu'un - vous devez comprendre si le vote Ă©tait pour ou contre. Tous ces Ă©vĂ©nements ont des attributs diffĂ©rents, diffĂ©rents graphiques sont dessinĂ©s dessus, mais tout cela doit ĂȘtre traitĂ© dans un seul pipeline. Comment le mettre dans le modĂšle ClickHouse?

Approche n ° 1 - par table d'événements. Cette premiÚre approche, nous avons extrapolé à partir de l'expérience acquise avec MySQL - nous avons créé une tablette pour chaque événement dans ClickHouse. Cela semble assez logique, mais nous avons rencontré un certain nombre de difficultés.

Nous n'avons aucune restriction quant au fait que l'Ă©vĂ©nement changera de structure lorsque la version d'aujourd'hui sera publiĂ©e. Ce patch peut ĂȘtre rĂ©alisĂ© par n'importe quel dĂ©veloppeur. Le schĂ©ma est gĂ©nĂ©ralement modifiable dans toutes les directions. Le seul champ obligatoire est l' Ă©vĂ©nement d'horodatage et ce qu'Ă©tait l'Ă©vĂ©nement. Tout le reste change Ă  la volĂ©e et, en consĂ©quence, ces plaques doivent ĂȘtre modifiĂ©es. ClickHouse a la capacitĂ© d'effectuer ALTER sur un cluster , mais c'est une procĂ©dure dĂ©licate dĂ©licate qui est difficile Ă  automatiser pour le faire fonctionner en douceur. Par consĂ©quent, c'est un inconvĂ©nient.

Nous avons plus d'un millier d'événements différents, ce qui nous donne un taux d'insertion élevé par machine - nous enregistrons constamment toutes les données dans mille tableaux. Pour ClickHouse, il s'agit d'un anti-motif. Si Pepsi a le slogan - "Live in big sips", alors ClickHouse - "Live in big batch" . Si cela n'est pas fait, la réplication est étouffée, ClickHouse refuse d'accepter de nouvelles insertions - un schéma désagréable.

Approche n ° 2 - une large table . Des hommes sibĂ©riens ont tentĂ© de glisser la tronçonneuse sur le rail et d'appliquer un modĂšle de donnĂ©es diffĂ©rent. Nous faisons un tableau avec mille colonnes , oĂč chaque Ă©vĂ©nement a des colonnes rĂ©servĂ©es Ă  ses donnĂ©es. Nous obtenons une Ă©norme table clairsemĂ©e - heureusement, cela ne va pas au-delĂ  de l'environnement de dĂ©veloppement, car dĂšs les premiers inserts, il est devenu clair que le schĂ©ma est absolument mauvais, et nous ne le ferons pas.

Mais je veux toujours utiliser un produit logiciel aussi cool, un peu plus pour terminer - et ce sera ce dont vous avez besoin.

Approche n ° 3 - tableau générique. Nous avons une énorme table dans laquelle nous stockons les données dans des tableaux, car ClickHouse prend en charge les types de données non scalaires . Autrement dit, nous commençons une colonne dans laquelle les noms des attributs sont stockés, et une colonne distincte avec un tableau dans lequel les valeurs des attributs sont stockées.



ClickHouse ici remplit trÚs bien sa tùche. Si nous n'avions qu'à insérer des données, nous serions probablement extirper 10 fois de plus dans l'installation actuelle.

Cependant, la mouche dans la pommade est qu'elle est également un anti-modÚle pour ClickHouse - pour stocker des tableaux de chaßnes . C'est mauvais car les tableaux de lignes occupent plus d'espace disque - ils rétrécissent moins que les colonnes simples et sont plus difficiles à traiter . Mais pour notre tùche, nous fermons les yeux sur cela, car les avantages l'emportent.

Comment faire SELECT à partir d'une telle table? Notre tùche consiste à compter les inscriptions groupées par sexe. Vous devez d'abord trouver dans un tableau quelle position correspond à la colonne genre, puis monter dans une autre colonne avec cet index et obtenir les données.



Comment dessiner des graphiques sur ces données


Étant donnĂ© que tous les Ă©vĂ©nements sont dĂ©crits, ils ont une structure stricte, nous formons une requĂȘte SQL Ă  quatre Ă©tages pour chaque type d'Ă©vĂ©nement, l'exĂ©cutons et enregistrons les rĂ©sultats dans une autre table.

Le problÚme est que pour dessiner deux points adjacents sur le graphique, vous devez numériser la table entiÚre . Exemple: nous regardons l'inscription par jour. Cet événement va de la premiÚre ligne à l'avant-derniÚre. Numérisé une fois - excellent. AprÚs 5 minutes, nous voulons dessiner un nouveau point sur le graphique - encore une fois, nous analysons la plage de données qui croise avec l'analyse précédente, et ainsi de suite pour chaque événement. Cela semble logique, mais ça n'a pas l'air génial.

De plus, lorsque nous prenons certaines lignes, nous devons également lire les résultats sous agrégation . Par exemple, il est un fait que le serviteur de Dieu était enregistré en Scandinavie et était un homme, et nous devons calculer les statistiques sommaires: combien d'inscriptions, combien d'hommes, combien d'entre eux sont des personnes et combien sont de NorvÚge. Cela s'appelle en termes de bases de données analytiques ROLLUP, CUBE et GROUPING SETS - transformez une ligne en plusieurs.

Comment traiter


Heureusement, ClickHouse dispose d'un outil pour résoudre ce problÚme, à savoir l' état sérialisé des fonctions d'agrégation . Cela signifie que vous pouvez numériser une fois une donnée et enregistrer ces résultats. Ceci est une fonctionnalité qui tue . Il y a 3 ans, nous avons fait exactement cela sur Spark et Hadoop, et c'est cool qu'en parallÚle avec nous, les meilleurs esprits Yandex aient implémenté un analogue dans ClickHouse.

Demande lente


Nous avons une demande lente - compter les utilisateurs uniques pour aujourd'hui et hier.

 SELECT uniq(user_id) FROM table WHERE dt IN (today(), yesterday()) 

Dans le plan physique, nous pouvons faire SELECT pour l'état d'hier, obtenir sa représentation binaire, l'enregistrer quelque part.

 SELECT uniq(user_id), 'xxx' AS ts, uniqState(user id) AS state FROM table WHERE dt IN (today(), yesterday()) 

Pour aujourd'hui, nous modifions simplement la condition qu'il sera aujourd'hui: 'yyy' AS ts et WHERE dt = today() et horodatage que nous appellerons «xxx» et «yyy». , , 2 .

 SELECT uniqMerge(state) FROM ageagate_table WHERE ts IN ('xxx', 'yyy') 


:

  • , ;
  • ;
  • .

, - . . , , , , ClickHouse, : «, ! , !»


, , . , . . — SQL-, . , , .



, - time series. : , , , time series.

time series : , , timestamp . , , . . , , , — , . , , ClickHouse -, , .

, , ClickHouse:

— « », — .

time series 2 , 20 20-80 . . ClickHouse GraphiteMergeTree , time series, .


8 ClickHouse , 6 - , 2 : 2 — , . 1.8 . , 500 . , 1,8 , 500 ! .

Hadoop


2 . . 3 , CPU — 4 . , .

Process


, , , . , , ClickHouse 3 000 . , , , overkill.

, , . ClickHouse, . , , , . , 8 3–4 . — .

Present —


, ? time series, time series , , , .



Drop Detect — SQL : SQL- , , .



Anomaly Detection — . , , 2% , — 40, , , , .

— , , - , Anomaly Detection.

Anomaly Detection


, time series . : , , . time series . , , . , drop detection — , .

UI.



. - , — . -, .

Present


, , . , : 1000 — alarm, 0 — alarm. .

Anomaly Detection , . Anomaly Detection Exasol , ClickHouse. Anomaly Detection 2 , .


, , 4 .

, , , . , , . , .

HighLoad++ , HighLoad++ - . , , :)

, PHP Russia , , . , , , 1,8 /, , 1 .

Source: https://habr.com/ru/post/fr442616/


All Articles