Iniciando com o R no SQL Server 2016 – SQL Server R Services

By | 21/12/2015

Olá pessoal!

O tema abordado hoje será a integração do R com o SQL Server 2016. A versão pública atual é a CTP 3.2, porém a utilização deve se manter a mesma mesmo com versão final (a ser lançada no ano que vem).

A Microsoft adquiriu uma empresa chamada Revolution Anaytics que possui uma IDE para trabalhar com a linguagem R (Revolution R Open e Revolution R Enterprise), onde além da interface também existiam várias melhorias em questões de escalabilidade da linguagem. O R, bem como estas melhorias, foi incorporado ao SQL Server 2016 com o nome de SQL Server R Services.

Existem dois cenários básicos de utilização:

  • Exploração de Dados e Modelagem Preditiva (Cientista de Dados)
  • Operacionalização de código R via T-SQL (Desenvolvedor)

 

Exploração de Dados e Modelagem Preditiva

Neste cenário o cientista de dados utiliza o RRO / RRE (R IDE) para codificar em R e o código é executado remotamente através da engine do SQL 2016. Esta abordagem é interessante pois é possível fazer análise exploratória dos dados sem ser necessário trazer os dados para a máquina do cientista de dados.

image

Benefícios

UI familiar: você trabalha com sua IDE R que já utiliza. 

Processamento na DB: você pode executar o código R e ter os calculos sendo executados dentro da database (na máquina do SQL Server). Isso, como falado, elimina a necessidade de mover os dados para uma máquina externa rodando o R.

Performance e escala: ao usar as APIS do pacote RevoScaleR, você acaba com a restrição do R de rodar na arquitetura de thread única e limitações de memória. Você pode trabalhar com grandes datasets e pode rodar cálculos com múltiplas threads,  cores e processadores.

Portabilidade de código: O mesmo código R rodado contra dados no SQL Server pode ser usado contra outras databases (como o Hadoop por exemplo).

Operacionalização de código R via T-SQL

Este cenário é normalmente executado por desenvolvedores de aplicação ou SQL.

image

Benefícios

Operacionalização do T-SQL operationalization: você pode invocar scripts R embarcand eles em stored procedures de sistema e ter o calculo executado na database. Isso é útil quando você deseja executar um score contra um modelo preitivo em produção. É possível também executar scripts R e retornar plots e predições e embarcá-las na sua aplicação, como por exemplo, relatórios do Reporting Services.

Performance e escala: stored procedures de sistema que invocam as APIs do RevoScaleR podem operar sobre grandes datasets e se beneficiar da arquitetura de mútiplas threads, cores e processadores. É possível usar os mecanismos de agregação e columnstore, o que da uma vantagem do que há de melhor nos “dois mundos”.

UI familiar: Usa o SQL Server Management Studio para criar os scripts.


Instalação

O processo de instalação pode ser visto na documentação: https://msdn.microsoft.com/en-us/library/mt604883.aspx.

1) Instalar a feature Advanced Analytics Extensions, um recurso novo no SQL 2016 que permite que a runtime do R seja acionada através do SQL Server.

2) Efetuar o download e instalação do  Revolution R Open 3.2.2 for Revolution R Enterprise 7.5.0. É uma distribuição do R (General Public License – GPL) que inclue a runtime opensource do R e outras bibliotecas.
http://go.microsoft.com/fwlink/?LinkId=626650

3)  Efetuar o download e instalação do Revolution R Enterprise 7.5. Revolution R Enterprise 7.5.0 é um conjunto de providers e pacotes R que suportam análises de alta performance com o SQL 2016 e outras fontes de dados.
http://go.microsoft.com/fwlink/?LinkId=626652 (trial)

4) Executar os passos de pós instalação:
Post-Installation Server Configuration (SQL Server R Services) 

Após a instalação não esqueça de verificar se a configuração external scripts enabled está ativa (sp_configure).

Não esqueca de registrar RevoScaleR também (cmd como admin – se for nomeda há a necessidade de passa o parâmetro com o nome da instância).

É importante dizer que o RRO e o RRE são obrigatórios para utilizar o R Services (o RevoScaleR só vem no Enterprise).

%programfiles%\RRO\RRO-3.2.2-for-RRE-7.5.0\R-3.2.2\library\RevoScaleR\rxLibs\x64\RegisterRExt.exe /install

Caso contrário receberá a seguinte mensagem:

Msg 39021, Level 16, State 1, Line 9
Unable to launch runtime for ‘R’ script. Please check the configuration of the ‘R’ runtime.
Msg 39019, Level 16, State 1, Line 9
An external script error occurred:
Unable to launch the runtime. ErrorCode 0x80070490: 1168(Element not found.).

