2016-08-24 1 views
0

Ich habe eine Menge sqoop-Jobs in AWS EMR ausgeführt, aber manchmal muss ich diese Instanz ausschalten.Save shoop inkrementelle Import-ID

Es gibt eine Möglichkeit, die letzte ID aus dem inkrementellen Import zu speichern, vielleicht lokal, und über cronjob in s3 hochzuladen.

Meine erste Idee ist, wenn ich den Job erstelle, sende ich einfach eine Anfrage an Redshift, wo meine Daten gespeichert sind und die letzte ID oder last_modified, per Bash-Skript.

Eine andere Idee ist es, die Ausgabe von shoop job --show $ jobid zu erhalten, den Parameter von last_id zu filtern und ihn zu verwenden, um den Job erneut zu erstellen.

Aber ich weiß nicht, ob sqoop eine Möglichkeit bietet, dies einfacher zu tun.

Antwort

1

Lösung

ich die Datei Sqoop-site.xml ändern und den Endpunkt zu meinen MySQL hinzufügen .

Schritte

  1. Erstellen der MySQL-Instanz und führen diese Anfragen: CREATE TABLE SQOOP_ROOT (version INT, propname VARCHAR(128) NOT NULL, propval VARCHAR(256), CONSTRAINT SQOOP_ROOT_unq UNIQUE (version, propname)); und INSERT INTO SQOOP_ROOT VALUES(NULL, 'sqoop.hsqldb.job.storage.version', '0');

  2. Veränderung der ursprünglichen Sqoop-site.xml Hinzufügen von MySQL Endpunkt, Benutzer und Passwort.

<property> 
    <name>sqoop.metastore.client.enable.autoconnect</name> 
    <value>true</value> 
    <description>If true, Sqoop will connect to a local metastore 
     for job management when no other metastore arguments are 
     provided. 
    </description> 
    </property> 


    <!-- 
    The auto-connect metastore is stored in ~/.sqoop/. Uncomment 
    these next arguments to control the auto-connect process with 
    greater precision. 
    --> 

    <property> 
    <name>sqoop.metastore.client.autoconnect.url</name> 
    <value>jdbc:mysql://your-mysql-instance-endpoint:3306/database</value> 
    <description>The connect string to use when connecting to a 
     job-management metastore. If unspecified, uses ~/.sqoop/. 
     You can specify a different path here. 
    </description> 
    </property> 
    <property> 
    <name>sqoop.metastore.client.autoconnect.username</name> 
    <value>${sqoop-user}</value> 
    <description>The username to bind to the metastore. 
    </description> 
    </property> 
    <property> 
    <name>sqoop.metastore.client.autoconnect.password</name> 
    <value>${sqoop-pass}</value> 
    <description>The password to bind to the metastore. 
    </description> 
    </property> 

Wenn Sie den Befehl sqoop job --list in ersten Mal ausführen es Nullwerte zurück. Wenn Sie jedoch nach dem Erstellen der Jobs die EMR-Datei herunterfahren, verlieren Sie die sqoop-Metadaten nicht durch Ausführen von Jobs.

In EMR können wir die Bootstrap-Aktion verwenden, um diesen Vorgang bei der Clustererstellung zu automatisieren.

2

Gemäß der Sqoop docs,

Wenn ein inkrementeller Import von der Befehlszeile ausgeführt wird, um den Wert, der als --last-Wert in einem nachfolgenden inkrementellen Import angegeben werden soll, wird auf den Bildschirm ausgegeben werden, für Ihre Referenz. Wenn ein inkrementeller Import von einem gespeicherten Job ausgeführt wird, wird dieser Wert im gespeicherten Job beibehalten. Nachfolgende Ausführungen von sqoop-Job --exec someIncrementalJob werden weiterhin nur neuere Zeilen als die zuvor importierten importieren.

Sie müssen also nichts speichern. Sqoop's Metastore wird sich darum kümmern, den letzten Wert zu speichern und den nächsten inkrementellen Importjob zu nutzen.

Beispiel,

sqoop job \ 
--create new_job \ 
-- \ 
import \ 
--connect jdbc:mysql://localhost/testdb \ 
--username xxxx \ 
--password xxxx \ 
--table employee \ 
--incremental append \ 
--check-column id \ 
--last-value 0 

und starten Sie diesen Job mit dem --exec Parameter:

sqoop job --exec new_job 
+0

Ja, das Problem ist, weil der Metastore lokal gespeichert wird, und irgendwann muss ich den ETL-Prozess herunterfahren und wenn ich wiederherstellen muss ich von der letzten ID neu starten. Als ich die Dokumentation las, sah ich den sqoop-Metastore und ich änderte die sqoop-Site.XML, um diese Eigenschaften in einer MySQL-Instanz remote zu speichern. Ich werde diesen Ansatz morgen validieren. –

+0

@CarlosEduardo dieses _ (Remote-MySQL als Metastore) _ würde Ihr Problem lösen. –

+0

@CarlosEduardo hast du es versucht? –