2016-07-29 25 views
1

Ich versuche, die Datenbanktabellen retail_db in die bereits erstellte Hive-Datenbank zu kopieren. Wenn ich den folgenden Code ausführenFehler beim Importieren einer Datei in Hive mit sqoop

sqoop import-all-tables \ 
--num-mappers 1 \ 
--connect "jdbc:mysql://quickstart.cloudera:3306/retail_db" \ 
--username=retail_dba \ 
--password=cloudera \ 
--hive-import \ 
--hive-overwrite \ 
--create-hive-table \ 
--outdir java_files \ 
--hive-database retail_stage 

My Map-reduce Job stoppt mit dem folgenden Fehler:

ERROR tool.ImportAllTablesTool: Encountered IOException running import job: org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://quickstart.cloudera:8020/user/cloudera/categories already exists

ich die Tabellen zu kopieren versuchen Datenbank lieder, warum dann eine vorhandene Datei in cloudera verursacht das Problem. Gibt es eine Möglichkeit, diesen Fehler zu ignorieren oder die vorhandene Datei zu überschreiben.

Antwort

3

Dies ist, wie sqoop Importe Job funktioniert:

  • sqoop erstellt/importiert Daten in tmp dir (HDFS), das Home-Verzeichnis des Benutzers (in Ihrem Fall es /user/cloudera ist).

  • Kopieren Sie dann Daten an ihre eigentliche hive Lage (dh /user/hive/wearhouse.

  • Dieses categories Verzeichnis existiert haben sollten, bevor Sie Importanweisungen lief. So, dass dir löschen oder wenn seine wichtige umbenennen.

hadoop fs -rmr /user/cloudera/categories

ODER

hadoop fs -mv /user/cloudera/categories /user/cloudera/categories_1

und sqoop Befehl erneut ausführen!

So kurz, importieren zu Hive wird hdfs als Staging-Ort verwenden und Sqoop löscht dir Staging /user/cloudera/categories nach dem Kopieren (erfolgreich) zu tatsächlichen hdfs Lage - es ist letzte Stufe des Sqoop Jobs Staging/tmp-Dateien zu bereinigen - so Wenn Sie versuchen, das tmp-Staging-Verzeichnis aufzulisten, werden Sie es nicht finden.

Nach erfolgreichem Import: hadoop fs -ls /user/cloudera/categories - Verzeichnis wird nicht da sein.

2

Sqoop Import Hive arbeitet in 3 Schritten:

  • Put Daten HDFS
  • Tabelle erstellen Hive, wenn nicht vorhanden
  • Laden von Daten in Hive Tabelle

Sie haben nicht erwähnt --target-dir oder --warehouse-dir, so wird es Daten in HDFS Home Directory setzen, die ich glaube, in Ihrem Fall /user/cloudera/.

Jetzt für eine MySQL-Tabelle categories haben Sie möglicherweise früher importiert. Also, /user/cloudera/categories Verzeichnis existiert und Sie erhalten diese Ausnahme.

Fügen Sie ein beliebiges nicht vorhandenes Verzeichnis in --taget-dir wie --taget-dir /user/cloudera/mysqldata hinzu. Dann wird sqoop alle Mysql-Tabellen, die durch den obigen Befehl importiert wurden, an diesem Ort ablegen.

0

Sie können hive-import und hive-overwrite nicht gleichzeitig verwenden.

Die Version Ich bestätigte dieses Problem ist;

$ sqoop help import 

--hive-overwrite Overwrite existing data in the Hive table

$ sqoop version 

Sqoop 1.4.6-cdh5.13.0

ref. https://stackoverflow.com/a/22407835/927387