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

Procedura:utilizzare l'interfaccia REST di Apache HBase, parte 1

Esistono vari modi per accedere e interagire con Apache HBase. L'API Java fornisce la maggior parte delle funzionalità, ma molte persone desiderano utilizzare HBase senza Java.

Esistono due approcci principali per farlo: Uno è l'interfaccia Thrift, che è la più veloce e leggera delle due opzioni. L'altro modo per accedere a HBase è utilizzare l'interfaccia REST, che utilizza i verbi HTTP per eseguire un'azione, offrendo agli sviluppatori un'ampia scelta di linguaggi e programmi da utilizzare.

Questa serie di istruzioni discuterà l'interfaccia REST e fornirà esempi di codice Python per accedervi. Il primo post tratterà HBase REST, alcuni avvertimenti di Python e l'amministrazione delle tabelle. Il secondo post spiegherà come inserire più righe alla volta utilizzando XML e JSON. Il terzo post mostrerà come ottenere più righe usando XML e JSON. Gli esempi di codice completo possono essere trovati sul mio account GitHub.

Nozioni di base su HBase REST

Affinché sia ​​Thrift che REST funzionino, è necessario che un altro demone HBase sia in esecuzione per gestire queste richieste. Questi demoni possono essere installati nei pacchetti hbase-thrift e hbase-rest. Il diagramma seguente illustra dove sono posizionati Thrift e REST nel cluster. Tieni presente che i client Thrift e REST di solito non eseguono altri servizi come DataNode o RegionServers per mantenere basso il carico e la reattività elevata per le interazioni REST.

Assicurati di installare e avviare questi daemon sui nodi che hanno accesso sia al cluster Hadoop che al server delle applicazioni web. L'interfaccia REST non ha alcun bilanciamento del carico integrato; che dovrà essere fatto con l'hardware o nel codice. Cloudera Manager semplifica l'installazione e la gestione dei servizi HBase REST e Thrift. (Puoi scaricarlo e provarlo gratuitamente!) Lo svantaggio di REST è che è molto più pesante di Thrift o Java.

Un'interfaccia REST può utilizzare vari formati di dati:XML, JSON e protobuf. Specificando il Accept e Content-Type intestazioni, puoi scegliere il formato che desideri trasmettere o ricevere indietro.

Per iniziare a utilizzare l'interfaccia REST, devi capire su quale porta è in esecuzione. La porta predefinita per CDH è la porta 8070. Per questo post vedrai il baseurl variabile utilizzata, ed ecco il valore che userò::

baseurl = "http://localhost:8070"

L'interfaccia REST può essere configurata per utilizzare una credenziale Kerberos per aumentare la sicurezza.

Per il tuo codice, dovrai utilizzare l'indirizzo IP o il nome di dominio completo DNS del nodo che esegue il daemon REST. Verificare inoltre che la porta sia corretta. Consiglio vivamente di rendere questo URL una variabile, poiché potrebbe cambiare con le modifiche alla rete.

Soluzioni per bug Python e HBase

Ci sono due bug e soluzioni alternative che devono essere risolti. Il primo bug è che i moduli Python integrati non supportano tutti i verbi HTTP. Il secondo è un bug REST HBase quando si lavora con JSON.

I moduli Python integrati per l'interazione REST non supportano facilmente tutti i verbi HTTP necessari per HBase REST. Dovrai installare il modulo delle richieste Python. Il modulo delle richieste ripulisce anche il codice e rende tutte le interazioni molto più semplici.

L'interfaccia REST di HBase presenta un bug durante l'aggiunta di dati tramite JSON:è necessario che i campi mantengano il loro esatto ordine. Il Python integrato dict type non supporta questa funzione, quindi per mantenere l'ordine, dovremo utilizzare OrderedDict classe. (Quelli con Python 2.6 e versioni precedenti dovranno installare il modulo orderdict.) Tratterò anche il bug e la soluzione alternativa più avanti nel post.

Era anche difficile usare la codifica base64 e la decodifica di interi, quindi ho scritto del codice per farlo:

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

Per rendere le cose ancora più semplici, ho scritto un metodo per confermare che le risposte HTTP tornano negli anni 200, il che indica che l'operazione ha funzionato. Il codice di esempio utilizza questo metodo per verificare l'esito positivo di una chiamata prima di procedere. Ecco il metodo:

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

Lavorare con le tabelle

Utilizzando l'interfaccia REST, puoi creare o eliminare tabelle. Diamo un'occhiata al codice per creare una tabella.

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

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

In questo frammento, creiamo un piccolo documento XML che definisce lo schema della tabella nella variabile di contenuto. È necessario fornire il nome della tabella e il cognome della colonna. Se sono presenti più famiglie di colonne, crei altri ColumnSchema nodi.

Successivamente, utilizziamo il modulo delle richieste per POST l'XML all'URL che creiamo. Questo URL deve includere il nome della nuova tabella. Inoltre, nota che stiamo impostando le intestazioni per questo POST chiamata. Stiamo mostrando che stiamo inviando XML con il Content-Type impostato su "text/xml" e che vogliamo che XML torni con Accept impostato su "testo/xml".

Usando il request.status_code , puoi verificare che la creazione della tabella sia andata a buon fine. L'interfaccia REST utilizza gli stessi codici di errore HTTP per rilevare se una chiamata è andata a buon fine o se si è verificato un errore. Un codice di stato negli anni 200 significa che le cose hanno funzionato correttamente.

Possiamo facilmente verificare se esiste una tabella utilizzando il seguente codice:

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

Le chiamate utilizzano il GET verbo per dire all'interfaccia REST che vogliamo ottenere le informazioni sullo schema sulla tabella nell'URL. Ancora una volta, possiamo usare il codice di stato per vedere se la tabella esiste. Un codice di stato tra 200 significa che esiste e qualsiasi altro numero significa che non esiste.

Usando il curl comando, possiamo verificare il successo di un'operazione REST senza scrivere codice. Il comando seguente restituirà un 200 che mostra il successo della chiamata perché messagestable la tabella esiste in HBase. Ecco la chiamata e il suo 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

Questa chiamata REST risulterà in errore perché tablenotthere la tabella non esiste in HBase. Ecco la chiamata e il suo 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

Possiamo eliminare una tabella utilizzando il seguente codice:

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

Questa chiamata utilizza il DELETE verbo per dire all'interfaccia REST che vogliamo eliminare la tabella. L'eliminazione di una tabella tramite l'interfaccia REST non richiede di disabilitarla prima. Come al solito, possiamo confermare il successo guardando il codice di stato.

Nel prossimo post di questa serie tratteremo l'inserimento di righe.

Jesse Anderson è un istruttore presso la Cloudera University.

Se sei interessato a HBase, assicurati di registrarti a HBaseCon 2013 (13 giugno, San Francisco) – L'evento della community per contributori, sviluppatori, amministratori e utenti di HBase. La registrazione Early Bird è aperta fino al 23 aprile.