2015-10-19 9 views
5

WRT un cluster a 3 nodi composto da istanze c3.2xlarge.modifica query hive per forzare più di 1 riduttore

Ho due tabelle. La tabella U ha circa 65 milioni di record e contiene tra gli altri campi di latitudine e longitudine. La tabella L ha circa 1 milione di record e contiene anche latitudine e longitudine.

U viene memorizzato come tabella ORC.

Task è determinare quanti record U ricadono in un raggio di 10 miglia di posizioni in L.

select l.id, count(u.id) from U u, L l where 3960 * 
acos(cos(radians(l.lat)) * cos(radians(u.lat)) * cos(radians(l.long) - 
radians(u.long)) + sin(radians(l.lat)) * sin(radians(u.lat))) < 10.0 
group by l.id; 

Il bit 3960 * acos(cos(radians(l.lat)) * cos(radians(u.lat)) * cos(radians(l.long) - radians(u.long)) + sin(radians(l.lat)) * sin(radians(u.lat))) < 10.0 è solo la distanza tra i lat/long coppie dovrebbe essere inferiore a 10 miglia di vincolo.

Problema: La query sembra richiedere sempre un completamento. Mentre la fase della mappa viene completata in modo relativamente rapido, la fase di riduzione si blocca a una certa percentuale fissa (80% is.)

Ho notato questo nei messaggi di output emessi da Hive. Numero di ridurre le operazioni determinate in fase di compilazione: 1

Ho provato aumentando il numero di riduttori modificando mapred.reduce.tasks a 7 ma finisce sempre come 1. Non ero successo aumentando il numero di riduttori.

This answer sembra suggerire che forse se scrivo la mia query in un modo diverso allora posso forzare più di 1 riduttore. Ma non sono ancora riuscito a farlo.

Stime del tempo di esecuzione: per una singola posizione in L occorrono circa 60 secondi per ottenere una risposta. Con questo account dovrebbero essere necessari 60 milioni di secondi, ovvero circa 700 giorni! Dovrebbe prendere così tanto tempo? Anche per Hadoop.

Ho anche provato a mettere vincoli addional come delimita la lat, lungo in un 10 miglia per 10 miglia scatola quadrata con la posizione a L al centro area ma il tempo è ora 40 secondi per 1 posizione quale non è un grande miglioramento.

Domande:

1) Come posso forzare di più il numero di riduttori? 2) Esiste una query migliore (in termini di tempo di esecuzione)? 3) Qualsiasi altro consiglio che possa aiutarmi a risolvere questo problema.

Versione: Hadoop - 2.7.0 Java 1.7.0_80 Hive 1.2.1

+0

Credo che si dovrebbe guardare le estensioni GIS per Hive: https://cwiki.apache.org/confluence/display/Hive/spaziale + query. –

+0

quale versione di Hadoop stai usando? mapreduce.job.reduces sostituisce mapreduce.job.reduces in Hadoop 2.x –

+0

C'è un cross join U x L, quindi il filtro. L'unione incrociata moltiplica le righe. È possibile trasformare la clausola WHERE per entrare nella clausola ON? In questo modo: DALL'INTERNO IN UNITO JOIN L l ON (3960 * acos (cos (radians (l.lat)) * cos (radians (u.lat)) * cos (radians (l.long) - radianti (u.long)) + sin (radians (l.lat)) * sin (radians (u.lat))) <10.0) GROUP BY l.id – leftjoin

risposta

0

Se si utilizza Hadoop 2, il modo giusto per specificare riduttori è:

SET mapreduce.job.reduces=7;

questo è legato alle modifiche apportate in Hadoop 2. Ho avuto lo stesso comportamento che stai descrivendo, aggiornato al comando precedente e ha avuto successo nell'impostazione delle attività di riduzione. Non sono sicuro di come Hadoop scelga il numero di riduttori necessario, ma sembra che in alcune situazioni sia troppo piccolo e ciò può causare ritardi significativi nelle prestazioni.

1

Come detto in precedenza,

mapred.reduce.tasks sostituiti con mapreduce.job.reduces

dare un'occhiata a tutti gli attributi deprecati e nuovi valori per quei valori obsoleti da questo article.

A parte gli attributi deprecati, si deve migrare alcune delle funzioni, così come spiegato in questo article

Problemi correlati