2015-05-06 45 views
6

Mam tabelę w Hbase, powiedzmy "tbl" i chciałbym zapytać o nią przy użyciu Ula Hive. Dlatego odwzorowane stół do ula następująco:Tuning Hive Queries, który używa tabeli bazowej HBase

CREATE EXTERNAL TABLE tbl(id string, data map<string,string>) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' 
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,data:") 
TBLPROPERTIES("hbase.table.name" = "tbl"); 

Zapytania jak:

select * from tbl", "select id from tbl", "select id, data 
from tbl 

są naprawdę szybkie.

Ale zapytań jak

select id from tbl where substr(id, 0, 5) = "12345" 

select id from tbl where data["777"] IS NOT NULL 

są bardzo powolne.

W Przeciwnie, gdy uruchomiony z HBase skorupy:

"scan 'tbl', { 
COLUMNS=>'data', STARTROW='12345', ENDROW='12346'}" or 
"scan 'tbl', { COLUMNS=>'data', "FILTER" => 
FilterList.new([qualifierFilter('777')])}" 

jest szybki jak błyskawica!

Kiedy spojrzał w mapred pracy generowanych przez ula na jobtracker I odkrył, że „map.input.records” zlicza wszystkie elementy w tabeli HBase, oznacza pracę sprawia, że ​​pełne skanowanie tabeli, zanim jeszcze zacznie żadnych mappers !! Co więcej, podejrzewam, że kopiuje on wszystkie dane z tabeli Hbase do hdfs na folder wejściowy tmp przed uruchomieniem.

Tak, moje pytania są - Dlaczego hbase obsługa magazynu dla ula nie tłumaczy kwerendy hive do odpowiednich funkcji hbase? Dlaczego skanuje wszystkie rekordy , a następnie dzieli je na segmenty za pomocą klauzuli "where"? Jak można go ulepszyć?

Wszelkie sugestie dotyczące poprawy wydajności kwerendy Hive (mapowane do tabeli HBase).

Czy możemy utworzyć indeks wtórny na tabelach HBase?

Używamy integracji HBase i Hive i próbujemy dostroić wydajność zapytań Hive.

+0

Czy masz jakieś liczby dla zapytań, które działają przeciwko Hive's Text vs ORC vs integracja HBase? W jaki sposób taryfy Tpch są rozliczane według powyższych formatów pamięci masowej? Dziękuję i pozdrawiam! – user1393608

+0

Hej @Ram, czy kiedykolwiek znalazłeś odpowiednie rozwiązanie/obejście tego problemu? – Havnar

Odpowiedz

7

Dużo pytań !, Postaram się odpowiedzieć na wszystkie i daje kilka wskazówek wydajności:

Dane nie są kopiowane do HDFS, ale zadania mapreduce generowane przez HIVE będzie przechowywać swoje dane w pośrednich HDFS.

Wtórne indeksy lub alternatywne ścieżki zapytania nie są obsługiwane przez HBase (more info).

Hive przetłumaczy wszystko na zadania MapReduce, które wymagają czasu do rozpowszechnienia & zainicjalizowane, jeśli masz bardzo małą liczbę wierszy, możliwe jest, że prosta operacja SCAN w powłoce Hbase jest szybsza niż zapytanie Hive, ale na dużych zbiorach danych , dystrybucja pracy wśród datanodów jest koniecznością.

The Hive HBase obsługi nie robi bardzo dobrą robotę podczas wydobywania początku & klucze przystanek rzędzie od zapytania, pytania, takie jak substr(id, 0, 5) = "12345" nie użyje rozpocząć & klucze przystanek rzędu.

Przed wykonaniem zapytania, uruchom polecenie EXPLAIN [your_query]; i sprawdzić filterExpr: części, jeśli nie go znaleźć, zapytanie będzie wykonać pełne skanowanie tabeli.Na marginesie wszystkie zniekształcenia w obrębie zostaną przekształcone w odpowiednie filtry.

EXPLAIN SELECT * FROM tbl WHERE (id>='12345') AND (id<'12346') 
STAGE PLANS: 
    Stage: Stage-1 
    Map Reduce 
     Alias -> Map Operator Tree: 
     tbl 
      TableScan 
      alias: tbl 
      filterExpr: 
       expr: ((id>= '12345') and (id < '12346')) 
       type: boolean 
      Filter Operator 
       .... 

Na szczęście jest prosty sposób, aby upewnić się, że początkowe klucze row & zatrzymania są stosowane, gdy szukasz wiersz kluczowych prefiksów, tylko konwertować substr(id, 0, 5) = "12345" do prostszej zapytania: id>="12345" AND id<"12346", zostanie on wykryty przez klucze przewodnika i rozpocząć wiersz & zatrzymania zostaną przekazane SCAN (12345, 12346.)


teraz, oto kilka wskazówek, w celu przyspieszenia zapytań (o wiele):

  • Upewnij się ustawić następujące właściwości, aby skorzystać z dozowania, aby zmniejszyć liczbę wywołań RPC (liczba zależy od wielkości kolumnach)

    SET hbase.scan.cache=10000;

    SET hbase.client.scanner.cache=10000;

  • Producent z pewnością ustawisz następujące właściwości, aby uruchomić zadanie rozproszone w modułach śledzenia zadań, zamiast uruchamiać zadanie lokalne.

    SET mapred.job.tracker=[YOUR_JOB_TRACKER]:8021;

    SET hbase.zookeeper.quorum=[ZOOKEEPER_NODE_1],[ZOOKEEPER_NODE_2],[ZOOKEEPER_NODE_3];

  • Zmniejsz ilość kolumn swojej SELECT do minimum. Staraj się nie SELECT *

  • Ilekroć chcesz użyć rozpocząć & klucze przystanek wierszy, aby zapobiec pełne skanowanie tabeli, zawsze zapewniają key>=x i key<y wyrażeń (nie używać między operatorem)

  • Zawsze EXPLAIN SELECT twoje zapytania przed ich wykonanie.

+0

Dzięki za krótkie wyjaśnienie. Czy istnieje sposób zastosowania wskazówek w ulu podczas pobierania danych z HBase (np. Klastra w ulu). – Ram

+0

Nie jestem pewien, co chciałbyś osiągnąć, ale jestem pewien, że nie jest to obsługiwane. Jeśli obawiasz się zmniejszenia ilości operacji we/wy, zadania MR wygenerowane przez Hive i system bazowy będą wystarczająco inteligentne, aby dystrybuować skanowanie wzdłuż serwerów regionu, w których dane każdego regionu znajdują się lokalnie. Spróbuj i daj mi znać;) –

+0

Czy masz jakieś liczby dla zapytań, które działają przeciwko Hive's Text vs ORC vs integracja HBase? W jaki sposób odbywa się zapytanie Tpch względem wszystkich powyższych formatów pamięci masowej? – user1393608