sql >> Database >  >> NoSQL >> HBase

How-to:gebruik de Apache HBase REST-interface, deel 1

Er zijn verschillende manieren om toegang te krijgen tot en te werken met Apache HBase. De Java API biedt de meeste functionaliteit, maar veel mensen willen HBase gebruiken zonder Java.

Er zijn twee hoofdbenaderingen om dat te doen:de ene is de Thrift-interface, de snellere en lichtere van de twee opties. De andere manier om toegang te krijgen tot HBase is door de REST-interface te gebruiken, die HTTP-werkwoorden gebruikt om een ​​actie uit te voeren, waardoor ontwikkelaars een ruime keuze aan talen en programma's kunnen gebruiken.

Deze reeks how-to's bespreekt de REST-interface en biedt Python-codevoorbeelden om toegang te krijgen. Het eerste bericht behandelt HBase REST, enkele Python-waarschuwingen en tabelbeheer. In het tweede bericht wordt uitgelegd hoe u meerdere rijen tegelijk kunt invoegen met behulp van XML en JSON. Het derde bericht laat zien hoe je multiples-rijen kunt krijgen met XML en JSON. De volledige codevoorbeelden zijn te vinden op mijn GitHub-account.

Basis HBase REST

Om zowel Thrift als REST te laten werken, moet een andere HBase-daemon worden uitgevoerd om deze verzoeken af ​​te handelen. Deze daemons kunnen worden geïnstalleerd in de pakketten hbase-thrift en hbase-rest. Het onderstaande diagram illustreert waar Thrift en REST in het cluster worden geplaatst. Houd er rekening mee dat de Thrift- en REST-clients meestal geen andere services zoals DataNode of RegionServers uitvoeren om de belasting laag te houden en het reactievermogen hoog te houden voor REST-interacties.

Zorg ervoor dat u deze daemons installeert en start op knooppunten die toegang hebben tot zowel het Hadoop-cluster als de webtoepassingsserver. De REST-interface heeft geen ingebouwde taakverdeling; dat zal met hardware of in code moeten gebeuren. Cloudera Manager maakt het heel eenvoudig om de HBase REST- en Thrift-services te installeren en te beheren. (Je kunt het gratis downloaden en uitproberen!) Het nadeel van REST is dat het veel zwaarder is dan Thrift of Java.

Een REST-interface kan verschillende dataformaten gebruiken:XML, JSON en protobuf. Door het opgeven van de Accept en Content-Type headers, kunt u het formaat kiezen dat u wilt doorgeven of terug wilt ontvangen.

Om de REST-interface te gaan gebruiken, moet u uitzoeken op welke poort deze draait. De standaardpoort voor CDH is poort 8070. Voor dit bericht zie je de baseurl variabele gebruikt, en hier is de waarde die ik zal gebruiken::

baseurl = "http://localhost:8070"

De REST-interface kan worden ingesteld om een ​​Kerberos-referentie te gebruiken om de beveiliging te vergroten.

Voor uw code moet u het IP-adres of de volledig gekwalificeerde domeinnaam DNS gebruiken van het knooppunt waarop de REST-daemon wordt uitgevoerd. Controleer ook of de poort correct is. Ik raad ten zeerste aan om van deze URL een variabele te maken, omdat deze kan veranderen door netwerkwijzigingen.

Python- en HBase-bugoplossingen

Er zijn twee bugs en tijdelijke oplossingen die moeten worden aangepakt. De eerste bug is dat de ingebouwde Python-modules niet alle HTTP-werkwoorden ondersteunen. De tweede is een HBase REST-bug bij het werken met JSON.

De ingebouwde Python-modules voor REST-interactie ondersteunen niet gemakkelijk alle HTTP-werkwoorden die nodig zijn voor HBase REST. U moet de module Python-verzoeken installeren. De aanvraagmodule ruimt ook de code op en maakt alle interacties veel gemakkelijker.

De HBase REST-interface heeft een bug bij het toevoegen van gegevens via JSON:het is vereist dat de velden hun exacte volgorde behouden. Het ingebouwde Python dict type ondersteunt deze functie niet, dus om de volgorde te behouden, moeten we de OrderedDict gebruiken klas. (Degenen met Python 2.6 en ouder zullen de besteldedict-module moeten installeren.) Ik zal de bug en de tijdelijke oplossing later in de post ook bespreken.

