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

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

Existují různé způsoby přístupu a interakce s Apache HBase. Nejvíce funkcí poskytuje Java API. Někteří lidé však chtějí používat HBase bez Javy.

Tito lidé mají dvě hlavní možnosti:Jedna je rozhraní Thrift (lehčí, a tedy rychlejší ze dvou možností) a druhá je rozhraní REST (aka Stargate). Rozhraní REST používá k provedení akce slovesa HTTP. Pomocí HTTP nabízí rozhraní REST mnohem širší škálu jazyků a programů, které mohou k rozhraní přistupovat. (Pokud byste chtěli více informací o rozhraní REST, můžete přejít na mou sérii návodů, jak na to.)

V této sérii návodů se naučíte orientovat se v rozhraní Thrift a prozkoumáte ukázky kódu Pythonu, jak toho dosáhnout. Tento první příspěvek se bude týkat HBase Thrift, práce s Thriftem a některých standardních kódů pro připojení k Thrift. Druhý příspěvek ukáže, jak vložit a získat více řádků najednou. Třetí příspěvek vysvětlí, jak používat skenování a některé úvahy při výběru mezi REST a Thrift.

Úplné ukázky kódu najdete na mém účtu GitHub.

HBase Thrift

Thrift je softwarový rámec, který vám umožňuje vytvářet vícejazyčné vazby. V kontextu HBase je Java jediným prvotřídním občanem. Rozhraní HBase Thrift však umožňuje dalším jazykům přistupovat k HBase přes Thrift připojením k serveru Thrift, který je propojen s klientem Java.

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 s balíčky hbase-thrift a hbase-rest. Níže uvedený diagram ukazuje, jak jsou Thrift a REST umístěny v clusteru.

Všimněte si, že hostitelé klientů Thrift a REST obvykle neprovozují žádné další služby (jako jsou DataNodes nebo RegionServers), aby udrželi nízkou režii a vysokou odezvu pro interakce REST nebo Thrift.

Ujistěte se, že jste tyto démony nainstalovali a spustili na uzlech, které mají přístup jak ke clusteru Hadoop, tak k aplikaci, která potřebuje přístup k HBase. Rozhraní Thrift nemá žádné vestavěné vyvažování zátěže, takže veškeré vyvažování zátěže bude muset být provedeno pomocí externích nástrojů, jako je DNS round-robin, virtuální IP adresa nebo v kódu. Cloudera Manager také velmi usnadňuje instalaci a správu služeb HBase REST a Thrift. Můžete si jej zdarma stáhnout a vyzkoušet v Cloudera Standard!

Nevýhodou Thriftu je, že je obtížnější jej nastavit než REST. Budete muset zkompilovat Thrift a vygenerovat vazby specifické pro daný jazyk. Tyto vazby jsou pěkné, protože vám poskytují kód pro jazyk, ve kterém pracujete – není třeba analyzovat XML nebo JSON jako v REST; spíše vám rozhraní Thrift poskytuje přímý přístup k datům řádků. Další příjemnou vlastností je, že protokol Thrift má nativní binární přenos; nebudete muset kódovat a dekódovat data base64.

Chcete-li začít používat rozhraní Thrift, musíte zjistit, na kterém portu běží. Výchozí port pro CDH je port 9090.  V tomto příspěvku uvidíte použité proměnné hostitele a portu, zde jsou hodnoty, které budeme používat:

host ="localhost"port ="9090"

Rozhraní Thrift můžete nastavit tak, aby pro lepší zabezpečení používalo přihlašovací údaje Kerberos.

Pro svůj kód budete muset použít IP adresu nebo plně kvalifikovaný název domény uzlu a port, na kterém běží démon Thrift. Vřele doporučuji vytvořit z této adresy URL proměnnou, protože se může změnit se změnami sítě.

Jazykové vazby

Než budete moci vytvořit vazby Thrift, musíte si stáhnout a zkompilovat Thrift. Neexistují žádné binární balíčky pro Thrift, které bych mohl najít, kromě Windows. Budete se muset řídit pokyny Thrift pro instalaci na platformu, kterou si zvolíte.

Jakmile je Thrift nainstalován, musíte najít soubor Hbase.thrift. Chcete-li definovat služby a datové typy v Thriftu, musíte vytvořit soubor IDL. Naštěstí pro nás vývojáři HBase již jeden vytvořili. Soubor bohužel není distribuován jako součást binárních balíčků CDH. (To opravíme v budoucí verzi CDH.) Budete si muset stáhnout zdrojový balíček verze HBase, kterou používáte. Ujistěte se, že používáte správnou verzi HBase, protože toto IDL se může změnit. V komprimovaném souboru je cesta k IDL hbase-VERSION/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift.

Thrift podporuje generování jazykových vazeb pro více než 14 jazyků včetně Java, C++, Python, PHP, Ruby a C#. Pro vygenerování vazeb pro Python byste použili následující příkaz:

thrift -gen py /path/to/hbase/source/hbase-VERSION/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift

Dále budete muset získat kód Thrift pro váš jazyk, který obsahuje všechny třídy pro připojení k Thriftu a jeho protokolům. Tento kód lze nalézt na /path/to/thrift/thrift-0.9.0/lib/py/src/.

