2014-04-10 21 views
8

Viene visualizzato questo errore durante l'esecuzione di un join semplice tra due tabelle. Eseguo questa query nella riga di comando Hive. Sto nominando tabella come & b. La tabella a è la tabella interna Hive eb è la tabella esterna (in Cassandra). La tabella a ha solo 1610 righe e la tabella b ha ~ 8 milioni di righe. Nello scenario di produzione attuale, Tabella a potrebbe arrivare fino a 100.000 righe. Si riporta di seguito il mio unirsi con la tabella b come l'ultima tabella nel joinHive Query Execution Error, codice di ritorno 3 da MapredLocalTask ​​

SELEZIONA a.col1, a.col2, b.col3, b.col4 DAL un JOIN b ON (a.col1 = b.col1 AND a.col2 = b.col2);

Di seguito si riporta l'errore

posti di lavoro totale MapReduce = 1
log di esecuzione a: /tmp/pricadmn/.log
2014-04-09 07:15:36 A partire da lancio compito locale per elaborare la join della mappa; memoria massima = 932184064
2014-04-09 07:16:41 Elaborazione righe: 200000 Dimensioni hash: 199999 Utilizzo memoria: 197529208 percentuale: 0,212
2014-04-09 07:17:12 Elaborazione righe: 300000 Dimensioni hashtable: 299999 utilizzo memoria: 163.894.528 percentuale: 0.176
2014/04/09 07:17:43 righe Processing: 400000 dimensione Hashtable: utilizzo 399999 memoria: 347.109.936 percentuale: 0,372
...
...
...

2014-04-09 07:24:29 Elaborazione righe: 1600000 Dimensioni hash: 1599999 Utilizzo memoria: 714454400 percentuale: 0,766
2014/04/09 07:25:03 filari di lavorazione: 1700000 dimensioni Hashtable: utilizzo 1.699.999 di memoria: 901.427.928 percentuali: 0,967
Esecuzione non riuscita con stato di uscita: 3
Ottenere informazioni di errore


Task fallito!
Task ID:
Stage-5

Logs:

/u/applic/pricadmn/dse-4.0.1/logs/hive/hive.log
FALLITA: esecuzione di codice errore, ritorno 3 da org.apache.hadoop.hive.ql.exec.mr.MapredLocalTask ​​

Sto utilizzando DSE 4.0.1. Di seguito sono alcune delle mie impostazioni che si potrebbe essere interessati a
mapred.map.child.java.opts = -Xmx512M
mapred.reduce.child.java.opts = -Xmx512M
mapred.reduce.parallel.copies = 20
hive.auto.convert.join = true

ho aumentato mapred.map.child.java.opts a 1G e ho avuto negli ultimi più record e poi errored fuori. Non sembra una buona soluzione. Inoltre ho cambiato l'ordine nel join ma nessun aiuto. Ho visto questo link Hive Map join : out of memory Exception ma non ha risolto il mio problema.

Per me sembra che Hive stia cercando di mettere in memoria la tabella più grande durante la fase di attività locale che sono confuso. Secondo la mia comprensione, la seconda tabella (nel mio caso la tabella b) dovrebbe essere in streaming. Correggimi se sbaglio. Ogni aiuto per risolvere questo problema è molto apprezzato.

risposta

-1

L'ultimo join dovrebbe essere la tabella più grande. È possibile modificare l'ordine delle tabelle di join.

+0

La tabella b è la mia tabella più grande ed è l'ultimo join nella mia query. Se non ti dispiace puoi ri-scrivere la mia domanda, potrebbe essere mi manca qualcosa. – user3517633

1

Sembra che il tuo compito stia esaurendo la memoria. Controllare line 324 of the MapredLocalTask class.

} catch (Throwable e) { 
    if (e instanceof OutOfMemoryError 
     || (e instanceof HiveException && e.getMessage().equals("RunOutOfMeomoryUsage"))) { 
    // Don't create a new object if we are already out of memory 
    return 3; 
    } else { 
+0

Sono curioso di sapere perché sta lanciando OOM. La tabella a è molto piccola, invece di mettere la tabella a in tabella hash e in streaming b, perché Hive sta mettendo in memoria il tavolo più grande. Il mio tavolo più grande è l'ultimo nella mia dichiarazione di iscrizione. Può essere Hive usa qualche altra logica internamente. Tuttavia ho provato con mapred.map.child.java.opts = -Xmx1024M ma nessun aiuto. Oltre ad aumentare la memoria c'è qualche altra opzione? – user3517633

+0

Ci sono una miriade di fattori che possono influire sull'uso della memoria in un processo MR. Aumenterei la dimensione dell'heap in modo incrementale per vedere se il lavoro verrà eseguito correttamente con un heap più grande, ma ancora abbastanza grande adatto al tuo hardware. Se non riesci a farla franca, cerca di capire in che modo viene utilizzata così tanta memoria per escludere una perdita. Puoi anche provare a utilizzare una divisione divisa più piccola per elaborare blocchi di dati più piccoli in ogni attività. –

25

set hive.auto.convert.join = false;

+8

Sarebbe fantastico se potessi spiegare in modo più dettagliato come questo possa risolvere il problema dato. – blalasaadri

+1

Controlla questa pagina, forse aiuta. [Https://cwiki.apache.org/confluence/display/Hive/LanguageManual+JoinOptimization](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+JoinOptimization) –