2017-02-15 1 views
1

Ich verwende Sqoop 1.4.6, um Daten von MySQL nach Hive zu importieren. Verwenden Sie hierzu die Option import-all-tables. Das Ergebnis ist in Ordnung, aber der Importvorgang selbst ist ziemlich langsam. Zum Beispiel enthält eine der Datenbanken 40 bis 50 Tabellen mit insgesamt weniger als 1 Million Zeilen und benötigt ungefähr 25-30 Minuten, um abgeschlossen zu werden. Bei der Untersuchung scheint es die meiste Zeit damit zu verschwenden, Hive für jede importierte Tabelle zu initialisieren. Das Testen eines einfachen mysqldump für dieselbe Datenbank wird in unter 1 Minute abgeschlossen. Die Frage ist also, wie man diese Initialisierungszeit reduzieren kann, wenn dies der Fall ist, zum Beispiel mit einer einzigen Hive-Sitzung?Optimieren des Sqoop-Datenimports von MySQL zu Hive mithilfe von Import-All-Tabellen

Der Import Befehl lautet:

sqoop import-all-tables -Dorg.apache.sqoop.splitter.allow_text_splitter=true --compress --compression-codec=snappy --num-mappers 1 --connect "jdbc:mysql://..." --username ... --password ... --null-string '\\N' --null-non-string '\\N' --hive-drop-import-delims --hive-import --hive-overwrite --hive-database ... --as-textfile --exclude-tables ... --warehouse-dir=... 

Update:

Sqoop Version: 1.4.6.2.5.3.0-37

Hive Version: 1.2.1000.2.5.3.0 -37

Könnte verwandt werden mit:

https://issues.apache.org/jira/browse/HIVE-10319

Antwort

1

entfernen Option --num-mappers 1 Import mit Standard-4-Mapper OR Änderung es zu einer höheren Zahl --num-mappers 8 (wenn Hardware ermöglicht) laufen - das ist für Tabellen mit Primärschlüssel-Import mit mehr parellel Jobs läuft, UND Verwenden Sie --autoreset-to-one-mapper Option - es wird 1 Mapper für Tabelle ohne Primärschlüssel verwenden. Verwenden Sie auch --direct Modus:

sqoop import-all-tables \ 
--connect "jdbc:mysql://..." --username ... \ 
--password ... \ 
-Dorg.apache.sqoop.splitter.allow_text_splitter=true \ 
--compress --compression-codec=snappy \ 
--num-mappers 8 \ 
--autoreset-to-one \ 
--direct \ 
--null-string '\\N' 
... 

lassen Sie uns wissen, ob dies die Leistung verbessern ...


Update:

--fetch-size=<n> - Wo die Anzahl der Einträge repräsentiert Das muss Sqoop auf einmal abrufen. Der Standardwert ist 1000.

Erhöhen Sie den Wert des Fetch-Size-Arguments basierend auf dem Volumen von Daten, die gelesen werden müssen. Stellen Sie den Wert basierend auf dem verfügbaren Speicher und der Bandbreite ein.


zunehmende Mapper-Speicher von aktuellem Wert zu einer höheren Zahl: Beispiel: sqoop import-all-tables -D mapreduce.map.memory.mb=2048 -D mapreduce.map.java.opts=-Xmx1024m <sqoop options>


Sqoop Performance Tuning Best Practices

Tune folgende Sqoop Argumente in JDBC-Verbindung oder Sqoop Mapping Leistung zu optimieren

  • Charge (für den Export)
  • Split-by- und Boundary-Abfrage (nicht benötigt, da wir --autoreset-to-one-mapper klagen, kann nicht sein, verwenden, um mit import-all-tables)
  • direkten
  • fetch-size
  • num-Mapper
+0

Es l Ooks wie ich kann '--direct' nicht mit' --hive-drop-import-delims' verwenden, aber werde deine anderen Vorschläge versuchen und zurückkommen ... –

+0

Ziemlich genau dasselbe Ergebnis; ungefähr 25 Minuten pro Datenbank. Ich habe es auch mit Datenbanken versucht, die sich in der Anzahl der Gesamtreihen unterscheiden, aber mit ungefähr der gleichen Anzahl von Tabellen, und die Gesamtzeiten liegen ziemlich nahe beieinander. Scheint so, als ob es eine konstante Zeit pro Tabelle gibt, die nicht relativ zur Datenmenge in ihnen ist. –

+0

Können Sie versuchen, den Mapper-Speicher vom aktuellen Wert auf eine höhere Zahl zu erhöhen ?: 'sqoop Import-All-Tabellen -D mapreduce.map.memory.mb = 2048 -D mapreduce.map.java.opts = -Xmx1024m ' –

Verwandte Themen