Nachbesserungen im Script zur Automatisierung

This commit is contained in:
Felix Lohmeier 2017-01-06 16:37:17 +01:00
parent 1fea1f9f39
commit 4e1b4d6e3b
2 changed files with 21 additions and 18 deletions

View File

@ -139,8 +139,8 @@ Das Script hat eine Laufzeit von etwa 5-10 Minuten für 2 Projekte. Währenddess
Wie Variante 1 mit folgenden Verbesserungen: Wie Variante 1 mit folgenden Verbesserungen:
* Die IDs der zu verarbeitenden Projekte können nun an den Befehl zum Aufruf des Scripts angehängt werden. Wenn keine Projekt-IDs angegeben werden, dann werden diejenigen Projekte verarbeitet, deren Name mit ```TRANSFORM``` beginnt. Dazu werden die vorhandenen Projekte ausgelesen und daraus die Projektnummern mit einem grep-Befehl ausgefiltert und in eine Variable geschrieben. * Die IDs der zu verarbeitenden Projekte können nun an den Befehl zum Aufruf des Scripts angehängt werden. Wenn keine Projekt-IDs angegeben werden, dann werden diejenigen Projekte verarbeitet, deren Name mit dem Codewort (voreingestellt: ```TRANSFORM```) beginnt. Dazu werden die vorhandenen Projekte ausgelesen und daraus die Projektnummern mit einem grep-Befehl ausgefiltert und in eine Variable geschrieben.
* Die anzuwendenden Transformationsdateien werden zu Beginn in einer Variable ```jsonfiles``` definiert (und können direkt im Script geändert werden). Das Script wendet diese Transformationsdateien in der genannten Reihenfolge auf alle zu verarbeitenden Projekte an. * Die anzuwendenden Transformationsdateien werden zu Beginn in einer Variable ```jsonfiles``` definiert (voreingestellt: 07_3.json und 07_5_minimal.json) und können direkt im Script geändert werden). Das Script wendet diese Transformationsdateien in der genannten Reihenfolge auf alle zu verarbeitenden Projekte an. Um Arbeitsspeicher zu schonen, wird der Docker-Container mit OpenRefine nach jeder Transformation neu gestartet.
* Das Script lädt selbsttätig die aktuellen Transformationsdateien aus dem Script in Gitbook, d.h. aus dem Verzeichnis https://felixlohmeier.gitbooks.io/seminar-wir-bauen-uns-einen-bibliothekskatalog/content/openrefine/ in das Arbeitsverzeichnis von OpenRefine und überschreibt ggf. gleichlautende Dateien. * Das Script lädt selbsttätig die aktuellen Transformationsdateien aus dem Script in Gitbook, d.h. aus dem Verzeichnis https://felixlohmeier.gitbooks.io/seminar-wir-bauen-uns-einen-bibliothekskatalog/content/openrefine/ in das Arbeitsverzeichnis von OpenRefine und überschreibt ggf. gleichlautende Dateien.
* Der Server wird für jedes Projekt einzeln gestartet und beendet, damit der Arbeitsspeicher nicht voll läuft. * Der Server wird für jedes Projekt einzeln gestartet und beendet, damit der Arbeitsspeicher nicht voll läuft.
* Statt der festen Wartezeit (sleep 15) erfolgt eine Abfrage, ob der Server erreichbar ist, bevor das Script fortschreitet. Das beschleunigt die Verarbeitung, wenn der Server schneller als in 15 Sekunden startet und beugt Fehlern vor, falls der Server ausgelastet ist und mal länger als 15 Sekunden braucht. * Statt der festen Wartezeit (sleep 15) erfolgt eine Abfrage, ob der Server erreichbar ist, bevor das Script fortschreitet. Das beschleunigt die Verarbeitung, wenn der Server schneller als in 15 Sekunden startet und beugt Fehlern vor, falls der Server ausgelastet ist und mal länger als 15 Sekunden braucht.
@ -161,7 +161,6 @@ Wie Variante 1 mit folgenden Verbesserungen:
Das Script gibt jetzt auch Rückmeldungen zum aktuellen Status, manche Meldungen sind aber vielleicht irritierend: Das Script gibt jetzt auch Rückmeldungen zum aktuellen Status, manche Meldungen sind aber vielleicht irritierend:
* Die Meldung "(23) Failed writing body" können Sie ignorieren, falls diese erscheinen sollte, das macht nichts ;-). * Die Meldung "(23) Failed writing body" können Sie ignorieren, falls diese erscheinen sollte, das macht nichts ;-).
* Die Verarbeitung der Datei test.json wirft einen Fehler, weil dies nur ein Platzhalter ist und dort nichts sinnvolles drinsteht.
* Am Ende werden schließlich alle TSV-Dateien gelistet, die im Arbeitsverzeichnis liegen. Daher tauchen auch die TSV-Dateien aus der vorigen Aufgabe mit auf. * Am Ende werden schließlich alle TSV-Dateien gelistet, die im Arbeitsverzeichnis liegen. Daher tauchen auch die TSV-Dateien aus der vorigen Aufgabe mit auf.
Prüfen Sie die transformierten Projekte im Browser. Dazu müssen Sie zunächst wieder OpenRefine manuell starten. Prüfen Sie die transformierten Projekte im Browser. Dazu müssen Sie zunächst wieder OpenRefine manuell starten.
@ -171,10 +170,10 @@ Prüfen Sie die transformierten Projekte im Browser. Dazu müssen Sie zunächst
Hinweise: Hinweise:
* Stellen Sie das Backup aus Kapitel 7.5 wieder her, um einen sauberen Ausgangszustand zu erreichen. Löschen Sie im Browser Testprojekte aus früheren Aufgaben, so dass nur die 45 Projekte mit 10000er Schnipseln verbleiben. * Stellen Sie das Backup aus Kapitel 7.5 wieder her, um einen sauberen Ausgangszustand zu erreichen. Löschen Sie im Browser die Testprojekte aus früheren Aufgaben, so dass nur die 45 Projekte mit 10000er Schnipseln verbleiben.
* Da das Script bzw. der Python-Client keine Projekte erstellen kann, müssen Sie Kapitel 7.5, Aufgabe 7 manuell durchführen. Sie können das Script für die Teil davor und danach einsetzen. * Da das Script bzw. der Python-Client keine Projekte erstellen kann, müssen Sie Kapitel 7.5, Aufgabe 7 manuell durchführen. Sie können das Script für die Teil davor und danach einsetzen.
* Passen Sie die Zeile ```jsonfiles=(07_3.json test.json)``` im Script jeweils so an, dass alle in Kapitel 7.3-7.7 verwendeten Transformationsdateien in der richtigen Reihenfolge abgearbeitet werden. * Passen Sie die Zeile ```jsonfiles=(07_3.json 07_5_minimal.json)``` im Script so an, dass alle in Kapitel 7.3-7.7 verwendeten Transformationsdateien in der richtigen Reihenfolge abgearbeitet werden.
* Passen Sie die Zeile ```projects=($(sudo docker run --rm --link refine-server -v ${workdir}:/data felixlohmeier/openrefine:client-py | grep "TRANSFORM" | cut -c 2-14))``` im Script so an, dass alle gewünschten Projekte bearbeitet werden. * Passen Sie die Zeile ```codewort="TRANSFORM"``` im Script so an, dass alle gewünschten Projekte bearbeitet werden.
## Lösung ## Lösung
@ -187,8 +186,7 @@ Hinweise:
* OpenRefine beenden * OpenRefine beenden
* Script mit ```curl``` auf den Server laden: {%s%}curl -O https://felixlohmeier.gitbooks.io/seminar-wir-bauen-uns-einen-bibliothekskatalog/content/scripte/transform+export.sh{%ends%} * Script mit ```curl``` auf den Server laden: {%s%}curl -O https://felixlohmeier.gitbooks.io/seminar-wir-bauen-uns-einen-bibliothekskatalog/content/scripte/transform+export.sh{%ends%}
* Script ausführbar machen: {%s%}chmod +x transform+export.sh{%ends%} * Script ausführbar machen: {%s%}chmod +x transform+export.sh{%ends%}
* Script anpassen #1: {%s%}nano transform+export.sh und die Zeile projects=($(sudo docker run --rm --link refine-server -v ${workdir}:/data felixlohmeier/openrefine:client-py | grep "TRANSFORM" | cut -c 2-14)) durch projects=($(sudo docker run --rm --link refine-server -v ${workdir}:/data felixlohmeier/openrefine:client-py | grep "haw" | cut -c 2-14)) ersetzen.{%ends%} * Script anpassen: {%s%}nano transform+export.sh und die Zeile codewort="TRANSFORM" durch codewort="haw" ersetzen.{%ends%}
* Script anpassen #2: {%s%}nano transform+export.sh und die Zeile jsonfiles=(07_3.json test.json) durch jsonfiles=(07_3.json 07_5_minimal.json) ersetzen.{%ends%}
* Script ausführen (Achtung: Mehrere Stunden Laufzeit!): {%s%}./transform+export.sh{%ends%} * Script ausführen (Achtung: Mehrere Stunden Laufzeit!): {%s%}./transform+export.sh{%ends%}
**Teil 2: manuell** **Teil 2: manuell**
@ -197,23 +195,22 @@ Ergebnis herunterladen und aufräumen:
* TSV-Dateien herunterladen: {%s%}vgl. Lösung in Kapitel 6.3, Aufgabe 1{%ends%} * TSV-Dateien herunterladen: {%s%}vgl. Lösung in Kapitel 6.3, Aufgabe 1{%ends%}
* Arbeitsverzeichnis leeren: {%s%}sudo rm -r -f refine/*{%ends%} * Arbeitsverzeichnis leeren: {%s%}sudo rm -r -f refine/*{%ends%}
Server Starten:
* {%s%}sudo docker run --rm -p 8888:3333 -v /home/stud/refine:/data felixlohmeier/openrefine:2.6rc2 -i 0.0.0.0 -m 3G -d /data{%ends%}
Projekt anlegen: Projekt anlegen:
* OpenRefine starten: {%s%}sudo docker run --rm -p 8888:3333 -v /home/stud/refine:/data felixlohmeier/openrefine:2.6rc2 -i 0.0.0.0 -m 3G -d /data{%ends%}
* {%s%}Create Project / Durchsuchen... / Alle TSV Dateien auswählen / Next / Configure Parsing Options{%ends%} * {%s%}Create Project / Durchsuchen... / Alle TSV Dateien auswählen / Next / Configure Parsing Options{%ends%}
* {%s%}Parse data as CSV / TSV / separator-based files{%ends%} * {%s%}Parse data as CSV / TSV / separator-based files{%ends%}
* {%s%}Character encoding: UTF-8{%ends%} * {%s%}Character encoding: UTF-8{%ends%}
* {%s%}Checkbox "Store file source..." deaktivieren / Projektnamen "haw-prozessiert-script" vergeben und Button "Create Project" drücken{%ends%} * {%s%}Checkbox "Store file source..." deaktivieren / Projektnamen "haw-prozessiert-script" vergeben und Button "Create Project" drücken{%ends%}
* OpenRefine beenden
**Teil 3: mit Script** **Teil 3: mit Script**
* Script anpassen: {%s%}nano transform+export.sh und die Zeile jsonfiles=(07_3.json test.json) durch jsonfiles=(07_5_minimal.json 07_6-2.json 07_6-4.json 07_6-5.json 07_6-6.json 07_6-7.json 07_6-8.json) ersetzen.{%ends%} * Script anpassen: {%s%}nano transform+export.sh und die Zeile jsonfiles=(07_3.json 07_5_minimal.json) durch jsonfiles=(07_5_minimal.json 07_6-2.json 07_6-4.json 07_6-5.json 07_6-6.json 07_6-7.json 07_6-8.json) ersetzen.{%ends%}
* Script ausführen: {%s%}./transform+export.sh{%ends%} * Script ausführen: {%s%}./transform+export.sh{%ends%}
## Ergebnis ## Ergebnis
Die Datei haw-prozessiert-script.tsv im Ordner ~/refine/ ist das Endergebnis der Verarbeitung. Sie können diese Datei mit der vorher manuell erstellten Datei haw-prozessiert.tsv im Ordner ~/tsv/ vergleichen. Im Idealfall sollte das folgende Kommando keine Differenz zwischen den beiden Dateien feststellen können: Die Datei ```haw-prozessiert-script.tsv``` im Ordner ~/refine/ ist das Endergebnis der Verarbeitung. Sie können diese Datei mit der vorher manuell erstellten Datei ```haw-prozessiert.tsv im Ordner``` ~/tsv/ vergleichen. Im Idealfall sollte das folgende Kommando keine Differenz zwischen den beiden Dateien feststellen können:
``` ```
diff ~/refine/haw-prozessiert-script.tsv ~/tsv/haw-prozessiert.tsv diff ~/refine/haw-prozessiert-script.tsv ~/tsv/haw-prozessiert.tsv

View File

@ -11,15 +11,16 @@
# Beispiel: ./transform+export.sh 01234567890123 1234567890123 # Beispiel: ./transform+export.sh 01234567890123 1234567890123
# #
# Nutzung Variante B) # Nutzung Variante B)
# Codewort TRANSFORM manuell in OpenRefine in den Namen der zu verarbeitenden Projekten aufnehmen # Codewort manuell in OpenRefine in den Namen der zu verarbeitenden Projekten aufnehmen
# und Script ohne weitere Parameter starten. # und Script ohne weitere Parameter starten.
# Beispiel: ./transform+export.sh # Beispiel: ./transform+export.sh
# #
# Transformationen aus den folgenden Dateien werden (in dieser Reihenfolge) durchgeführt # Transformationen aus den folgenden Dateien werden (in dieser Reihenfolge) durchgeführt
# (bei Bedarf direkt hier im Script ändern) # (bei Bedarf direkt hier im Script ändern)
jsonfiles=(07_3.json test.json) jsonfiles=(07_3.json 07_5_minimal.json)
# Weitere Programmvariablen # Weitere Programmvariablen
codewort="TRANSFORM"
workdir="/home/stud/refine" workdir="/home/stud/refine"
port=8888 port=8888
ram=3G ram=3G
@ -29,6 +30,7 @@ echo "Transformationsdateien: " ${jsonfiles[@]}
echo "Arbeitsverzeichnis: " ${workdir} echo "Arbeitsverzeichnis: " ${workdir}
echo "OpenRefine auf Port: " ${port} echo "OpenRefine auf Port: " ${port}
echo "OpenRefine max. RAM: " ${ram} echo "OpenRefine max. RAM: " ${ram}
echo "Codewort: " ${codewort}
echo "" echo ""
# Startzeitpunkt ausgeben # Startzeitpunkt ausgeben
@ -58,7 +60,7 @@ if [ -z "$1" ]
echo "Es wurden beim Aufruf des Scripts keine Projekt-IDs benannt." echo "Es wurden beim Aufruf des Scripts keine Projekt-IDs benannt."
echo "" echo ""
echo "Projekt-IDs auslesen..." echo "Projekt-IDs auslesen..."
projects=($(sudo docker run --rm --link refine-server -v ${workdir}:/data felixlohmeier/openrefine:client-py | grep "TRANSFORM" | cut -c 2-14)) projects=($(sudo docker run --rm --link refine-server -v ${workdir}:/data felixlohmeier/openrefine:client-py | grep "${codewort}" | cut -c 2-14))
if [ -z "$projects" ] if [ -z "$projects" ]
then then
echo "*** Es konnten keine Projekte gefunden werden! ***" echo "*** Es konnten keine Projekte gefunden werden! ***"
@ -67,14 +69,14 @@ if [ -z "$1" ]
echo "1. an den Startbefehl des Scripts die IDs der zu verarbeitenden Projekte anhängen" echo "1. an den Startbefehl des Scripts die IDs der zu verarbeitenden Projekte anhängen"
echo "Beispiel: ./transform+export.sh 01234567890123 1234567890123" echo "Beispiel: ./transform+export.sh 01234567890123 1234567890123"
echo "" echo ""
echo "2. Das Codewort TRANSFORM manuell in OpenRefine in den Namen der zu verarbeitenden Projekten aufnehmen und das Script erneut starten." echo "2. Das Codewort ${codewort} manuell in OpenRefine in den Namen der zu verarbeitenden Projekten aufnehmen und das Script erneut starten."
echo "" echo ""
echo "Server beenden und Container löschen..." echo "Server beenden und Container löschen..."
sudo docker stop refine-server sudo docker stop refine-server
sudo docker rm refine-server sudo docker rm refine-server
exit exit
else else
echo "Folgende Projekte im Arbeitsverzeichnis tragen das Codewort TRANSFORM im Namen:" echo "Folgende Projekte im Arbeitsverzeichnis tragen das Codewort ${codewort} im Namen:"
echo ${projects[@]} echo ${projects[@]}
echo "" echo ""
fi fi
@ -107,6 +109,10 @@ for projectid in "${projects[@]}" ; do
for jsonfile in "${jsonfiles[@]}" ; do for jsonfile in "${jsonfiles[@]}" ; do
echo "Transformiere mit ${jsonfile}..." echo "Transformiere mit ${jsonfile}..."
sudo docker run --rm --link refine-server -v ${workdir}:/data felixlohmeier/openrefine:client-py -f ${jsonfile} ${projectid} sudo docker run --rm --link refine-server -v ${workdir}:/data felixlohmeier/openrefine:client-py -f ${jsonfile} ${projectid}
echo "Server neu starten..."
sudo docker stop refine-server && sudo docker rm refine-server
sudo docker run -d --name=refine-server -p ${port}:3333 -v ${workdir}:/data felixlohmeier/openrefine:2.6rc1 -i 0.0.0.0 -m ${ram} -d /data
until curl --silent http://localhost:${port} | cat | grep -q -o "OpenRefine" ; do sleep 3; done
done done
# Daten exportieren # Daten exportieren