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
Credo che si dovrebbe guardare le estensioni GIS per Hive: https://cwiki.apache.org/confluence/display/Hive/spaziale + query. –
quale versione di Hadoop stai usando? mapreduce.job.reduces sostituisce mapreduce.job.reduces in Hadoop 2.x –
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