Rückblick: HBase ist massiv skalierbar - und äußerst komplex

Apache HBase beschreibt sich selbst als "die Hadoop-Datenbank", was etwas verwirrend sein kann, da unter Hadoop normalerweise das beliebte MapReduce-Verarbeitungsframework zu verstehen ist. Aber Hadoop ist wirklich ein Dachname für ein ganzes Ökosystem von Technologien, von denen einige HBase verwendet, um eine verteilte, spaltenorientierte Datenbank zu erstellen, die auf den gleichen Prinzipien wie Googles Bigtable basiert. HBase verwendet die MapReduce-Funktionen von Hadoop nicht direkt, obwohl HBase in Hadoop integriert werden kann, um als Quelle oder Ziel für MapReduce-Jobs zu dienen.

Die Merkmale von HBase sind extreme Skalierbarkeit, hohe Zuverlässigkeit und die Schema-Flexibilität, die Sie von einer spaltenorientierten Datenbank erhalten. Während Tabellen und Spaltenfamilien im Voraus definiert werden müssen, können Sie im laufenden Betrieb neue Spalten hinzufügen. HBase bietet außerdem eine starke Konsistenz auf Zeilenebene, eine integrierte Versionierung und "Coprozessoren", die die Entsprechungen von Triggern und gespeicherten Prozeduren liefern.

[Ebenfalls am: Big Data Showdown: Cassandra vs. HBase | Welche verdammte Datenbank soll ich benutzen? | Bossie Awards 2013: Die besten Open Source Big Data Tools | NoSQL Showdown: MongoDB vs. Couchbase | Im Daily Newsletter erhalten Sie jeden Tag einen Überblick über die wichtigsten Geschichten. ]]

HBase wurde für die Unterstützung von Abfragen großer Datenmengen entwickelt und ist für die Leseleistung optimiert. Bei Schreibvorgängen versucht HBase, die Konsistenz aufrechtzuerhalten. Im Gegensatz zu "eventuell konsistenter" Cassandra bietet HBase keine verschiedenen Einstellungen für die Konsistenzstufe (um den Schreibvorgang zu bestätigen, nachdem ein Knoten ihn geschrieben hat oder ein Quorum von Knoten ihn geschrieben hat). Der Preis für die starke Konsistenz von HBase ist daher, dass Schreibvorgänge langsamer sein können.

HDFS - das verteilte Hadoop-Dateisystem - ist die Grundlage des Hadoop-Ökosystems und das Dateisystem, auf dem sich HBase befindet. HDFS wurde für die Ausführung auf Standardhardware entwickelt und toleriert Ausfälle von Mitgliedsknoten. Es eignet sich am besten für Stapelverarbeitungssysteme, die den Streaming-Zugriff auf große Datenmengen bevorzugen. Dies scheint es für den Direktzugriff, den man in Datenbanksystemen wie HBase erwarten würde, unangemessen zu machen. HBase unternimmt jedoch Schritte, um das ansonsten inkongruente Verhalten von HDFS zu kompensieren.

Zookeeper, eine andere Hadoop-Technologie (obwohl sie von aktuellen Versionen der Hadoop MapReduce-Engine nicht mehr verwendet wird), ist ein verteilter Kommunikations- und Koordinierungsdienst. Zookeeper verwaltet eine synchronisierte speicherinterne Datenstruktur, auf die mehrere Clients zugreifen können. Die Datenstruktur ist wie ein Dateisystem organisiert, obwohl die Komponenten (znodes) der Struktur Datencontainer sowie Elemente in einem hierarchischen Baum sein können. Stellen Sie sich ein Dateisystem vor, dessen Dateien auch Verzeichnisse sein können.

HBase verwendet Zookeeper, um Clusteraktivitäten zu koordinieren und den Zustand der Mitgliedsknoten zu überwachen. Wenn Sie einen HBase-Cluster ausführen, müssen Sie Zookeeper auch parallel ausführen. HBase wird Zookeeper standardmäßig ausführen und verwalten. Sie können HBase jedoch so konfigurieren, dass ein separat verwaltetes Zookeeper-Setup verwendet wird. Sie können die Zookeeper-Serverprozesse sogar auf derselben Hardware wie die anderen HBase-Prozesse ausführen. Dies wird jedoch nicht empfohlen, insbesondere für einen HBase-Cluster mit hohem Volumen.

