Publié le :
Dépannage CREATION_INTERNE

Dépannage des erreurs du moteur CAS LIBNAME

Ce code est également disponible en : Deutsch English Español
En attente de validation
L'erreur 'The call to Cloud Analytic Services failed' est généralement causée par une procédure ou une étape DATA qui tente de créer plusieurs tables de sortie en utilisant le même libref CAS pour l'entrée et la sortie. Le moteur CAS LIBNAME ne peut pas traiter plusieurs actions de sortie simultanément sur un seul libref. Cela est particulièrement observable lorsque l'option WRITETRANSFERSIZE est définie sur une petite valeur, exacerbant la contention. Les solutions proposées incluent l'utilisation d'étapes DATA ou PROC distinctes pour chaque table de sortie, ou l'utilisation d'un moteur de données différent pour la création des tables intermédiaires ou finales.
Analyse des données

Type : CREATION_INTERNE


Les exemples utilisent des données générées (SASHELP.CARS) ou des datalines pour assurer l'autonomie du code.

1 Bloc de code
DATA STEP Data
Explication :
Cet exemple démontre le scénario exact qui cause l'erreur décrite dans la documentation. Un seul DATA step tente d'écrire simultanément deux tables ('one' et 'two') dans le même libref CAS ('mycas'). Le moteur CAS LIBNAME, surtout avec un 'writetransfersize' artificiellement petit, ne peut pas gérer plusieurs flux de sortie concurrents de cette manière, ce qui conduit à l'échec de l'appel à Cloud Analytic Services. L'option `writetransfersize=1k` est utilisée pour rendre l'erreur plus probable dans un environnement de test.
Copié !
1/* Établit une connexion CAS avec une petite taille de transfert pour provoquer l'erreur */
2LIBNAME mycas cas s_port=10000 s_host='localhost' caslib='casuser' s_caslib='casuser' s_nthreads=1 s_timeout=1000 writetransfersize=1k;
3 
4/* Crée deux tables de sortie dans CAS en utilisant un seul DATA step */
5/* Ceci est le scénario qui génère l'erreur 'The call to Cloud Analytic Services failed' */
6DATA mycas.one mycas.two;
7 SET sashelp.cars;
8RUN;
9 
10/* Pour nettoyer après l'erreur (si la session n'est pas bloquée) */
11/* proc casutil incaslib='casuser'; droptable 'one'; droptable 'two'; run; */
12/* libname mycas clear; */
2 Bloc de code
DATA STEP Data
Explication :
Cet exemple illustre la solution la plus simple au problème précédent : diviser la création des tables de sortie en plusieurs DATA steps séquentiels. Chaque DATA step écrit une seule table dans le libref CAS, évitant ainsi le conflit d'accès simultané et permettant au moteur CAS LIBNAME de traiter les requêtes individuellement. Cette approche est recommandée pour sa clarté et sa conformité aux meilleures pratiques.
Copié !
1/* Établit une connexion CAS */
2LIBNAME mycas cas s_port=10000 s_host='localhost' caslib='casuser' s_caslib='casuser';
3 
4/* Crée la première table de sortie dans un DATA step distinct */
5DATA mycas.one;
6 SET sashelp.cars;
7RUN;
8 
9/* Crée la deuxième table de sortie dans un DATA step distinct */
10DATA mycas.two;
11 SET sashelp.cars;
12RUN;
13 
14/* Vérification des tables créées */
15PROC CASUTIL incaslib='casuser'; list tables; RUN;
16 
17/* Nettoyage */
18PROC CASUTIL incaslib='casuser'; droptable 'one'; droptable 'two'; RUN;
19LIBNAME mycas clear;
3 Bloc de code
PROC COPY Data
Explication :
Cette solution avancée utilise la procédure PROC COPY pour transférer plusieurs tables d'une bibliothèque SAS temporaire (WORK) vers le libref CAS. PROC COPY gère de manière interne le transfert séquentiel des tables, évitant ainsi le problème de contention observé avec l'écriture directe de plusieurs tables dans un seul DATA step. C'est une méthode efficace pour consolider le transfert de données tout en respectant les contraintes du moteur CAS LIBNAME.
Copié !
1/* Établit une connexion CAS */
2LIBNAME mycas cas s_port=10000 s_host='localhost' caslib='casuser' s_caslib='casuser';
3 
4/* Crée des données temporaires dans work */
5DATA work.temp_one;
6 SET sashelp.cars;
7 where make = 'Audi';
8RUN;
9 
10DATA work.temp_two;
11 SET sashelp.cars;
12 where make = 'BMW';
13RUN;
14 
15/* Utilise PROC COPY pour transférer séquentiellement les tables vers CAS */
16/* Cela est géré en interne par SAS pour éviter les conflits */
17PROC COPY in=work out=mycas;
18 select temp_one temp_two;
19RUN;
20 
21/* Vérification des tables créées */
22PROC CASUTIL incaslib='casuser'; list tables; RUN;
23 
24/* Nettoyage */
25PROC CASUTIL incaslib='casuser'; droptable 'temp_one' 'temp_two'; RUN;
26LIBNAME mycas clear;
27LIBNAME work clear;
4 Bloc de code
DATA STEP Data
Explication :
Cet exemple se concentre sur une meilleure gestion des transferts de données volumineux vers CAS en utilisant l'option `WRITETRANSFERSIZE`. Plutôt qu'une petite valeur qui peut exacerber les problèmes de performance ou de concurrence, une valeur plus élevée (ici 1M pour 1 Mo) est utilisée pour optimiser le transfert. Bien que l'exemple 1 ait montré comment une petite valeur pouvait causer des erreurs dans des scénarios spécifiques, une valeur appropriée pour `WRITETRANSFERSIZE` est cruciale pour l'efficacité des opérations CAS, surtout pour l'ingestion de données massives. Cet exemple crée une seule grande table pour illustrer la performance d'un transfert optimisé.
Copié !
1/* Établit une connexion CAS avec une taille de transfert optimisée */
2/* Utiliser une valeur plus grande pour WRITETRANSFERSIZE */
3LIBNAME mycas cas s_port=10000 s_host='localhost' caslib='casuser' s_caslib='casuser' writetransfersize=1m;
4 
5/* Crée une table de grande taille dans CAS */
6DATA mycas.large_table;
7 DO _n_ = 1 to 100000;
8 var1 = ranuni(0);
9 var2 = rand('NORMAL');
10 OUTPUT;
11 END;
12RUN;
13 
14/* Vérification de la table créée */
15PROC CASUTIL incaslib='casuser'; list tables; RUN;
16PROC PRINT DATA=mycas.large_table(obs=5); RUN;
17 
18/* Nettoyage */
19PROC CASUTIL incaslib='casuser'; droptable 'large_table'; RUN;
20LIBNAME mycas clear;
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.