• Aucun résultat trouvé

Systèmes d’index pour le traitement des requêtes complexes sur les DHT

Les systèmes distribués construits avec les tables de Hachage distribuées – Distributed Hash Table (DHT) supportent efficacement des requêtes exactes (c’est-à-dire qu’ils permettent de trouver les données dont les identifiants correspondent exactement à une clé). Pour de nombreuses applications, le traitement des requêtes exactes ne suffit pas, il faut un support efficace pour réaliser des requêtes complexes telles que les requêtes d’intervalles ou les requêtes de sur-ensembles.

Plusieurs solutions ont été proposées pour supporter les requêtes complexes en étendant les fonctionnalités des DHT [Ramabhadran et al. 04, Tang et al. 10, Hidalgo et al. 11,

Caron et al. 06,Cortés et al. 16,Hidalgo et al. 16]. Le principe est simple et consiste à indexer les clés utilisées pour stocker les objets dans la DHT : c’est ce qu’on appelle l’indexation au dessus de la DHT ou over-DHT indexing.

Un index over-DHT est une structure ad’hoc construite au dessus d’une table de hachage distribuée et dont l’objectif est de traiter efficacement les requêtes complexes sans modifier la DHT. Parmi les structures les plus utilisées, nous avons les arbres de préfixes. Cette section étudie quelques solutions proposées pour traiter les requêtes complexes sur les DHT.

2.2.1 Prefix Hash Tree (PHT)

Prefix Hash Tree (PHT) [Ramabhadran et al. 04] est un arbre binaire de préfixes destiné à indexer un ensemble de données dans un réseau P2P structuré. Les nœuds de l’arbre binaire sont identifiés par un label (composé des symboles "/", "0" et "1"). Chaque nœud interne possède deux fils. Le fils gauche (resp droit) a pour label 0 (resp. 1). Tout nœud est désigné par la concatenation des labels des nœuds qui compose le chemin qui le relie à la racine (/).

La structure de PHT contient trois types de nœuds, les nœuds feuilles qui stockent les données, les nœuds internes qui participent au maintien de l’arbre et les nœuds externes qui n’appartiennent pas à l’arbre de préfixe mais qui sont présents dans la DHT.

L’ensemble des nœuds de PHT est réparti entre les pairs du réseau DHT en associant les préfixes des nœuds aux identifiants des pairs de la DHT. Ainsi, chaque nœud de l’arbre PHT correspond à un nœud dans la DHT et ses objets peuvent être localisés par une simple opération lookup sur la DHT.

La recherche dans PHT est effectuée par l’opération PHT-Lookup. Considérant une donnée représentée par une chaine binaire, PHT-Lookup retourne l’unique nœud feuille dont l’identifiant est un préfixe de la donnée, c’est-à-dire, le nœud qui stocke la donnée. Pour cela,

2.2. SYSTÈMES D’INDEX POUR LE TRAITEMENT DES REQUÊTES COMPLEXES SUR LES DHT13

PHT propose deux méthodes de recherche.

D’abord il y a la recherche linéaire qui commence par effectuer une opération DHT-Lookup en utilisant le plus court préfixe de la donnée. Si un nœud interne est atteint, une nouvelle DHT-Lookup est réalisée en utilisant un préfixe plus long. Ce processus est répété jusqu’à ce qu’une feuille soit trouvée. Ensuite, il y a la recherche binaire qui divise la longueur du préfixe de la donnée en deux et commence par rechercher la moitié du préfixe. Si cette recherche retourne un nœud interne de PHT, le processus recommence avec un nouveau préfixe égale au milieu de la moitié supérieure. Si le préfixe correspond à un nœud externe, la moitié supérieure de l’intervalle est supprimée et la recherche recommence avec la moitié inférieure. Pour effectuer une recherche d’intervalle, la plus petite borne de l’intervalle est utilisée pour trouver le premier nœud feuille. Une fois ce nœud atteint, PHT utilise une liste liant les nœuds feuilles pour retrouver toutes les données en parcourant la liste vers le nœud feuille qui est en charge de la borne supérieure de l’intervalle.

2.2.2 TPT-C

TPT-C [Hidalgo et al. 11] améliore les performances des recherches sur les arbres de préfixes en évitant de revisiter les nœuds internes des arbres. Pour cela, TPT-C propose de maintenir sur chaque nœud interne de l’arbre un cache qui stocke les labels des nœuds visités lors des recherches précédentes. Chaque nœud contient un nombre limité d’entrées dans son cache et chaque entrée est un préfixe de label d’un nœud interne.

