Verwenden Sie GNU Parallel, um große Dateien zu scpfen und sie nach Chunk pro Host zu teilen

969
Enchantner

Ich verwende Ansible, um einige Konfigurationen auf mehreren Knoten einzurichten, und als Teil dieses Setups muss ich eine große Datei in n Zeilen aufteilen und jeden Teil in eine Remote-Datei kopieren, ohne eine lokale Kopie jedes Blocks zu erstellen (wie der Befehl bash split) tut). Ansible kann dies nicht standardmäßig tun (oder ich habe gerade nicht herausgefunden, wie es geht), also entschied ich mich für GNU Parallel. Ich habe hier herausgefunden, dass das Kopieren von stdin leicht wie folgt erfolgen kann:

~$ echo "Lots of data" | ssh user@example.com 'cat > big.txt' 

Aber ich möchte dies gleichzeitig mit mehreren Gastgebern machen! Hier ist ein Beispiel:

~$ cat hosts.txt 1.1.1.1 2.2.2.2 3.3.3.3  ~$ cat data.txt lots of ... lines 

Ich berechne die Anzahl der Zeilen pro Knoten, indem ich "wc -l" mache und die zweite Anzahl durch die erste dividiere. Im Grunde würde der nächste Schritt also so aussehen:

~$ cat data.txt | parallel -S `cat hosts.txt | tr "\n" ","` -N $LINES_PER_HOST --pipe "ssh $HOST 'cat > /data/piece.txt'" 

Aber wie kann ich einen Befehl für jeden Host starten, womit sollte ich $ HOST ersetzen? Ich dachte darüber nach, zwei Eingänge zu kombinieren (einer als Hosts), aber immer noch keine Ahnung, wie das geht.

Würde mich wirklich über irgendwelche Gedanken freuen.

2

1 Antwort auf die Frage

1
Ole Tange

Werke ab Version 20150922:

parallel-20150922 -a bigfile --roundrobin --pipepart --slf hosts.txt -j1 'cat > giraf' 
Vielen Dank! Ich sehe nur eine Einschränkung - ich kann Dateien nur in Blöcke aufteilen, nicht in Zeilen. Wird die Zeilenende in diesem Fall immer korrekt verarbeitet? Es ist mir eigentlich egal, ob ein Knoten etwas mehr Zeilen als der andere bekommt, aber ich brauche Zeilen, um vollständig und lesbar zu sein. Enchantner vor 7 Jahren 0
Es teilt sich auf \ n, Sie sollten also auf Nummer sicher gehen. Ole Tange vor 7 Jahren 0
Ich habe es als Datei mit 10000 Zeilen und 2 Knoten gestartet, wobei die Blockgröße etwas größer war als die Ausgabe "du -b", geteilt durch zwei. Ein Knoten hat ~ 4850 Zeilen, der andere ~ 4900, der Rest geht verloren. Gibt es eine Möglichkeit, sicherzustellen, dass alle Zeilen kopiert werden? Oder sollte ich die Blockgröße anders berechnen? Enchantner vor 7 Jahren 0
Sie sollten niemals Linien verlieren. Können Sie genau den Befehl posten, den Sie geschrieben haben? Wenn Sie den Befehl ausführen, den ich gebe, wird --block nicht benötigt. Ole Tange vor 7 Jahren 0