Zbieraj dane do rozwiązywania problemów ze skryptami Python i R za pomocą SQL Server Machine Learning Services

Dotyczy: SQL Server 2016 (13.x) i nowsze wersje

Ważna

Obsługa serwera Machine Learning Server (wcześniej znanego jako R Server) zakończyła się 1 lipca 2022 r. Aby uzyskać więcej informacji, zobacz Co się dzieje z serwerem Machine Learning Server?

Ten artykuł opisuje, jak zbierać potrzebne dane podczas rozwiązywania problemów w SQL Server Machine Learning Services. Te dane mogą być przydatne, niezależnie od tego, czy rozwiązujesz problemy samodzielnie, czy z pomocą wsparcia klienta Microsoft.

Wersja i edycja SQL Server

SQL Server 2016 R Services to pierwsza wersja SQL Server, która zawiera zintegrowane wsparcie dla R. SQL Server 2016 Service Pack 1 (SP1) zawiera kilka istotnych usprawnień, w tym możliwość uruchamiania zewnętrznych skryptów. Jeśli używasz SQL Server 2016, powinieneś rozważyć instalację SP1 lub nowszej wersji.

SQL Server 2017 i nowsze mają integrację z językiem Python. Nie da się uzyskać integracji funkcji Python w wcześniejszych wersjach.

W zależności od wersji SQL Server, której używasz, niektóre funkcje uczenia maszynowego mogą być niedostępne lub ograniczone.

Wersje języka R i narzędzi

Ogólnie rzecz biorąc, wersja Microsoft R, która jest instalowana po wybraniu funkcji R Services lub funkcji Machine Learning Services, jest określana przez numer kompilacji SQL Server. Jeśli aktualizujesz lub łatasz SQL Server, musisz także zaktualizować lub załatać jego komponenty R.

Listę wydań i linki do pobierania komponentów R znajdziesz w artykule Install machine learning components without internet (Instaluj komponenty uczenia maszynowego bez dostępu do internetu). Na komputerach z dostępem do internetu wymagana wersja R jest automatycznie identyfikowana i instalowana.

Możliwe jest oddzielne aktualizowanie komponentów R Server od silnika bazy danych SQL Server, w procesie zwanym binding. Dlatego wersja R, której używasz podczas uruchamiania kodu R w SQL Server, może się różnić zarówno w zależności od zainstalowanej wersji SQL Server, jak i od tego, czy przeniosłeś serwer do najnowszej wersji R.

Określ wersję R

Najprostszym sposobem na ustalenie wersji R jest pobranie właściwości środowiska uruchomieniowego przez wykonanie instrukcji takiej jak poniższa:

EXECUTE sp_execute_external_script
       @language = N'R'
       , @script = N'
# Transform R version properties to data.frame
OutputDataSet <- data.frame(
  property_name = c("R.version", "Revo.version"),
  property_value = c(R.Version()$version.string, Revo.version$version.string),
  stringsAsFactors = FALSE)
# Retrieve properties like R.home, libPath & default packages
OutputDataSet <- rbind(OutputDataSet, data.frame(
  property_name = c("R.home", "libPaths", "defaultPackages"),
  property_value = c(R.home(), .libPaths(), paste(getOption("defaultPackages"), collapse=", ")),
  stringsAsFactors = FALSE)
)
'
WITH RESULT SETS ((PropertyName nvarchar(100), PropertyValue nvarchar(4000)));

Wskazówka

Jeśli R Services nie działa, spróbuj uruchomić tylko część skryptu R z RGui.

W ostateczności możesz otworzyć pliki na serwerze, aby ustalić zainstalowaną wersję. Aby to zrobić, znajdź plik rlauncher.config, aby uzyskać lokalizację runtime R oraz aktualny katalog roboczy. Zalecamy przygotowanie i otwarcie kopii pliku, aby przypadkowo nie zmienić żadnych właściwości.

  • SQL Server 2016

    C:\Program Files\Microsoft SQL Server\MSSQL13.<instance_name\MSSQL\Binn\rlauncher.config

  • SQL Server 2017

    C:\Program Files\Microsoft SQL Server\MSSQL14.<instance_name>\MSSQL\Binn\rlauncher.config

Aby pobrać wersje R i RevoScaleR, otwórz wiersz poleceń R lub otwórz RGui powiązane z instancją.

  • SQL Server 2016

    C:\Program Files\Microsoft SQL Server\MSSQL13.<instancename>\R_SERVICES\bin\x64\RGui.exe

  • SQL Server 2017

    C:\Program Files\Microsoft SQL Server\MSSQL14.<instance_name>\R_SERVICES\bin\x64\RGui.exe

