Database

SAS Viya et Hadoop : Résoudre l'erreur de connexion TimeoutException lors de la création d'une Caslib

Simon 26/07/2024 4 views

L'intégration de données massives entre SAS© Viya et un cluster Hadoop est une opération courante, mais elle peut parfois se heurter à des problèmes de configuration subtils. L'un des obstacles les plus fréquents lors de la définition d'une Caslib est l'apparition d'une erreur de délai d'attente (timeout) immédiatement après l'exécution du code de connexion.

Cet article détaille les symptômes de cette erreur et présente une solution éprouvée pour stabiliser la connexion.

Illustration

Le Symptôme

Lors de l'exécution d'une instruction CASLIB pour se connecter à Hadoop (souvent via Hive), le processus s'arrête et renvoie les messages d'erreur suivants dans le journal (log) :

ERROR: The connection to the data source driver failed. ERROR: General error java.util.concurrent.TimeoutException ERROR: Function failed. ERROR: The action stopped due to errors.

Ce problème survient généralement lors de l'utilisation d'une chaîne de connexion explicite incluant l'option uri=, comme dans l'exemple ci-dessous :

1/* Code provoquant l'erreur */
2caslib hdlib datasource=(
3 srctype="hadoop",
4 dataTransferMode="serial",
5 username="{votre_user}",
6 password="{votre_mdp}",
7 /* L'option URI ci-dessous est souvent la cause du conflit */
8 uri="jdbc:hive2://{host}:2181...;serviceDiscoveryMode=zooKeeper;...",
9 hadoopjarpath="/sas_mirror/hadoopfiles/lib",
10 hadoopconfigdir="/sas_mirror/hadoopfiles/conf",
11 schema="default"
12);

L'Analyse

L'erreur java.util.concurrent.TimeoutException suggère que le client SAS© n'a pas réussi à établir la connexion avec le cluster dans le temps imparti. Bien que l'on puisse penser à un problème réseau ou à une indisponibilité du cluster, la cause racine réside souvent dans une sur-configuration.

Lorsque vous fournissez à la fois :

  1. Le chemin vers les fichiers de configuration Hadoop (hadoopconfigdir contenant les fichiers XML comme hive-site.xml, core-site.xml, etc.).

  2. Une chaîne de connexion JDBC explicite (uri=).

Il peut se créer un conflit ou une redondance dans la méthode de découverte des services Zookeeper. SAS© est capable d'extraire la configuration Zookeeper directement depuis vos fichiers XML, rendant l'option uri superflue.

La Solution

Pour résoudre ce problème, la méthode recommandée consiste à simplifier la déclaration de la Caslib. Il faut supprimer l'option uri= et laisser SAS© gérer la connexion en s'appuyant uniquement sur les fichiers de configuration et les binaires Hadoop.

Voici le code corrigé et fonctionnel :

1cas mySession sessopts=(caslib=casuser timeout=1800 locale="en_US");
2 
3caslib hdlib datasource=(
4 srctype="hadoop",
5 dataTransferMode="serial",
6 username="{votre_user}",
7 password="{votre_mdp}",
8 /* Suppression de l'option URI */
9 hadoopjarpath="/sas_mirror/hadoopfiles/lib",
10 hadoopconfigdir="/sas_mirror/hadoopfiles/conf",
11 schema="default"
12);
13 
14PROC CASUTIL;
15 list files incaslib="hdlib";
16RUN;

En ne spécifiant pas de serveur ni d'URI, SAS© utilisera les informations contenues dans le dossier pointé par hadoopconfigdir pour localiser le cluster Zookeeper et établir la connexion correctement.

Astuce supplémentaire : Gérer la lenteur du cluster

Si, après avoir appliqué la correction ci-dessus, vous rencontrez toujours des erreurs de timeout (notamment sur des clusters très sollicités), il est possible que le délai par défaut soit trop court.

Le délai de connexion par défaut pour Hadoop est généralement de 30 secondes. Vous pouvez augmenter cette valeur en ajoutant l'option login_timeout :

1caslib hdlib datasource=(
2 ...
3 login_timeout=60 /* Augmentation du délai à 60 secondes */
4 ...
5);