Débogage SAS VIYA CAS

Erreur SAS : Corrigez le bug "Call to Cloud Analytic Services failed" une bonne fois pour toute

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

Le Conseil de l'Expert

Stéphanie
Spécialiste Machine Learning et IA.

L'erreur « The call to Cloud Analytic Services failed » est un signal d'alarme classique indiquant une saturation des canaux de communication entre votre session SAS et le moteur Cloud Analytic Services (CAS). Dans l'architecture distribuée de SAS Viya, le moteur CAS LIBNAME est conçu pour la performance, mais il possède une contrainte structurelle : il ne peut pas orchestrer plusieurs flux d'écriture simultanés sur un même libref au sein d'une seule étape DATA. Tenter de créer mycas.one et mycas.two en une seule fois revient à provoquer un goulot d'étranglement bloquant pour les verrous de la session CAS.

troubleshooting
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;
L'Astuce Pro
L'astuce technique pour corriger l'erreur de connexion CAS lors d'écritures multiples consiste à comprendre que le moteur CAS LIBNAME n'est pas "multi-threadé" pour l'écriture de plusieurs tables simultanées au sein d'un même DATA step : pour garantir la stabilité de vos flux, vous devez impérativement sérialiser vos sorties en utilisant une étape DATA par table ou privilégier la PROC COPY qui gère nativement le séquençage des transferts vers la mémoire distribuée, tout en augmentant l'option WRITETRANSFERSIZE (minimum 512k ou 1m) pour réduire la fragmentation des paquets réseau et éviter les interruptions de socket entre le client SAS et le contrôleur CAS.
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.