Konsola R wyświetla informacje o wersji przy starcie. Na przykład następująca wersja reprezentuje domyślną konfigurację SQL Server 2017:

*Microsoft R Open 3.3.3*

*The enhanced R distribution from Microsoft*

*Microsoft packages Copyright (C) 2017 Microsoft*

*Loading Microsoft R Server packages, version 9.1.0.*

Wersje języka Python

Istnieje kilka sposobów na zdobycie wersji Python. Najprostszym sposobem jest uruchomienie tego stwierdzenia z Management Studio lub innego narzędzia do zapytań SQL:

-- Get Python runtime properties:
exec sp_execute_external_script
       @language = N'Python'
       , @script = N'
import sys
import pkg_resources
OutputDataSet = pandas.DataFrame(
                    {"property_name": ["Python.home", "Python.version", "Revo.version", "libpaths"],
                    "property_value": [sys.executable[:-10], sys.version, pkg_resources.get_distribution("revoscalepy").version, str(sys.path)]}
)
'
with WITH RESULT SETS (SQL keywords) ((PropertyName nvarchar(100), PropertyValue nvarchar(4000)));

Jeśli Machine Learning Services nie działa, możesz określić zainstalowaną wersję Python, patrząc na plik pythonlauncher.config. Zalecamy przygotowanie i otwarcie kopii pliku, aby przypadkowo nie zmienić żadnych właściwości.

  1. Tylko dla SQL Server 2017:C:\Program Files\Microsoft SQL Server\MSSQL14.<instance_name>\MSSQL\Log\ExtensibilityLog\pythonlauncher.config
  2. Sprawdź wartość PYTHONHOME.
  3. Zdobądź wartość aktualnego katalogu roboczyego.

Note

Jeśli zainstalowałeś zarówno Python, jak i R w SQL Server 2017, katalog roboczy i pula kont worker są współdzielone dla języków R i Python.

Czy zainstalowano kilka wersji języka R lub Python?

Sprawdź, czy na komputerze zainstalowano więcej niż jedną kopię bibliotek R. To duplikowanie może nastąpić, jeśli:

  • Podczas konfiguracji wybierasz zarówno R Services (In-Database), jak i R Server (Standalone).
  • Instalujesz Microsoft R Client oprócz SQL Server.
  • Inny zestaw bibliotek R został zainstalowany za pomocą narzędzi R dla Visual Studio, R Studio, klienta Microsoft R lub innego IDE R.
  • Komputer jest hostem wielu instancji SQL Server, a więcej niż jedna instancja korzysta z uczenia maszynowego.

Te same warunki dotyczą Pythona.

Jeśli zauważysz, że zainstalowano wiele bibliotek lub środowisk uruchomieniowych, upewnij się, że otrzymujesz tylko błędy związane ze środowiskami uruchomieniowymi Python lub R używanymi przez instancję programu SQL Server.

Pochodzenie błędów

Błędy, które zauważysz podczas próby uruchomienia kodu R, mogą pochodzić z dowolnego z następujących źródeł:

  • silnik bazy danych SQL Server, w tym procedurę składowaną sp_execute_external_script
  • Zaufany Launchpad SQL Server
  • Inne składniki struktury rozszerzalności, w tym programy uruchamiające R i Python oraz procesy satelitarne
  • Dostawcy, tacy jak Microsoft Open Database Connectivity (ODBC)
  • Język R

Gdy korzystasz z usługi po raz pierwszy, trudno jest rozpoznać, które wiadomości pochodzą z których usług. Zalecamy, abyś uchwycił nie tylko dokładny tekst wiadomości, ale także kontekst, w którym ją zobaczyłeś. Zwróć uwagę na oprogramowanie klienckie, którego używasz do uruchamiania kodu uczenia maszynowego:

  • Używasz Management Studio? Zewnętrzna aplikacja?
  • Czy uruchamiasz kod R w kliencie zdalnym, czy bezpośrednio w procedurze przechowywanej?

Pliki logów SQL Server

Pobierz najnowszy SQL Server ERRORLOG. Pełny zestaw logów błędów składa się z plików z następującego domyślnego katalogu logów:

  • SQL Server 2016

    C:\Program Files\Microsoft SQL Server\MSSQL13.SQL2016\MSSQL\Log\ExtensibilityLog

  • SQL Server 2017

    C:\Program Files\Microsoft SQL Server\MSSQL14.SQL2016\MSSQL\Log\ExtensibilityLog

