Uso de RevoScaleR para instalar paquetes de R

Se aplica a: SQL Server 2016 (13.x) SQL Server 2017 (14.x)

En este artículo se describe cómo usar las funciones de RevoScaleR (versión 9.0.1 y posteriores) para instalar paquetes de R en SQL Server con Machine Learning Services o R Services. Las funciones RevoScaleR las pueden usar los usuarios remotos y no administradores para instalar paquetes en SQL Server sin acceso directo al servidor.

Funciones de RevoScaleR para administración de paquetes

En la tabla siguiente se describen las funciones que se usan para la instalación y administración de paquetes de R.

Función Descripción
rxSqlLibPaths Determina la ruta de acceso de la biblioteca de instancias en el servidor SQL Server remoto.
rxFindPackage Obtiene la ruta de acceso de uno o varios paquetes en el servidor SQL Server remoto.
rxInstallPackages Llame a esta función desde un cliente R remoto para instalar paquetes en un contexto de proceso de SQL Server, ya sea desde un repositorio especificado o leyendo paquetes comprimidos guardados de forma local. Esta función comprueba si hay dependencias y se asegura de que se puedan instalar todos los paquetes relacionados en SQL Server, como la instalación de paquetes de R en el contexto de proceso local. Para usar esta opción, debe tener habilitada la administración de paquetes en el servidor y en la base de datos. Los entornos de cliente y servidor deben tener la misma versión de RevoScaleR.
rxInstalledPackages Obtiene una lista de los paquetes instalados en el contexto de proceso especificado.
rxSyncPackages Copia información acerca de una biblioteca de paquetes entre el sistema de archivos y la base de datos para el contexto de proceso especificado.
rxRemovePackages Quita los paquetes en el contexto de proceso especificado. También calcula las dependencias y se asegura de que se quiten los paquetes que otros paquetes de SQL Server ya no usan, con el objetivo de liberar recursos.

Requisitos previos

  • Administración remota habilitada en SQL Server. Para más información, vea Habilitación de la administración de paquetes de R remota en SQL Server.

  • Las versiones de RevoScaleR son las mismas en los entornos de cliente y servidor. Para más información, vea Obtener información sobre paquetes de R.

  • Tiene permiso para conectarse al servidor y a una base de datos, y para ejecutar comandos de R. Debe ser miembro de un rol de base de datos que le permite instalar paquetes en la instancia y la base de datos especificadas.

    • Los usuarios del ámbito compartido pueden instalarse por los usuarios que pertenecen al rol rpkgs-shared en una base de datos especificada. Todos los usuarios de este rol pueden desinstalar paquetes compartidos.

    • Los usuarios del ámbito privado pueden instalarse por cualquier usuario que pertenezca al rol rpkgs-private en una base de datos. Sin embargo, los usuarios solo pueden ver y desinstalar sus propios paquetes.

    • Los propietarios de bases de datos pueden trabajar con paquetes compartidos o privados.

Conexiones de cliente

Importante

La compatibilidad con Machine Learning Server (anteriormente conocido como R Server) finalizó el 1 de julio de 2022. Para obtener más información, consulte ¿Qué sucederá con Machine Learning Server?

Una estación de trabajo cliente puede ser Microsoft R Client o Microsoft Machine Learning Server (los científicos de datos suelen usar la edición gratuita para desarrolladores) en la misma red.

Al llamar a las funciones de administración de paquetes desde un cliente remoto de R, debe crear primero un objeto de contexto de proceso mediante la función RxInSqlServer. A partir de ese momento, para cada función de administración de paquetes que use, pase el contexto de proceso como argumento.

La identidad del usuario se especifica normalmente al establecer el contexto de proceso. Si no especifica un nombre de usuario y una contraseña al crear el contexto de proceso, se usa la identidad del usuario que ejecuta el código de R.

  1. En una línea de comandos de R, defina una cadena de conexión para la instancia y la base de datos.

  2. Use el constructor RxInSqlServer para definir un contexto de proceso de SQL Server, usando la cadena de conexión.

    sqlcc <- RxInSqlServer(connectionString = myConnString, shareDir = sqlShareDir, wait = sqlWait, consoleOutput = sqlConsoleOutput)
    
  3. Cree una lista de los paquetes que desea instalar y guarde la lista en una variable de cadena.

    packageList <- c("e1071", "mice")
    
  4. Llame a rxInstallPackages y pase el contexto de proceso y la variable de cadena que contiene los nombres de paquete.

    rxInstallPackages(pkgs = packageList, verbose = TRUE, computeContext = sqlcc)
    

    Si se requieren paquetes dependientes, también se instalan, suponiendo que haya una conexión a Internet disponible en el cliente.

    Los paquetes se instalan con las credenciales del usuario que realiza la conexión, en el ámbito predeterminado para ese usuario.

Llamada a funciones de administración de paquetes en procedimientos almacenados

Puede ejecutar funciones de administración de paquetes dentro de sp_execute_external_script. Al hacerlo, la función se ejecuta utilizando el contexto de seguridad del autor de la llamada del procedimiento almacenado.

Ejemplos

En esta sección se ofrecen ejemplos de uso de estas funciones desde un cliente remoto al conectarse a una instancia o base de datos de SQL Server como contexto de proceso.

