KenntWas.de – Technische Tipps

Technische Informationen zu Linux, (Oracle-) Datenbanken und mehr

Daten verteilen und mit GNU Parallel abarbeiten

| 0 comments

GNU Parallel

GNU Parallel ist ein shell-Tool, das sich besonders dazu eignet, Daten aufzuteilen um diese parallel weiter verarbeiten zu lassen. Damit werden heutige Multiprozessorsysteme besser ausgenutzt. Falls vorhanden können auch mehrere Server als Rechenknecht eingesetzt werden.

Normalerweise arbeitet GNU Parallel wie das Programm xargs.
parallel holt sich die die Argumente (Dateinamen) von stdin, baut daraus Kommandozeilen zusammen und führt diese parallel aus. Dabei achtet parallel darauf, dass die Ausgabe – also das Ergebnis – dem eines sequenziellen Aufrufs entspricht.

Einführungsvideo

Die Beispiele und Man-Pages zu GNU Parallel stehen auf der Dokumentationsseite.

Neue Optionen mit parallel-20110205

Seit der Version 20110205 (siehe Ankündigung) kann GNU parallel noch mehr. Der Input muss nicht mehr in Einzeldateien vorhanden sein, sondern kann von parallel in Blöcke gesplittet werden.

cat bigfile | parallel --pipe --recend '' -k gzip -9 > bigfile.gz

In diesem Beispiel bekommen alle Instanzen von  “gzip -9″ einen Teil des Inputs per stdin als pipe.

Wichtig ist hier der Parameter -k (–keeporder). Er stellt sicher, dass die Reihenfolge nicht verändert wird. parallel erzeugt temporäre Dateien in /tmp (Platz beachten oder –tmpdir verwenden).

–pipe

–pipe zerlegt den Input (von parallel) in Blöcke. Jeder Block wird einem Programm zur Weiterverarbeitung übergeben. Piping und Ausführung der Programme erfolgen parallel.

–blocksize

–blocksize setzt die Blockgrösse in bytes für –pipe. Die Blockgrösse kann variieren. Default ist 1M. Abkürzungen wie K, M, G, T dürfen verwendet werden.

–recstart

–recstart setzt den Startstring für einen Record. Default ist ” (ein Leerstring).

–recend

–recend setzt den String für das Ende eines Records. Default ist “\n”. Wenn kein Enderecord verwendet werden soll, ist –recend ” (Leerstring) anzugeben.

Wenn sowohl –recstart als auch –recend angegeben werden, muß der Enderecord direkt auf einen Startrecord folgen, damit er nicht ignoriert wird. Dies ist Sinnvoll, wenn Start- oder Endrecord in den Daten vorkommen können.

–remove-rec-sep

–remove-rec-sep entfernt die Recordseparatoren (recend und recstart).

–regexp

–regexp weisst GNU Parallel an, –recstart und –recend als Regular Expression zu behandeln.

–output-as-files

–output-as-files erzeugt für jeden Aufruf eine Datei mit dem Ergebnis und gibt die Dateinamen aus.

Beispiel:

( cd; tar cf - . ) |
   parallel --pipe --block-size 100m --verbose  --recend '' -k --output-as-files 'gzip -9' > /tmp/t
 
cat /tmp/t |  parallel -k cat > /tmp/t.tgz   # Einzeldateien zu einer Datei zusammenfassen
rm `cat /tmp/t`            # Einzeldateien löschen
rm /tmp/t                               # Dateiliste löschen
 
/tmp/t:
       /tmp/Xwx38x8YFS.par
       /tmp/ZfIAI56nDM.par
       /tmp/NAAkwg3DgC.par

Die Dateien bleiben stehen und werden nicht gelöscht.

-N

-N wird zusammen mit –pipe verwendet und setzt die Anzahl der zu verarbeitenden Records. -N ist langsamer als –blocksize und sollte nur in Ausnahmefällen verwendet werden.

Installation

parallel ist ein Perl-Script. Es lässt sich leicht installieren.

wget http://ftp.gnu.org/gnu/parallel/parallel-20110205.tar.bz2
bunzip2 < parallel-*.tar.bz2 | tar xvf -
cd parallel-20110205

./configure && make && sudo make install

Parallel liegt nach der Installation in /usr/local/bin/parallel.

Beispiele

> parallel convert {} {.}_small.jpg ::: *.jpg

{}   ist die Eingangsdatei (*.jpg)
{.} ist die Datei ohne Extension, an die dann _small.jpg angehängt wird
:::  trennt die Kommandozeile von den Daten (Hier: *.jpg)

Im Jahre 1924 sah Multiprocessor Computing noch etwas anders aus als heute.
Hier berechnen Angestellte die Bonuszahlungen für Veteranen in Washington DC.

Multiprocessor Computing im Jahre 1924

Leave a Reply

Required fields are marked *.