it-swarm.com.de

Hbase zählt schnell die Anzahl der Zeilen

Im Moment implementiere ich die Zeilenanzahl über ResultScanner so

for (Result rs = scanner.next(); rs != null; rs = scanner.next()) {
    number++;
}

Wenn Daten Millionen von Zeitrechnern erreichen, die groß sind. Ich möchte in Echtzeit berechnen, dass ich Mapreduce nicht verwenden möchte

Wie man schnell die Anzahl der Zeilen zählt.

44
cldo

Verwenden Sie RowCounter in HBase RowCounter ist ein Mapreduce-Job, um alle Zeilen einer Tabelle zu zählen. Dies ist ein nützliches Dienstprogramm, das als Sanitätsprüfung verwendet werden kann, um sicherzustellen, dass HBase alle Blöcke einer Tabelle lesen kann, wenn Bedenken hinsichtlich Metadateninkonsistenz bestehen. Die Mapreduce-Funktion wird in einem einzigen Prozess ausgeführt. Sie läuft jedoch schneller, wenn Sie einen MapReduce-Cluster zur Ausnutzung verwenden. 

$ hbase org.Apache.hadoop.hbase.mapreduce.RowCounter <tablename>

Usage: RowCounter [options] 
    <tablename> [          
        --starttime=[start] 
        --endtime=[end] 
        [--range=[startKey],[endKey]] 
        [<column1> <column2>...]
    ]
92
Basil Saju

Sie können die count-Methode in hbase verwenden, um die Anzahl der Zeilen zu zählen. Aber ja, das Zählen von Zeilen einer großen Tabelle kann langsam sein. Anzahl 'Tabellenname' [Intervall]

Rückgabewert ist die Anzahl der Zeilen.

Dieser Vorgang kann lange Zeit in Anspruch nehmen (Ausführen von $ HADOOP_HOME/bin/hadoop jar Hbase.jar rowcount), um einen zählenden Mapreduce-Job auszuführen. Die aktuelle Anzahl wird standardmäßig alle 1000 Zeilen angezeigt. Das Zählintervall kann optional angegeben werden. Scan Caching ist standardmäßig für die Anzahl der Scans aktiviert. Die Standard-Cache-Größe beträgt 10 Zeilen. Wenn Ihre Zeilen klein sind, können Sie diesen Parameter erhöhen.

Beispiele:

hbase> count 't1'

hbase> count 't1', INTERVAL => 100000

hbase> count 't1', CACHE => 1000

hbase> count 't1', INTERVAL => 10, CACHE => 1000

Dieselben Befehle können auch für eine Tabellenreferenz ausgeführt werden. Angenommen, Sie hätten einen Verweis auf die Tabelle 't1', wären die entsprechenden Befehle:

hbase> t.count

hbase> t.count INTERVAL => 100000

hbase> t.count CACHE => 1000

hbase> t.count INTERVAL => 10, CACHE => 1000
28
Neethu

Verwenden Sie die in HBase enthaltene HBase-Zeilenanzahl/reduzierter Job

7

Wenn Sie RowCounter aus irgendeinem Grund nicht verwenden können, sollte eine Kombination dieser beiden Filter eine optimale Methode sein, um eine Zählung zu erhalten:

FirstKeyOnlyFilter() AND KeyOnlyFilter()

Die Variable FirstKeyOnlyFilter führt dazu, dass der Scanner nur das erste Spaltenqualifikationsmerkmal zurückgibt, das er findet, im Gegensatz zum Scanner, das alle Spaltenqualifikationsmerkmale in der Tabelle zurückgibt, wodurch die Netzwerkbandbreite minimiert wird. Wie wäre es, wenn Sie einfach einen Spaltenqualifikator für die Rückkehr auswählen? Dies würde funktionieren, wenn Sie garantieren könnten, dass das Spaltenqualifikationsmerkmal für jede Zeile vorhanden ist. Wenn dies nicht der Fall ist, erhalten Sie eine ungenaue Anzahl.

Die Variable KeyOnlyFilter führt dazu, dass der Scanner nur die Spaltenfamilie zurückgibt und keinen Wert für das Spaltenqualifikationsmerkmal zurückgibt. Dadurch wird die Netzwerkbandbreite weiter reduziert, was im Allgemeinen keine große Reduzierung ausmachen würde. Es kann jedoch ein Randfall geben, bei dem die erste Spalte, die vom vorherigen Filter ausgewählt wurde, zufällig einen extrem großen Wert darstellt.

Ich habe versucht, mit scan.setCaching herumzuspielen, aber die Ergebnisse waren überall vorhanden. Vielleicht könnte es helfen.

