diff --git a/07_8_automatisierung.md b/07_8_automatisierung.md index 82e781b..e791625 100644 --- a/07_8_automatisierung.md +++ b/07_8_automatisierung.md @@ -142,10 +142,9 @@ 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 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 (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. -* 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. * Am Ende werden zur Erfolgskontrolle die exportierten TSV-Dateien ausgegeben. -* Das Script gibt die Konfigurationswerte sowie regelmäßig Start- und Endzeitpunkte aus. +* Das Script gibt die Konfigurationswerte, regelmäßig Start- und Endzeitpunkte und Statistiken zum Ressourcenverbrauch aus. * Arbeitsverzeichnis, Port und maximaler Arbeitsspeicher für den OpenRefine-Server werden zu Beginn als Variable definiert (Standard: ```/home/stud/refine/```, ```8888```, ```3G```), was eine Anpassung später leichter macht. **Script als Datei: [transform+export.sh](https://felixlohmeier.gitbooks.io/seminar-wir-bauen-uns-einen-bibliothekskatalog/content/scripte/transform+export.sh)** @@ -158,11 +157,6 @@ Wie Variante 1 mit folgenden Verbesserungen: * Script ausführbar machen: ```chmod +x transform+export.sh``` * Script starten mit ```./transform+export.sh``` -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 ;-). -* 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. @@ -210,10 +204,18 @@ Projekt anlegen: ## Ergebnis -Die exportierte TSV-Datei 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 exportierte TSV-Datei 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. + +Anzahl der Zeilen vergleichen: ``` -diff ~/refine/*.tsv ~/tsv/haw-prozessiert.tsv +wc -l ~/refine/*.tsv ~/tsv/haw-prozessiert.tsv +``` + +Spaltenüberschriften vergleichen: + +``` +head -n 1 ~/refine/*.tsv ~/tsv/haw-prozessiert.tsv ``` ## Literatur diff --git a/scripte/transform+export.sh b/scripte/transform+export.sh index 42aa49b..be085ec 100644 --- a/scripte/transform+export.sh +++ b/scripte/transform+export.sh @@ -1,6 +1,6 @@ #!/bin/bash # Script zur Transformation und zum Export von Projekten mit OpenRefine -# Variante "Komfort", Stand: 06.01.2017 +# Variante "Komfort", Stand: 08.01.2017 # # Voraussetzungen: # 1. Docker @@ -14,13 +14,12 @@ # Codewort manuell in OpenRefine in den Namen der zu verarbeitenden Projekten aufnehmen # und Script ohne weitere Parameter starten. # Beispiel: ./transform+export.sh -# -# Transformationen aus den folgenden Dateien werden (in dieser Reihenfolge) durchgeführt -# (bei Bedarf direkt hier im Script ändern) +codewort="TRANSFORM" + +# Transformationsregeln aus den folgenden Dateien werden (in dieser Reihenfolge) durchgeführt jsonfiles=(07_3.json 07_5_minimal.json) # Weitere Programmvariablen -codewort="TRANSFORM" workdir="/home/stud/refine" port=8888 ram=3G @@ -52,7 +51,7 @@ sudo docker run -d --name=refine-server -p ${port}:3333 -v ${workdir}:/data feli echo "" # Warten bis Server vollständig gestartet ist -until curl --silent http://localhost:${port} | cat | grep -q -o "OpenRefine" ; do sleep 3; done +until curl --silent -N http://localhost:${port} | cat | grep -q -o "OpenRefine" ; do sleep 1; done # Abfrage der Projekt-IDs, wenn mit dem Startbefehl keine benannt wurden if [ -z "$1" ] @@ -103,18 +102,26 @@ for projectid in "${projects[@]}" ; do 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 # Warten bis Server vollständig gestartet ist - until curl --silent http://localhost:${port} | cat | grep -q -o "OpenRefine" ; do sleep 3; done - + until curl --silent -N http://localhost:${port} | cat | grep -q -o "OpenRefine" ; do sleep 1; done + echo "" + # Transformationen durchführen for jsonfile in "${jsonfiles[@]}" ; do echo "Transformiere mit ${jsonfile}..." + # Meldungen aus Docker-Container refine-server ausgeben (Hintergrundprozess) + sudo docker attach refine-server & + # Transformation mit Python-Client anstoßen sudo docker run --rm --link refine-server -v ${workdir}:/data felixlohmeier/openrefine:client-py -f ${jsonfile} ${projectid} - # Neustart des Docker-Containers nach jeder Transformation, um Arbeitsspeicher zu schonen - echo "Server neu starten ..." - docker stop -t=500 ${dockername} - docker rm ${dockername} + # Statistik des Java-Prozesses + echo "Statistik zum Ressourcenverbrauch..." + ps -o start,etime,%mem,%cpu,rss -C java + # Neustart des Docker-Containers refine-server nach jeder Transformation, um Arbeitsspeicher zu schonen + echo "Projekt speichern und Server neu starten ..." + sudo docker stop -t=5000 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 + until curl --silent -N http://localhost:${port} | cat | grep -q -o "OpenRefine" ; do sleep 1; done + echo "" done # Daten exportieren @@ -123,7 +130,7 @@ for projectid in "${projects[@]}" ; do # Server beenden und Container löschen echo "Server beenden und Container löschen..." - sudo docker stop -t=500 refine-server + sudo docker stop -t=5000 refine-server sudo docker rm refine-server echo "Ende Projekt $projectid @ $(date)"