2015-10-19 4 views
5

WRT ein Cluster mit 3 Knoten, der aus c3.2xlarge-Instanzen besteht.Modifizieren der Hive-Abfrage, um mehr als einen Reduzierer zu erzwingen

Ich habe zwei Tabellen. Tabelle U hat etwa 65 Millionen Datensätze und enthält neben anderen Feldern Längen- und Breitengrad. Tabelle L hat ungefähr 1 Million Aufzeichnungen und enthält auch Längen- und Breitengrad.

U wird als ORC-Tabelle gespeichert.

Aufgabe ist es, festzustellen, wie viele U Datensätze innerhalb eines Radius 10 Meile fallen von Standorten 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; 

Das 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 nur der Abstand zwischen den lat/long Paare sollte weniger als 10 Meilenbeschränkung.

Problem: Die Abfrage scheint ewig dauern zu vervollständigen. Während die Karte Phase relativ schnell abgeschlossen ist, bleibt die Reduzierungsphase bei etwa festen Prozentsatz (80% ish) hängen

Ich bemerkte dies in den Ausgabenachrichten, die Hive aussendet. Anzahl der Aufgaben reduzieren bei der Kompilierung bestimmt: 1

Ich habe versucht, die Anzahl der Reduzierungen Erhöhung von mapred.reduce.tasks Einstellung-7 aber es endet immer als 1. Ich war nicht erfolgreich Erhöhung der Anzahl der Reduzierstücke.

This answer scheint darauf hinzuweisen, dass, wenn ich meine Abfrage auf eine andere Weise schreibe, dann kann ich mehr als 1 Reduzierung zwingen. Aber ich konnte das noch nicht machen.

Ausführungszeit Schätzungen: Für einen einzelnen Ort in L dauert es etwa 60 Sekunden, um eine Antwort zu erhalten. Nach diesem Konto sollte es 60 Millionen Sekunden dauern, was ungefähr 700 Tage beträgt! Sollte es so lange dauern? Sogar für Hadoop.

Ich habe auch addional Einschränkungen wie Begrenzung der lat, lang in einer 10 Meile um 10 Meile viereckiger Kasten mit der Lage in L in der Mitte der Box, aber die Zeit genommen, ist nun 40 Sekunden für 1 Standort versucht, Putting welche ist keine große Verbesserung.

Fragen:

1) Wie kann ich mehr Zahl der Reduzierungen zwingen? 2) Gibt es eine bessere (in Bezug auf die Ausführungszeit) Abfrage? 3) Irgendein anderer Rat, der mir hilft, dieses Problem zu lösen.

Version: Hadoop - 2.7.0 Java 1.7.0_80 Hive 1.2.1

+0

erklärte ich glaube, Sie an den GIS-Erweiterungen für Hive aussehen sollte: https://cwiki.apache.org/confluence/display/Hive/Räumliche + Abfragen. –

+0

Welche Version von Hadoop verwenden Sie? mapreduce.job.reduces ersetzt mapreduce.job.reduces in Hadoop 2.x –

+0

Es gibt eine Kreuzverbindung mit U x L, dann Filterung. Cross Join multipliziert Zeilen. Ist es möglich, die WHERE-Klausel in eine ON-Klausel umzuwandeln? Wie folgt: VON U INNERER VERBINDUNG L ON (3960 * acos (cos (Bogenmaß)) * cos (Bogenmaß()) * cos (Bogenmaß (l.long)) - Bogenmaß (u.long)) + sin (Bogenmaß (l.lat)) * sin (Bogenmaß (u.lat))) <10.0) GROUP BY l.id – leftjoin

Antwort

0

Wenn Sie mit Hadoop 2, der richtige Weg, Reduzierungen zu spezifizieren ist:

SET mapreduce.job.reduces=7;

Diese Änderungen in Hadoop gemacht zusammenhängt 2. ich das gleiche Verhalten hatte die Sie beschreiben, wurde auf den obigen Befehl aktualisiert und konnte die Reduzierungsaufgaben erfolgreich festlegen. Ich bin mir nicht sicher, wie Hadoop die Anzahl der erforderlichen Reduzierungen auswählt, aber in manchen Situationen scheint sie zu klein zu sein, was zu erheblichen Leistungseinbußen führen kann.

1

Wie bereits gesagt,

mapred.reduce.tasks ersetzt mit mapreduce.job.reduces

Werfen Sie einen Blick auf alle veralteten Attribute und neue Werte für die veralteten Werte aus diesem article.

Neben veralteten Attribute, Sie haben auch einige der Funktionen wandern, wie in diesem article