Par Maxime Jumelle
CTO & Co-Founder
Publié le 23 mai 2023
Catégorie Data Engineering
Apache Phoenix est une extension open-source de Apache HBase qui fournit une couche de requêtes SQL pour les données stockées dans HBase. Phoenix permet ainsi d'interagir sur les tables HBase à l'aide de requêtes SQL standard, sans avoir à écrire de code spécifique à HBase.
Phoenix utilise une approche de traitement en mémoire pour accélérer les requêtes, ce qui en fait un choix attrayant pour les applications nécessitant des performances élevées lors de l'interrogation de données massives. Il exploite également la compression de données pour réduire l'utilisation de l'espace de stockage.
Dans cet article, nous allons voir comment Phoenix est utilisé pour faciliter les requêtes sur des tables HBase.
Rappelons que HBase est une base orientée colonne : elle est constituée de tables de données (au même titre qu'une base de données SQL). En revanche, les colonnes pourront êtres différentes en fonctions des lignes.
Le modèle de données d'Apache HBase est un modèle de colonnes distribuées, également appelé modèle de colonnes larges. Ce modèle de données diffère du modèle de lignes et de colonnes des bases de données relationnelles traditionnelles.
Dans HBase, les données sont stockées dans des tables qui sont constituées de familles de colonnes. Chaque famille de colonnes peut contenir un nombre arbitraire de colonnes, qui peuvent être ajoutées ou supprimées de manière dynamique. Les colonnes sont identifiées par un nom, qui est une chaîne de caractères, et sont regroupées dans des familles de colonnes pour faciliter la gestion des données.
Lorsque l'on souhaite faire des requêtes sur des tables HBase, notamment pour récupérer plusieurs lignes d'une table, on utilise la commande scan
. La commande scan
, comme son nom l'indique, permet de scanner l'intégralité de la table, c'est-à-dire récupérer ou afficher toutes les lignes qui composent la table, ainsi que les colonnes associées.
À lire aussi : découvrez notre formation Data Engineer
Si par exemple, on dispose de la table users
avec les familles de colonnes 'users', 'infos', 'events'
, on peut utiliser la commande suivante pour récupérer l'intégralité des lignes.
scan 'users'
ROW COLUMN+CELL 0 column=infos:email, timestamp=1667398963047, value=encoreuneautreadresse@gmail.com 0 column=infos:first_name, timestamp=1667398870035, value=Jean 0 column=infos:last_name, timestamp=1667398833989, value=Dupont 1 column=infos:first_name, timestamp=1667398924511, value=Maxime 1 column=infos:last_name, timestamp=1667398924536, value=Jumelle 2 row(s) Took 0.0481 seconds
Bien entendu, cette commande est très lourde, car elle demande de récupérer toutes les données stockées dans tous les DataNodes de HBase. Dans la plupart des cas, on souhaitera alors filtrer sur les lignes ou les colonnes pour ne récupérer que les lignes qui nous intéressent. Au même titre que la clause WHERE
sous SQL, l'opération FILTER
permet d'ajouter des prédicats, et plus spécifiquement des filtres pour récupérer uniquement certaines lignes qui nous intéressent.
Par exemple, supposons que l'on souhaite récupérer toutes les lignes dont les utilisateurs possèdent une adresse email. Nous pouvons alors utiliser l'opération suivante.
scan 'users', {FILTER => "SingleColumnValueFilter('infos', 'email', !=, 'binary:', true, true)"}
ROW COLUMN+CELL 0 column=infos:email, timestamp=1667398963047, value=encoreuneautreadresse@gmail.com 0 column=infos:first_name, timestamp=1667398870035, value=Jean 0 column=infos:last_name, timestamp=1667398833989, value=Dupont 1 row(s) Took 0.0641 seconds
Nous n'obtenons qu'une seule ligne, ce qui est cohérent, car seul le premier utilisateur sur les deux possède une adresse email. Essayons d'analyser le filtre.
Nous utilisons des filtres comme SingleColumnValueFilter
qui vont tester une condition d'égalité, inégalité, etc sur une colonne particulière. Nous spécifions dans l'ordre la famille de colonne, la colonne, l'opération et enfin la valeur à tester (ici, binary:
signifie valeur nulle).
Comme nous venons de le voir, les requêtes sur les tables HBase peuvent être complexes à formuler, car elles demandent d'utiliser l'API HBase standard pour déterminer les opérations à réaliser. Il serait donc plus intéressant d'utiliser un langage comme le SQL, d'une part parce qu'il est très utilisé dans les infrastructures IT, mais aussi parce que beaucoup de Data Engineers savent formuler des requêtes SQL.
C'est justement là qu'intervient Apache Phoenix : cet outil permet de convertir des requêtes SQL en requêtes HBase. Phoenix utilise une syntaxe SQL standard pour la création de tables, l'insertion de données, la mise à jour de données et la requête de données. Il prend en charge les fonctions SQL classiques, les agrégations, les jointures et les sous-requêtes.
Le principal avantage, c'est donc de pouvoir communiquer avec HBase uniquement via du SQL, tout en garantissant les principes de base de données transactionnelle. L'autre point intéressant, c'est que Phoenix utilise des techniques de compression, de mise en cache et de parallélisation pour optimiser les performances des requêtes SQL sur les données HBase. Cela permet d'obtenir des temps de réponse rapides pour les requêtes SQL sur de grandes quantités de données, à l'instar de la rapidité par défaut présente sous HBase.
Lorsqu'une requête SQL est requêtée, il y a en réalité une conversion qui est opérée par Phoenix. Cette opération de mappage de requêtes SQL vers les opérations HBase consiste pour Phoenix à analyser la requête et la mapper vers les opérations HBase appropriées. Phoenix utilise des tables système pour stocker des informations sur la structure de la table HBase et pour mappage les colonnes SQL aux familles de colonnes et aux qualificateurs de colonnes HBase.
Phoenix prend également en charge les index pour accélérer les requêtes SQL. Les index sont stockés dans des tables HBase distinctes et sont utilisés pour identifier rapidement les lignes de données correspondant aux critères de recherche.
À lire aussi : découvrez notre formation Data Engineer
Pour interagir avec Phoenix, on peut utiliser la ligne de commande sqlline.py
, qui nous permet de rentrer dans le Shell HBase, et d'exécuter des requêtes SQL. Avant de démarrer, commençons par y ajouter la table users_events
.
Il est possible de créer une table sous Phoenix afin d'en créer une représentation SQL pour ensuite y importer les données (depuis une table HBase ou à partir d'un fichier CSV).
CREATE TABLE IF NOT EXISTS users_events ( event_id BIGINT NOT NULL, event_time TIMESTAMP, event_type VARCHAR, product_id VARCHAR, category_id VARCHAR, category_code VARCHAR, brand VARCHAR, price FLOAT, user_id VARCHAR, user_session VARCHAR CONSTRAINT users_events_pk PRIMARY KEY (event_id) );
La table users_events
peut donc être requêtée avec du SQL classique.
SELECT * FROM users_events LIMIT 10;
+----------+-----------------------+------------+------------+---------------------+----------------+ | EVENT_ID | EVENT_TIME | EVENT_TYPE | PRODUCT_ID | CATEGORY_ID | CAT | +----------+-----------------------+------------+------------+---------------------+----------------+ | 0 | 2019-10-01 00:00:00.0 | view | 44600062 | 2103807459595387724 | | | 1 | 2019-10-01 00:00:00.0 | view | 3900821 | 2053013552326770905 | appliances.env | | 2 | 2019-10-01 00:00:01.0 | view | 17200506 | 2053013559792632471 | furniture.livi | | 3 | 2019-10-01 00:00:01.0 | view | 1307067 | 2053013558920217191 | computers.note | | 4 | 2019-10-01 00:00:04.0 | view | 1004237 | 2053013555631882655 | electronics.sm | | 5 | 2019-10-01 00:00:05.0 | view | 1480613 | 2053013561092866779 | computers.desk | | 6 | 2019-10-01 00:00:08.0 | view | 17300353 | 2053013553853497655 | | | 7 | 2019-10-01 00:00:08.0 | view | 31500053 | 2053013558031024687 | | | 8 | 2019-10-01 00:00:10.0 | view | 28719074 | 2053013565480109009 | apparel.shoes. | | 9 | 2019-10-01 00:00:11.0 | view | 1004545 | 2053013555631882655 | electronics.sm | +----------+-----------------------+------------+------------+---------------------+----------------+ 10 rows selected (0.064 seconds)
Le principal intérêt c'est surtout de pouvoir formuler des requêtes avec les clauses SQL classiques comme WHERE
, ORDER BY
ou encore GROUP BY
.
SELECT user_id, COUNT(*) AS num_articles FROM users_events WHERE event_type = 'purchase' GROUP BY user_id ORDER BY num_articles DESC LIMIT 10;
+-----------+--------------+ | USER_ID | NUM_ARTICLES | +-----------+--------------+ | 548318522 | 29 | | 554090147 | 26 | | 541311429 | 20 | | 548891541 | 20 | | 531974857 | 17 | | 541337272 | 17 | | 513322839 | 16 | | 520695559 | 16 | | 516993548 | 15 | | 512730829 | 15 | +-----------+--------------+
Apache Phoenix présente de nombreux avantages lorsque l'on utilise régulièrement HBase pour de nombreux projets.
Apache Phoenix est donc un choix pertinent pour apporter une couche SQL très intéressant sur les environnements HBase.
Vous souhaitez vous former au Data Engineering ?
Articles similaires
7 févr. 2024
Pendant de nombreuses années, le rôle des Data Engineers était de récupérer des données issues de différentes sources, systèmes de stockage et applications tierces et de les centraliser dans un Data Warehouse, dans le but de pouvoir obtenir une vision complète et organisée des données disponibles.
Maxime Jumelle
CTO & Co-Founder
Lire l'article
4 déc. 2023
Pour de nombreuses entreprises, la mise en place et la maintenant de pipelines de données est une étape cruciale pour avoir à disposition d'une vue d'ensemble nette de toutes les données à disposition. Un des challenges quotidien pour les Data Analysts et Data Engineers consiste à s'assurer que ces pipelines de données puissent répondre aux besoins de toutes les équipes d'une entreprise.
Maxime Jumelle
CTO & Co-Founder
Lire l'article
14 nov. 2023
Pour améliorer les opérations commerciales et maintenir la compétitivité, il est essentiel de gérer efficacement les données en entreprise. Cependant, la diversité des sources de données, leur complexité croissante et la façon dont elles sont stockées peuvent rapidement devenir un problème important.
Maxime Jumelle
CTO & Co-Founder
Lire l'article
60 rue François 1er
75008 Paris
Blent est une plateforme 100% en ligne pour se former aux métiers Tech & Data.
Organisme de formation n°11755985075.
Data Engineering
IA Générative
MLOps
Cloud & DevOps
À propos
Gestion des cookies
© 2025 Blent.ai | Tous droits réservés