Database

SAS Viya y Hadoop: Solucionar el error de conexión TimeoutException al crear una Caslib

Simon 26/07/2024 3 vues

La integración de datos masivos entre SAS© Viya y un clúster de Hadoop es una operación común, pero a veces puede encontrar problemas de configuración sutiles. Uno de los obstáculos más frecuentes al definir una Caslib es la aparición de un error de tiempo de espera (timeout) inmediatamente después de ejecutar el código de conexión.

Este artículo detalla los síntomas de este error y presenta una solución probada para estabilizar la conexión.

Illustration

El Síntoma

Al ejecutar una instrucción CASLIB para conectarse a Hadoop (a menudo a través de Hive), el proceso se detiene y devuelve los siguientes mensajes de error en el registro (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.

Este problema suele ocurrir al utilizar una cadena de conexión explícita que incluye la opción uri=, como en el ejemplo siguiente:

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);

El Análisis

El error java.util.concurrent.TimeoutException sugiere que el cliente SAS© no logró establecer la conexión con el clúster en el tiempo asignado. Aunque se podría pensar en un problema de red o en una indisponibilidad del clúster, la causa raíz a menudo reside en una sobreconfiguración.

Cuando proporciona ambos:

  1. La ruta a los archivos de configuración de Hadoop (hadoopconfigdir que contiene los archivos XML como hive-site.xml, core-site.xml, etc.).

  2. Una cadena de conexión JDBC explícita (uri=).

Puede crearse un conflicto o una redundancia en el método de descubrimiento de los servicios de Zookeeper. SAS© es capaz de extraer la configuración de Zookeeper directamente de sus archivos XML, lo que hace que la opción uri sea superflua.

La Solución

Para resolver este problema, el método recomendado es simplificar la declaración de la Caslib. Es necesario eliminar la opción uri= y dejar que SAS© gestione la conexión basándose únicamente en los archivos de configuración y los binarios de Hadoop.

Aquí está el código corregido y funcional:

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;

Al no especificar un servidor ni una URI, SAS© utilizará la información contenida en la carpeta a la que apunta hadoopconfigdir para localizar el clúster de Zookeeper y establecer la conexión correctamente.

Consejo adicional: Gestionar la lentitud del clúster

Si, después de aplicar la corrección anterior, sigue encontrando errores de timeout (especialmente en clústeres muy solicitados), es posible que el tiempo de espera predeterminado sea demasiado corto.

El tiempo de espera de conexión predeterminado para Hadoop suele ser de 30 segundos. Puede aumentar este valor añadiendo la opción login_timeout:

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