Het was ook moeilijk om base64 te gebruiken voor het coderen en decoderen van gehele getallen, dus schreef ik wat code om dat te doen:

# 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]

Om het nog gemakkelijker te maken, heb ik een methode geschreven om te bevestigen dat HTTP-reacties terugkomen in de jaren 200, wat aangeeft dat de operatie werkte. De voorbeeldcode gebruikt deze methode om het succes van een aanroep te controleren voordat u verder gaat. Hier is de methode:

# Checks the request object to see if the call was successful
def issuccessful(request):
	if 200

Werken met tabellen

Met behulp van de REST-interface kunt u tabellen maken of verwijderen. Laten we eens kijken naar de code om een ​​tabel te maken.

content =  ''
content += ''
content += '  '
content += ''

request = requests.post(baseurl + "/" + tablename + "/schema", data=content, headers={"Content-Type" : "text/xml", "Accept" : "text/xml"})

In dit fragment maken we een klein XML-document dat het tabelschema in de inhoudsvariabele definieert. We moeten de naam van de tabel en de familienaam van de kolom opgeven. Als er meerdere kolomfamilies zijn, maakt u nog meer ColumnSchema knooppunten.

Vervolgens gebruiken we de aanvraagmodule om POST de XML naar de URL die we maken. Deze URL moet de naam van de nieuwe tabel bevatten. Houd er ook rekening mee dat we de headers voor deze POST . instellen telefoongesprek. We laten zien dat we in XML verzenden met het Content-Type ingesteld op “text/xml” en dat we XML terug willen met de Accept ingesteld op "tekst/xml".

De request.status_code . gebruiken , kunt u controleren of het maken van de tabel is gelukt. De REST-interface gebruikt dezelfde HTTP-foutcodes om te detecteren of een aanroep is gelukt of een fout heeft gemaakt. Een statuscode in de jaren 200 betekent dat alles correct werkte.

We kunnen eenvoudig controleren of een tabel bestaat met behulp van de volgende code:

request = requests.get(baseurl + "/" + tablename + "/schema")

De oproepen gebruiken de GET werkwoord om de REST-interface te vertellen dat we de schema-informatie over de tabel in de URL willen krijgen. Nogmaals, we kunnen de statuscode gebruiken om te zien of de tabel bestaat. Een statuscode in de jaren 200 betekent dat het bestaat en elk ander nummer betekent dat het niet bestaat.

De curl gebruiken commando, kunnen we het succes van een REST-bewerking controleren zonder code te schrijven. De volgende opdracht retourneert een 200 die het succes van de oproep aangeeft, omdat de messagestable tabel bestaat in HBase. Hier is de oproep en de output:

[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

Deze REST-aanroep zal een foutmelding geven omdat de tablenotthere tabel bestaat niet in HBase. Hier is de oproep en de output:

[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

We kunnen een tabel verwijderen met de volgende code:

request = requests.delete(baseurl + "/" + tablename + "/schema")

Deze oproep gebruikt de DELETE werkwoord om de REST-interface te vertellen dat we de tabel willen verwijderen. Voor het verwijderen van een tabel via de REST-interface hoeft u deze niet eerst uit te schakelen. Zoals gewoonlijk kunnen we het succes bevestigen door naar de statuscode te kijken.

In de volgende post in deze serie behandelen we het invoegen van rijen.

Jesse Anderson is docent aan Cloudera University.

Als u geïnteresseerd bent in HBase, moet u zich registreren voor HBaseCon 2013 (13 juni, San Francisco) - HET community-evenement voor HBase-bijdragers, ontwikkelaars, beheerders en gebruikers. Early Bird-registratie is open tot 23 april.


  1. MongoDB $ltrim

  2. MongoDB:hoe krijg ik een duidelijke lijst met veldwaarden van subdocumenten?

  3. Maak een notitie-app voor Android met MongoDB Stitch

  4. Fout:Kan geen verbinding maken met Redis op redis:6379:Naam of service niet bekend