У пользователей, которые пытаются инкорпорировать код на языке R в среду SQL Server, неизбежно возникает множество вопросов относительно того, как все это работает. Известно, что язык R весьма интенсивно потреб­ляет ресурсы памяти. Но означает ли это, что при выполнении кода R необходимо блокировать другие процессы? За какими процессами следует наблюдать, чтобы определить влияние выполняемого кода R на производительность системы SQL Server? Является ли подключение сервера к Интернету необходимым условием для выполнения кода R? Может ли R потреблять серверные ресурсы памяти без передачи нагрузки на сервер? Почему код R должен выполняться в формате внешнего сценария внутри SQL Server? Чтобы получить ответы все на эти вопросы, мы должны разобраться с тем, как код R выполняется внутри среды SQL Server.

Установка языка R в SQL Server

При установке системы SQL Server 2016 используются два компонента R — служба R Services (применяется в базах данных) и компонент R Server (используется автономно). Корпорация Microsoft приобрела компанию Revolution Analytics (и ее флагманский продукт Revolution R Enterprise) 6 апреля 2015 года. Продукт Revolution R Enterprise получил наименование R Server. Вошедший в состав установщика SQL Server пакет R Server выполняется в среде Linux или Windows. Его назначение состоит в том, чтобы ускорить выполнение кода R не только в среде SQL Server, но и при обработке данных средствами Hadoop и Teradata. Если вы хотите выполнять код R на другом сервере так, чтобы не расходовать ресурсы базы данных SQL Server, имейте в виду, что такой вариант возможен.

Однако если используемые при этом данные поступают от SQL Server, то в процессе передачи данных с SQL Server на автономный R Server возникают задержки, и это необходимо учитывать. Перемещение процессов может снизить производительность кода на языке R. О затратах на лицензирование установки автономного сервера R Server следует проконсультироваться с представителем Microsoft. Оценку ресурсной нагрузки на SQL Server со стороны службы R Services (если речь идет о базе данных) необходимо рассчитывать до принятия решения об установке автономного продукта R Server Standalone.

Установка R Components и Internet Access

Впервые корпорация Microsoft включает в пакет SQL Server продукт с открытым исходным кодом и особым лицензионным соглашением. Пользователю выдается приглашение ввести данные по лицензии на использование средств языка R. И в дополнение к этому исходный исполняемый файл доступен из Интернета, а не из пакета SQL Server Install. Если же сервер не имеет доступа к Интернету, компоненты Open Source R Package и Microsoft R Package должны быть загружены на сервер. Это определяется процедурой установки. Создаются две ссылки для установки, а также окно для вывода маршрута установки.

Что устанавливается

Когда в системе SQL Server устанавливается служба R Services, на сервере размещаются компоненты R libraries, R documentation, R tools, ScaleR Libraries и несколько специальных двоичных файлов, в том числе исполняемый файл службы Launchpad.exe. При необходимости быстро проверить, установлена ли служба R Services, просмотрите список функционирующих служб на предмет наличия службы SQL Server Launchpad service. Вызовы R и других языков специалисты Microsoft реализовали в компоненте Launchpad.exe.

Настройка SQL Server для выполнения кода R

По завершении установки оболочки R необходимо произвести ряд этапов настройки, которые обеспечат выполнение кодов R в системе SQL Server. Из окна запросов SSMS выполните следующий сценарий для запуска R:

sp_configure ‘external scripts enabled’,
   1 GO Reconfigure GO

После успешного завершения этого шага необходимо перезапустить службу SQL Server Services. Выполнив перезапуск, определите, корректно ли выполняется код R. Для этого в окне запросов SSMS запустите код, приведенный в листинге 1.

Если все пройдет нормально, сценарий возвратит единицу. Теперь система SQL Server готова выполнять коды R.

Методы использования ресурсов SQL Server R

Существует два метода выполнения кодов R в среде SQL Server. Первый состоит в вызове системной процедуры sp_execute_external_script, у которой для параметра используемого языка указано значение R (как показано в листинге 1). Код R можно добавить в раздел сценария и выполнить в среде SQL Server.

