HBase
 sql >> Baza danych >  >> NoSQL >> HBase

Używanie Hive do interakcji z HBase, część 1

Ten wpis na blogu został opublikowany na Hortonworks.com przed fuzją z Cloudera. Niektóre linki, zasoby lub odniesienia mogą nie być już dokładne.

Jest to pierwszy z dwóch postów badających użycie Hive do interakcji z tabelami HBase. Drugi post jest tutaj.

Jedną z rzeczy, o które często mnie pytają, jest sposób korzystania z HBase z Apache Hive. Nie tylko jak to zrobić, ale co działa, jak dobrze działa i jak dobrze to wykorzystać. Zrobiłem trochę badań w tej dziedzinie, więc mam nadzieję, że przyda się to komuś poza mną. To jest temat, którego nie omówiliśmy w HBase in Action, być może te uwagi staną się podstawą dla drugiej edycji 😉 Te uwagi dotyczą Hive 0.11.x używanego w połączeniu z HBase 0.94.x. Powinny one w dużej mierze mieć zastosowanie do 0.12.x + 0.96.x, chociaż nie przetestowałem jeszcze wszystkiego.

Projekt hive zawiera opcjonalną bibliotekę do interakcji z HBase. W tym miejscu zaimplementowana jest warstwa pomostowa między dwoma systemami. Podstawowy interfejs używany podczas uzyskiwania dostępu do HBase z zapytań Hive nazywa się BaseStorageHandler . Możesz także wchodzić w interakcję z tabelami HBase bezpośrednio za pomocą formatów wejściowych i wyjściowych, ale procedura obsługi jest prostsza i działa w większości zastosowań.

Tabele HBase z Hive

Użyj HBaseStorageHandler aby zarejestrować tabele HBase w magazynie metadanych Hive. Opcjonalnie możesz określić tabelę HBase jako EXTERNAL , w takim przypadku Hive nie utworzy, aby bezpośrednio usunąć tę tabelę – będziesz musiał użyć do tego powłoki HBase.

[sql]
CREATE [EXTERNAL] TABLE foo(…)
PRZECHOWYWANE PRZEZ 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
TBLPROPERTIES ('hbase.table.name' =' pasek');
[/sql]

Powyższa instrukcja rejestruje tabelę HBase o nazwie bar w metastore Hive, dostępnym z Hive pod nazwą foo .

Pod maską HBaseStorageHandler deleguje interakcję z tabelą HBase do
HiveHBaseTableInputFormatHiveHBaseTableOutputFormat . Jeśli chcesz, możesz zarejestrować swoją tabelę HBase w Hive, korzystając bezpośrednio z tych klas. Powyższe stwierdzenie jest mniej więcej odpowiednikiem:

[sql]
CREATE TABLE foo(…)
PRZECHOWYWANE JAKO
INPUTFORMAT 'org.apache.hadoop.hive.hbase.HiveHBaseTableInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive .hbase.HiveHBaseTableOutputFormat'
TBLPROPERTIES ('hbase.table.name' ='bar');
[/sql]

Dostępny jest również HiveHFileOutputFormat co oznacza, że ​​powinno być możliwe generowanie plików HFiles do zbiorczego ładowania również z Hive. W praktyce nie udało mi się to działać od końca do końca (patrz HIVE-4627).

Mapowanie schematu

Rejestracja stolika to dopiero pierwszy krok. W ramach tej rejestracji musisz też określić mapowanie kolumn. W ten sposób łączysz nazwy kolumn Hive z kluczem wiersza i kolumnami tabeli HBase. Zrób to za pomocą hbase.columns.mapping Właściwość SerDe.

[sql]
CREATE TABLE foo(rowkey ŁAŃCUCH, a ŁAŃCUCH, b ŁAŃCUCH)
PRZECHOWYWANY PRZEZ 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
Z WŁAŚCIWOŚCIAMI SERDE ('hbase.columns .mapping' =':key,f:c1,f:c2')
TBLPROPERTIES ('hbase.table.name' ='bar');

[/sql]

Wartości podane we właściwości mapowania odpowiadają jeden do jednego z nazwami kolumn tabeli gałęzi. Nazwy kolumn HBase są w pełni kwalifikowane według rodziny kolumn i używasz specjalnego tokena :key do reprezentowania klawisza. Powyższe

przykład tworzy wiersze z tabeli HBase bar dostępne w tabeli Hive foo . foo kolumna rowkey mapuje na klawisz wiersza tabeli HBase, a do c1 w f rodzina kolumn i b do c2 , także w f rodzina.