Para todos los ejemplos, debe proporcionar una cadena de conexión o un contexto de proceso, lo cual requiere una cadena de conexión. En este ejemplo se proporciona una manera de crear un contexto de proceso para SQL Server:

instance_name <- "computer-name/instance-name";
database_name <- "TestDB";
sqlWait= TRUE;
sqlConsoleOutput <- TRUE;
connString <- paste("Driver=SQL Server;Server=", instance_name, ";Database=", database_name, ";Trusted_Connection=true;", sep="");
sqlcc <- RxInSqlServer(connectionString = connString, wait = sqlWait, consoleOutput = sqlConsoleOutput, numTasks = 4);

Dependiendo de dónde se encuentre el servidor y del modelo de seguridad, es posible que deba proporcionar una especificación de dominio y subred en la cadena de conexión, o bien usar un inicio de sesión de SQL. Por ejemplo:

connStr <- "Driver=SQL Server;Server=myserver.financeweb.contoso.com;Database=Finance;Uid=RUser1;Pwd=RUserPassword"

Obtención de una ruta de acceso de paquete en un contexto de proceso de SQL Server

En este ejemplo se obtiene la ruta de acceso del paquete RevoScaleR en el contexto del proceso, sqlcc.

sqlPackagePaths <- rxFindPackage(package = "RevoScaleR", computeContext = sqlcc)
print(sqlPackagePaths)

Resultados

"C:/Program Files/Microsoft SQL Server/MSSQL14.MSSQLSERVER/R_SERVICES/library/RevoScaleR"

Sugerencia

Si ha habilitado la opción para ver la salida de la consola SQL, puede obtener mensajes de estado de la función que precede a la instrucción print. Una vez que haya terminado de probar el código, establezca consoleOutput en FALSE en el constructor de contexto de proceso para eliminar los mensajes.

Obtener la ubicación de varios paquetes

En el ejemplo siguiente se obtienen las rutas de acceso de los paquetes RevoScaleR y lattice en el contexto de proceso, sqlcc. Para obtener información sobre varios paquetes, pase un vector de cadena que contenga el nombre de los paquetes.

packagePaths <- rxFindPackage(package = c("RevoScaleR", "lattice"), computeContext = sqlcc)
print(packagePaths)

Obtención de versiones de paquete en un contexto de proceso remoto

Ejecute este comando en una consola de R para obtener el número de compilación y los números de versión de los paquetes instalados en el contexto de proceso, sqlServer.

sqlPackages <- rxInstalledPackages(fields = c("Package", "Version", "Built"), computeContext = sqlServer)

Instalar un paquete en SQL Server

En este ejemplo se instala el paquete forecast y sus dependencias en el contexto de proceso.

pkgs <- c("forecast")
rxInstallPackages(pkgs = pkgs, verbose = TRUE, scope = "private", computeContext = sqlcc)

Quitar un paquete de SQL Server

En este ejemplo se quita el paquete forecast y sus dependencias del contexto de proceso.

pkgs <- c("forecast")
rxRemovePackages(pkgs = pkgs, verbose = TRUE, scope = "private", computeContext = sqlcc)

Sincronización de paquetes entre la base de datos y el sistema de archivos

En el ejemplo siguiente se comprueba la base de datos TestDB y se determina si todos los paquetes están instalados en el sistema de archivos. Si faltan algunos paquetes, se instalan en el sistema de archivos.

# Instantiate the compute context
connectionString <- "Driver=SQL Server;Server=myServer;Database=TestDB;Trusted_Connection=True;"
computeContext <- RxInSqlServer(connectionString = connectionString )

# Synchronize the packages in the file system for all scopes and users
rxSyncPackages(computeContext=computeContext, verbose=TRUE)

La sincronización de paquetes funciona en cada base de datos y para cada usuario. Para obtener más información, consulte Sincronización de paquete de R para SQL Server.

Uso de un procedimiento almacenado para enumerar paquetes en SQL Server

Ejecute este comando desde Management Studio u otra herramienta que admita T-SQL para obtener una lista de los paquetes instalados en la instancia actual, utilizando rxInstalledPackages en un procedimiento almacenado.

EXEC sp_execute_external_script 
  @language=N'R', 
  @script=N'
    myPackages <- rxInstalledPackages();
    OutputDataSet <- as.data.frame(myPackages);
    '

La función rxSqlLibPaths se puede utilizar para determinar la biblioteca activa utilizada por SQL Server Machine Learning Services. Este script solo puede devolver la ruta de acceso de la biblioteca del servidor actual.

declare @instance_name nvarchar(100) = @@SERVERNAME, @database_name nvarchar(128) = db_name();
exec sp_execute_external_script 
  @language = N'R',
  @script = N'
    connStr <- paste("Driver=SQL Server;Server=", instance_name, ";Database=", database_name, ";Trusted_Connection=true;", sep="");
    .libPaths(rxSqlLibPaths(connStr));
    print(.libPaths());
  ', 
  @input_data_1 = N'', 
  @params = N'@instance_name nvarchar(100), @database_name nvarchar(128)',
  @instance_name = @instance_name, 
  @database_name = @database_name;

Consulte también