2017-02-01 4 views
0

Ich benutze Impala JDBC-Treiber zum Batch-Einfügen von Daten in Impala. Ich habe derzeit eine Stapelgröße von 1000 und verwenden Sie INSERT INTO VALUES-Klausel von PreparedStatement Batch-Abfragen auszuführen. Impala Daemon läuft auf 3 Maschinen und Impala Catalog Server, State Store läuft auf der 4. Maschine.Batch einfügen in Impala zu viel Zeit in Anspruch nehmen

Die Masseneinfügemodus Abfrage-Plan auf Impala sieht wie folgt aus:

Query Timeline: 35s398ms 
    - Query submitted: 0.000ns (0.000ns) 
    - Planning finished: 34s822ms (34s822ms) 
    - Submit for admission: 34s886ms (63.997ms) 
    - Completed admission: 34s886ms (0.000ns) 
    - Ready to start 1 fragment instances: 34s886ms (0.000ns) 
    - All 1 fragment instances started: 34s958ms (71.997ms) 
    - DML data written: 35s082ms (123.996ms) 
    - DML Metastore update finished: 35s286ms (203.993ms) 
    - Request finished: 35s298ms (11.999ms) 
    - Unregister query: 35s374ms (75.997ms) 
- ComputeScanRangeAssignmentTimer: 0.000ns 

Wie wir sehen können, Planung abgeschlossen die ganze Zeit nimmt. Wir haben versucht, in beiden Formaten, PARQUET als auch normal zu erstellen. Aber jedesmal ist der Planning-Fertigteil zu hoch.

Gibt es irgendeine Konfigurationsänderung, die ich tun muss? Oder mache ich etwas falsch?

Antwort

1

Die erste Sache zu bemerken ist, dass selbst wenn Sie eine einzelne PreparedStatement in Stapeln verwenden, wird jede Zeile immer noch eine eigene INSERT-Anweisung erhalten. Zum Beispiel kann die vorbereitete Anweisung

INSERT INTO t VALUES (?, ?); 

fügt zwei Zeilen als

INSERT INTO t VALUES ('a', 1); 
INSERT INTO t VALUES ('b', 2); 

und nicht als

INSERT INTO t VALUES ('a', 1), ('b', 2); 

Das nächste, was zu beachten ist, dass eine einzelne Zeile in Hadoop Einfügen ist sehr Ineffizient, da für jede Zeile eine neue HDFS-Datei erstellt werden muss.

Ein Auszug aus the Impala documentation:

Die INSERT ... VALUES Technik nicht geeignet ist, große Mengen von Daten in HDFS-basierten Tabellen für das Laden, da die Einfügeoperationen nicht parallelisiert werden kann, und jeder erzeugt eine separate Datendatei. Verwenden Sie es zum Einrichten kleiner Dimensionstabellen oder kleiner Datenmengen zum Experimentieren mit SQL-Syntax oder mit HBase-Tabellen. Verwenden Sie es nicht für große ETL-Jobs oder Benchmark-Tests für Ladevorgänge. Führen Sie keine Skripte mit Tausenden von INSERT ... VALUES Anweisungen aus, die jedes Mal eine einzelne Zeile einfügen. Wenn Sie INSERT ... VALUES Operationen ausführen, um Daten als eine Stufe in einer ETL-Pipeline in eine Staging-Tabelle zu laden, fügen Sie nach Möglichkeit mehrere Zeilenwerte in jede VALUES-Klausel ein und verwenden Sie eine separate Datenbank, um die Bereinigung zu vereinfachen, wenn die Operation viele kleine Dateien erzeugt.

Verwandte Themen