Możesz także powiązać MAP Hive struktury danych do rodzin kolumn HBase. W tym przypadku tylko STRING Używany jest typ ula. Drugi obecnie obsługiwany typ Hive to BINARY . Więcej przykładów znajdziesz na stronie wiki.

Interakcja z danymi

Po zdefiniowaniu mapowań kolumn możesz teraz uzyskiwać dostęp do danych HBase tak samo, jak do innych danych Hive. Obecnie obsługiwane są tylko proste predykaty zapytań.

[sql]
SELECT * FROM foo WHERE …;
[/sql]

Możesz również wypełnić i HBase tabelę za pomocą Hive. Działa to zarówno z INTO i OVERWRITE klauzule.

[sql]
FROM source_hive_table INSERT INTO TABLE moja_hbase_table
SELECT source_hive_table.* WHERE …;
[/sql]

Pamiętaj, że w Hive 0.12.0 występuje regresja, która psuje tę funkcję, zobacz HIVE-5515.

W praktyce

Aby wszystko było prawidłowo podłączone w czasie wykonywania, trzeba jeszcze trochę finezji. Moduł interakcji HBase jest całkowicie opcjonalny, więc musisz się upewnić, że on i jego zależności HBase są dostępne w ścieżce klas Hive.

[bash]
$ export HADOOP_CLASSPATH=…
$ hive -e „UTWÓRZ TABELĘ… PRZECHOWYWANA PRZEZ „org.apache…HBaseStorageHandler”
[/bash]

Środowisko instalacji może lepiej radzić sobie z tym dla użytkowników, ale na razie musisz nim zarządzać samodzielnie. Idealnie hive Skrypt bin może wykryć obecność HBase i automatycznie utworzyć niezbędną CLASSPATH korekty. Wygląda na to, że to ulepszenie jest śledzone w HIVE-2055. Ostatnią milę zapewnia sama dystrybucja, upewniając się, że zmienne środowiskowe są ustawione dla hive . Tę funkcję zapewnia BIGTOP-955.

Musisz również upewnić się, że niezbędne słoiki są wysyłane do zadań MapReduce podczas wykonywania instrukcji Hive. Hive zapewnia mechanizm wysyłania dodatkowych zależności zadań za pośrednictwem funkcji auxjars.

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

Odkryłem mały błąd w kompilacjach HDP-1.3, który maskuje określone przez użytkownika wartości HIVE_AUX_JARS_PATH . Dzięki uprawnieniom administracyjnym można to łatwo naprawić, poprawiając wiersz w hive-env.sh szanować istniejącą wartość.
Obejście w skryptach użytkownika polega na użyciu SET oświadczenie, aby podać wartość po uruchomieniu interfejsu wiersza polecenia Hive.

[bash]
SET hive.aux.jars.path =…
[/bash]

Hive powinien być w stanie wykryć, które słoiki są potrzebne i samodzielnie je dodać. HBase zapewnia  TableMapReduceUtils#addDependencyJars  metody do tego celu. Wygląda na to, że jest to zrobione w ulu-0.12.0, przynajmniej według HIVE-2379.

Praca w przyszłości

Wiele powiedziano na temat właściwej obsługi predykatu (HIVE-1643, HIVE-2854, HIVE-3617,
HIVE-3684) i świadomości typu danych (HIVE-1245, HIVE-2599). Idą one w parze, ponieważ semantyka predykatów jest definiowana pod względem typów, na których działają. Można zrobić więcej, aby zmapować złożone typy danych Hive, takie jak Mapy i Structs, na rodziny kolumn HBase (HIVE-3211). Obsługa znaczników czasu HBase to trochę bałagan; nie są dostępne dla aplikacji Hive o dowolnym poziomie szczegółowości (HIVE-2828, HIVE-2306). Jedyną interakcją, jaką ma użytkownik, jest ustawienie modułu obsługi pamięci w celu zapisania niestandardowej sygnatury czasowej ze wszystkimi operacjami.

Z punktu widzenia wydajności są rzeczy, które Hive może dziś zrobić (tj. niezależne od typów danych), aby skorzystać z HBase. Istnieje również możliwość Hive obsługującego HBase do korzystania z tabel HBase jako pośredniej lokalizacji przechowywania (HIVE-3565), ułatwiając łączenie po stronie mapy z tabelami wymiarów załadowanymi do HBase. Hive może wykorzystać naturalną indeksowaną strukturę HBase (HIVE-3634, HIVE-3727), potencjalnie oszczędzając ogromne skany. Obecnie użytkownik nie ma (żadnej?) kontroli nad wykonywanymi skanami. Powinna być włączona konfiguracja na zadanie lub przynajmniej na tabelę (HIVE-1233). Umożliwiłoby to użytkownikowi zaznajomionemu z HBase dostarczenie Hive wskazówek dotyczących sposobu interakcji z HBase. Obsługa prostego podziału próbkowania tabel HBase (HIVE-3399) może być również łatwo wykonana, ponieważ HBase już zarządza partycjami tabel.