Zde jsou příkazy, které jsem spustil, abych vytvořil projekt Python pro použití HBase Thrift:

$ mkdir HBaseThrift$ cd HBaseThrift/$ thrift -gen py ~/Downloads/hbase-0.94.2-cdh4.2.0/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift$ mv gen-py/* . $ rm -rf gen-py/$ mkdir thrift$ cp -rp ~/Downloads/thrift-0.9.0/lib/py/src/* ./thrift/

Rád si ponechávám kopii souboru Hbase.thrift v projektu, na který se mohu vrátit. Má mnoho „Javadoc“ na různých voláních, datových objektech a návratových objektech.

$ cp ~/Downloads/hbase-0.94.2-cdh4.2.0/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift

Kód kotelní desky

Zjistíte, že všechny vaše skripty Python Thrift budou vypadat velmi podobně. Pojďme si projít každou část.

z thrift.transport import TSocketfrom thrift.protocol import TBinaryProtocolfrom thrift.transport import TTransportfrom hbase import Hbase

Tyto importují moduly Thrift a HBase, které potřebujete.

# Connect to HBase Thrift servertransport =TTransport.TBufferedTransport(TSocket.TSocket(host, port))protocol =TBinaryProtocol.TBinaryProtocolAccelerated(transport)

To vytváří soketový transport a linkový protokol a umožňuje Thrift klientovi připojit se a hovořit s Thrift serverem.

# Vytvořte a otevřete klientské připojeníclient =Hbase.Client(protocol)transport.open()

Tyto řádky vytvářejí objekt Client, který budete používat k interakci s HBase. Z tohoto klientského objektu budete vydávat všechny vaše Gets a Puts. Dále otevřete soket pro Thrift server.

# Udělejte něco

Dále budete skutečně pracovat s klientem HBase. Vše je zkonstruováno, inicializováno a připojeno. Nejprve začněte používat klienta.

transport.close()

Nakonec transport uzavřete. Tím se uzavře soket a uvolní se prostředky na serveru Thrift. Zde je celý kód pro snadné kopírování a vkládání:

z thrift.transport import TSocketfrom thrift.protocol import TBinaryProtocolfrom thrift.transport import TTransportfrom hbase import Hbase# Připojit k HBase Thrift servertransport =TTransport.TBufferedTransport(TSocket.TSocket(hostitel, port))protokol =TBinaryProtokol =TBinary # Vytvořte a otevřete klientské připojeníclient =Hbase.Client(protocol)transport.open()# Do Somethingtransport.close()

V implementaci Pythonu HBase Thrift jsou všechny hodnoty předávány jako řetězce. To zahrnuje binární data, jako je celé číslo. Všechny hodnoty sloupců jsou uloženy v objektu TCell. Zde je definice v souboru Hbase.thrift:

struct TCell{  1:Bytes value,  2:i64 timestamp}

Všimněte si změny řetězce při generování kódu Pythonu:

thrift_spec =(    Žádné, # 0    (1, TType.STRING, 'value', None, None, ), # 1    (2, TType.I64, 'timestamp', None, None, ), # 2) 

Napsal jsem pomocnou metodu, která usnadňuje práci s 32bitovými celými čísly. Chcete-li změnit celé číslo tam a zpět mezi řetězcem, použijte tyto dvě metody.

# Metoda pro kódování ints s Thriftovým řetězcem encodingdef encode(n):     return struct.pack("i", n)# Metoda pro dekódování ints s Thriftovým řetězcem encodingdef decode(s):     return struct.unpack('i' , s)[0]

Toto upozornění mějte na paměti při práci s binárními daty v Thriftu. Budete muset převést binární data na řetězce a naopak.

Dochází k chybě

Porozumět chybám v rozhraní Thrift není tak snadné, jak by mohlo být. Zde je například chyba, která se objeví v Pythonu, když není nalezena tabulka:

Traceback (poslední poslední volání):  Soubor „./get.py“, řádek 17, v     řádcích =client.getRow(tablename, „shakespeare-comedies-000001“)  Soubor „/mnt/hgfs/ jesse/repos/DevHivePigHBaseVM/training_materials/hbase/exercises/python_bleets_thrift/hbase/Hbase.py", řádek 1038, v getRow    vraťte self.recv_getRow()  Soubor "/exv_getRow()  Soubor "/exv. /python_bleets_thrift/hbase/Hbase.py", řádek 1062, v recv_getRow    zvýšit výsledek.iohbase.ttypes.IOError:IOError(_message='doesnotexist')

Vše však není ztraceno, protože se můžete podívat na soubor protokolu HBase Thrift. Na CDH je tento soubor umístěn na /var/log/hbase/hbase-hbase-thrift-localhost.localdomain.log. V příkladu chybějící tabulky byste v protokolu Thrift viděli chybu, že tabulka neexistuje. Je to nepohodlné, ale můžete odtud ladit.

V příštím díle se budu věnovat vkládání a získávání řádků.

Jesse Anderson je instruktorem na Cloudera University.


  1. Připojení Redis k 127.0.0.1:6379 se nezdařilo – připojte ECONNREFUSED

  2. Použití uložených funkcí JavaScriptu v agregačním kanálu, MapReduce nebo runCommand

  3. Jak vypsat všechny databáze Redis?

  4. Vypočítejte medián v agregačním rámci MongoDB