Blog

rsync als R-Paket

In unserem neusten Projekt präsentieren wir Ihnen unser R-Paket rsync, welches als Schnittstelle zwischen R und dem beliebten Linux-Kommandozeilen-Tool rsync dient.

Ursprünglich ist rsync ein Open Source-Werkzeug für effizientes Synchronisieren von Dateien. Veröffentlicht von Paul Mackerras und Andrew Tridgell unter der GNU General Public Licence, erlaubt es Benutzern von Unix-Systemen lokale sowie remote liegende Dateien zwischen zwei Orten zu synchronisieren. Ein großer Vorteil liegt neben dem vollständigen Kopieren von Dateien darin, wenn möglich nur Unterschiede innerhalb der Dateien zu übertragen. Dies ermöglicht hohe Geschwindigkeiten und vermeidet Redundanzen.

Rsync erfreut sich großer Beliebtheit, u.a. bei der Erstellung von Backups sowie dem Übertragen oder Spiegeln von Daten. Dabei unterstützt das Tool das Synchronisieren von Links, Rechten, Gruppen oder Geräten.

Schema 1 visualisiert die Einsatzszenarien von rsync. Dabei unterscheiden wir zwei Fälle. Erstens, den Fall zwischen zwei lokalen Verzeichnissen (obere Hälfte der Grafik) und zweitens, den Fall zwischen einem lokalen Verzeichnis und einem remote liegenden rsync-Daemon (untere Hälfte der Grafik).

Schema 1: Mögliche rsync-Szenarien, die durch das rsync R-Paket abgedeckt werden. Oben: lokal zu lokal. Unten: lokal zu remote.

Rsync ist ausschließlich für Unix-Systeme verfügbar und wird über die Kommandozeile gesteuert. Windows-Nutzer müssen wir an dieser Stelle leider vertrösten. Lediglich über einen kleinen Umweg, z.B. mit cygwin, können Windows-User dieses Problem umgehen.

Ein exemplarischer Befehl für das Synchronisieren der Datei x.csv zwischen lokalem Verzeichnis und einem rsync-Daemon könnte folgendermaßen aussehen:

RSYNC_PASSWORD="1234" rsync -ltx /home/UserXY/Documents/x.csv rsync://user@example.de/someFolder"

Da wir viele Prozesse in R implementieren, und darin seit vielen Jahren auf rsync zurück greifen, vereinheitlichen wir die Nutzung über ein R-Paket. Das R-Paket übernimmt dann die Kommunikation mit dem Kommandozeilenprogramm rsync. Der gleiche Befehl aus R heraus, sieht nun so aus:

rsync::sendFile(con, fileName = "x.csv")

Die R-Schnittstelle zu rsync bietet mehrere Vorteile:

  • Intuitive Bedienung für Nutzer mit R-Erfahrung
  • Interaktion mit rsync direkt aus R
  • Typische Aktionen können ohne Kommandozeilenkenntnisse ausgeführt werden

Installation

Damit Ihnen unser R-Paket das Synchronisieren erleichtert muss zunächst das darunterliegende rsync-Tool installiert werden. Auf vielen Linux Distributionen gehört das Programm aber ohnehin zu den Standardpaketen.

Anschließend installieren Sie das R-Paket rsync durch das Ausführen folgender Zeile in R:

devtools::install_github("INWTlab/rsync")

Funktionalität

Zu Beginn einer R Sitzung muss eine Verbindung zwischen zwei Endpunkten aufgebaut werden. Um ein reproduzierbares Beispiel zu erzeugen wollen wir Dateien zwischen zwei lokalen Ordnern synchronisieren. Dazu definieren wir ein Konfigurations-Objekt, welches zum einen den lokalen Endpunkt (src) und zum anderen das Zielverzeichnis (dest) definiert.

library("rsync")
dir.create("destination")
dir.create("source")
dest <- rsync::newRsync(
  dest = "destination",
  src = "source"
)
dest

## Rsync server: 
##   dest: /home/userxy/projects/rsync/destination
##   src: /home/userxy/projects/rsync/source
##   password: NULL 
## Directory in destination:
## [1] name         lastModified size        
## <0 rows> (or 0-length row.names)

Github Im Falle eines remote liegenden Verzeichnisses, können Sie zusätzlich ein Passwort angeben. Die Perspektive die wir nun einnehmen ist, dass wir Transaktionen immer von dem Quell- (source) ins Zielverzeichnis (destination) durchführen. Um nun Dateien zu erstellen, können wir relativ einfach R-Objekte ausschreiben (das einladen funktioniert analog über getData):

x <- 1
y <- 2
sendObject(dest, x)
sendObject(dest, y)

## Rsync server: 
##   dest: /home/userxy/projects/rsync/destination
##   src: /home/userxy/projects/rsync/source
##   password: NULL 
## Directory in destination:
##      name        lastModified size
## 1 x.Rdata 2019-02-28 12:30:51   61
## 2 y.Rdata 2019-02-28 12:30:51   60

Wie Sie sehen wurden zwei neue Dateien im Zielverzeichnis erzeugt. Wir können nun mit einigen wenigen Funktionsaufrufen die Kerneigenschaften des Pakets demonstrieren:

removeAllFiles(dest) # lässt 'source' unverändert

## Rsync server: 
##   dest: /home/userxy/projects/rsync/destination
##   src: /home/userxy/projects/rsync/source
##   password: NULL 
## Directory in destination:
## [1] name         lastModified size        
## <0 rows> (or 0-length row.names)

sendFile(dest, "x.Rdata")

## Rsync server: 
##   dest: /home/userxy/projects/rsync/destination
##   src: /home/userxy/projects/rsync/source
##   password: NULL 
## Directory in destination:
##      name        lastModified size
## 1 x.Rdata 2019-02-28 12:30:51   61

Zusätzlich bietet das Paket hilfreiche Funktionen zum Laden von Dateien aus dem Zielverzeichnis und Tests auf die Checksumme zweier Dateien, um Fehler beim Transfer abfangen zu können.

Feedback

Gerne können Sie bei der Verbesserung dieses R-Pakets helfen, erstellen Sie dazu einfach ein Issue auf Github.