Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op: SQL Server 2016 (13.x) en latere versies
In dit artikel wordt de architectuur van het uitbreidbaarheidsframework beschreven voor het uitvoeren van een extern Python- of R-script op SQL Server Machine Learning Services. Het script wordt uitgevoerd in een taalruntimeomgeving als een extensie voor de kerndatabase-engine.
Achtergrond
Het uitbreidbaarheidsframework is geïntroduceerd in SQL Server 2016 ter ondersteuning van de R-runtime met R Services. SQL Server 2017 en hoger biedt ondersteuning voor Python met Machine Learning Services.
Het doel van het uitbreidbaarheidsframework is om een interface te bieden tussen SQL Server- en data science-talen zoals R en Python. Het doel is om wrijving te verminderen bij het verplaatsen van data science-oplossingen naar productie en het beveiligen van gegevens die tijdens het ontwikkelingsproces beschikbaar worden gesteld. Door een vertrouwde scripttaal uit te voeren binnen een beveiligd framework dat wordt beheerd door SQL Server, kunnen databasebeheerders de beveiliging behouden terwijl gegevenswetenschappers toegang hebben tot bedrijfsgegevens.
In het volgende diagram worden de mogelijkheden en voordelen van de uitbreidbare architectuur visueel beschreven.
Een extern script kan worden uitgevoerd door een opgeslagen procedure aan te roepen en de resultaten worden rechtstreeks als tabellaire resultaten geretourneerd naar SQL Server. Hierdoor kunt u eenvoudig machine learning genereren of gebruiken vanuit elke toepassing die een SQL-query kan verzenden en de resultaten kan verwerken.
Uitvoering van extern script is onderhevig aan SQL Server-gegevensbeveiliging. Een gebruiker die een extern script uitvoert, heeft alleen toegang tot gegevens die even beschikbaar zijn in een SQL-query. Als een query mislukt vanwege onvoldoende machtigingen, mislukt een script dat door dezelfde gebruiker wordt uitgevoerd, ook om dezelfde reden. SQL Server-beveiliging wordt afgedwongen op tabel-, database- en exemplaarniveau. Databasebeheerders kunnen gebruikerstoegang, resources die worden gebruikt door externe scripts en externe codebibliotheken die aan de server worden toegevoegd, beheren.
Schaal- en optimalisatiemogelijkheden hebben een dubbele basis: winst via het databaseplatform (ColumnStore-indexen, resourcebeheer); en uitbreidingsspecifieke voordelen, bijvoorbeeld wanneer Microsoft-bibliotheken voor R en Python worden gebruikt voor data science-modellen. Terwijl R enkelvoudig draadgebruik heeft, zijn RevoScaleR-functies multithreaded en kunnen een workload over meerdere kernen verdelen.
Implementatie maakt gebruik van SQL Server-methodologieën. Deze procedures kunnen worden opgeslagen voor het verpakken van een extern script, ingesloten SQL- of T-SQL-query's die functies aanroepen, zoals PREDICT, om resultaten te retourneren van prognosemodellen die op de server zijn opgeslagen.
Ontwikkelaars met gevestigde vaardigheden in specifieke hulpprogramma's en IDE's kunnen code schrijven in deze hulpprogramma's en de code vervolgens overzetten naar SQL Server.
Architectuurschema
De architectuur is zodanig ontworpen dat externe scripts worden uitgevoerd in een afzonderlijk proces van SQL Server, maar met onderdelen die intern de keten van aanvragen voor gegevens en bewerkingen op SQL Server beheren. Afhankelijk van de versie van SQL Server zijn ondersteunde taalextensies R, Python en talen van derden, zoals Java en .NET.
Onderdeelarchitectuur in Windows:
Onderdeelarchitectuur in Linux:
Onderdelen omvatten een launchpad-service die wordt gebruikt voor het aanroepen van externe runtimes en bibliotheekspecifieke logica voor het laden van interpreters en bibliotheken. Met de lanceerder wordt een taalruntime geladen, plus eventuele propriëtaire modules. Als uw code bijvoorbeeld RevoScaleR-functies bevat, wordt een RevoScaleR-interpreter geladen. BxlServer en SQL Satellite beheren communicatie en gegevensoverdracht met SQL Server.
In Linux gebruikt SQL een launchpadd-service om te communiceren met een afzonderlijk launchpadproces voor elke gebruiker.
Launchpad
Sql Server Launchpad is een service die externe scripts beheert en uitvoert, vergelijkbaar met de manier waarop de volledige tekstindexering en queryservice een afzonderlijke host start voor het verwerken van query's in volledige tekst. De launchpad-service kan alleen vertrouwde startprogramma's starten die zijn gepubliceerd door Microsoft of die door Microsoft zijn gecertificeerd als voldoen aan de vereisten voor prestaties en resourcebeheer.
| Vertrouwde startprogramma's | Extension | SQL Server-versies |
|---|---|---|
| RLauncher.dll voor de R-taal voor Windows | R-extensie | SQL Server 2016 en hoger |
| Pythonlauncher.dll voor Python-taal voor Windows | Python-extensie | SQL Server 2017 en hoger |
| RLauncher.so voor de R-taal voor Linux | R-extensie | SQL Server 2019 en hoger |
| Pythonlauncher.so voor Python-taal voor Linux | Python-extensie | SQL Server 2019 en hoger |
De SQL Server Launchpad-service wordt uitgevoerd onder een eigen gebruikersaccount. Als u het account wijzigt waarop launchpad wordt uitgevoerd, moet u dit doen met BEHULP van SQL Server Configuration Manager om ervoor te zorgen dat wijzigingen naar gerelateerde bestanden worden geschreven.
In Windows wordt een afzonderlijke SQL Server Launchpad-service gemaakt voor elk exemplaar van de database-engine waaraan u SQL Server Machine Learning Services hebt toegevoegd. Er is één launchpad-service voor elk exemplaar van de database-engine, dus als u meerdere exemplaren met externe scriptondersteuning hebt, beschikt u over een launchpad-service voor elk exemplaar. Een database-engine-exemplaar is gebonden aan de launchpad-service die hiervoor is gemaakt. Alle aanroepen van extern script in een opgeslagen procedure of T-SQL resulteren in de SQL Server-service die de launchpad-service aanroept die voor hetzelfde exemplaar is gemaakt.
Om taken uit te voeren in een specifieke ondersteunde taal, krijgt het launchpad een beveiligd werkaccount van de pool en start het een satellietproces om de externe runtime te beheren. Elk satellietproces erft het gebruikersaccount van het launchpad en gebruikt dat werknemersaccount voor de duur van de uitvoering van het script. Als het script parallelle processen gebruikt, worden deze gemaakt onder hetzelfde, enkel werkaccount.
In Linux wordt slechts één exemplaar van de database-engine ondersteund en is er één launchpadd-service gebonden aan het exemplaar. Wanneer een script wordt uitgevoerd, start de launchpadd-service een afzonderlijk launchpad-proces met het gebruikersaccount met beperkte bevoegdheden mssql_satellite. Elk satellietproces neemt het mssql_satellite gebruikersaccount van launchpad over en gebruikt dat voor de duur van de uitvoering van het script.
BxlServer en SQL Satellite
BxlServer is een uitvoerbaar bestand dat wordt geleverd door Microsoft die de communicatie tussen SQL Server en de taalruntime beheert. Hiermee worden de Windows-taakobjecten voor Windows of de naamruimten voor Linux gemaakt die worden gebruikt om externe scriptsessies te bevatten. Het biedt ook beveiligde werkmappen voor elke externe scripttaak en maakt gebruik van SQL Satellite voor het beheren van gegevensoverdracht tussen de externe runtime en SQL Server. Als u Process Explorer uitvoert terwijl een taak wordt uitgevoerd, ziet u mogelijk een of meerdere exemplaren van BxlServer.
BxlServer is een aanvulling op een taalruntime-omgeving die met SQL Server werkt om gegevens over te dragen en taken te beheren. BXL staat voor binaire Exchange-taal en verwijst naar de gegevensindeling die wordt gebruikt om gegevens efficiënt te verplaatsen tussen SQL Server en externe processen.
SQL Satellite is een uitbreidbaarheids-API, opgenomen in de database-engine, die externe code of externe runtimes ondersteunt die zijn geïmplementeerd met C of C++.
BxlServer maakt gebruik van SQL Satellite voor deze taken:
- Invoergegevens lezen
- Uitvoergegevens schrijven
- Invoerargumenten verkrijgen
- Uitvoerargumenten schrijven
- Foutafhandeling
- STDOUT en STDERR terugschrijven naar de cliënt
SQL Satellite maakt gebruik van een aangepaste gegevensindeling die is geoptimaliseerd voor snelle gegevensoverdracht tussen SQL Server en externe scripttalen. Het voert typeconversies uit en definieert de schema's van de invoer- en uitvoergegevenssets tijdens de communicatie tussen SQL Server en de externe scriptruntime.
De SQL Satellite kan worden bewaakt met behulp van uitgebreide Windows-gebeurtenissen (XEvents). Zie Uitgebreide gebeurtenissen voor SQL Server Machine Learning Services voor meer informatie.
Communicatiekanalen tussen onderdelen
Communicatieprotocollen tussen onderdelen en gegevensplatformen worden in deze sectie beschreven.
TCP/IP
Interne communicatie tussen SQL Server en sql Satellite maakt standaard gebruik van TCP/IP.
Named Pipes
Intern gegevenstransport tussen de BxlServer en SQL Server via SQL Satellite maakt gebruik van een eigen, gecomprimeerde gegevensindeling om de prestaties te verbeteren. Gegevens worden uitgewisseld tussen taaluitvoeringstijden en BxlServer in BXL-indeling, met behulp van Named Pipes.
ODBC
Communicatie tussen externe data science-clients en een extern SQL Server-exemplaar maakt gebruik van ODBC. Het account dat de scripttaken naar SQL Server verzendt, moet beide machtigingen hebben om verbinding te maken met het exemplaar en externe scripts uit te voeren.
Afhankelijk van de taak heeft het account mogelijk deze machtigingen nodig:
- Gegevens lezen die door de taak worden gebruikt
- Gegevens naar tabellen schrijven: bijvoorbeeld bij het opslaan van resultaten in een tabel
- Databaseobjecten maken: bijvoorbeeld als u extern script opslaat als onderdeel van een nieuwe opgeslagen procedure.
Wanneer SQL Server wordt gebruikt als de rekencontext voor het uitvoeren van scripts vanaf een externe client en het uitvoerbare bestand gegevens moet ophalen uit een externe bron, wordt ODBC gebruikt voor write-back. SQL Server wijst de identiteit van de gebruiker die de externe opdracht uitgeeft toe aan de identiteit van de gebruiker in het huidige exemplaar en voert de ODBC-opdracht uit met behulp van de referenties van die gebruiker. De verbindingsreeks die nodig is om deze ODBC-aanroep uit te voeren, wordt verkregen uit de clientcode.
RODBC (alleen R)
Extra ODBC-aanroepen kunnen in het script worden uitgevoerd met behulp van RODBC. RODBC is een populair R-pakket dat wordt gebruikt voor toegang tot gegevens in relationele databases; de prestaties zijn echter over het algemeen trager dan vergelijkbare providers die worden gebruikt door SQL Server. Veel R-scripts gebruiken ingesloten aanroepen naar RODBC als een manier om 'secundaire' gegevenssets op te halen voor gebruik in analyse. De opgeslagen procedure waarmee een model wordt getraind, kan bijvoorbeeld een SQL-query definiëren om de gegevens op te halen voor het trainen van een model, maar gebruik een ingesloten RODBC-aanroep om extra factoren op te halen, om opzoekacties uit te voeren of om nieuwe gegevens op te halen uit externe bronnen, zoals tekstbestanden of Excel.
De volgende code illustreert een RODBC-aanroep die is ingesloten in een R-script:
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");Andere protocollen
Processen die mogelijk in segmenten moeten werken of gegevens moeten overdragen naar een externe client, kunnen ook de XDF-bestandsindeling gebruiken. De werkelijke gegevensoverdracht verloopt via gecodeerde blobs.