Note

Dokładna nazwa folderu różni się w zależności od nazwy instancji.

Błędy zwrócone przez sp_execute_external_script

Uzyskaj pełny tekst błędów, które są zwracane, jeśli występują, gdy uruchamiasz polecenie sp_execute_external_script.

Aby wyeliminować problemy z R lub Python, możesz uruchomić ten skrypt, który uruchamia runtime R lub Python i przesyła dane tam i z powrotem.

Dla R

exec sp_execute_external_script @language =N'R',  
@script=N'OutputDataSet<-InputDataSet',  
@input_data_1 =N'select 1 as hello'  
with result sets (([hello] int not null));  
go

Dla języka Python

exec sp_execute_external_script @language =N'Python',  
@script=N'OutputDataSet= InputDataSet',  
@input_data_1 =N'select 1 as hello'  
with result sets (([hello] int not null));  
go

Błędy generowane przez framework rozszerzalności

SQL Server generuje oddzielne logi dla środowisk wykonawczych języka skryptów zewnętrznych. Te błędy nie są generowane przez język Python ani R. Są generowane z komponentów rozszerzalności w SQL Server, w tym z launcherów specyficznych dla języka oraz ich procesów satelitarnych.

Te logi możesz pobrać z następujących domyślnych lokalizacji:

  • SQL Server 2016

    C:\Program Files\Microsoft SQL Server\MSSQL13.<instance_name>\MSSQL\Log\ExtensibilityLog

  • SQL Server 2017

    C:\Program Files\Microsoft SQL Server\MSSQL14.<instance_name>\MSSQL\Log\ExtensibilityLog

Note

Dokładna nazwa folderu różni się w zależności od nazwy instancji. W zależności od konfiguracji, folder może być na innym dysku.

Na przykład następujące wiadomości logowe są powiązane z ramami rozszerzalności:

  • LogonUser nie powiodło się dla użytkownika MSSQLSERVER01

    Może to wskazywać, że konta robocze uruchamiające zewnętrzne skrypty nie mają dostępu do instancji.

  • InitializePhysicalUsersPool nie powiódł się

    Ten komunikat może oznaczać, że Twoje ustawienia bezpieczeństwa uniemożliwiają konfigurację utworzenia puli kont pracowników potrzebnych do uruchamiania zewnętrznych skryptów.

  • Inicjalizacja Menedżera kontekstu bezpieczeństwa nie powiodła się

  • Inicjalizacja Satellite Session Manager zakończyła się niepowodzeniem

Zdarzenia systemowe

  1. Otwórz Windows Podgląd zdarzeń i przeszukaj dziennik zdarzeń systemowych pod kątem komunikatów zawierających ciąg Launchpad.
  2. Otwórz plik ExtLaunchErrorlog i poszukaj ciągu ErrorCode. Przejrzyj wiadomość powiązaną z kodem błędu.

Na przykład następujące wiadomości to powszechne błędy systemowe związane z ramami rozszerzalności SQL Server:

  • Usługa SQL Server Launchpad (MSSQLSERVER) nie została uruchomiona z powodu następującego błędu: <tekst>

  • Usługa nie odpowiedziała na żądanie uruchomienia lub sterowania w odpowiednim czasie.

  • Podczas oczekiwania na połączenie usługi SQL Server Launchpad (MSSQLSERVER) osiągnięto limit czasu (120000 milisekund).

Pliki zrzutu

Jeśli znasz się na debugowaniu, możesz użyć plików dump do analizy awarii w Launchpadzie.

  1. Znajdź folder, który zawiera logi bootstrap setup dla SQL Server. Na przykład w SQL Server 2016 domyślną ścieżką była C:\Program Files\Microsoft SQL Server\130\Setup Bootstrap\Log.
  2. Otwórz podfolder bootstrap log, który jest specyficzny dla rozszerzalności.
  3. Jeśli musisz złożyć prośbę o wsparcie, dodaj całą zawartość tego folderu do pliku spakowanego. Na przykład, C:\Program Files\Microsoft SQL Server\130\Setup Bootstrap\Log\LOG\ExtensibilityLog.

Dokładna lokalizacja może się różnić w zależności od twojego systemu i może być na dysku innym niż dysk C. Upewnij się, że masz logi instancji, w której zainstalowano uczenie maszynowe.

Ustawienia konfiguracji