Второй метод предполагает выполнение кода не на сервере, а на любом клиенте, имеющем доступ к серверу. Функции ScaleR, включенные в состав SQL Server, позволяют клиентскому компьютеру использовать серверные ресурсы для выполнения кода R на этом клиентском компьютере. Благодаря такому переключению контекста клиенты получают возможность использовать при выполнении кода память и ресурсы сервера, что во многих случаях позволяет резко повысить производительность.

Исключение возможности переключения контекста на серверах пользователями

При эксплуатации отдельных серверов возможны ситуации, когда управляющие этими серверами администраторы баз данных предпочли бы исключить возможность привлечения кем-либо из пользователей ресурсов SQL Server к выполнению кодов R. Данная функция легко деактивируется. Для этого нужно открыть окно диспетчера настроек SQL Server Configuration Manager и правой кнопкой мыши щелкнуть на значке SQL Server Launchpad. Откроется окно свойств, показанное на экране.

 

Окно свойств SQL Server Launchpad
Экран. Окно свойств SQL Server Launchpad

 

При выборе вкладки Advanced отображается параметр External Users Count (на экране он выделен). По умолчанию его значение принимается равным 20 пользователям. Это означает, что 20 пользователей могут изменять контекст кода, выполняемого ими на клиентских компьютерах, для запуска его на сервере. Чтобы лишить пользователей такой возможности, это значение нужно установить равным 0. Теперь следует нажать кнопку OK, после чего никто не сможет выполнять код R на SQL Server. Перезагружать систему не обязательно.

SQL Server и интеграция кода R

Приведенная на рисунке диаграмма показывает, каким образом код R реализуется в SQL Server. В случае создания средствами именованного конвейера запроса на запуск кода R с использованием хранимой процедуры или посредством переключения контекста SQL Server обращается к файлу Launchpad.exe. Всякий раз при вызове хранимой процедуры или при поступлении запроса на выполнение кода R запускается процесс rlauncher. Кроме того, если на данный момент не существует ни одного объекта «задание Windows», то формируется пять таких объектов для обработки R, но, если имеются неиспользованные объекты «задание Windows», инициированные в ходе предыдущего вызова и не задействованные в данный момент, эти объекты также будут использованы.

 

Схема выполнения кода R на SQL Server
Рисунок. Схема выполнения кода R на SQL Server

Контейнеры объектов «задание» будут выполнять код R с использованием файла rterm.exe и вызовом файла rxlink.dll. Этот dll-модуль обрабатывает сообщения, направляемые объекту BxlServer с целью обработки записанных внутри кода R функций ScaleR, направляет данные по мониторингу модулю SQLOS, создает события XEvents и вызывает модуль sqlsatellite.dll с целью передачи и считывания данных с SQL Server.

Распределение ресурсов SQL Server

Система SQL Server управляет всеми ресурсами на уровне приложений из модуля SQLOS. SQLOS представляет собой интерфейс между SQL Server и всеми базовыми аппаратными ресурсами, включая память. С помощью регулятора ресурсов в среде SQL Server мы можем распределять ресурсы, потребляемые теми или иными процессами, с тем чтобы исключить ситуацию, когда один процесс будет использовать, к примеру, всю память, обрекая на «голодную смерть» другие процессы, выполняющиеся на той же системе. Настройка и использование пулов ресурсов открывает более широкие возможности, такие как производственные приложения, обеспечивающие распределение большей части ресурсов SQL Server, потребляемых системой SQLOS. Таким образом исключаются ситуации, когда выполнение запроса на формирование нерегламентированного отчета может отразиться на производительности первичного приложения.

Поскольку R не выполняется в среде SQLOS, разработчики SQL Server 2016 реализовали в своем продукте новый пул внешних ресурсов External Resource Pool, ответственный за управление ресурсами, используемыми средствами для работы с языком R. Посредством настройки регулятора ресурсов и создания пулов внешних ресурсов администраторы могут осуществлять настройку и мониторинг ресурсов, потребляемых кодами R, с последующим определением текущей ресурсной нагрузки.

