HBase
 sql >> база данни >  >> NoSQL >> HBase

Използване на Hive за взаимодействие с HBase, част 1

Тази публикация в блога е публикувана на Hortonworks.com преди сливането с Cloudera. Някои връзки, ресурси или препратки може вече да не са точни.

Това е първата от двете публикации, разглеждащи използването на Hive за взаимодействие с HBase таблици. Втората публикация е тук.

Едно от нещата, за които често ме питат, е как да използвам HBase от Apache Hive. Не само как да го направите, но и какво работи, колко добре работи и как да го използвате добре. Направих малко проучване в тази област, така че се надявам, че това ще бъде полезно и на някой, освен на мен. Това е тема, която не успяхме да разгледаме в HBase в действие, може би тези бележки ще станат основа за второто издание 😉 Тези бележки са приложими за Hive 0.11.x, използван във връзка с HBase 0.94.x. Те трябва да са до голяма степен приложими за 0.12.x + 0.96.x, въпреки че все още не съм тествал всичко.

Проектът Hive включва незадължителна библиотека за взаимодействие с HBase. Това е мястото, където се реализира мостовият слой между двете системи. Основният интерфейс, който използвате при достъп до HBase от Hive заявки, се нарича  BaseStorageHandler . Можете също да взаимодействате с таблици HBase директно чрез входни и изходни формати, но манипулаторът е по-опростен и работи за повечето приложения.

HBase таблици от Hive

Използвайте HBaseStorageHandler за да регистрирате HBase таблици в метахранилище Hive. Можете по избор да посочите таблицата HBase като EXTERNAL , в който случай Hive няма да създаде, за да пусне тази таблица директно – за това ще трябва да използвате обвивката на HBase.

[sql]
СЪЗДАВАНЕ НА [ВЪНШНА] ТАБЛИЦА foo(…)
СЪХРАНЕНА ОТ 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
TBLPROPERTIES ('hbase.table.name' =' bar');
[/sql]

Горният оператор регистрира таблицата HBase с име bar в метамагазина Hive, достъпен от Hive с името foo .

Под капака, HBaseStorageHandler делегира взаимодействие с таблицата HBase на
HiveHBaseTableInputFormat и HiveHBaseTableOutputFormat . Можете да регистрирате таблицата си HBase в Hive, като използвате тези класове директно, ако желаете. Горното изявление е приблизително еквивалентно на:

[sql]
СЪЗДАВАНЕ НА ТАБЛИЦА foo(…)
СЪХРАНЕН КАТО
INPUTFORMAT 'org.apache.hadoop.hive.hbase.HiveHBaseTableInputFormat'
ИЗХОДЕН ФОРМАТ 'org.apache.hadoop.hive .hbase.HiveHBaseTableOutputFormat'
TBLPROPERTIES ('hbase.table.name' ='bar');
[/sql]

Предоставен е и HiveHFileOutputFormat което означава, че трябва да е възможно да се генерират HFiles за групово зареждане и от Hive. На практика не успях да накарам това да работи от край до край (вижте HIVE-4627).

Картографиране на схема

Регистрирането на таблицата е само първата стъпка. Като част от тази регистрация трябва също да посочите съпоставяне на колони. Ето как свързвате имената на колони на Hive с клавишния ред и колоните на таблицата HBase. Направете това с помощта на hbase.columns.mapping Свойство SerDe.

[sql]
СЪЗДАВАНЕ НА ТАБЛИЦА foo(rowkey STRING, a STRING, b STRING)
СЪХРАНЯВАНО ОТ 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
СЪС SERDEPROPERTIES ('hbase.columns .mapping' =':key,f:c1,f:c2')
TBLPROPERTIES ('hbase.table.name' ='bar');

[/sql]

Стойностите, предоставени в свойството за съпоставяне, съответстват едно към едно с имената на колони на таблицата на кошера. Имената на колони в HBase са напълно квалифицирани по семейство  колони и използвате специалния токен :key за представяне на rowkey. Горното

пример прави редове от таблицата HBase bar достъпно чрез таблицата Hive foo . foo колона rowkey съпоставя с rowkey на таблицата на HBase, a до c1 в f семейство колони и b до c2 , също в f семейство.