Pour effectuer la recherche (binaire ou linéaire), TPT-C utilise le cache pour récupérer l’entrée correspondant au plus long préfixe commun avec la requête. Si un tel préfixe est trouvé, la recherche continue avec ce préfixe et réduit l’espace de recherche, sinon la recherche est effectuée normalement comme dans PHT. TPT-C optimise ainsi le coût de la recherche dans les arbres de préfixes en réduisant l’espace des préfixes candidats.

2.2.3 LIGHT

Comme PHT, LIGHT [Tang et al. 10] permet aussi de traiter les requêtes complexes à un moindre coût. Pour cela, LIGHT définit : un arbre de préfixe qui indexe les données, une structure de données qui stocke le résumé de l’arbre et une fonction de nommage qui associe la structure de données et la DHT.

LIGHT partitionne récursivement l’espace des données en deux sous-espaces de taille égales jusqu’à ce que chaque sous-espace contienne un nombre limité de données.

Tout comme PHT, LIGHT utilise un arbre de préfixes avec lequel, les données sont stockées dans les nœuds feuilles mais l’arbre de LIGHT dispose de deux racines dont une virtuelle ayant un seul fils qui est la racine normale.

Chaque branche de l’arbre est étiquetée par un nombre binaire, 0 pour les branches vers les fils gauches et 1 pour les fils droits. La branche spéciale entre la racine virtuelle et la racine normale est étiquetée par 0.

Ainsi chaque nœud possède un préfixe unique qui est la concaténation des nombres binaires composant son chemin depuis la racine virtuelle. Le préfixe de la racine virtuelle est le caractère spécial #.

À la différence de PHT, LIGHT ne maintient pas une liste liant les feuilles mais il propose à la place, une structure de données distribuée pour stocker les données et un résumé des informations de l’arbre de préfixes.

Pour rechercher une donnée, LIGHT-lookup retourne la clé DHT correspondante. Il s’agit de trouver le préfixe du nœud qui couvre la donnée sur lequel LIGHT applique sa fonction de nommage pour obtenir la clé DHT.

LIGHT propose un algorithme de recherche binaire similaire à celui de PHT. À chaque itération, LIGHT calcule le milieu de l’intervalle et effectue une opération DHT-get de la clé correspondant au préfixe obtenu. Si l’opération DHT-get échoue, le préfixe courant correspond à un nœud qui n’existe pas et la borne supérieure est réduite à la longueur du préfixe du nœud interne contenant le préfixe courant ; Si la DHT-get réussit, soit le préfixe retourné couvre la donnée dans ce cas la recherche retourne le préfixe du nœud interne contenant la clé-DHT courante, soit le préfixe retourné est un ancêtre de la feuille recherchée et LIGHT augmente la valeur de la borne inférieure.

Pour trouver un intervalle, LIGHT recherche une des bornes en utilisant la recherche binaire. Une fois que la feuille responsable de la borne est repérée, LIGHT transmet récursivement la requête aux nœuds de la vue local de la feuille. La transmission est effectuée jusqu’à ce que tous les nœuds internes couvrant l’intervalle soient visités. Grâce à la structure de donnée distribuée LIGHT parvient à maintenir des vues logiques au sein des nœuds feuilles et à explorer les contenus des sous arbres de la vue.

La flexibilité de la structure de LIGHT peut être exploitée pour optimiser la recherche binaire. En effet, le préfixe d’une feuille stocké sur un nœud interne ou sur une racine révèle la profondeur d’un des deux sous arbres issus de ce nœud : si le préfixe termine par 0, c’est la profondeur de la partie gauche du sous arbre qui est indiquée et si le préfixe termine par 1, c’est la profondeur du sous arbre droit qui est indiquée.

La solution de [Fu et al. 11] exploite le préfixe de la feuille trouvée pour déterminer le nœud fils le plus proche de la clé recherchée et utilise ce préfixe comme la borne supérieure de l’intervalle de la recherche binaire.

2.2.4 DST

DST [Zheng et al. 06] (Distributed Segment Tree) est un index over-DHT qui partitionne l’espace des données en segments d’intervalles fixes. L’index supporte les requêtes d’intervalles et les requêtes de couverture sans modifier la structure de la DHT sous-jacente. Les requêtes de couverture sont des requêtes d’intervalles spéciales qui récupèrent toutes les parties d’une donnée décomposée.

La structure de l’index de DST (i.e. un arbre de segments [de Berg et al. 97]) est un arbre totalement binaire construit au dessus d’une DHT. Les nœuds de l’arbre de segments sont associés aux pairs de la couche DHT en appliquant une fonction de hachage sur les bornes des intervalles. DST réplique les données de chaque niveau de l’arbre vers les nœuds ancêtres pour maintenir une vue globale sur l’ensemble des données de l’arbre.

Cette réplication rend les nœuds de niveaux supérieurs surchargés car la racine doit stocker tout l’intervalle indexé par l’arbre et devient un point de congestion. Pour éliminer ce