2017-04-26 2 views
0

Ich habe ein Shell-Skript, das sqoop job ausführt. Das Skript ist unten.sqoop Job-Shell-Skript parallel in Oozie ausführen

Jetzt, wenn ich den Tabellennamen im Workflow übergeben, bekomme ich den shoop Job erfolgreich ausgeführt werden.

Der Workflow ist unten.

<workflow-app name="Shell_script" xmlns="uri:oozie:workflow:0.5"> 
<start to="shell"/> 
<kill name="Kill"> 
    <message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message> 
</kill> 
<action name="shell_script"> 
    <shell xmlns="uri:oozie:shell-action:0.1"> 
     <job-tracker>${jobTracker}</job-tracker> 
     <name-node>${nameNode}</name-node> 
     <exec>sqoopjob.sh</exec> 
     <argument>test123</argument> 
     <file>/user/oozie/sqoop/lib/sqoopjob.sh#sqoopjob.sh</file> 
    </shell> 
    <ok to="End"/> 
    <error to="Kill"/> 
    </action> 
    <end name="End"/> 
</workflow-app> 

Der Job wird erfolgreich für Tabelle test123 ausgeführt.

Jetzt habe ich 300 sqoop Jobs gleich wie oben. Ich möchte 10 sqoop Jobs parallel ausführen. Alle Tabellennamen befinden sich in einer einzigen Datei.

Jetzt möchte ich auf die Datei und 10 sqoop Jobs für die ersten 10 Tabellen ausführen und so weiter.

Wie kann ich das tun? soll ich 10 Workflows vorbereiten? Ich bin buchstäblich verwirrt.

+1

Nun, in der Theorie, Sie alles, was in einem Shell-Skript tun können; keine Notwendigkeit für einen Scheduler wie Oozie. Es wäre ein bisschen grob und ein wenig schwierig, die parallelen Ausführungen zu koordinieren, aber auf der anderen Seite war Oozie auch nicht dazu gedacht, Hunderte von Mikro-Jobs zu verwalten ... und Oozie unterstützt überhaupt keine Art von Schleife. –

+0

@SamsonScharfrichter Also, wie Sie gesagt haben, können wir das in Oozie erreichen? ist das richtig. Wenn ja, wie können wir es tun? – User12345

+0

Was? Zitieren selbst: _ "Sie können all das in einem ** Shell-Skript **" _ –

Antwort

1

Als @Samson Scharfrichter erwähnt können Sie parallele Jobs im Shell-Skript starten. In der Shell eine Funktion runJob() erstellen und parallel ausführen. Benutzen Sie diese Schablone: ​​

#!/bin/bash 

runJob() { 
tableName="$1" 
#add other parameters here 

#call sqoop here or do something else 
#write command logs 
#etc, etc 
#return 0 on success, return 1 on fail 

return 0 
} 

#Run parallel processes and wait for their completion 

#Add loop here or add more calls 
runJob $table_name & 
runJob $table_name2 & 
runJob $table_name3 & 
#Note the ampersand in above commands says to create parallel process 

#Now wait for all processes to complete 
FAILED=0 

for job in `jobs -p` 
do 
    echo "job=$job" 
    wait $job || let "FAILED+=1" 
done 

if [ "$FAILED" != "0" ]; then 
    echo "Execution FAILED! ($FAILED)" 
    #Do something here, log or send messege, etc 

    exit 1 
fi 

#All processes are completed successfully! 
#Do something here 
echo "Done successfully" 
+0

Ideal, obwohl es nicht die richtige Art ist, Dinge in Oozie zu tun. Ihre Antwort funktioniert auf der Shell-Skriptseite von Linux. Vielen Dank für Ihre Antwort – User12345

Verwandte Themen