Tento blogový příspěvek byl publikován na Hortonworks.com před sloučením s Cloudera. Některé odkazy, zdroje nebo reference již nemusí být přesné.
Toto je první ze dvou příspěvků, které zkoumají použití Hive pro interakci s tabulkami HBase. Druhý příspěvek je zde.
Jedna z věcí, na kterou se mě často ptají, je, jak používat HBase od Apache Hive. Nejen jak to udělat, ale co funguje, jak dobře to funguje a jak toho dobře využít. Provedl jsem v této oblasti trochu průzkumu, takže doufám, že to bude užitečné pro někoho kromě mě. Toto je téma, které jsme v HBase in Action nemohli probrat, možná se tyto poznámky stanou základem pro 2. vydání 😉 Tyto poznámky platí pro Hive 0.11.x používané ve spojení s HBase 0.94.x. Měly by být z velké části použitelné pro 0.12.x + 0.96.x, i když jsem ještě nevyzkoušel vše.
Projekt úlu obsahuje volitelnou knihovnu pro interakci s HBase. Zde je implementována vrstva mostu mezi těmito dvěma systémy. Primární rozhraní, které používáte při přístupu k HBase z dotazů Hive, se nazývá BaseStorageHandler
. S tabulkami HBase můžete také pracovat přímo prostřednictvím vstupních a výstupních formátů, ale obslužný program je jednodušší a funguje pro většinu použití.
HBase tabulky z Hive
Použijte HBaseStorageHandler
k registraci tabulek HBase v metaúložišti Hive. Volitelně můžete zadat tabulku HBase jako EXTERNAL
, v takovém případě Hive nevytvoří, aby tuto tabulku přímo zrušil – k tomu budete muset použít prostředí HBase.
[sql]
VYTVOŘTE [EXTERNÍ] TABULKU foo(…)
ULOŽENÉ 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
TBLPROPERTIES ('hbase.table.name' =' bar');
[/sql]
Výše uvedený příkaz registruje tabulku HBase s názvem bar
v metaúložišti Hive, dostupném z Hive pod jménem foo
.
Pod kapotou je HBaseStorageHandler
deleguje interakci s tabulkou HBase naHiveHBaseTableInputFormat
a HiveHBaseTableOutputFormat
. Pokud chcete, můžete svou tabulku HBase zaregistrovat v Hive přímo pomocí těchto tříd. Výše uvedené prohlášení je zhruba ekvivalentní:
[sql]
VYTVOŘIT TABULKU foo(…)
ULOŽENO JAKO
INPUTFORMAT 'org.apache.hadoop.hive.hbase.HiveHBaseTableInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive .hbase.HiveHBaseTableOutputFormat'
TBLPROPERTIES ('hbase.table.name' ='bar');
[/sql]
K dispozici je také HiveHFileOutputFormat
což znamená, že by mělo být možné generovat soubory HFiles pro hromadné načítání také z Hive. V praxi se mi nepodařilo, aby to fungovalo od začátku do konce (viz HIVE-4627).
Mapování schématu
Registrace tabulky je pouze prvním krokem. V rámci této registrace je také potřeba zadat mapování sloupců. Takto propojíte názvy sloupců Hive s klíčem řádků a sloupci tabulky HBase. Udělejte to pomocí hbase.columns.mapping
Vlastnost SerDe.
[sql]
VYTVOŘIT TABULKU foo(rowkey STRING, a STRING, b STRING)
ULOŽENO U 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
S SERDEPROPERTIES ('hbase.columns .mapping' =':key,f:c1,f:c2')
TBLPROPERTIES ('hbase.table.name' ='bar');
…
[/sql]
Hodnoty poskytnuté ve vlastnosti mapování odpovídají jedna za jednu s názvy sloupců podregistrové tabulky. Názvy sloupců HBase jsou plně kvalifikovány podle rodiny sloupců a vy používáte speciální token :key
reprezentovat klíč řádku. Výše uvedené
příklad vytváří řádky z tabulky HBase bar
dostupné prostřednictvím tabulky Hive foo
. foo
sloupec rowkey
mapuje na klíč řádku tabulky HBase, a
na c1
v f
rodina sloupců a b
na c2
, také v f
rodina.
Můžete také přiřadit MAP
Hive datové struktury do rodin sloupců HBase. V tomto případě pouze STRING
Používá se typ úlu. Dalším aktuálně podporovaným typem úlu je BINARY
. Další příklady naleznete na stránce wiki.
Interakce s daty
S definovaným mapováním sloupců nyní můžete přistupovat k datům HBase stejně jako k jakýmkoli jiným datům Hive. Aktuálně jsou podporovány pouze jednoduché predikáty dotazů.
[sql]
SELECT * FROM foo WHERE …;
[/sql]
Pomocí Hive můžete také naplnit a HBase tabulku. Toto funguje s INTO
a OVERWRITE
klauzule.
[sql]
FROM source_hive_table INSERT INTO TABLE my_hbase_table
SELECT source_hive_table.* WHERE …;
[/sql]
Upozorňujeme, že v Hive 0.12.0 existuje regrese, která tuto funkci porušuje, viz HIVE-5515.
V praxi
Ke správnému zapojení všeho za běhu je stále potřeba trochu jemnosti. Interakční modul HBase je zcela volitelný, takže se musíte ujistit, že je a jeho závislosti na HBase jsou dostupné na cestě třídy Hive.
[bash]
$ export HADOOP_CLASSPATH=…
$ hive -e “CREATE TABLE … STORED BY ‘org.apache…HBaseStorageHandler'”
[/bash]
Instalační prostředí by to pro uživatele mohlo zvládnout lépe, ale prozatím to musíte spravovat sami. Ideálně hive
bin script dokáže detekovat přítomnost HBase a automaticky vytvořit potřebné CLASSPATH
úpravy. Zdá se, že toto vylepšení je sledováno v HIVE-2055. Poslední míli poskytuje samotná distribuce a zajišťuje, že proměnné prostředí jsou nastaveny pro hive
. Tuto funkci poskytuje BIGTOP-955.
Při provádění příkazů Hive se také musíte ujistit, že potřebné sklenice jsou odeslány do úloh MapReduce. Hive poskytuje mechanismus pro odesílání dalších závislých úloh prostřednictvím funkce auxjars.
[bash]
$ export HIVE_AUX_JARS_PATH=…
$ hive -e “SELECT * FROM …”
[/bash]
Objevil jsem malou chybu v sestavení HDP-1.3, která maskuje uživatelem zadané hodnoty HIVE_AUX_JARS_PATH
. S právy správce to lze snadno opravit opravou řádku v hive-env.sh
respektovat existující hodnotu.
Řešením v uživatelských skriptech je použití SET
příkaz k poskytnutí hodnoty, jakmile spustíte rozhraní příkazového řádku Hive.
[bash]
SET hive.aux.jars.path =…
[/bash]
Úl by měl být schopen rozpoznat, které sklenice jsou potřebné, a sám je přidat. HBase poskytuje TableMapReduceUtils#addDependencyJars
metody pro tento účel. Zdá se, že se to děje v hive-0.12.0, alespoň podle HIVE-2379.
Budoucí práce
O správné podpoře predikátového rozšíření (HIVE-1643, HIVE-2854, HIVE-3617,
HIVE-3684) a povědomí o datových typech (HIVE-1245, HIVE-2599) již bylo řečeno mnoho. Ty jdou ruku v ruce, protože predikátová sémantika je definována z hlediska typů, na kterých působí. Dalo by se udělat více pro mapování komplexních datových typů Hive, jako jsou mapy a struktury, také na rodiny sloupců HBase (HIVE-3211). Podpora časových razítek HBase je trochu nepořádek; nejsou dostupné pro aplikace Hive s jakoukoli úrovní podrobnosti (HIVE-2828, HIVE-2306). Jediná interakce uživatele je prostřednictvím nastavení obslužného programu úložiště pro zápis vlastního časového razítka se všemi operacemi.
Z hlediska výkonu existují věci, které Hive dnes může udělat (tj. nezávisí na datových typech), aby využil HBase. Existuje také možnost HBase-aware Hive, která využívá tabulky HBase jako přechodné úložiště (HIVE-3565), což usnadňuje spojení na straně mapy s tabulkami dimenzí načtenými do HBase. Hive by mohl využít přirozenou indexovanou strukturu HBase (HIVE-3634, HIVE-3727), což by potenciálně ušetřilo obrovské skeny. Uživatel v současné době nemá (žádnou?) kontrolu nad prováděnými kontrolami. Měla by být povolena konfigurace pro každou úlohu nebo alespoň pro tabulku (HIVE-1233). To by umožnilo uživateli znalému HBase poskytnout Hive rady ohledně toho, jak by měl s HBase interagovat. Podpora jednoduchého rozděleného vzorkování tabulek HBase (HIVE-3399) by mohla být také snadno provedena, protože HBase již spravuje oddíly tabulek.
Další přístupové kanály
Vše, co se dosud probíralo, vyžadovalo, aby Hive interagoval s online servery HBase RegionServers. Aplikace mohou získat významnou propustnost a užít si větší flexibilitu díky přímé interakci s daty HBase uloženými na HDFS. To má také výhodu v tom, že zabrání tomu, aby pracovní zátěž Hive zasahovala do online aplikací HBase vázaných na SLA (alespoň dokud neuvidíme vylepšení HBase v izolaci QOS mezi úlohami, HBASE-4441).
Jak již bylo zmíněno dříve, existuje HiveHFileOutputFormat
. Vyřešení HIVE-4627 by mělo z Hive udělat přímočarý způsob generování HFsouborů pro hromadné načítání. Jakmile vytvoříte HFiles pomocí Hive, zbývá ještě poslední krok spuštění LoadIncrementalHFiles
nástroj k jejich zkopírování a registraci v regionech. K tomu slouží HiveStorageHandler
rozhraní bude potřebovat nějaký háček k ovlivnění plánu dotazů při jeho vytváření, což mu umožní přidávat kroky. Po umístění by mělo být možné SET
runtime příznak, přepínání INSERT
operace pro použití hromadného zatížení.
HBase nedávno představila funkci snímku tabulky. To umožňuje uživateli vytvořit trvalé zobrazení tabulky v určitém okamžiku uložené v HDFS. HBase dokáže obnovit tabulku ze snímku do předchozího stavu a vytvořit zcela novou tabulku ze stávajícího snímku. Hive aktuálně nepodporuje čtení ze snímku HBase. Ostatně HBase zatím nepodporuje úlohy MapReduce přes snímky, ačkoli tato funkce je ve vývoji (HBASE-8369).
Závěry
Rozhraní mezi HBase a Hive je mladé, ale má pěkný potenciál. Existuje spousta nízko visícího ovoce, které lze nasbírat, aby bylo vše jednodušší a rychlejší. Nejkřiklavějším problémem, který brání skutečnému vývoji aplikací, je nesoulad impedance mezi typovaným, hustým schématem Hive a netypovaným, řídkým schématem HBase. To je stejně kognitivní problém jako technický problém. Zde uvedená řešení by umožnila vypadnout z řady vylepšení, včetně mnoha vylepšení výkonu. Doufám, že pokračující práce na přidávání datových typů do HBase (HBASE-8089) může pomoci překlenout tuto mezeru.
Základní operace většinou fungují, alespoň základním způsobem. Pomocí Hive můžete číst data a zapisovat je zpět do HBase. Konfigurace prostředí je neprůhledný a manuální proces, který nováčkům pravděpodobně brání osvojit si nástroje. Je tu také otázka hromadných operací – podpora pro psaní souborů HFiles a čtení snímků HBase pomocí Hive v tuto chvíli zcela chybí. A samozřejmě jsou všude poseté brouky. Největším nedávným vylepšením je ukončení podpory rozhraní HCatalog, které odstraňuje nezbytné předběžné rozhodování o tom, které rozhraní použít.
Hive poskytuje nad HBase velmi použitelné rozhraní SQL, které se snadno integruje do mnoha existujících pracovních postupů ETL. Toto rozhraní vyžaduje zjednodušení některých sémantik BigTable, které HBase poskytuje, ale výsledkem bude otevření HBase mnohem širšímu publiku uživatelů. Interoperabilita Hive velmi dobře doplňuje zkušenosti poskytované společností Phoenix. Hive má tu výhodu, že nevyžaduje složitosti nasazení, které daný systém aktuálně vyžaduje. Doufejme, že společná definice typů umožní doplňkovou budoucnost.