Можете също да свържете MAP на Hive структури от данни към семейства колони HBase. В този случай само STRING Използва се тип кошер. Другият тип Hive, поддържан в момента, е BINARY . Вижте wiki страницата за повече примери.

Взаимодействие с данни

С дефинираните съпоставяния на колони, вече можете да осъществявате достъп до HBase данни точно както бихте направили които други данни на Hive. Понастоящем се поддържат само прости предикати на заявка.

[sql]
ИЗБЕРЕТЕ * ОТ foo КЪДЕ …;
[/sql]

Можете също да попълните и HBase таблица с помощта на Hive. Това работи както с INTO и OVERWRITE клаузи.

[sql]
ОТ source_hive_table INSERT INTO TABLE my_hbase_table
ИЗБЕРЕТЕ source_hive_table.* КЪДЕ …;
[/sql]

Имайте предвид, че в Hive 0.12.0 има регресия, която нарушава тази функция, вижте HIVE-5515.

На практика

Все още е необходима малко финес, за да се свърже правилно всичко по време на изпълнение. Модулът за взаимодействие с HBase е напълно незадължителен, така че трябва да се уверите, че той и зависимостите му от HBase са налични в пътя на класа на Hive.

[bash]
$ export HADOOP_CLASSPATH=…
$ hive -e „СЪЗДАВАНЕ НА ТАБЛИЦА... СЪХРАНЯВАНО ОТ ‘org.apache…HBaseStorageHandler’”
[/bash]

Инсталационната среда би могла да свърши по-добра работа за справяне с това за потребителите, но за момента трябва да я управлявате сами. В идеалния случай hive bin скрипт може да открие наличието на HBase и автоматично да направи необходимия CLASSPATH корекции. Това подобрение изглежда се проследява в HIVE-2055. Последната миля се осигурява от самата дистрибуция, като се гарантира, че променливите на средата са зададени за hive . Тази функционалност се предоставя от BIGTOP-955.

Също така трябва да се уверите, че необходимите буркани са изпратени до заданията MapReduce , когато изпълнявате своите оператори Hive. Hive предоставя механизъм за изпращане на допълнителни зависимости за задания чрез функцията auxjars.

[bash]
$ export HIVE_AUX_JARS_PATH=…
$ hive -e “SELECT * FROM …”
[/bash]

Открих малка грешка в компилациите на HDP-1.3, която маскира зададените от потребителя стойности на HIVE_AUX_JARS_PATH . С администраторски права това лесно се коригира чрез коригиране на реда в hive-env.sh да уважават съществуваща стойност.
Заобикалянето в потребителските скриптове е да използвате SET изявление за предоставяне на стойност, след като стартирате Hive CLI.

[bash]
ЗАДАДЕТЕ hive.aux.jars.path =…
[/bash]

Hive трябва да може да открие кои буркани са необходими и да ги добави сам. HBase предоставя  TableMapReduceUtils#addDependencyJars  методи за тази цел. Изглежда, че това се прави в hive-0.12.0, поне според HIVE-2379.

Бъдеща работа

Много беше казано за правилната поддръжка за натискане на предикат (HIVE-1643, HIVE-2854, HIVE-3617,
HIVE-3684) и информираност за типа данни (HIVE-1245, HIVE-2599). Те вървят ръка за ръка, тъй като семантиката на предиката е дефинирана по отношение на типовете, върху които оперират. Може да се направи повече, за да се картографират сложните типове данни на Hive, като Maps и Structs, върху семейства колони HBase (HIVE-3211). Поддръжката за времеви марки на HBase е малко бъркотия; те не са достъпни за приложения на Hive с никакво ниво на детайлност (HIVE-2828, HIVE-2306). Единственото взаимодействие, което потребителят има, е чрез настройката на манипулатора на хранилището за записване на персонализирано клеймо за време с всички операции.