Распределение ресурсов R в среде SQL Server

Организовать распределение для регулятора ресурсов всех функций SQLOS можно с помощью следующей команды:

SELECT * FROM sys.resource_governor_
   resource_pools WHERE name = 'default'

По умолчанию значения max cpu, memory и cpu cap установлены на уровне 100%. С целью распределения ресурсов для R необходимо исследовать пулы внешних ресурсов.

SELECT * FROM sys.resource_governor_
   external_resource_pools WHERE
   name = 'default'

По умолчанию максимальный объем памяти, доступный для использования средствами R за границами памяти, выделенной для SQL Server, составляет 20% объема оставшейся памяти. Если в системе SQL Server требуется выполнять дополнительные объемы работ по обработке кодов R, может возникнуть необходимость соответствующим образом изменить значения объемов памяти SQLOS и ресурсов внешних пулов. Указанные в листинге 2 настройки позволят снизить общие параметры памяти для SQLOS и увеличить параметры памяти, выделяемые для внешних процессов.

Приведенные в листинге 2 значения даются на тот случай, чтобы выделять в системе SQL Server максимальный объем ресурсов для выполнения кодов R. Перед внесением соответствующих изменений рекомендуется создать пул внешних ресурсов для кодов R и наблюдать за его использованием на протяжении определенного времени. С помощью приведенного ниже кода вы можете создать пул внешних ресурсов для обслуживания процессов, использующих коды R. Имя нового пула — R_Resources. Для максимального объема памяти указано значение, принимаемое по умолчанию, поскольку в идеале этот шаг следует предпринимать до изменения значений для внешних ресурсов:

CREATE EXTERNAL RESOURCE POOL
   R_Resources WITH (max_memory_
   percent = 20);

Следующий этап процесса состоит в создании группы рабочих приложений. Эта группа, которой в коде присвоено название RworkloadGroup, используется в качестве контейнера, содержащего процессы, идентифицированные как процессы R.

CREATE WORKLOAD GROUP
   RworkloadGroup WITH (importance =
   medium) USING "default",
   EXTERNAL "R_resources";

В ходе следующего этапа формируется функция, относящая процессы к категории R, с тем чтобы за ними можно было осуществлять наблюдение внутри группы рабочей нагрузки (см. листинг 3).

По завершении процесса создания функции регулятор ресурсов получает команду на ее использование таким образом, чтобы все функции R подвергались мониторингу внутри пула внешних ресурсов, и включается в работу с помощью команды на перенастройку, как показано в листинге 4.

Далее идентифицируются все процессы, в которых применяются коды R и используется указанная внешняя настройка регулятора.

Таковы этапы настройки, обеспечивающие оптимальное выполнение кодов R в среде SQL Server. В заключение хочу выразить благодарность Бобу Уорну из Microsoft, который помог мне разобраться в процессах, обеспечивающих выполнение кодов R.

 Листинг 1. Проверка работоспособности кода на R
EXEC sp_execute_external_script @language =N'R', @script=N'OutputDataSet <-InputDataSet', @input_data_1 =N'SELECT 1 as CheckToSeeIfRIsWorking' WITH result sets (([CheckToSeeIfRIsWorking] int not null)); GO
Листинг 2. Настройка памяти для SQLOS и памяти для внешних процессов
ALTER RESOURCE POOL "default" WITH (max_memory_percent = 60);
ALTER EXTERNAL RESOURCE POOL "default" WITH (max_memory_percent = 40);
ALTER RESOURCE GOVERNOR reconfigure;
GO
Листинг 3. Классификация процессов для R
USE master
GO

CREATE FUNCTION is_R_app()
WITH schemabinding
AS
BEGIN
  IF program_name() in ('Microsoft R Host', 'RStudio') RETURN 'RworkloadGroup';
  RETURN 'default'
  END;
GO
Листинг 4. Настройка и перезапуск регулятора ресурсов
ALTER RESOURCE GOVERNOR WITH (classifier_function = dbo.is_R_app);
ALTER RESOURCE GOVERNOR  reconfigure;
GO