Estes passos estão documentados no passo 4).

image


Cenário do Cientista de Dados

Neste cenário o cientista de dados utiliza uma IDE (RRO/RRE/RStudio) para criação dos seus modelos. Contudo ao invés de ter uma execução em um R local, o script é executado dentro do SQL Server e o resultado vem para a sua IDE novamente. Esta abordagem é a indicada para cenários exploratórios.

Para isso funcionar é preciso lançar mão de algumas funções disponibilizadas com o pacote da Revolution Analytics. O script que precisa ser utilizado é algo como o abaixo (este exemplo completo pode ser consultado dos scripts de exemplo, disponibilixados aqui na pasta Advanced Analytics). Eu particularmente tenho afinidade com o RStudio pois o utilizo há mais tempo, então vou mostrar a execução por ele. Lembre-se que iremos utilizar bibliotecas do Revolution R Enterpriese (logo ele precisa estar instalado na máquina).

connectionString <- “Driver=SQL Server;Server=localhost;Database=RevoTestDB;Uid=MyUser;Pwd=MyPassword”

airData <- RxSqlServerData(
  connectionString = connectionString,
  table = “AirlineDemoSmall”,
  colInfo = list( ArrDelay = list(type = “integer”), DayOfWeek = list(type = “factor”, levels = c(“Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”, “Sunday”)))
)
cc <- RxInSqlServer(connectionString = connectionString, autoCleanup = FALSE, consoleOutput = TRUE)
rxSetComputeContext(cc)
rxSummary(~ArrDelay + DayOfWeek, data = airData)

E a saída é:

image


Cenário do Desenvolvedor

  1. O desenvolvedor que estiver criando uma aplicação pode utilizar o R através de uma procedure chamada: sp_execute_external_script.

Um exemplo pode ser visto abaixo. Este exemplo demonstra a utilização do parâmetro @input_data_1. Esta é a forma de passar dados do SQL Server para dentro do script R. Dentro do script esse resultset passa a ser um data frame nomeado de InputDataSet.

Foi preciso converter para VARCHAR a coluna de retorno (originalmente é um nvarchar) pois existem tipos de dados que não são suportados pelo R runtime.

Os formatos não suportados são:  binary, varbinary, timestamp, datetime2, datetimeoffset, time, nchar, nvarchar, ntext, image, hierarchyid, xml, sql_variant e user-defined type.

image

Mais exemplos:
Introduction: Using R Code in Transact-SQL (SQL Server R Services)
https://msdn.microsoft.com/en-US/library/mt591996.aspx


Lista de Issues conhecidas

Topic

Description

Performance will improve by RTM

Performance is not yet optimal in CTP3. ScaleR functions don’t support multi-process parallelism. Pushing data in parallel from SQL to R and Batch mode execution of queries is also expected in RTM.

No support for multiple result sets

No support for multiple result sets in CTP3. A mitigation can be issuing multiple calls or writing data to disk via ODBC and have the app read it later.

No support for output parameters

Same as above

SQL authentication mandatory from client

Working from the Data scientist client is only supported with SQL authentication until we will move to a new architecture post CTP3.

Resource governance

While using SQL Server resource pools is not available yet in CTP3, we have placed a cap of 20% on the max resource usage of the machine resources. This value is configurable.

Running side by side with additional RRE versions

Installing RRE side by side with non-CTP3 RRE versions is not supported.

RevoScaleR rxExec not working in CTP3

The rxExec function is not-usable until we provide support for parallelism across processes.

String corruptions

Roundtrip of strings from SQL -> R -> SQL can result in corruptions. This is due to difference in encodings between R & SQL Server and collation/language.

Datetime values incomplete

Datetime values can lose milliseconds values due to difference in precision

Datatype inconsistencies

Many datatype ranges are different between SQL Server & R. As a result, sending such values from R can result in NA values on the R side. Similarly, sending values from R that are unsupported in SQL Server can result in NULL values (ex: +Inf, -Inf, NaN float values).

Outbound network access is blocked for R sessions

If Windows firewall is enabled on the SQL Server machine, by default we block outbound network access from R processes. As a result, any operation that accesses external network resources from R script like file shares, web sites, etc. will fail


Bom pessoal, espero que as explicações e os exemplos acima tenham mostrado algumas das possibilidades com a engine do R diretamente dentro do SQL Server.

Até a próxima!
Thiago Zavaschi

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios são marcados com *