Ich hatte 16 Millionen Zeilen zwischen Start und Stopp, die folgenden pseudo-empirischen Tests unterzogen wurden:

 Wenn FirstKeyOnlyFilter und KeyOnlyFilter aktiviert sind: 

 Wenn das Caching nicht festgelegt ist (d. H. Der Standardwert), dauerte es 188 Sekunden .
 Bei auf 1 eingestelltem Caching dauerte es 188 Sekunden 
 Bei der Zwischenspeicherung auf 10 Sekunden dauerte es 200 Sekunden 
 Bei einem Caching von 100 dauerte es 187 Sekunden 
 Bei auf 1000 eingestelltem Caching dauerte es 183 Sekunden .
 Mit dem Caching auf 10000 dauerte es 199 Sekunden .
 Bei auf 100000 eingestelltem Caching dauerte es 199 Sekunden .

 Wenn FirstKeyOnlyFilter und KeyOnlyFilter deaktiviert sind: 

 Wenn das Zwischenspeichern nicht festgelegt ist (d. H. Der Standardwert), dauerte es 309 Sekunden 

Ich habe mir nicht die Mühe gemacht, das richtig zu testen, aber es scheint klar zu sein, dass FirstKeyOnlyFilter und KeyOnlyFilter gut sind.

Darüber hinaus sind die Zellen in dieser Tabelle sehr klein - ich denke, die Filter wären an einer anderen Tabelle noch besser gewesen.


Hier ist ein Java-Codebeispiel:

 import Java.io.IOException; 

 import org.Apache.hadoop.conf.Configuration; 
 import org.Apache.hadoop.hbase.HBaseConfiguration; 
 import org.Apache.hadoop .hbase.client.HTable; 
 import org.Apache.hadoop.hbase.client.Result; 
 import org.Apache.hadoop.hbase.cles.resultScanner; 
 import org.Apache.hadoop.hbase .client.Scan; 
 import org.Apache.hadoop.hbase.util.Bytes; 

 import org.Apache.hadoop.hbase.filter.RowFilter; 
 import org.Apache.hadoop. hbase.filter.KeyOnlyFilter; 
 import org.Apache.hadoop.hbase.filter.FirstKeyOnlyFilter; 
 import org.Apache.hadoop.hbase.filter.FilterList; 

 import org.Apache.hadoop.hbase.filter.CompareFilter.CompareOp; 
 import org.Apache.hadoop.hbase.filter .RegexStringComparator; 

 öffentliche Klasse HBaseCount {
 public static void main (String [] args) löst die IOException {
 Konfiguration config = HBaseConfiguration.create (); 

 HTable-Tabelle = neue HTable (config, "meine_tabelle"); 

 Scan scan = new Scan (
 Bytes.toBytes ("foo"), Bytes.toBytes ("foo ~") 
); 

 if (args.length == 1) {
 scan.setCaching (Integer.valueOf (args [0])); 
 } 
 System.out.println ("Zwischenspeicherung des Scans ist" + scan.getCaching ()); 

 FilterList allFilters = new FilterList (); 
 allFilters.addFilter (new FirstKeyOnlyFilter ()); 
 allFilters.addFilter (neuer KeyOnlyFilter ()); 

 scan.setFilter (allFilters); 

 Scanner von resultScanner = table.getScanner (scannen); 

 int count = 0; 

 langer Start = System.currentTimeMillis (); 

 Versuchen {
 for (Ergebnis rr = scanner.next (); rr! = null; rr = scanner.next ()) {
 count + = 1; 
 if (count% 100000 == 0) System.out.println (count); 
 } 
 } endlich {
 scanner.close (); 
 } 

 long end = System.currentTimeMillis (); 

 long elapsedTime = end - start; 

 System.out.println ("verstrichene Zeit war" + (elapsedTime/1000F)); 

 } 
} 


Hier ist ein Beispiel von pychbase code:

 von pychbase import Connection 
 c = Verbindung () 
 t = c.table ('meine_tabelle') 
 # Unter der Haube gilt dies für FirstKeyOnlyFilter und KeyOnlyFilter 
 # ähnlich wie das Happybase-Beispiel unten 
 print t.count (row_prefix = "foo") 

Hier ist ein Happybase-Codebeispiel:

 von Happybase Import Connection 
 c = Verbindung (...) 
 t = c.table ('meine_tabelle') 
 count = 0 
 für _ in t.scan (filter = 'FirstKeyOnlyFilter () AND KeyOnlyFilter ()'): 
 count + = 1 

 Druckanzahl 

Danke an @Tuckr und @KennyCason für den Tipp.

6
Matthew Moisen

Einfache, effektive und effiziente Möglichkeit, Zeilen in HBASE zu zählen:

  1. Wenn Sie eine Zeile einfügen, lösen Sie diese API aus, durch die die betreffende Zelle inkrementiert wird.

    Htable.incrementColumnValue(Bytes.toBytes("count"), Bytes.toBytes("details"), Bytes.toBytes("count"), 1);
    
  2. Anzahl der in dieser Tabelle vorhandenen Zeilen prüfen. Verwenden Sie einfach die API "Abrufen" oder "Scannen" für diese bestimmte Zeilenanzahl.

