2009-03-25 10 views
10

La documentation Hbase indique clairement que vous devez regrouper des colonnes similaires dans des familles de colonnes, car le stockage physique est effectué par famille de colonnes.Hadoop Hbase: Répartition des familles de colonnes entre les tables

Mais qu'est-ce que cela signifie de mettre deux familles de colonnes dans la même table, par opposition à avoir des tables séparées par groupe de colonnes? Existe-t-il des cas spécifiques où le "partitionnement" des tables est plus logique et où une table "large" fonctionne mieux?

Des tables séparées devraient aboutir à des "régions de ligne" séparées, ce qui pourrait être bénéfique lorsque certaines familles de colonnes (dans leur ensemble) sont très éparses. Inversement, quand serait-il avantageux d'avoir des familles de colonnes regroupées?

Répondre

8

Vous avez l'idée même des familles de colonnes: il s'agit simplement d'un conseil à HBase pour stocker et répliquer ces éléments ensemble pour un accès plus rapide.

Si vous placez deux familles de colonnes dans la même table et avez toujours des clés différentes pour y accéder, alors c'est vraiment la même chose que de les avoir dans deux tables séparées. Vous gagnez seulement en ayant deux familles de colonnes dans la même table qui sont accessibles via les mêmes clés. Par exemple: si j'ai des colonnes pour le nombre total de pages vues pour un site web donné, le nombre de vues uniques pour un même site, le navigateur que l'utilisateur utilise pour voir le site, et leur connexion internet, je peux Décidez que je veux que les deux premiers soient une famille de colonnes et les deux dernières soient une autre famille de colonnes. Ici tous les quatre sont accessibles par la même clé, à savoir le site Web en question, donc je gagne en les ayant dans la même table.

Si elles sont dans des tables différentes, je finirais par faire une opération de type jointure sur les deux tables. Je ne connais pas vraiment les nombres, donc je ne peux pas vraiment vous dire à quel point l'opération de type jointure est lente (puisque je ne me souviens pas que HBase a une jointure parce qu'elle est non relationnelle) et quel est le point de basculement les dans des tableaux séparés l'emporte sur les avoir dans la même table (ou vice versa). Bien sûr, tout cela dépend des données que vous essayez de stocker, donc si vous n'aviez jamais besoin de vous joindre à travers les tables, vous voudriez les conserver dans des tables séparées, car vous pourriez argumenter qu'elles ne le sont pas. liés les uns aux autres en premier lieu.

+0

Vous dites "Rejoindre est cher". Cela semble impliquer qu'une «jointure» entre des groupes de colonnes dans la même table est moins coûteuse qu'une jointure de groupes de colonnes à travers des tables. Est-ce le cas? Les docs HBase ne le font pas clairement, je pense. – Thilo

+1

Je pense qu'il est beaucoup moins cher de faire une 'jointure' entre les colonnes dans la même table, car c'est juste une opération 'get' avec les deux colonnes nommées et est une primitive dans le langage de requête. 'Join', cependant, n'est pas une primitive et vous devez l'implémenter vous-même (ce qui nécessite plus d'opérations). –

8

Les familles de colonnes sont un compromis entre l'accès orienté ligne et l'accès orienté colonnes. Pour étendre l'exemple de la page Web de Chris, un accès en ligne récupère toutes les données (colonnes) pour un seul site Web. Un exemple d'opération axée sur les colonnes consisterait à additionner le nombre de pages vues sur tous les sites. La dernière opération ne nécessite pas les détails du navigateur et de la connexion, qui sont beaucoup plus grands que les valeurs numériques pour les comptages de vues et affecteraient significativement les performances des requêtes. Par conséquent, HBase fournit des familles de colonnes en tant qu'optimisation prenant en charge les opérations de colonnes. Quant à savoir si les colonnes doivent ou non figurer dans la même table ... Je suivrais simplement les directives normales de modélisation des données et mettrais toutes les colonnes dans la même table si elles sont des attributs de la même entité. Les familles de colonnes concernent les performances et non le schéma.

+1

"Les familles de colonnes concernent les performances et non le schéma." Cela n'a pas été clair pour moi jusqu'à ce que vous venez de le dire. Je vous remercie. –