Performance SAS : Accélérez massivement vos exports vers Greenplum grâce au Bulkload

Ce code est également disponible en : Deutsch English Español
Niveau de difficulté
Débutant
Publié le :
Michael

Le Conseil de l'Expert

Michael
Responsable de l'infrastructure Viya.

Ce script ne se contente pas de charger des données ; il déploie la stratégie d'ingestion la plus performante disponible pour les bases MPP (Massively Parallel Processing) comme Greenplum.

1. La mécanique de la performance (gpfdist)
L'élément critique ici est l'activation de BULKLOAD=YES combiné au protocole BL_PROTOCOL="gpfdist". Contrairement à une insertion standard (ODBC/JDBC) qui écrit les données ligne par ligne (générant une latence réseau énorme), cette méthode lance un serveur de fichiers parallèle.

SAS écrit les données dans un fichier plat temporaire (souvent CSV), et le processus gpfdist sert ces données directement à tous les segments du cluster Greenplum simultanément. C'est ce parallélisme qui permet de charger des millions de lignes en quelques secondes.

2. Flexibilité d'implémentation
Le script démontre une excellente polyvalence en appliquant cette technique via deux méthodes :

Via PROC SQL : Idéal pour les analystes habitués au standard SQL, permettant de créer la table et de charger les données en une seule instruction atomique.

Via l'étape DATA : Souvent préférable si vous devez effectuer des transformations complexes ou des nettoyages conditionnels sur les données pendant le flux de chargement vers la base.

BL_PORT et BL_HOST
Les paramètres BL_PORT et BL_HOST sont essentiels ici. Ils indiquent à Greenplum où écoute le processus SAS pour récupérer les données. Une mauvaise configuration de ces ports (souvent bloqués par des pare-feux) est la cause n°1 des échecs de bulkload.
Le script commence par une phase de nettoyage utilisant `PROC DELETE` pour supprimer d'éventuelles tables de test (`testblkld1`, `testblkld2`) dans la bibliothèque `mydblib`. Ensuite, un jeu de données de travail (`work.testblkld`) est créé en mémoire avec des données spécifiées directement dans le script (`cards`). Enfin, les données de `work.testblkld` sont chargées en masse dans la base de données Greenplum en utilisant deux approches distinctes : la première via une instruction `CREATE TABLE AS SELECT` dans `PROC SQL` avec les options `BULKLOAD` activées directement sur la table cible, et la seconde via une étape `DATA` qui utilise également les options `BULKLOAD` lors de la déclaration de la table cible `mydblib.testblkld2`.
Analyse des données

Type : CREATION_INTERNE


Le jeu de données source `work.testblkld` est créé directement dans le script SAS via une étape `DATA` et l'instruction `cards;` pour définir les données en ligne. Les tables cibles `mydblib.testblkld1` et `mydblib.testblkld2` sont des tables externes dans une base de données Greenplum, mais les données source sont internes au script.

1 Bloc de code
PROC DELETE
Explication :
Ces `PROC DELETE` sont utilisées pour supprimer les tables `testblkld1` et `testblkld2` de la bibliothèque `mydblib` si elles existent. Cela assure un environnement propre pour l'exécution du script et évite les erreurs de création de tables existantes. `mydblib` est une bibliothèque SAS/ACCESS connectée à une base de données externe.
Copié !
1 
2PROC DELETE
3DATA=mydblib.testblkld1;
4 
5RUN;
6PROC DELETE
7DATA=mydblib.testblkld2;
8 
9RUN;
10 
2 Bloc de code
DATA STEP Data
Explication :
Cette étape `DATA` crée un jeu de données temporaire nommé `work.testblkld`. Il contient quatre variables : `name` (caractère), `age` (numérique), `sex` (caractère) et `bdate` (numérique, formatée comme une date SAS à partir d'un format `mmddyy.`). Les données sont fournies en ligne via l'instruction `cards;`, ce qui signifie que le jeu de données est créé directement à partir des valeurs spécifiées dans le script.
Copié !
1DATA work.testblkld;
2 INPUT name $ age sex $ bdate mmddyy.;
3 CARDS;
4amy 3 f 030185
5bill 12 m 121277
6charlie 35 m 010253
7david 19 m 101469
8elinor 42 f 080845
9pearl 78 f 051222
10vera 96 f 101200
11frank 24 m 092663
12georgia 1 f 040687
13henry 46 m 053042
14joann 27 f 020461
15buddy 66 m 101432
16;
17RUN;
3 Bloc de code
PROC SQL
Explication :
Ce bloc utilise `PROC SQL` pour créer une nouvelle table `testblkld1` dans la bibliothèque `mydblib` (qui représente la connexion à Greenplum). L'option `BULKLOAD=YES` active le chargement en masse. Les options `BL_PORT`, `BL_HOST`, et `BL_PROTOCOL="gpfdist"` sont des paramètres spécifiques pour la configuration du protocole GPFDIST de Greenplum, permettant un transfert de données optimisé. `bl_format='CSV'` spécifie le format des données envoyées. La table est créée en sélectionnant toutes les colonnes du jeu de données `work.testblkld`.
Copié !
1PROC SQL;
2create TABLE mydblib.testblkld1
3 (BULKLOAD=YES
4 BL_PORT=&port
5 BL_HOST=&host
6 BL_PROTOCOL="gpfdist"
7 bl_format='CSV')
8 as select * from work.testblkld;
9QUIT;
4 Bloc de code
DATA STEP
Explication :
Ce bloc utilise une étape `DATA` pour créer la table `testblkld2` dans la bibliothèque `mydblib`. Comme dans l'exemple `PROC SQL`, les options `BULKLOAD=YES`, `BL_PORT`, `BL_HOST`, et `BL_PROTOCOL="gpfdist"` sont spécifiées directement sur l'instruction `DATA` pour la table cible, activant ainsi le chargement en masse vers Greenplum. L'instruction `set work.testblkld;` indique que les données à charger proviennent du jeu de données temporaire `work.testblkld` créé précédemment.
Copié !
1DATA mydblib.testblkld2 (
2 BULKLOAD=YES
3 BL_PORT=&port
4 BL_HOST=&host
5 BL_PROTOCOL="gpfdist"
6 );
7 SET work.testblkld;
8RUN;
L'Astuce Pro
Ajoutez l'option BL_DELETE_DATAFILE=NO pour empêcher la suppression automatique du fichier temporaire généré par SAS ; cela permet d'inspecter les données brutes pour déboguer les problèmes de formatage ou de délimiteur en cas d'échec du chargement Greenplum.
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
Informations de Copyright : SAS SAMPLE LIBRARY, NAME: bulkload.sas, TITLE: Sample Programs, PRODUCT: SAS/ACCESS to Greenplum, SYSTEM: z/OS, UNIX, WINDOWS, REF: SAS/ACCESS 9 for Relational Databases: Reference