Архитектура расширяемости в службах машинного обучения SQL Server.

Область применения: SQL Server 2016 (13.x) и более поздних версий

В этой статье описывается архитектура платформы расширяемости для выполнения внешнего скрипта Python или R в службах SQL Server Машинное обучение Services. Сценарий выполняется в среде языковой среды в качестве расширения ядра СУБД.

Общие сведения

Платформа расширяемости появилась в SQL Server 2016 для поддержки среды выполнения R посредством служб R. В SQL Server 2017 и более поздних версий Службы машинного обучения поддерживают Python.

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

Следующая диаграмма наглядно описывает возможности и преимущества расширяемой архитектуры.

Goals of integration with SQL Server

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

  • Выполнение внешнего сценария зависит от безопасности данных в SQL Server. Пользователь, выполняющий внешний сценарий, может получить доступ только к тем данным, которые доступны в SQL-запросе. Если запрос завершается ошибкой из-за недостаточных разрешений, сценарий, запущенный этим же пользователем, завершится ошибкой по той же причине. Безопасность SQL Server может осуществляться на уровне таблицы, базы данных или экземпляра. Администраторы баз данных могут управлять доступом пользователей, ресурсами, используемыми внешними сценариями, а также внешними библиотеками кода, добавленными на сервер.

  • Возможности масштабирования и оптимизации основываются на двух выгодах: выгода от платформы баз данных (индексы ColumnStore, управление ресурсами); и выгода для конкретных расширений, например, если для моделей обработки и анализа данных используются библиотеки Майкрософт для R и Python. В то время как R является однопотоковым, функции RevoScaleR являются многопоточными и способны распределять рабочую нагрузку по нескольким ядрам.

  • Развертывание использует методологии SQL Server. Это могут быть хранимые процедуры, охватывающие внешний сценарий, внедренный SQL или запросы T-SQL, вызывающие такие функции, как PREDICT, для возврата результатов из моделей прогнозирования, сохраненных на сервере.

  • Разработчики с установленными навыками в определенных средствах и IDE могут писать код в этих средствах, а затем переносить код в SQL Server.

Диаграмма архитектуры

Архитектура разработана таким образом, что внешние сценарии выполняются в отдельном от SQL Server процессе, но с компонентами, которые внутренне управляют цепочкой запросов на данные и операции в SQL Server. В зависимости от версии SQL Server поддерживаемые языковые расширения включают R, Python и сторонние языки, такие как Java и .NET.

Архитектура компонентов в Windows:

Windows component architecture

Архитектура компонентов в Linux:

Linux component architecture

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

В Linux SQL использует службу панели запуска для взаимодействия с отдельным процессом панели запуска для каждого пользователя.

Панель запуска

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

Доверенные средства запуска Расширение Версии SQL Server
RLauncher. dll для языка R для Windows Расширение R SQL Server 2016 и более поздние версии
Pythonlauncher.dll для языка Python для Windows Расширение Python SQL Server 2017 и более поздние версии
RLauncher. dll для языка R для Linux Расширение R SQL Server 2019 и более поздние версии
Pythonlauncher.so для языка Python для Linux Расширение Python SQL Server 2019 и более поздние версии

Служба панели запуска SQL Server выполняется под собственной учетной записью пользователя. При изменении учетной записи, запускающей панель запуска, не забудьте сделать это с помощью диспетчера конфигурации SQL Server, чтобы обеспечить запись изменений в связанные файлы.

В Windows для каждого экземпляра ядра СУБД создается отдельная служба панели запуска SQL Server, в которую вы добавили службы SQL Server Машинное обучение Services. Для каждого экземпляра ядра СУБД существует одна служба панели запуска, поэтому при наличии нескольких экземпляров с поддержкой внешних сценариев для каждой из них будет установлена служба панели запуска. Экземпляр ядра СУБД привязан к созданной для нее службе панели запуска. Все вызовы внешнего скрипта в хранимой процедуре или T-SQL приводят к тому, что служба SQL Server вызывает службу панели запуска, созданную для того же экземпляра.

Для выполнения задач на определенном поддерживаемом языке панель запуска получает защищенную рабочую учетную запись из пула и запускает вспомогательный процесс для управления внешней средой выполнения. Каждый вспомогательный процесс наследует учетную запись пользователя панели запуска и использует эту учетную запись в течение времени выполнения сценария. Если в сценарии используются параллельные процессы, они создаются под одной рабочей учетной записью.