Wie HBase funktioniert

Genauer gesagt ist eine Zeile eine Sammlung von Schlüssel / Wert-Paaren, wobei der Schlüssel eine Spaltenkennung und der Wert der Inhalt der Zelle ist, die am Schnittpunkt einer bestimmten Zeile und Spalte vorhanden ist. Da HBase jedoch eine spaltenorientierte Datenbank ist, müssen keine zwei Zeilen in einer Tabelle dieselben Spalten haben. Um die Sache noch komplizierter zu machen, werden die Daten in HBase versioniert. Die tatsächlichen Koordinaten eines Wertes (einer Zelle) sind das Tupel {row key, column key, timestamp}. Darüber hinaus können Spalten in Spaltenfamilien gruppiert werden, wodurch ein Datenbankdesigner die Zugriffsmerkmale weiter steuern kann, da alle Spalten innerhalb einer Spaltenfamilie in unmittelbarer Nähe zueinander gespeichert werden.

Eine Schreiboperation in HBase zeichnet die Daten zuerst in einem Festschreibungsprotokoll (einem "Vorausschreibprotokoll") und dann in einer internen Speicherstruktur auf, die als MemStore bezeichnet wird. Wenn der MemStore voll ist, wird er als Entität namens HFile auf die Festplatte geschrieben. HFiles werden als Folge von Datenblöcken gespeichert, wobei ein Index an das Dateiende angehängt wird. Ein weiterer Index, der im Speicher gespeichert ist, beschleunigt die Suche nach Daten in HFiles.

HFiles sind nach dem Schreiben unveränderlich. Wenn ein Schlüssel gelöscht wird, zeichnet HBase eine spezielle "Grabstein" -Markierung auf, um an das Löschen zu erinnern. Grabsteine ​​werden entfernt (ebenso wie die gelöschten Daten), wenn HFiles regelmäßig komprimiert werden.

HBase versucht, Lesevorgänge zuerst über den MemStore auszuführen. Andernfalls prüft HBase eine weitere speicherinterne Struktur, den BlockStore, einen Lese-Cache, der häufig gelesene Daten aus dem Speicher und nicht aus festplattenbasierten HFiles liefert.

HBase teilt Zeilen nach Regionen, die durch einen Bereich von Zeilenschlüsseln definiert sind. Jede Region in einem HBase-Cluster wird von einem RegionServer-Prozess verwaltet. In der Regel gibt es einen einzelnen RegionServer-Prozess pro HBase-Knoten. Mit zunehmender Datenmenge teilt HBase Regionen auf und migriert die zugehörigen Daten zu Ausgleichszwecken auf verschiedene Knoten im Cluster.

Die Clusterarchitektur von HBase ist nicht vollständig symmetrisch. Beispielsweise muss jeder Cluster einen einzelnen aktiven Masterknoten haben. Mehrere Knoten können (und sollten) als Masterknoten festgelegt werden. Beim Start des Clusters koordinieren die Master-Kandidaten jedoch so, dass nur einer der amtierende Master ist. Es liegt in der Verantwortung des Masters, Regionsserver zu überwachen, Regionsserver-Failover durchzuführen und Regionsaufteilungen zu koordinieren.

Sollte der Masterknoten abstürzen, kann der Cluster weiterhin im stationären Modus arbeiten - Lese- und Schreibanforderungen verwalten - aber keine der Vorgänge ausführen, die die Koordination des Masters erfordern (z. B. Neuausgleich). Aus diesem Grund empfiehlt es sich, mehrere Masterknoten anzugeben. Sollte der amtierende Meister ausfallen, wird er schnell ersetzt.

