Hbase rapidement compter le nombre de lignes
Droit maintenant, j'en œuvre de nombre de lignes sur ResultScanner
comme ce
for (Result rs = scanner.next(); rs != null; rs = scanner.next()) {
number++;
}
Si les données de rejoindre des millions de temps de calcul est important.Je veux calculer en temps réel que je ne veux pas utiliser Mapreduce
Rapidement comment compter le nombre de lignes.
Vous devez vous connecter pour publier un commentaire.
Utilisation RowCounter dans HBase
RowCounter est un travail de mapreduce pour compter toutes les lignes d'une table. C'est un bon utilitaire pour l'utiliser comme un test de cohérence pour s'assurer que HBase pouvez lire tous les blocs d'une table si il y a des préoccupations de métadonnées de l'incohérence. Il sera exécuté le mapreduce le tout dans un seul processus, mais il sera exécuté plus rapidement si vous avez une MapReduce cluster en place pour exploiter.
org.apache.hadoop.hbase.mapreduce.RowCounter$RowCounterMapper$Counters ROWS=55438
<- ce que c'est?Vous pouvez utiliser le comte de la méthode dans hbase pour compter le nombre de lignes. Mais oui, compter les lignes d'un tableau de grande taille peut être lent.le comte "tablename" [intervalle]
Valeur de retour est le nombre de lignes.
Cette opération peut prendre du temps (Run ‘$HADOOP_HOME/bin/hadoop jar
hbase.jar rowcount " pour exécuter un comptage travail de mapreduce). Le nombre actuel est indiqué
tous les 1000 lignes par défaut. Comptage de l'intervalle peut éventuellement être indiqué. Scan
la mise en cache est activée sur le comte contrôle par défaut. Taille du cache par défaut est de 10 lignes.
Si vos lignes sont de petite taille, vous pouvez augmenter ce
le paramètre.
Exemples:
Les mêmes commandes peuvent également être exécuté sur une table de référence. Supposons que vous ayez une référence à la table t1, les commandes correspondantes seraient:
Si vous ne pouvez pas utiliser
RowCounter
pour quelque raison que ce soit, alors la combinaison de ces deux filtres de manière optimale afin d'obtenir un décompte:La
FirstKeyOnlyFilter
entraînera le scanner ne revenant à la première colonne qualificatif qu'il trouve, contrairement au scanner le retour de tous les de la colonne qualificatifs dans la table, ce qui permettra de réduire au minimum le réseau de bande passante. Qu'en est simplement en la sélectionnant une colonne qualifier au retour? Cela pourrait fonctionner si vous pouviez garantir que la colonne qualificatif existe pour chaque ligne, mais si que n'est pas vrai, alors vous obtiendrez une inexactes comte.La
KeyOnlyFilter
entraînera le scanner ne revenant à la famille de la colonne, et ne retourne aucune valeur pour la colonne de qualification. Cela réduit d'autant la bande passante du réseau, qui, dans le cas général ne serait pas en compte beaucoup de réduction, mais il peut être un cas limite où la première colonne choisie par le filtre précédent se trouve être une très grande valeur.J'ai essayé de jouer avec les
scan.setCaching
mais les résultats étaient tous sur la place. Elle pourrait peut-être aider.J'ai eu 16 millions de lignes entre un début et de fin que j'ai fait la pseudo-empirique:
Je n'ai pas pris la peine de faire les tests appropriés de cela, mais il semble clair que le
FirstKeyOnlyFilter
etKeyOnlyFilter
sont bonnes.En outre, les cellules de ce tableau sont très petits, donc je pense que les filtres aurait été encore mieux sur une autre table.
Voici un exemple de code Java:
Ici est un pychbase exemple de code:
Ici est un Happybase exemple de code:
Grâce à @Tuckr et @KennyCason pour l'astuce.
Utiliser le HBase rowcount travail map/reduce qui est inclus avec HBase
job.getCounters().findCounter(RowCounter.RowCounterMapper.Counters.ROWS).getValue();
Simple, Efficace et Efficiente de la façon de compter les ligne dans HBASE:
Chaque fois que vous insérez une ligne de déclenchement de cette API qui va incrémenter cette cellule particulière.
De vérifier le nombre de lignes présentes dans le tableau. Suffit d'utiliser "Get" ou "scan" de l'API pour cette Ligne particulière "compter".
En utilisant cette Méthode, vous pouvez obtenir le nombre de lignes en moins d'une milliseconde.
À compter de l'enregistrement de la table Hbase compter sur un bon FIL de cluster, vous devez définir la carte de réduire la file d'attente de travail nom:
Vous pouvez utiliser le coprocesseur de ce qui est disponible depuis HBase de 0,92. Voir Coprocesseur et AggregateProtocol et exemple
Si vous utilisez un scanner, scanner essayer de revenir le plus petit nombre de qualificatifs que possible. En fait, le qualificatif(s) que vous ne retour doit être la plus petite (en taille en octets) que vous avez disponible. Cela permettra d'accélérer votre analyse énormément.
Malheureusement, cela ne fera que l'échelle de mesure (en millions de milliards?). Pour aller encore plus loin, vous pouvez le faire en temps réel, mais vous devez d'abord exécuter un travail de mapreduce pour compter toutes les lignes.
Magasin Mapreduce sortie dans une cellule dans HBase. Chaque fois que vous ajoutez une ligne, incrémente le compteur de 1. Chaque fois que vous supprimez une ligne, décrémente le compteur.
Lorsque vous avez besoin d'accéder au nombre de lignes en temps réel, vous avez bien lu le champ dans HBase.
Il n'y a aucun moyen rapide de compter les lignes, autrement, d'une manière qui les échelles. Vous ne pouvez compter si vite.
FirstKeyOnlyFilter
. un Scan de filtreFirstKeyOnlyFilter
faire? À partir de la [thrift docs](, je ne pouvais pas comprendre cette explication:[FirstKeyOnlyFilter] returns only the first key-value from each row
-- Est-ce à dire qu'il choisit juste la première cellule et renvoie celui-ci?FirstKeyOnlyFilter
a une très grande valeur, alors ce serait de ralentir le scan. D'autre part, si vous choisissez le qualificatif qui a la plus petite valeur, mais ce qualificatif n'apparaît pas dans toutes les lignes que vous souhaitez compter, alors vous aurez un inexactes comte.FirstKeyOnlyFilter() AND KeyOnlyFilter()
. LeKeyOnlyFilter
empêchera la valeur de la colonne d'être transmis sur le réseau.U peut trouver un exemple de exemple ici:
configuration.setLong("hbase.client.scanner.caching", 1000);
œuvres? Par exemple, si je l'ai mis, et plus tard àscanner.getCaching()
, il sera de retour-1
.Aller à Hbase maison répertoire et exécutez cette commande,
./bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'espace de noms:nom de la table'
Cela permettra de lancer un travail de mapreduce et la sortie afficher le nombre d'enregistrements existants dans la table hbase.
Deux façons Travaillé pour moi de me nombre de lignes de table hbase avec la Vitesse
Scénario #1
Si hbase la taille de la table est petite, puis connectez-vous à hbase shell avec d'utilisateur valide et d'exécuter
Exemple
Scénario #2
Si hbase la taille de la table est grande,alors exécuter intégré RowCounter carte de réduire l'emploi:
Connexion à hadoop machine avec d'utilisateur valide et de l'exécuter:
Exemple:
org.apache.hadoop.hbase.client.coprocesseur.AggregationClient