В Linux поддерживается только один экземпляр ядра СУБД, и к нему привязана одна служба с заданной панелью запуска. При выполнении сценария служба панели запуска запускает отдельный процесс панели запуска с учетной записью пользователя с низким уровнем прав mssql_satellite. Каждый вспомогательный процесс наследует учетную запись пользователя панели запуска и использует эту учетную запись в течение времени выполнения сценария.

BxlServer и вспомогательное соединение SQL

BxlServer — это исполняемый объект, предоставляемый корпорацией Майкрософт, который управляет связью между SQL Server и языковой средой выполнения. Он создает объекты задания Windows для Windows или пространства имен для Linux, которые используются для хранения сеансов внешних сценариев. Он также предоставляет защищенные рабочие папки для каждого задания внешнего сценария и использует вспомогательную среду SQL для управления обменом данными между внешней средой выполнения и SQL Server. При запуске Process Explorer во время выполнения задания может появиться один или несколько экземпляров BxlServer.

По сути, BxlServer — это вспомогательная среда языковой среды, которая работает с SQL Server для перемещения данных и управления задачами. BXL расшифровывается как двоичный язык Exchange и ссылается на формат данных, используемый для эффективного перемещения данных между SQL Server и внешними процессами.

Вспомогательное соединение SQL — это API расширяемости, который включен в ядро СУБД для поддержки внешнего кода или внешних сред выполнения, реализованных на языке C или C++.

BxlServer использует вспомогательное соединение SQL для следующих задач:

  • чтение входных данных;
  • запись выходных данных;
  • получение входных аргументов;
  • запись входных аргументов;
  • Обработка ошибок
  • обратная запись StdOut и StdErr в клиент.

Вспомогательное соединение SQL использует пользовательский формат данных, оптимизированный для быстрой передачи данных между SQL Server и языками внешних скриптов. Оно выполняет преобразования типов и определяет схемы входных и выходных наборов данных во время обмена данными между SQL Server и средой выполнения внешнего сценария.

Вспомогательное соединение SQL можно отслеживать с помощью расширенных событий Windows (xEvents). Дополнительные сведения см. в разделе о расширенных событиях для Служб машинного обучения SQL Server.

Каналы связи между компонентами

В этом разделе описаны протоколы связи между компонентами и платформами данных.

  • TCP/IP

    По умолчанию для внутренней связи между SQL Server и вспомогательным соединением SQL используется протокол TCP/IP.

  • Именованные каналы

    Для внутренней передачи данных между BxlServer и через вспомогательное соединение SQL используется внутренний формат сжатых данных для оптимизации производительности. Данные передаются между временем языкового запуска и BxlServer в формате BXL с использованием именованных каналов.

  • ODBC

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

    Кроме того, в зависимости от задачи учетной записи могут потребоваться следующие разрешения:

    • Чтение данных, используемых заданием
    • Запись данных в таблицы. Например, при сохранении результатов в таблицу.
    • Создание объектов базы данных. Например, при сохранении внешнего сценария как части новой хранимой процедуры.

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

  • RODBC (только для R)

    Дополнительные вызовы ODBC можно вносить в скрипт с помощью RODBC. RODBC — это популярный пакет R для доступа к данным в реляционных базах данных. Тем не менее его производительность обычно медленнее, чем у поставщиков, используемых SQL Server. Многие скрипты R используют встроенные вызовы RODBC как способ получения "вторичных" наборов данных для использования при анализе. Например, хранимая процедура, которая обучает модель, может определить SQL-запрос, чтобы получить данные для обучения модели, но использовать встроенный вызов RODBC, чтобы получить дополнительные факторы для выполнения операций поиска или для получения новых данных из внешних источников, таких как текстовые файлы или Excel.

    Следующий код иллюстрирует вызов RODBC, встроенный в скрипт R:

    library(RODBC);
    connStr <- paste("Driver=SQL Server;Server=", instance_name, ";Database=", database_name, ";Trusted_Connection=true;", sep="");
    dbhandle <- odbcDriverConnect(connStr)
    OutputDataSet <- sqlQuery(dbhandle, "select * from table_name");
    
  • Другие протоколы

    Процессы, которые могут потребоваться для работы в блоках или передачи данных обратно удаленному клиенту, также могут использовать формат файла Xdf-File. Фактический перенос данных осуществляется через закодированные BLOB-объекты.

См. также