Sie können HBase zu Entwicklungszwecken auf einem nativen Dateisystem ausführen, aber ein bereitgestellter HBase-Cluster wird auf HDFS ausgeführt, was - wie bereits erwähnt - für HBase ein schlechter Spielplatz zu sein scheint. Trotz des Streaming-orientierten zugrunde liegenden Dateisystems erzielt HBase schnelle zufällige E / A. Diese Magie wird durch eine Kombination aus Stapelschreibvorgängen im Speicher und persistierenden Daten auf der Festplatte mithilfe von logarithmisch strukturierten Zusammenführungsbäumen erreicht. Infolgedessen werden alle zufälligen Schreibvorgänge im Speicher ausgeführt, und wenn Daten auf die Festplatte geschrieben werden, werden die Daten zuerst sortiert und dann nacheinander mit einem zugehörigen Index geschrieben. Wie oben erwähnt, werden zuerst zufällige Lesevorgänge im Speicher versucht. Wenn sich die angeforderten Daten nicht im Speicher befinden, ist die nachfolgende Festplattensuche schnell, da die Daten sortiert und indiziert werden.

Arbeiten mit HBase

HBase unterstützt zwar keine Transaktionen, ist aber letztendlich auch nicht konsistent. Vielmehr unterstützt HBase eine starke Konsistenz, zumindest auf der Ebene einer einzelnen Zeile. HBase hat keinen Sinn für Datentypen; Alles wird als Array von Bytes gespeichert. HBase definiert jedoch einen speziellen "Zähler" -Datentyp, der eine atomare Inkrementierungsoperation vorsieht - nützlich zum Beispiel zum Zählen von Ansichten einer Webseite. Sie können eine beliebige Anzahl von Zählern innerhalb einer einzelnen Zeile über einen einzelnen Aufruf erhöhen, ohne die Zeile sperren zu müssen. Beachten Sie, dass Zähler für Schreibvorgänge synchronisiert werden (mehrere Schreibvorgänge führen immer konsistente Inkremente aus), jedoch nicht unbedingt für Lesevorgänge.

Die HBase-Shell ist eine modifizierte, interaktive Ruby-Shell, die in JRuby ausgeführt wird und in einer Java-VM ausgeführt wird. Alles, was Sie in der interaktiven Ruby-Shell tun können, können Sie in der HBase-Shell tun. Dies bedeutet, dass die HBase-Shell eine leistungsstarke Skriptumgebung sein kann.

Die neueste Version der Shell bietet eine Art objektorientierte Schnittstelle zum Bearbeiten von HBase-Tabellen. Sie können beispielsweise einer JRuby-Variablen eine Tabelle zuweisen und dann eine Methode für das Tabellenobjekt unter Verwendung der Standardpunktnotation ausgeben. Wenn Sie beispielsweise eine Tabelle definiert und der myTableVariablen zugewiesen haben , können Sie Daten mit folgenden Elementen in die Tabelle schreiben (setzen):

            myTable.put '', '', ''

Dies würde den Wert in die Zeile in der Spalte schreiben .

Es gibt einige Verwaltungs-GUIs von Drittanbietern für HBase, z. B. hbase-explorer. HBase selbst enthält einige integrierte webbasierte Überwachungstools. Ein HBase-Masterknoten bedient eine Webschnittstelle an Port 60010. Navigieren Sie zu dieser Schnittstelle, und Sie finden Informationen zum Masterknoten selbst, einschließlich der Startzeit, des aktuellen Zookeeper-Ports, einer Liste von Regionsservern und der durchschnittlichen Anzahl von Regionen pro Regionsserver , und so weiter. Eine Liste der Tabellen wird ebenfalls bereitgestellt. Klicken Sie auf eine Tabelle, und es werden Informationen angezeigt, z. B. die Regionsserver, auf denen die Komponenten der Tabelle gehostet werden. Diese Seite enthält auch Steuerelemente zum Initiieren einer Komprimierung für die Tabelle oder zum Aufteilen der Tabellenbereiche.

Darüber hinaus führt jeder Regionsserverknoten eine Überwachungswebschnittstelle an Port 60030 aus. Hier finden Sie viele Metriken: Lese- und Schreiblatenzen, die beispielsweise in verschiedene Perzentile unterteilt sind. Sie können auch Informationen zu den von diesem Regionsserver verwalteten Regionen anzeigen und einen Speicherauszug der aktiven Threads auf dem Server erstellen.

