2015-01-12 15 views
6

Ich verwende AWS-EMR, um meine Hive-Abfragen auszuführen, und ich habe ein Leistungsproblem beim Ausführen von Hive-Version 0.13.1.Leistungsproblem in Hive-Version 0.13.1

Die neuere Version des Bienenstocks dauerte ungefähr 5 Minuten für das Ausführen von 10 Datenzeilen. Aber das gleiche Skript für 230804 Zeilen dauert 2 Tage und läuft noch. Was muss ich tun, um das Problem zu analysieren und zu beheben?

Beispieldaten:

Tabelle 1:

hive> describe foo; 
OK 
orderno string 
Time taken: 0.101 seconds, Fetched: 1 row(s) 

Beispieldaten für Tabelle1:

hive>select * from foo;   
OK 
1826203307 
1826207803 
1826179498 
1826179657 

Tabelle 2:

hive> describe de_geo_ip_logs; 
OK 
id   bigint          
startorderno  bigint          
endorderno   bigint          
itemcode    int           
Time taken: 0.047 seconds, Fetched: 4 row(s) 

Beispieldaten für Tabelle 2:

hive> select * from bar; 

127698025 417880320 417880575 306 
127698025 3038626048 3038626303 584 
127698025 3038626304 3038626431 269 
127698025 3038626560 3038626815 163 

Meine Suche:

SELECT b.itemcode 
FROM foo a, bar b 
WHERE a.orderno BETWEEN b.startorderno AND b.endorderno; 

Attached the hive logs for the above query.

+0

0.Hive 0.13 ist nicht stabil und hat viele Probleme, wie viele der Abfragen älterer Versionen nicht in dieser Version verwenden verwenden neueste Hive 0.14 –

+0

Hive-0.14 haben viele erweiterte Funktionen wie Einfügen, Aktualisieren, Löschen –

+0

Diese Frage ist absurd . – gobrewers14

Antwort

7

In der obersten Etage des Hallo "Log-Ausgabe": "Warnung: Shuffle Join JOIN [4] [Tabellen a, b] in Phase 'Stage-1 Mapred' ist ein Cross-Produkt."

EDIT: Ein 'Cross-Produkt' oder Cartesian Produkt ist ein Join ohne Bedingungen, die jede Zeile in der 'B' Tabelle für jede Zeile in der 'A' Tabelle zurückgibt. Also, wenn Sie ein Beispiel nehmen von 'a' ist 5 Zeilen, und 'b' ist 10 Zeilen, erhalten Sie das Produkt, oder, 5 multipliziert mit 10 = 50 Zeilen zurückgegeben. Es wird eine Menge Zeilen geben, die für die eine oder andere Tabelle komplett 'null' sind.

Wenn Sie nun eine Tabelle 'a' mit 20.000 Zeilen haben und diese mit einer anderen Tabelle 'b' von 500.000 Zeilen verbinden, bitten Sie die SQL-Engine, Ihnen eine Datei 'a, b' von 10.000.000.000 zurückzugeben Zeilen und führen Sie dann die BETWEEN-Operation für die 10 Millionen Zeilen aus.

Also, wenn Sie die Anzahl der 'b' Zeilen löschen, sehen Sie, dass Sie mehr profitieren als das 'a' - in Ihrem Beispiel, wenn Sie die ip_logs Tabelle, Tabelle 2 filtern können, da ich ein mache Erraten Sie, dass es mehr Zeilen als Ihre Bestellnummer Tabelle hat, wird es die Ausführungszeit reduzieren. ENDE BEARBEITEN

Sie zwingen die Ausführungsengine, durch ein kartesisches Produkt zu arbeiten, indem Sie keine Bedingung für die Verknüpfung angeben. Es ist immer wieder notwendig, den gesamten Tisch zu scannen. Mit 10 Zeilen haben Sie kein Problem. Mit 20k stößt du auf Dutzende von Map/Reduce-Wellen.

Diese Abfrage:

SELECT b.itemcode 
FROM foo a JOIN bar b on <SomeKey> 
WHERE a.orderno BETWEEN b.startorderno AND b.endorderno; 

Aber ich habe Probleme, herauszufinden, welche Spalte Ihr Modell ermöglicht Beitritt auf. Vielleicht könnte das Datenmodell für diesen Ausdruck verbessert werden? Es kann nur sein, dass ich die Probe nicht klar lese.

In beiden Fällen müssen Sie die Anzahl der Vergleiche VOR der where-Klausel filtern. Andere Möglichkeiten, die ich in Hive getan habe, bestehen darin, eine Ansicht mit einer kleineren Menge von Daten zu erstellen und der Ansicht anstelle der ursprünglichen Tabelle beizutreten.

+0

Danke @suiterdev. Ich verwende die obige Abfrage ohne ON. Es funktioniert für kleine Datenmengen mit Warnung: Map Join MAPJOIN [8] [BigTable = b] in Aufgabe 'Stage-3: MAPRED' ist ein Cross-Produkt. Aber große Datenmenge der Abfrage wird Status ausgeführt. – brisk

+0

Ich habe meine Antwort bearbeitet, um weitere Informationen zur Verfügung zu stellen, was Ihnen hoffentlich hilft, das Problem besser zu verstehen. – suiterdev