2009-07-13 6 views
3

In der "API Anwendungsbeispiel" auf "Getting Started" Seite in HBase Dokumentation gibt ein Beispiel für Scanner Nutzung ist:HBase verteilt Scanner

Scanner Scanner = table.getScanner (neu String [] {“ myColumnFamily: columnQualifier1 "});

RowResult rowResult = scanner.next(); 
while (rowResult != null) { 
    //... 
    rowResult = scanner.next(); 

}

Wie ich verstehe, wird dieser Code auf einem Rechner (Name Knoten) und alle Scan- und Filter Arbeit ausgeführt werden, werden nicht ausgeschüttet. Es werden nur Daten gespeichert und Daten geladen. Wie kann ich einen verteilten Scanner verwenden, der auf jedem Knoten separat arbeitet?

Welches ist die beste Methode der schnellen Datenfilterung? Danke.

Antwort

1

Dies ist sowieso alt: Der Scanner ist nur eine Cursor-ähnliche API zum Abrufen der berechneten Ergebnisse. Zur Berechnung verwenden Sie MapReduce-Jobs (hbase.mapred).

1

Die Arbeitsweise des Scanners besteht darin, dass er in der ersten Region beginnt, Zeilen scannt und von einer Region zur nächsten springt. Ein Trick, den Sie tun können, ist, mehrere Scanner zu erstellen, jeder startet und endet mit den Start- und Endschlüsseln einer Region und erstellt dann mehrere Threads, die alle parallel lesen und in eine Ausgabewarteschlange schreiben. Jetzt muss Ihr Prozess schnell genug sein, um Elemente aus dieser Warteschlange zu lesen, zu verarbeiten und zu entfernen, ansonsten könnten Sie den Client OOM zuweisen, falls Sie zu viele Zeilen zu schnell kommen ließen. Sie müssen auch gleichzeitige Strukturen verwenden, um Synchronisationsverzögerungen zu vermeiden.

Sie können die Region mit Informationen getRegionLocations auf einem HTable abrufen: http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/HTable.html#getRegionLocations()

Denken Sie auch daran, dass Scanner Timeout kann, wenn man sie nicht schnell genug lesen, so dass Ihre Verbraucher-Threads blockiert, bis die Warteschlange leer wird ist manchmal nicht möglich.