sql >> Database teknologi >  >> NoSQL >> HBase

Sådan gør du:Brug Apache HBase REST-grænsefladen, del 1

Der er forskellige måder at få adgang til og interagere med Apache HBase. Java API leverer den største funktionalitet, men mange mennesker ønsker at bruge HBase uden Java.

Der er to hovedtilgange til at gøre det: Den ene er Thrift-grænsefladen, som er den hurtigere og lettere af de to muligheder. Den anden måde at få adgang til HBase på er at bruge REST-grænsefladen, som bruger HTTP-verber til at udføre en handling, hvilket giver udviklere et bredt udvalg af sprog og programmer at bruge.

Denne serie af how-to's vil diskutere REST-grænsefladen og give Python-kodeeksempler for at få adgang til den. Det første indlæg vil dække HBase REST, nogle Python advarsler og bordadministration. Det andet indlæg vil forklare, hvordan man indsætter flere rækker ad gangen ved hjælp af XML og JSON. Det tredje indlæg viser, hvordan man får flere rækker ved hjælp af XML og JSON. De fulde kodeeksempler kan findes på min GitHub-konto.

HBase REST Grundlæggende

For at både Thrift og REST skal fungere, skal en anden HBase-dæmon køre for at håndtere disse anmodninger. Disse dæmoner kan installeres i pakkerne hbase-thrift og hbase-rest. Diagrammet nedenfor illustrerer, hvor Thrift og REST er placeret i klyngen. Bemærk, at Thrift- og REST-klienterne normalt ikke kører nogen andre tjenester såsom DataNode eller RegionServers for at holde belastningen nede og lydhørheden høj for REST-interaktioner.

Sørg for at installere og starte disse dæmoner på noder, der har adgang til både Hadoop-klyngen og webapplikationsserveren. REST-grænsefladen har ikke nogen indbygget belastningsbalancering; det skal gøres med hardware eller i kode. Cloudera Manager gør det virkelig nemt at installere og administrere HBase REST- og Thrift-tjenesterne. (Du kan downloade og prøve det gratis!) Ulempen ved REST er, at det er meget tungere end Thrift eller Java.

En REST-grænseflade kan bruge forskellige dataformater:XML, JSON og protobuf. Ved at angive Accept og Content-Type headers, kan du vælge det format, du vil sende i eller modtage tilbage.

For at begynde at bruge REST-grænsefladen skal du finde ud af, hvilken port den kører på. Standardporten for CDH er port 8070. For dette indlæg vil du se baseurl variabel brugt, og her er den værdi, jeg vil bruge::

baseurl = "http://localhost:8070"

REST-grænsefladen kan konfigureres til at bruge en Kerberos-legitimationsoplysninger for at øge sikkerheden.

Til din kode skal du bruge IP-adressen eller det fuldt kvalificerede domænenavn DNS for den node, der kører REST-dæmonen. Bekræft også, at porten er korrekt. Jeg anbefaler stærkt at gøre denne URL til en variabel, da den kan ændre sig med netværksændringer.

Løsninger på Python og HBase-fejl

Der er to fejl og løsninger, der skal løses. Den første fejl er, at de indbyggede Python-moduler ikke understøtter alle HTTP-verberne. Den anden er en HBase REST-fejl, når du arbejder med JSON.

De indbyggede Python-moduler til REST-interaktion understøtter ikke let alle de HTTP-verber, der er nødvendige for HBase REST. Du skal installere Python-anmodningsmodulet. Anmodningsmodulet rydder også op i koden og gør alle interaktioner meget nemmere.

HBase REST-grænsefladen har en fejl ved tilføjelse af data via JSON:det kræves, at felterne bevarer deres nøjagtige rækkefølge. Den indbyggede Python dict type understøtter ikke denne funktion, så for at opretholde rækkefølgen skal vi bruge OrderedDict klasse. (De med Python 2.6 og ældre skal installere ordereddict-modulet.) Jeg vil også dække fejlen og løsningen senere i indlægget.

Det var også svært at bruge base64-kode og afkode heltal, så jeg skrev noget kode for at gøre det:

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

For at gøre tingene endnu nemmere skrev jeg en metode til at bekræfte, at HTTP-svar kommer tilbage i 200'erne, hvilket indikerer, at operationen fungerede. Eksempelkoden bruger denne metode til at kontrollere succesen af ​​et opkald, før du går videre. Her er metoden:

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

Arbejd med tabeller

Ved at bruge REST-grænsefladen kan du oprette eller slette tabeller. Lad os tage et kig på koden for at oprette en tabel.

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

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

I dette uddrag opretter vi et lille XML-dokument, der definerer tabelskemaet i indholdsvariablen. Vi skal angive navnet på tabellen og kolonnens familienavn. Hvis der er flere kolonnefamilier, opretter du nogle flere ColumnSchema noder.

Dernæst bruger vi anmodningsmodulet til at POST XML til den URL, vi opretter. Denne URL skal indeholde navnet på den nye tabel. Bemærk også, at vi sætter overskrifterne for denne POST opkald. Vi viser, at vi sender XML med Content-Type sat til "text/xml", og at vi vil have XML tilbage med Accept indstillet til "text/xml".

Brug af request.status_code , kan du kontrollere, at oprettelsen af ​​tabellen lykkedes. REST-grænsefladen bruger de samme HTTP-fejlkoder til at opdage, om et opkald var vellykket eller fejlede. En statuskode i 200-tallet betyder, at tingene fungerede korrekt.

Vi kan nemt kontrollere, om der findes en tabel ved hjælp af følgende kode:

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

Opkaldene bruger GET verbum for at fortælle REST-grænsefladen, vi ønsker at få skemaoplysningerne om tabellen i URL'en. Endnu en gang kan vi bruge statuskoden til at se, om tabellen eksisterer. En statuskode i 200'erne betyder, at den eksisterer, og ethvert andet nummer betyder, at den ikke gør det.

Brug af curl kommando, kan vi kontrollere succesen af ​​en REST-operation uden at skrive kode. Følgende kommando returnerer en 200, der viser opkaldets succes, fordi den messagestable tabel findes i HBase. Her er opkaldet og dets 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

Dette REST-kald vil fejle, fordi tablenotthere tabel findes ikke i HBase. Her er opkaldet og dets 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

Vi kan slette en tabel ved hjælp af følgende kode:

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

Dette opkald bruger DELETE verbum for at fortælle REST-grænsefladen, at vi ønsker at slette tabellen. Sletning af en tabel gennem REST-grænsefladen kræver ikke, at du deaktiverer den først. Som sædvanlig kan vi bekræfte succes ved at se på statuskoden.

I det næste indlæg i denne serie vil vi dække indsættelse af rækker.

Jesse Anderson er instruktør fra Cloudera University.

Hvis du er interesseret i HBase, skal du sørge for at tilmelde dig HBaseCon 2013 (13. juni, San Francisco) – fællesskabsbegivenheden for HBase-bidragydere, udviklere, administratorer og brugere. Early Bird tilmelding er åben indtil 23. april.


  1. Redis Pub/Sub ServiceStack, annullerer tråden

  2. Uafhængig af store og små bogstaver sortering i MongoDB

  3. Django, Redis:Hvor skal man sætte forbindelseskoden

  4. Tillader Redis kun strengrepræsentation, men ikke numerisk værdi