Parallelisierung mit MP Connect

Aus SAS-Wiki
Wechseln zu: Navigation, Suche

Von Grischa Pfister aus: Carina Ortseifen, Grischa Pfister, Heribert Ramroth, Marianne Weires: Tipps und Tricks für den leichteren Umgang mit der SAS Software, KSFE 2009

Parallele Verarbeitung.JPG

Die Verarbeitung immer größerer Datenmengen führt dazu, dass trotz schnellerer Hard- und Software die Ladeprozesse großer Datawarehouses immer wieder an die Grenze der verfügbaren Zeitfenster stoßen. Gefragt sind also Mechanismen, die dafür sorgen, dass in der gleichen Zeit ein Mehr an Datenverarbeitung stattfinden kann. Ein Weg dies zu tun, ist die Methode der Parallelisierung, und SAS unterstützt dies schon seit Version 8 mit MP Connect (MP steht für Multi Processor), einer Erweiterung des klassischen SAS/CONNECT Moduls. Um diese Technik nutzen zu können, muss der eingesetzte Rechner aber bestimmte technische Voraussetzungen erfüllen. Neben mehreren Prozessoren müssen mehrere Platten und meist auch mehrere Kontroller vor-handen sein (Symetric Multiprocessor bzw. SMP Architektur). Anders als bei der sequentiellen Verarbeitung erfolgt die Verarbeitung dann parallel in mehreren getrennten SAS-Sitzungen, die aus einer Haupt-Sitzung aufgerufen und synchronisiert werden. Die eigentliche Steuerung der Parallelisierung erfolgt durch das Programm, das in der Haupt-Sitzung abgearbeitet wird. Es enthält RSUBMIT-Blöcke für die einzelnen Verarbeitungs-Schritte, die im Gegensatz zum klassischen SAS/CONNECT asynchron abgearbeitet werden. Das bedeutet, die Verarbeitung des HauptProgrammes geht weiter und wartet nicht darauf, dass der RSUBMIT-Block fertig abgearbeitet ist. Wenn im Hauptprogramm dann ein Schritt folgt, der darauf angewiesen ist, dass asynchron verarbeitete Programmteile fertig sind, kann mit Hilfe der WAITFOR-Anweisung entsprechend synchronisiert werden. Der Programmierer entscheidet also, wie die Parallelisierung eines Programmes konkret ausgestaltet wird.

Ein – abstraktes – Beispiel für ein auf diese Weise parallelisiertes Programm sieht wie folgt aus:

Options 
  sascmd="D:\Programme\SAS\SAS9\sas.exe -nosyntaxcheck"
  autosignon=yes
;

Über ein OPTIONS-Statement wird das Start-Kommando für die asynchron zu startenden SAS-Sitzungen bekanntgegeben, der SIGNON (also der Start) erfolgt automatisch, wenn der RSUBMIT-Block verarbeitet wird. Anmerkung in eigener Sache: Dieses Start-Kommando war der Grund, warum die Beispiele im Vortrag nicht funktioniert haben. Hier stand nämlich der Pfad zu SAS 9.1.3, geöffnet hatte ich die Beispiele aber unter 9.2 – das konnte nicht funktionieren…

*** GP erster RSUBMIT-Block *** ;
Rsubmit process=load01 wait=no persist=no;
  ...
Endrsubmit;

Die Option „wait=no“ sorgt dafür, dass die Verarbeitung des RSUBMIT-Blocks asynchron erfolgt, „persist=no“ steuert, dass die SAS-Sitzung anschließend wieder beendet wird. Da hier eine unabhängige SAS-Sitzung gestartet wird, müssen die benötigten Bibliotheken zugeordnet sein, um Tabellen lesen und speichern zu können.

*** GP zweiter RSUBMIT-Block *** ;
Rsubmit process=load02 wait=no persist=no;
  ...
Endrsubmit;
*** GP Synchronisation ***;
Waitfor _all_ load01 load02;

  ...

