2015-05-06 45 views
6

Ho una tabella in Hbase diciamo "tbl" e vorrei interrogarla utilizzando l'hive . Quindi ho mappato una tabella di scorporare come segue:Ottimizzazione delle query hive che utilizzano la tabella HBase sottostante

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"); 

domande come:

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

sono veramente veloce.

Ma query come

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

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

sono incredibilmente lento.

Nella contrario durante l'esecuzione da shell HBase:

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

è estremamente veloce!

Quando ho guardato nel lavoro mapred generato da alveare su JobTracker ho scoperto che "map.input.records" conta tutti gli elementi nella tabella HBase, significa che il lavoro fa una scansione completa della tabella prima del suo inizio, anche eventuali mapper !! Inoltre, sospetto che copi tutti i dati dalla tabella Hbase in hdf alla cartella di input tmp del mapper prima di eseguire.

Quindi, le mie domande sono: Perché il gestore di memoria di hbase per hive non traduce le query di hive in nelle funzioni di hbase appropriate? Perché esegue la scansione di tutti i record e li divide utilizzando la clausola "where"? Come può essere migliorato?

Qualsiasi suggerimento per migliorare le prestazioni delle query Hive (mappate alla tabella HBase).

Possiamo creare un indice secondario sulle tabelle HBase?

Stiamo utilizzando l'integrazione di Hase e Hase e stiamo cercando di ottimizzare le prestazioni delle query Hive.

+0

Avete cifre per le query che vanno contro l'integrazione tra testo di Hive vs ORC e ​​HBase? In che modo le query Tpch vanno contro i precedenti formati di archiviazione? Grazie e saluti! – user1393608

+0

Hey @Ram, hai mai trovato una soluzione/soluzione adeguata per questo problema? – Havnar

risposta

7

Un sacco di domande !, Cercherò di rispondere a tutte e darvi alcuni consigli di performance:

I dati non viene copiato nella HDFS, ma i posti di lavoro generati da MapReduce HIVE sarà memorizzare i loro dati intermedi l'HDFS.

Gli indici secondari o percorsi di query alternativi non sono supportati da HBase (more info).

Hive tradurrà tutto in lavori MapReduce che hanno bisogno di tempo per essere distribuiti & inizializzato, se si dispone di un numero molto piccolo di righe è possibile che un'operazione SCAN semplice nella shell Hbase sia più veloce di una query Hive ma su set di dati di grandi dimensioni distribuire il lavoro tra i datanode è un must.

gestore The Hive HBase non fa un ottimo lavoro quando si estraggono le chiavi di avvio & fila fermata della query, le query come substr(id, 0, 5) = "12345" non utilizzeranno iniziare & chiavi fila di arresto.

Prima di eseguire le query, eseguire un comando EXPLAIN [your_query]; e verificare per la parte filterExpr:, se non lo trovate, la query eseguirà una scansione completa della tabella.Nota a margine, tutte le espressioni all'interno dello Filter Operator: verranno trasformate nei filtri appropriati.

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 
       .... 

Fortunatamente, c'è un modo semplice per assicurarsi di inizio chiavi fila & arresto vengono utilizzati quando siete alla ricerca di prefissi fila-chiave, basta convertire substr(id, 0, 5) = "12345" a una query più semplice: id>="12345" AND id<"12346", verrà rilevato dal le chiavi di fila & arresto del gestore e iniziare saranno forniti alla scansione (12345, 12346)


Ora, qui alcuni suggerimenti al fine di velocizzare le query (da un sacco):

  • Assicurati di impostare le seguenti proprietà di approfittare di dosaggio per ridurre il numero delle chiamate RPC (il numero dipende dalle dimensioni delle colonne)

    SET hbase.scan.cache=10000;

    SET hbase.client.scanner.cache=10000;

  • Marchio assicurarsi di impostare le seguenti proprietà per eseguire un lavoro distribuito nei tracker delle attività anziché eseguire il lavoro locale.

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

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

  • ridurre la quantità di colonne della SELECT al minimo. Cercate di non SELECT *

  • Ogni volta che si desidera utilizzare iniziare & chiavi fila di arresto per evitare scansione completa della tabella, fornire sempre key>=x e key<y espressioni (non utilizzare l'operatore Tra)

  • sempre EXPLAIN SELECT le vostre domande prima eseguendoli.

+0

Grazie per la breve spiegazione. Esiste un modo per applicare i suggerimenti in hive durante il recupero dei dati da HBase (ad esempio, cluster by in hive). – Ram

+0

Non sono molto sicuro di cosa vorresti ottenere con questo, ma sono abbastanza sicuro che non sia supportato. Se si è preoccupati di ridurre la quantità di I/O di rete, i lavori MR generati da Hive e il sistema sottostante saranno abbastanza intelligenti da distribuire la scansione lungo i server delle regioni in cui i dati di ciascuna regione risiedono localmente. Fai un tentativo e fammi sapere;) –

+0

Hai qualche cifra per le query che si scontrano con Hive's Text vs ORC contro l'integrazione con HBase? In che modo le query Tpch fanno riferimento a tutti i formati di archiviazione sopra elencati? – user1393608