От гледна точка на производителността има неща, които Hive може да направи днес (т.е. не зависими от типове данни), за да се възползва от HBase. Има също възможност за HBase Hive Hive да използва HBase таблици като междинно место за съхранение (HIVE-3565), улеснявайки свързването от страна на картата с таблици с размери, заредени в HBase. Hive може да използва естествената индексирана структура на HBase (HIVE-3634, HIVE-3727), като потенциално спести огромни сканирания. Понастоящем потребителят няма (никакъв?) контрол върху сканирането, което се изпълнява. Конфигурирането на база на задание или поне на маса трябва да е активирано (HIVE-1233). Това би позволило на потребител, който поддържа HBase, да предостави на Hive съвети относно това как трябва да взаимодейства с HBase. Поддръжката за просто разделено вземане на проби от HBase таблици (HIVE-3399) също може да се направи лесно, тъй като HBase вече управлява дялове на таблици.

Други канали за достъп

Всичко, обсъдено досега, изисква Hive да взаимодейства с онлайн HBase RegionServers. Приложенията могат да получат значителна пропускателна способност и да се радват на по-голяма гъвкавост, като взаимодействат директно с HBase данни, запазени в HDFS. Това също има предимството да не позволява на работните натоварвания на Hive да пречат на онлайн свързаните с SLA HBase приложения (поне докато не видим подобрения на HBase в изолацията на QOS между задачите, HBASE-4441).

Както споменахме по-рано, има HiveHFileOutputFormat . Разрешаването на HIVE-4627 трябва да направи Hive лесен начин за генериране на HFiles за групово зареждане. След като създадете HFiles с помощта на Hive, все още има последната стъпка за стартиране на
LoadIncrementalHFiles програма за копиране и регистриране в регионите. За това, HiveStorageHandler  интерфейсът ще се нуждае от някакъв вид кука, за да повлияе на плана на заявката при създаването му, позволявайки му да добавя стъпки. След като е на място, трябва да е възможно SET флаг по време на изпълнение, превключване на INSERT  операция за използване на насипно натоварване.

HBase наскоро представи функцията за моментна снимка на таблицата. Това позволява на потребителя да създаде постоянен изглед към момента на таблица, запазен в HDFS. HBase може да възстанови таблица от моментна снимка до предишно състояние и да създаде изцяло нова таблица от съществуваща моментна снимка. Понастоящем Hive не поддържа четене от моментна снимка на HBase. По този въпрос HBase все още не поддържа задания MapReduce над моментни снимки, въпреки че функцията е в процес на разработка (HBASE-8369).

Заключения

Интерфейсът между HBase и Hive е млад, но има добър потенциал. Има много ниско висящи плодове, които могат да бъдат взети, за да направят нещата по-лесни и по-бързи. Най-очевидният проблем, който пречи на реалното разработване на приложения, е несъответствието на импеданса между въведената, плътна схема на Hive и нетипизираната, рядка схема на HBase. Това е толкова когнитивен проблем, колкото и технически проблем. Решенията тук биха позволили да отпаднат редица подобрения, включително много в начина на подобряване на производителността. Надявам се, че продължаването на работата за добавяне на типове данни към HBase (HBASE-8089) може да помогне за преодоляване на тази празнина.

Основните операции работят предимно, поне по елементарен начин. Можете да четете данни от и да записвате данни обратно в HBase с помощта на Hive. Конфигурирането на средата е непрозрачен и ръчен процес, който вероятно възпира начинаещите да възприемат инструментите. Съществува и въпросът за груповите операции – поддръжката за писане HFiles и четене на HBase моментни снимки с помощта на Hive в този момент напълно липсва. И разбира се, има бъгове, поръсени навсякъде. Най-голямото скорошно подобрение е оттеглянето на интерфейса на HCatalog, премахвайки необходимото предварително решение относно това кой интерфейс да се използва.

Hive предоставя много използваем SQL интерфейс върху HBase, който се интегрира лесно в много съществуващи работни потоци на ETL. Този интерфейс изисква опростяване на част от семантиката на BigTable, която HBase предоставя, но резултатът ще бъде отварянето на HBase за много по-широка аудитория от потребители. Взаимодействието на Hive допълва изключително добре изживяването, предоставено от Phoenix. Предимството на Hive е, че не изисква сложността на внедряването, изисквана в момента от тази система. Надяваме се, че общата дефиниция на типове ще позволи допълнително бъдеще.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MapReduce разбъркване и сортиране в Hadoop

  2. Spark на HBase с Spark shell

  3. Как да:Използвайте HBase групово зареждане и защо

  4. HDFS урок – пълно въведение в HDFS за начинаещи

  5. Проблемът с малките файлове