Durch die WAITFOR-Anweisung wird eine Synchronisierung der parallel laufenden RSUBMIT-Blöcke erzwungen, anschließend kann dann die Weiterverarbeitung der getrennt erzeugten Tabellen erfolgen. Für eine solche Parallelisierung werden insbesondere mehrere Festplatten benötigt, denn jede der asynchronen SAS-Sitzungen liest und schreibt von diesen Platten. Mit nur einer Festplatte würden sich die Prozesse gegenseitig blockieren. Doch auch mit mehreren Festplatten ist der I/O ein limitierender Faktor, weshalb mit SAS 9 eine weitere Komponente in MP Connect eingebaut worden ist, das sog. Piping.

Piping.JPG

Mit Piping ist gemeint, dass aufeinander folgende Arbeitsschritte wie z.B. Einlesen von Rohdaten mit anschließendem Sortieren der Tabelle ebenfalls nicht sequentiell, sondern verschachtelt passieren können. Während die Daten gelesen werden, können die Beobachtungen, die schon da sind, bereits an die Sortier-Routine übergeben werden – Proc Sort wird also schon aktiv, während der Data Step noch nicht abgeschlossen ist. Dies wird mit Hilfe einer neuen Libname-Engine namens ESOCK verwirklicht, die dafür sorgt, dass die Daten gar nicht erst auf Festplatte gespeichert werden, sondern via Port direkt an einen anderen Prozess übergeben werden, der seinerseits von diesem Port Daten liest. Auch hierfür ein abstrahiertes Beispiel:

Options 
  sascmd="D:\programme\sas\sas9\sas.exe -nosyntaxcheck"
  autosignon=yes
;
*** GP Lesen Daten01 *** ;
Rsubmit process=read01 wait=no persist=no;

  Libname out SASESOCK ":5021";

  Data Out.Daten01;
    Infile "daten01.csv";
    ...
  Run;
Endrsubmit;

Die Rohdaten für die erste Tabelle werden gelesen und direkt an den Port 5021 geschrieben.

*** GP Lesen Daten02 *** ;
Rsubmit process=read02 wait=no persist=no;
  Libname out SASESOCK ":5031";

  Data Out.Daten02;
    ...
  Run;          
Endrsubmit;

Die Rohdaten für die zweite Tabelle werden ebenfalls gelesen und an einen Port (5031) geschrieben.

*** GP Sortieren Daten01 *** ;
Rsubmit process=sort01 wait=no persist=no;
  Libname in SASESOCK ":5021";
  Libname out SASESOCK ":5022";

  Proc Sort data=In.Daten01 out=Out.Daten01;
    By order_date;
  Run;
Endrsubmit;

*** GP Sortieren Daten02 *** ;
Rsubmit process=sort02 wait=no persist=no;
  Libname in SASESOCK ":5031";
  Libname out SASESOCK ":5032";

  Proc Sort data=In.Daten02 out=Out.Daten02;
    By order_date;
  Run;
Endrsubmit;

Während die beiden Data Steps asynchron Daten lesen, werden die verarbeiteten Beobachtungen aus dem PDV statt in die Ergebnistabellen direkt an Proc Sort weitergegeben und sortiert. Von hier aus werden wiederum keine Ergebnisdateien erzeugt, sondern es wird an weitere Ports geschrieben (5022 resp. 5032).

*** GP Zusammenführen von Daten01 und Daten02 *** ;
Rsubmit process=combine wait=no persist=no;
  Libname out ".";
  Libname in1 SASESOCK ":5022";
  Libname in2 SASESOCK ":5032";

  Data Out.Combine;
    Set In1.Daten01 In2.Daten02;
  Run;
Endrsubmit;

Erst im letzten Schritt erfolgt eine Speicherung auf Festplatte, wobei die beiden Tabellen über ein SET-Statement zusammengeführt werden.

Die Piping-Technologie sorgt für eine deutliche Beschleunigung der Verarbeitung, da keine temporären Zwischendateien mehr geschrieben werden. Das kann sich allerdings auch als Achillesferse erweisen, denn wenn ein solches Programm abstürzt, gibt es keinen Zwischenstand mehr, bei dem wieder aufgesetzt werden könnte. Das erreichbare Mehr an Performanz wird also mit einem höheren Risiko bezahlt.

Literatur

  • SAS/CONNECT 9.1 User’s Guide, Part 4 - Compute Services.