Ta sekcja zawiera listę dodatkowych komponentów lub dostawców, które mogą być źródłem błędów podczas uruchamiania skryptów R lub Python.

Jakie protokoły sieciowe są dostępne?

Machine Learning Services wymaga następujących protokołów sieciowych do komunikacji wewnętrznej między komponentami rozszerzalności oraz do komunikacji z zewnętrznymi klientami R lub Python.

  • Nazwane kanały
  • TCP/IP

Otwórz SQL Server Configuration Manager, aby sprawdzić, czy protokół jest zainstalowany, a jeśli tak, czy jest włączony.

Konfiguracja zabezpieczeń i uprawnienia

W przypadku kont pracowniczych:

  1. W Panel sterowania otwórz Użytkownicy i Grupy oraz znajdź grupę używaną do uruchamiania zewnętrznych zadań skryptowych. Domyślnie grupa to SQLRUserGroup.
  2. Sprawdź, czy grupa istnieje i czy zawiera przynajmniej jedno konto pracownicze.
  3. W SQL Server Management Studio wybierz instancję, w której będą uruchamiane zadania R lub Python, wybierz Bezpieczeństwo, a następnie sprawdź, czy jest logowanie dla SQLRUserGroup.
  4. Sprawdź uprawnienia grupy użytkowników.

Dla indywidualnych kont użytkowników:

  1. Określ, czy instancja obsługuje uwierzytelnianie w trybie mieszanym, wyłącznie logowania SQL, czy wyłącznie uwierzytelnianie systemu Windows. To ustawienie wpływa na wymagania kodu w R lub Python.

  2. Dla każdego użytkownika, który musi uruchomić kod R, należy określić wymagany poziom uprawnień w każdej bazie danych, gdzie obiekty będą zapisywane z R, do których będą dostępne dane lub tworzone obiekty.

  3. Aby umożliwić wykonywanie skryptów, należy utworzyć role lub dodać użytkowników do następujących ról, w razie potrzeby:

    • Wszyscy oprócz db_owner wymagają uprawnienia EXECUTE ANY EXTERNAL SCRIPT.
    • db_datawriter: Zapisywać wyniki z R lub Python.
    • db_ddladmin: Tworzyć nowe obiekty.
    • db_datareader: Do odczytu danych wykorzystywanych przez kod R lub Python.
  4. Zwróć uwagę, czy zmieniłeś domyślne konta startowe podczas instalacji SQL Server 2016.

  5. Jeśli użytkownik musi zainstalować nowe pakiety R lub użyć pakietów R zainstalowanych przez innych użytkowników, może być konieczne włączenie zarządzania pakietami na instancji, a następnie przypisanie dodatkowych uprawnień.

Jakie foldery są blokowane przez oprogramowanie antywirusowe?

Oprogramowanie antywirusowe może blokować foldery, co uniemożliwia zarówno konfigurację funkcji uczenia maszynowego, jak i skuteczne wykonanie skryptów. Sprawdź, czy jakiekolwiek foldery w drzewie SQL Server podlegają skanowaniu antywirusowemu.

Jednak gdy na instancji zainstalowanych jest wiele usług lub funkcji, trudno jest wymienić wszystkie możliwe foldery używane przez instancję. Na przykład, gdy dodane są nowe funkcje, nowe foldery muszą zostać zidentyfikowane i wykluczone.

Co więcej, niektóre funkcje dynamicznie tworzą nowe foldery w czasie działania. Na przykład tabele OLTP w pamięci, procedury przechowywane i funkcje tworzą nowe katalogi w czasie działania. Nazwy tych folderów często zawierają GUID i nie można ich przewidzieć. Zaufany Launchpad SQL Server tworzy nowe katalogi robocze dla zadań skryptowych w R i Python.

Ponieważ może nie być możliwe wykluczenie wszystkich folderów potrzebnych przez proces SQL Server i jego funkcje, zalecamy wykluczenie całego drzewa katalogów instancji SQL Server.

Czy zapora sieciowa jest otwarta dla SQL Server? Czy instancja obsługuje połączenia zdalne?

  1. Aby sprawdzić, czy SQL Server obsługuje połączenia zdalne, zobacz Konfiguruj połączenia zdalnych serwerów.

  2. Sprawdź, czy dla SQL Server została utworzona reguła zapory. Ze względów bezpieczeństwa, w domyślnej instalacji zdalny klient R lub Python może nie być w stanie połączyć się z instancją. Więcej informacji można znaleźć w artykule Rozwiązywanie problemów z łączeniem się z SQL Server.