sql >> Databáze >  >> NoSQL >> HBase

Jak na to:Použijte rozhraní Apache HBase REST, část 1

Existují různé způsoby přístupu a interakce s Apache HBase. Java API poskytuje většinu funkcí, ale mnoho lidí chce používat HBase bez Java.

Existují dva hlavní přístupy, jak toho dosáhnout: Jedním je rozhraní Thrift, které je rychlejší a lehčí ze dvou možností. Druhým způsobem přístupu k HBase je použití rozhraní REST, které k provedení akce používá slovesa HTTP, což vývojářům poskytuje široký výběr jazyků a programů k použití.

Tato série návodů bude diskutovat o rozhraní REST a poskytne ukázky kódu Pythonu pro přístup k němu. První příspěvek se bude týkat HBase REST, některých upozornění Pythonu a správy tabulek. Druhý příspěvek vysvětlí, jak vložit více řádků najednou pomocí XML a JSON. Třetí příspěvek ukáže, jak získat více řádků pomocí XML a JSON. Úplné ukázky kódu najdete na mém účtu GitHub.

Základy HBase REST

Aby Thrift i REST fungovaly, musí být spuštěn další démon HBase, který tyto požadavky zpracovává. Tyto démony lze nainstalovat do balíčků hbase-thrift a hbase-rest. Níže uvedený diagram ukazuje, kde jsou Thrift a REST umístěny v clusteru. Všimněte si, že klienti Thrift a REST obvykle nespouštějí žádné další služby služeb, jako je DataNode nebo RegionServers, aby udrželi zátěž a vysokou rychlost odezvy pro interakce REST.

Nezapomeňte nainstalovat a spustit tyto démony na uzlech, které mají přístup jak ke clusteru Hadoop, tak k webovému aplikačnímu serveru. Rozhraní REST nemá žádné vestavěné vyvažování zátěže; to bude muset být provedeno s hardwarem nebo v kódu. Cloudera Manager velmi usnadňuje instalaci a správu služeb HBase REST a Thrift. (Můžete si to stáhnout a vyzkoušet zdarma!) Nevýhodou REST je, že je mnohem těžší než Thrift nebo Java.

Rozhraní REST může používat různé datové formáty:XML, JSON a protobuf. Zadáním Accept a Content-Type záhlaví, můžete si vybrat formát, který chcete předávat nebo přijímat zpět.

Chcete-li začít používat rozhraní REST, musíte zjistit, na kterém portu běží. Výchozí port pro CDH je port 8070. U tohoto příspěvku uvidíte baseurl použitá proměnná a zde je hodnota, kterou budu používat::

baseurl = "http://localhost:8070"

Rozhraní REST lze nastavit tak, aby ke zvýšení zabezpečení používalo pověření Kerberos.

Pro svůj kód budete muset použít IP adresu nebo plně kvalifikovaný název domény DNS uzlu, na kterém běží démon REST. Také zkontrolujte, zda je port správný. Důrazně doporučuji vytvořit z této adresy URL proměnnou, protože se může změnit se změnami sítě.

Řešení chyb Python a HBase

Existují dvě chyby a řešení, která je třeba vyřešit. První chybou je, že vestavěné moduly Pythonu nepodporují všechna HTTP slovesa. Druhým je chyba HBase REST při práci s JSON.

Vestavěné moduly Pythonu pro interakci REST nepodporují snadno všechna HTTP slovesa potřebná pro HBase REST. Budete muset nainstalovat modul požadavků Pythonu. Modul požadavků také vyčistí kód a výrazně zjednoduší všechny interakce.

Rozhraní HBase REST má chybu při přidávání dat přes JSON:je nutné, aby si pole zachovala přesné pořadí. Vestavěný Python dict typ tuto funkci nepodporuje, takže abychom zachovali objednávku, budeme muset použít OrderedDict třída. (Ti s Pythonem 2.6 a starším si budou muset nainstalovat modul orderdict.) Chybu a náhradní řešení také popíšu později v příspěvku.

Bylo také obtížné používat kódování a dekódování celých čísel base64, tak jsem napsal nějaký kód, abych to udělal:

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

Aby to bylo ještě jednodušší, napsal jsem metodu, která potvrdí, že odpovědi HTTP se vracejí po 200 letech, což naznačuje, že operace fungovala. Ukázkový kód používá tuto metodu ke kontrole úspěšnosti volání před pokračováním. Zde je metoda:

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

Práce s tabulkami

Pomocí rozhraní REST můžete vytvářet nebo mazat tabulky. Pojďme se podívat na kód pro vytvoření tabulky.

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

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

V tomto úryvku vytvoříme malý dokument XML, který definuje schéma tabulky v proměnné content. Musíme zadat název tabulky a název rodiny sloupců. Pokud existuje více rodin sloupců, vytvoříte další ColumnSchema uzly.

Dále použijeme modul požadavků k POST XML na adresu URL, kterou vytvoříme. Tato adresa URL musí obsahovat název nové tabulky. Všimněte si také, že pro tento POST nastavujeme záhlaví volání. Ukazujeme, že odesíláme v XML s Content-Type nastaveno na „text/xml“ a že chceme zpět XML pomocí Accept nastavte na „text/xml“.

Pomocí request.status_code , můžete zkontrolovat, že vytvoření tabulky bylo úspěšné. Rozhraní REST používá stejné kódy chyb HTTP ke zjištění, zda bylo volání úspěšné nebo zda došlo k chybě. Stavový kód v 200. letech znamená, že věci fungovaly správně.

Pomocí následujícího kódu můžeme snadno zkontrolovat, zda tabulka existuje:

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

Volání používá GET sloveso říci rozhraní REST, že chceme získat informace o schématu o tabulce v URL. Opět můžeme pomocí stavového kódu zjistit, zda tabulka existuje. Stavový kód ve tvaru 200 znamená, že existuje, a jakékoli jiné číslo znamená, že ne.

Pomocí curl můžeme zkontrolovat úspěšnost operace REST bez psaní kódu. Následující příkaz vrátí 200 ukazující úspěšnost volání, protože messagestable tabulka v HBase existuje. Zde je volání a jeho výstup:

[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

Toto volání REST dojde k chybě, protože tablenotthere tabulka v HBase neexistuje. Zde je volání a jeho výstup:

[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

Tabulku můžeme odstranit pomocí následujícího kódu:

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

Toto volání používá DELETE sloveso sdělit rozhraní REST, že chceme tabulku smazat. Odstranění tabulky prostřednictvím rozhraní REST nevyžaduje, abyste ji nejprve deaktivovali. Jako obvykle můžeme úspěch potvrdit pohledem na stavový kód.

V dalším příspěvku v této sérii se budeme zabývat vkládáním řádků.

Jesse Anderson je instruktor na Cloudera University.

Pokud vás HBase zajímá, nezapomeňte se zaregistrovat do HBaseCon 2013 (13. června, San Francisco) – komunitní událost pro přispěvatele, vývojáře, administrátory a uživatele HBase. Early Bird registrace je otevřena do 23. dubna


  1. Jak mohu použít guid v dotazu prostředí mongodb

  2. Jak optimalizovat výkon MongoDB

  3. Vytvořte databázi v MongoDB

  4. mongodb přidat čítač ke každému načtenému dokumentu