Nachbesserungen Kapitel 7.8 und zugehöriges Script

This commit is contained in:
Felix Lohmeier 2017-01-08 21:50:49 +01:00
parent 4662f2ab83
commit 90f90a5fe7
2 changed files with 32 additions and 23 deletions

View File

@ -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 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. * 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.
* 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.
* Am Ende werden zur Erfolgskontrolle die exportierten TSV-Dateien ausgegeben. * 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. * 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)** **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 ausführbar machen: ```chmod +x transform+export.sh```
* Script starten mit ```./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. 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 ## 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 ## Literatur

View File

@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# Script zur Transformation und zum Export von Projekten mit OpenRefine # Script zur Transformation und zum Export von Projekten mit OpenRefine
# Variante "Komfort", Stand: 06.01.2017 # Variante "Komfort", Stand: 08.01.2017
# #
# Voraussetzungen: # Voraussetzungen:
# 1. Docker # 1. Docker
@ -14,13 +14,12 @@
# Codewort 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
# codewort="TRANSFORM"
# Transformationen aus den folgenden Dateien werden (in dieser Reihenfolge) durchgeführt
# (bei Bedarf direkt hier im Script ändern) # Transformationsregeln aus den folgenden Dateien werden (in dieser Reihenfolge) durchgeführt
jsonfiles=(07_3.json 07_5_minimal.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
@ -52,7 +51,7 @@ sudo docker run -d --name=refine-server -p ${port}:3333 -v ${workdir}:/data feli
echo "" echo ""
# Warten bis Server vollständig gestartet ist # 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 # Abfrage der Projekt-IDs, wenn mit dem Startbefehl keine benannt wurden
if [ -z "$1" ] 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 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 # 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 # Transformationen durchführen
for jsonfile in "${jsonfiles[@]}" ; do for jsonfile in "${jsonfiles[@]}" ; do
echo "Transformiere mit ${jsonfile}..." 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} 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 # Statistik des Java-Prozesses
echo "Server neu starten ..." echo "Statistik zum Ressourcenverbrauch..."
docker stop -t=500 ${dockername} ps -o start,etime,%mem,%cpu,rss -C java
docker rm ${dockername} # 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 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 done
# Daten exportieren # Daten exportieren
@ -123,7 +130,7 @@ for projectid in "${projects[@]}" ; do
# Server beenden und Container löschen # Server beenden und Container löschen
echo "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 sudo docker rm refine-server
echo "Ende Projekt $projectid @ $(date)" echo "Ende Projekt $projectid @ $(date)"