Inne kanały dostępu

Wszystko, co omówiono do tej pory, wymagało od Hive interakcji z internetowymi serwerami HBase RegionServers. Aplikacje mogą zyskać znaczną przepustowość i cieszyć się większą elastycznością dzięki bezpośredniej interakcji z danymi HBase utrwalonymi w HDFS. Ma to również tę zaletę, że zapobiega kolidowaniu obciążeń roboczych Hive z aplikacjami HBase powiązanymi z SLA online (przynajmniej do czasu, gdy zobaczymy ulepszenia HBase w izolacji QOS między zadaniami, HBASE-4441).

Jak wspomniano wcześniej, istnieje HiveHFileOutputFormat . Rozwiązanie HIVE-4627 powinno sprawić, że Hive będzie prostym sposobem na generowanie plików HFI do zbiorczego ładowania. Po utworzeniu plików HFiles przy użyciu Hive jest jeszcze ostatni krok uruchamiania
LoadIncrementalHFiles narzędzie do kopiowania i rejestrowania ich w regionach. W tym celu HiveStorageHandler  Interfejs będzie wymagał pewnego rodzaju zaczepu, aby wpłynąć na plan zapytania w trakcie jego tworzenia, umożliwiając mu dołączanie kroków. Po umieszczeniu powinno być możliwe SET flaga czasu wykonywania, przełączanie INSERT  operacja, aby użyć bulkload.

HBase niedawno wprowadził funkcję migawki tabeli. Dzięki temu użytkownik może utworzyć utrwalony widok tabeli z określonego punktu w czasie, utrwalony w HDFS. HBase może przywrócić tabelę ze zrzutu do poprzedniego stanu i utworzyć całkowicie nową tabelę z istniejącego zrzutu. Hive nie obsługuje obecnie odczytywania z migawki HBase. Z tego powodu HBase nie obsługuje jeszcze zadań MapReduce na migawkach, chociaż funkcja jest w toku (HBASE-8369).

Wnioski

Interfejs między HBase i Hive jest młody, ale ma niezły potencjał. Istnieje wiele nisko wiszących owoców, które można zebrać, aby ułatwić i przyspieszyć proces. Najbardziej rażącym problemem uniemożliwiającym tworzenie prawdziwych aplikacji jest niedopasowanie impedancji między gęstym schematem Hive z typami a rzadkim schematem HBase. Jest to zarówno problem poznawczy, jak i techniczny. Rozwiązania tutaj umożliwiłyby wprowadzenie szeregu ulepszeń, w tym wielu usprawnień wydajności. Mam nadzieję, że dalsze prace nad dodaniem typów danych do HBase (HBASE-8089) pomogą wypełnić tę lukę.

Podstawowe operacje w większości działają, przynajmniej w szczątkowy sposób. Za pomocą Hive możesz odczytywać dane i zapisywać je z powrotem w HBase. Konfiguracja środowiska jest procesem nieprzejrzystym i ręcznym, który prawdopodobnie utrudnia nowicjuszom korzystanie z narzędzi. Jest też kwestia operacji zbiorczych – w tym momencie całkowicie brakuje obsługi pisania HFiles i odczytywania migawek HBase za pomocą Hive. I oczywiście są porozrzucane błędy. Największą niedawną poprawą jest wycofanie interfejsu HCatalog, usuwając niezbędną z góry decyzję dotyczącą tego, którego interfejsu użyć.

Hive zapewnia bardzo użyteczny interfejs SQL oparty na HBase, który łatwo integruje się z wieloma istniejącymi przepływami pracy ETL. Ten interfejs wymaga uproszczenia niektórych semantyki BigTable zapewnianej przez HBase, ale efektem będzie otwarcie HBase dla znacznie szerszego grona użytkowników. Hive interop doskonale uzupełnia wrażenia oferowane przez Phoenix. Hive ma tę zaletę, że nie wymaga złożoności wdrażania obecnie wymaganej przez ten system. Mamy nadzieję, że wspólna definicja typów pozwoli na komplementarną przyszłość.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Wewnątrz architektury pozyskiwania danych w czasie zbliżonym do rzeczywistego Santander (część 2)

  2. Wprowadzenie do federacji i architektury HDFS

  3. Wykorzystanie inżynierii danych Cloudera do analizy danych programu ochrony wypłat

  4. Solidna serializacja wiadomości w Apache Kafka przy użyciu Apache Avro, część 1

  5. Czym jest praca tylko z mapą w Hadoop?