Das HBase-Referenzhandbuch enthält ein Handbuch Erste Schritte und eine FAQ. Da es sich um ein Live-Dokument handelt, finden Sie an jeden Eintrag Kommentare der Benutzergemeinschaft. Die HBase-Website enthält auch Links zur HBase-Java-API sowie zu Videos und externen Quellen für HBase-Informationen. Weitere Informationen finden Sie im HBase-Wiki. Die HBase-Dokumentation ist zwar gut, entspricht aber nicht ganz der Dokumentation, die ich auf anderen Datenbankproduktseiten wie Cassandra und MongoDB gesehen habe. Trotzdem gibt es im Internet viel Material und die HBase-Community ist groß und aktiv genug, damit alle HBase-Fragen nicht lange unbeantwortet bleiben.

Eine der interessantesten Neuerungen von HBase ist die Unterstützung von "Coprozessoren" - Benutzercode, der als Teil der HBase RegionServer- und Master-Prozesse ausgeführt wird. Es gibt ungefähr zwei Arten von Coprozessoren: Beobachter und Endpunkte. Ein Beobachter ist eine vom Benutzer geschriebene Java-Klasse, die Methoden definiert, die aufgerufen werden, wenn bestimmte HBase-Ereignisse auftreten. Stellen Sie sich einen Beobachter als HBase-Gegenstück zum RDBMS-Trigger vor. Ein Beobachter, ein so genannten RegionObserver kann bestimmte Punkte in dem Steuerungsfluß von Datenmanipulationsoperationen wie Haken get, put, und delete.

Der HBase-Endpunkt-Coprozessor funktioniert ähnlich wie eine gespeicherte Prozedur. Beim Laden kann es beispielsweise von einem Beobachter aufgerufen werden und ermöglicht so das dynamische Hinzufügen neuer Funktionen zu HBase. Es gibt verschiedene Möglichkeiten, Coprozessoren in einen HBase-Cluster zu laden, auch über die HBase-Shell.

Das Konfigurieren eines großen HBase-Clusters kann schwierig sein. Ein HBase-Cluster umfasst Masterknoten, RegionServer-Prozesse, HDFS-Prozesse und einen gesamten Zookeeper-Cluster, der nebeneinander ausgeführt wird. Die Fehlerbehebung bei einem Fehler kann natürlich ein komplexes Unterfangen sein, da zahlreiche bewegliche Teile untersucht werden müssen.

HBase ist eine entwicklerorientierte Datenbank. Das Online-Referenzhandbuch ist stark mit den Java-API-Dokumenten von HBase verknüpft. Wenn Sie die Rolle einer bestimmten HBase-Entität - beispielsweise eines Filters - verstehen möchten, müssen Sie sich an die Dokumentation der Java-API zur Filterklasse übergeben lassen, um eine vollständige Erklärung zu erhalten.

Angesichts der Tatsache, dass der Zugriff nach Zeilen erfolgt und die Zeilen nach Zeilenschlüsseln indiziert werden, ist eine sorgfältige Gestaltung der Zeilenschlüsselstruktur für eine gute Leistung von entscheidender Bedeutung. Ironischerweise wussten Programmierer in den guten alten Zeiten der ISAM-Datenbanken (Indexed Sequential Access Method) dies gut: Beim Datenbankzugriff ging es nur um die Komponenten - und die Reihenfolge dieser Komponenten - in zusammengesetzten Schlüsselindizes.

HBase verwendet eine Sammlung von kampferprobten Technologien aus der Hadoop-Welt. Dies ist eine Überlegung wert, wenn eine große, skalierbare, hochverfügbare, verteilte Datenbank erstellt wird, insbesondere für Anwendungen, bei denen eine starke Konsistenz wichtig ist.

Apache HBase 0.94 auf einen Blick

 
Vorteile
  • Eingebaute Versionierung
  • Starke Konsistenz auf Rekordniveau
  • Bietet RDBMS-ähnliche Trigger und gespeicherte Prozeduren über Coprozessoren
  • Aufbauend auf bewährten Hadoop-Technologien
  • Aktive Entwicklungsgemeinschaft
Nachteile
  • Fehlt eine benutzerfreundliche, SQL-ähnliche Abfragesprache
  • Viele bewegliche Teile
  • Die Einrichtung über einen Entwicklungscluster mit einem Knoten hinaus kann schwierig sein
Plattformen Benötigt Java SE Version 6; kann unter Windows mit Cygwin ausgeführt werden
Kosten Kostenlose Open Source unter der Apache License Version 2.0