Mit dieser Methode können Sie die Zeilenanzahl in weniger als einer Millisekunde abrufen.

5
Balaji

Sie können den seit HBase 0.92 verfügbaren Koprozessor verwenden. Siehe Coprocessor und AggregateProtocol und Beispiel

3

Um die Anzahl der Hbase-Tabellendatensätze in einem richtigen YARN-Cluster zu zählen, müssen Sie auch den Namen der Map-Reduzierungsjobwarteschlange festlegen:

hbase org.Apache.hadoop.hbase.mapreduce.RowCounter -Dmapreduce.job.queuename= < Your Q Name which you have SUBMIT access>
 < TABLE_NAME>
3
Dean Jain

Wenn Sie einen Scanner verwenden, versuchen Sie in Ihrem Scanner, die geringstmögliche Anzahl von Qualifikationsmerkmalen zurückzugeben. Tatsächlich sollten die von Ihnen zurückgegebenen Qualifier (in Byte-Größe) die kleinsten sein, die Sie zur Verfügung haben. Dadurch wird Ihr Scan enorm beschleunigt.

Unglücklicherweise wird dies nur bis zu einer Größenordnung von Millionen (?) Milliarden betragen. Um es weiter auszudrücken, können Sie dies in Echtzeit tun, aber zuerst müssen Sie einen mapreduce-Job ausführen, um alle Zeilen zu zählen.

Speichern Sie die Mapreduce-Ausgabe in einer Zelle in HBase. Erhöhen Sie den Zähler jedes Mal um 1, wenn Sie eine Zeile hinzufügen. Verringern Sie den Zähler jedes Mal, wenn Sie eine Zeile löschen.

Wenn Sie in Echtzeit auf die Anzahl der Zeilen zugreifen müssen, lesen Sie dieses Feld in HBase. 

Es gibt keine schnelle Möglichkeit, die Zeilen ansonsten skalierbar zu zählen. Sie können nur so schnell zählen.

1
Tucker

Gehen Sie zum Hbase-Home-Verzeichnis und führen Sie diesen Befehl aus.

./bin/hbase org.Apache.hadoop.hbase.mapreduce.RowCounter 'Namespace: Tabellenname'

Dadurch wird ein Mapreduce-Job gestartet, und die Ausgabe zeigt die Anzahl der Datensätze an, die in der hbase-Tabelle vorhanden sind.

1

Ein Beispiel finden Sie hier:

/**
     * Used to get the number of rows of the table
     * @param tableName
     * @param familyNames
     * @return the number of rows
     * @throws IOException
     */
    public long countRows(String tableName, String... familyNames) throws IOException {
        long rowCount = 0;
        Configuration configuration = connection.getConfiguration();
        // Increase RPC timeout, in case of a slow computation
        configuration.setLong("hbase.rpc.timeout", 600000);
        // Default is 1, set to a higher value for faster scanner.next(..)
        configuration.setLong("hbase.client.scanner.caching", 1000);

        AggregationClient aggregationClient = new AggregationClient(configuration);
        try {
            Scan scan = new Scan();
            if (familyNames != null && familyNames.length > 0) {
                for (String familyName : familyNames) {
                    scan.addFamily(Bytes.toBytes(familyName));
                }
            }
            rowCount = aggregationClient.rowCount(TableName.valueOf(tableName), new LongColumnInterpreter(), scan);
        } catch (Throwable e) {
            throw new IOException(e);
        }
        return rowCount;
    }
1
Ranga Reddy

Zwei Wege Für mich gearbeitet, um die Anzahl der Zeilen aus der hbase-Tabelle mit Geschwindigkeit zu ermitteln

Szenario 1

Wenn die Größe der hbase-Tabelle klein ist, melden Sie sich mit gültigem Benutzer bei hbase Shell an und führen Sie sie aus

>count '<tablename>'

Beispiel 

>count 'employee'

6 row(s) in 0.1110 seconds

Szenario # 2

Wenn die hbase-Tabellengröße groß ist, führen Sie den eingebauten RowCounter-Map-Reduzierungsjob aus:.

/$HBASE_HOME/bin/hbase org.Apache.hadoop.hbase.mapreduce.RowCounter '<tablename>'

Beispiel:

 /$HBASE_HOME/bin/hbase org.Apache.hadoop.hbase.mapreduce.RowCounter 'employee'

     ....
     ....
     ....
     Virtual memory (bytes) snapshot=22594633728
                Total committed heap usage (bytes)=5093457920
        org.Apache.hadoop.hbase.mapreduce.RowCounter$RowCounterMapper$Counters
                ROWS=6
        File Input Format Counters
                Bytes Read=0
        File Output Format Counters
                Bytes Written=0