Es gibt verschiedene Möglichkeiten für den Zugriff auf und die Interaktion mit Apache HBase. Die Java-API bietet die meisten Funktionen, aber viele Benutzer möchten HBase ohne Java verwenden.
Dafür gibt es zwei Hauptansätze: Der eine ist die Thrift-Oberfläche, die die schnellere und leichtere der beiden Optionen ist. Die andere Möglichkeit, auf HBase zuzugreifen, ist die Verwendung der REST-Schnittstelle, die HTTP-Verben verwendet, um eine Aktion auszuführen, wodurch Entwicklern eine große Auswahl an Sprachen und Programmen zur Verfügung steht.
In dieser Reihe von Anleitungen wird die REST-Schnittstelle erläutert und Python-Codebeispiele für den Zugriff bereitgestellt. Der erste Beitrag behandelt HBase REST, einige Python-Vorbehalte und die Tabellenverwaltung. Im zweiten Beitrag wird erläutert, wie mehrere Zeilen gleichzeitig mit XML und JSON eingefügt werden. Der dritte Beitrag zeigt, wie Sie mit XML und JSON mehrere Zeilen erhalten. Die vollständigen Codebeispiele finden Sie in meinem GitHub-Konto.
HBase-REST-Grundlagen
Damit sowohl Thrift als auch REST funktionieren, muss ein weiterer HBase-Daemon ausgeführt werden, um diese Anforderungen zu verarbeiten. Diese Daemons können in den Paketen hbase-thrift und hbase-rest installiert werden. Das folgende Diagramm veranschaulicht, wo Thrift und REST im Cluster platziert werden. Beachten Sie, dass die Thrift- und REST-Clients normalerweise keine anderen Dienste wie DataNode oder RegionServers ausführen, um die Last niedrig und die Reaktionsfähigkeit für REST-Interaktionen hoch zu halten.
Achten Sie darauf, diese Daemons auf Knoten zu installieren und zu starten, die Zugriff auf den Hadoop-Cluster und den Webanwendungsserver haben. Die REST-Schnittstelle hat keinen eingebauten Lastenausgleich; das muss mit Hardware oder im Code erfolgen. Cloudera Manager macht es wirklich einfach, die HBase REST- und Thrift-Dienste zu installieren und zu verwalten. (Sie können es kostenlos herunterladen und ausprobieren!) Der Nachteil von REST ist, dass es viel schwerer ist als Thrift oder Java.
Eine REST-Schnittstelle kann verschiedene Datenformate verwenden:XML, JSON und protobuf. Durch Angabe des Accept
und Content-Type
Kopfzeilen können Sie das Format auswählen, das Sie übergeben oder zurückerhalten möchten.
Um mit der Verwendung der REST-Schnittstelle zu beginnen, müssen Sie herausfinden, auf welchem Port sie ausgeführt wird. Der Standardport für CDH ist Port 8070. Für diesen Beitrag sehen Sie die baseurl
Variable verwendet, und hier ist der Wert, den ich verwenden werde::
baseurl = "http://localhost:8070"
Die REST-Schnittstelle kann so eingerichtet werden, dass Kerberos-Anmeldeinformationen verwendet werden, um die Sicherheit zu erhöhen.
Für Ihren Code müssen Sie die IP-Adresse oder das DNS des vollqualifizierten Domainnamens des Knotens verwenden, auf dem der REST-Daemon ausgeführt wird. Bestätigen Sie außerdem, dass der Port korrekt ist. Ich empfehle dringend, diese URL zu einer Variablen zu machen, da sie sich bei Netzwerkänderungen ändern kann.
Python- und HBase-Fehlerumgehungen
Es gibt zwei Fehler und Problemumgehungen, die behoben werden müssen. Der erste Fehler ist, dass die eingebauten Python-Module nicht alle HTTP-Verben unterstützen. Der zweite ist ein HBase-REST-Fehler beim Arbeiten mit JSON.
Die integrierten Python-Module für die REST-Interaktion unterstützen nicht ohne weiteres alle HTTP-Verben, die für HBase REST benötigt werden. Sie müssen das Python-Requests-Modul installieren. Das Anforderungsmodul bereinigt auch den Code und macht alle Interaktionen viel einfacher.
Die HBase-REST-Schnittstelle hat einen Fehler beim Hinzufügen von Daten über JSON:Es ist erforderlich, dass die Felder ihre genaue Reihenfolge beibehalten. Das eingebaute Python dict
type unterstützt diese Funktion nicht, daher müssen wir das OrderedDict
verwenden, um die Reihenfolge beizubehalten Klasse. (Personen mit Python 2.6 und älter müssen dasordereddict-Modul installieren.) Ich werde den Fehler und die Problemumgehung auch später im Beitrag behandeln.
Es war auch schwierig, Ganzzahlen mit base64 zu kodieren und zu dekodieren, also habe ich dafür etwas Code geschrieben:
# Method for encoding ints with base64 encoding def encode(n): data = struct.pack("i", n) s = base64.b64encode(data) return s # Method for decoding ints with base64 encoding def decode(s): data = base64.b64decode(s) n = struct.unpack("i", data) return n[0]
Um die Dinge noch einfacher zu machen, habe ich eine Methode geschrieben, um zu bestätigen, dass HTTP-Antworten in den 200er Jahren zurückkommen, was darauf hinweist, dass die Operation funktioniert hat. Der Beispielcode verwendet diese Methode, um den Erfolg eines Aufrufs zu überprüfen, bevor er fortfährt. Hier ist die Methode:
# Checks the request object to see if the call was successful def issuccessful(request): if 200
Mit Tabellen arbeiten
Mithilfe der REST-Schnittstelle können Sie Tabellen erstellen oder löschen. Sehen wir uns den Code zum Erstellen einer Tabelle an.
content = '' content += '' content += ' ' content += '' request = requests.post(baseurl + "/" + tablename + "/schema", data=content, headers={"Content-Type" : "text/xml", "Accept" : "text/xml"})
In diesem Ausschnitt erstellen wir ein kleines XML-Dokument, das das Tabellenschema in der Inhaltsvariablen definiert. Wir müssen den Namen der Tabelle und den Namen der Spaltenfamilie angeben. Wenn mehrere Spaltenfamilien vorhanden sind, erstellen Sie weitere ColumnSchema
Knoten.
Als Nächstes verwenden wir das Anforderungsmodul zum POST
das XML zu der von uns erstellten URL. Diese URL muss den Namen der neuen Tabelle enthalten. Beachten Sie auch, dass wir die Header für diesen POST
setzen Forderung. Wir zeigen, dass wir XML mit dem Content-Type
senden auf „text/xml“ setzen und dass wir XML mit dem Accept
zurück haben wollen auf „text/xml“ setzen.
Verwenden Sie den request.status_code
können Sie überprüfen, ob die Tabellenerstellung erfolgreich war. Die REST-Schnittstelle verwendet dieselben HTTP-Fehlercodes, um zu erkennen, ob ein Aufruf erfolgreich war oder einen Fehler verursacht hat. Ein Statuscode in den 200ern bedeutet, dass alles richtig funktioniert hat.
Mit dem folgenden Code können wir leicht überprüfen, ob eine Tabelle existiert:
request = requests.get(baseurl + "/" + tablename + "/schema")
Die Aufrufe verwenden den GET
Verb, um der REST-Schnittstelle mitzuteilen, dass wir die Schemainformationen über die Tabelle in der URL erhalten möchten. Auch hier können wir den Statuscode verwenden, um zu sehen, ob die Tabelle existiert. Ein Statuscode in den 200ern bedeutet, dass er existiert, und jede andere Zahl bedeutet, dass er nicht existiert.
Mit dem curl
Befehl können wir den Erfolg einer REST-Operation überprüfen, ohne Code schreiben zu müssen. Der folgende Befehl gibt eine 200 zurück, die den Erfolg des Aufrufs anzeigt, da die messagestable
Tabelle existiert in HBase. Hier ist der Aufruf und seine Ausgabe:
[user@localhost]$ curl -I -H "Accept: text/xml" http://localhost:8070/messagestable/schema HTTP/1.1 200 OK Content-Length: 0 Cache-Control: no-cache Content-Type: text/xml
Dieser REST-Aufruf wird fehlschlagen, weil tablenotthere
Tabelle existiert nicht in HBase. Hier ist der Aufruf und seine Ausgabe:
[user@localhost]$ curl -I -H "Accept: text/xml" http://localhost:8070/tablenotthere/schema HTTP/1.1 500 org.apache.hadoop.hbase.TableNotFoundException: tablenotthere Content-Type: text/html; charset=iso-8859-1 Cache-Control: must-revalidate,no-cache,no-store Content-Length: 10767
Wir können eine Tabelle mit dem folgenden Code löschen:
request = requests.delete(baseurl + "/" + tablename + "/schema")
Dieser Aufruf verwendet den DELETE
Verb, um der REST-Schnittstelle mitzuteilen, dass wir die Tabelle löschen möchten. Wenn Sie eine Tabelle über die REST-Schnittstelle löschen, müssen Sie sie nicht zuerst deaktivieren. Wie üblich können wir den Erfolg anhand des Statuscodes bestätigen.
Im nächsten Beitrag dieser Serie behandeln wir das Einfügen von Zeilen.
Jesse Anderson ist Dozent an der Cloudera University.
Wenn Sie an HBase interessiert sind, registrieren Sie sich unbedingt für HBaseCon 2013 (13. Juni, San Francisco) – DAS Community-Event für HBase-Mitwirkende, Entwickler, Administratoren und Benutzer. Die Frühbucherregistrierung ist bis zum 23. April geöffnet.