SQL Server 2017에 추가된 기능 중에 개인적으로 가장 흥미있는 기능이 Machine Learning Services - Python입니다. 개발자들의 사랑을 한 몸에 받고 있는 Python의 기능을 기본 제공에 더해서 1)Data를 Client 로 이동하지 않고 처리 2)빠르고 편한 배포 및 활용 3)기업용 리소스 및 보안 관리 4)풍부한 확장 패키지(Microsoft에서 제작한 RevoScalePy 패키지) 등의 이점이 추가되었습니다.
In-Database R을 구현하면서 사용했던 기술을 많은 부분 그대로 사용하였으므로, 이미 In-DB R을 구성해본 분이라면 금방 익숙해질 것입니다. 이 글에서는, 독립 설치형 Python은 다루지 않고, In-DB Python 설치 및 SQL 구문내에서 Python script가 잘 동작하는지 확인하는 방법에 대해 정리하였습니다.
설치 목록
1. OS : Windows Server 2016
2. SQL Server 2017 평가판 (120일 무료 LINK)
3. Anaconda (Open Source) : SQL Server 2017 설치 중에 인터넷에서 다운로드 됨
4. SQL Server Management Studio (무료)
설치 순서
1. In-Database용 ML Services중에서 Python 설치
2. 참고) SQL Server와는 독립적으로 Python과 R을 설치할 수 도 있음
3. Python 배포판인 Anaconda와 package가 인터넷을 통해 설치된 다는 메시지 확인
4. 설치될 파일 목록 확인(1) : Machine Learning Services (In-Database), Python
5. 설치될 파일 목록 확인 (2) : SQL Server LaunchPad. 아래 10번에 추가 설명 제공.
설치 완료 후,
6. Computer Management(Compmgmt.msc) 수행 후, 외부 스크립트를 호출하기위한 worker account (기본 20개)가 생성되었는지 확인.
이 계정들은 모두 SQLRUserGroup의 구성원으로 포함되어 있음. (R용으로 만들었던 그룹을 그대로 Python 에서도 사용하고 있음)
7. 설치 폴더 확인
C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER 아래에 PYTHON_SERVICES 폴더가 생성됨
8. SQL Server Management Studio(SSMS) 다운로드 및 설치
9. SSMS에서 Python script 가 정상 동작하는지 확인하기
SSMS에 로그인하여, Python script가 잘 수행되는지 Hello World! 테스트 진행
참고) 여기서는 system administrators 그룹의 사용자로 진행하였음. 실 사용자는 별도의 권한 부여 필요함. https://docs.microsoft.com/en-us/sql/advanced-analytics/python/setup-python-machine-learning-services
--Allow to execute external scripts such as R and Python EXEC sp_configure 'external scripts enabled', 1 reconfigure with override GO
--Restart SQL Server to apply changed value
--Check whether the Python script works well or not. EXEC sp_execute_external_script @language = N'Python', @script = N' import sys import os print("Hello World!") '
|
정상 수행된 결과 확인.
참고) 오류가 발생하였다면 troubleshooting 과정이 필요 함. 예) import 구문 앞에 공백이 있으면 IndentationError 발생함.
참고) Python이 완료 상태이므로 모든 SQL Server client tool에서 위 구문을 수행해 볼 수 있음. 예: VS Code, SSDT, SSMS, SQLCMD 등.
10. 쿼리 수행시 호출되는 process 확인
Process explorer를 열어 두고서 위 쿼리를 수행하면, 호출되는 process의 상관 관계를 볼 수 있음.
Launchpad.exe > python.exe > conhost.exe, BxlServer.exe 호출. 즉, 외부 스크리트는 sqlservr.exe가 아닌 Launchpad.exe가 실행의 주체임.
11. 실습
테이블에 요일(월~일)로 표시된 값을 index(1~7)로 바꾸어 출력해 주는 스크립트 수행
참고) Python Data Analysis Library(pandas)의 Series 이용하여 수행
--테스트용 DB 생성 CREATE DATABASE ML_Samples GO
USE ML_Samples GO
--테스트용 테이블 생성 CREATE TABLE PythonTest ( [DayOfWeek] nvarchar(10) NOT NULL, [Amount] float NOT NULL ) GO
--데이터 입력 : 요일별 매출 현황
INSERT INTO PythonTest VALUES (N'일', 10.0), (N'월', 11.1), (N'화', 12.2), (N'수', 13.3), (N'목', 14.4), (N'금', 15.5), (N'토', 16.6), (N'금', 17.7), (N'월', 18.8), (N'일', 19.9) GO
--변수 선언 및 초기화 DECLARE @ParamINT INT = 1234567 DECLARE @ParamCharN VARCHAR(6) = 'INPUT '
print '------------------------------------------------------------------------' print 'Output parameters (before):' print FORMATMESSAGE('ParamINT=%d', @ParamINT) print FORMATMESSAGE('ParamCharN=%s', @ParamCharN)
print 'Dataset (before):' SELECT * FROM PythonTest
print '------------------------------------------------------------------------' print 'Dataset (after):' --SQL Server에서 python으로 읽기 한번당 넘기는 행수 선언 DECLARE @RowsPerRead INT = 5 -- execute sp_execute_external_script @language = N'Python', @script = N' import sys import os print("*******************************") print(sys.version) print("Hello World") print(os.getcwd()) print("*******************************") if ParamINT == 1234567: ParamINT = 1 else: ParamINT += 1
ParamCharN="OUTPUT" OutputDataSet = InputDataSet
global daysMap
daysMap = { "월" : 1, "화" : 2, "수" : 3, "목" : 4, "금" : 5, "토" : 6, "일" : 7 }
OutputDataSet["DayOfWeek"] = pandas.Series([daysMap[i] for i in OutputDataSet["DayOfWeek"]], index = OutputDataSet.index, dtype = "int32") ', @input_data_1 = N'SELECT * FROM PythonTest', @params = N'@r_rowsPerRead INT, @ParamINT INT OUTPUT, @ParamCharN CHAR(6) OUTPUT', @r_rowsPerRead = @RowsPerRead, @paramINT = @ParamINT OUTPUT, @paramCharN = @ParamCharN OUTPUT with result sets (("DayOfWeek" int null, "Amount" float null)) -- print 'Output parameters (after):' print FORMATMESSAGE('ParamINT=%d', @ParamINT) print FORMATMESSAGE('ParamCharN=%s', @ParamCharN) GO
|
반환된 두 개의 결과
수행 전 |
수행 후 |
DayOfWeek Amount 일 10 월 11.1 화 12.2 수 13.3 목 14.4 금 15.5 토 16.6 금 17.7 월 18.8 일 19.9 |
DayOfWeek Amount 7 10 1 11.1 2 12.2 3 13.3 4 14.4 5 15.5 6 16.6 5 17.7 1 18.8 7 19.9 |
출력된 Output
------------------------------------------------------------------------ Output parameters (before): ParamINT=1234567 ParamCharN=INPUT Dataset (before):
(10 rows affected) ------------------------------------------------------------------------ Dataset (after): STDOUT message(s) from external script: ******************************* 3.5.2 |Continuum Analytics, Inc.| (default, Jul 5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)] Hello World C:\PROGRA~1\MICROS~2\MSSQL1~1.MSS\MSSQL\EXTENS~1\MSSQLSERVER01\451A7F40-0448-42D2-AF50-AAAB1B9564EE ******************************* ******************************* 3.5.2 |Continuum Analytics, Inc.| (default, Jul 5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)] Hello World C:\PROGRA~1\MICROS~2\MSSQL1~1.MSS\MSSQL\EXTENS~1\MSSQLSERVER01\451A7F40-0448-42D2-AF50-AAAB1B9564EE *******************************
(10 rows affected) Output parameters (after): ParamINT=2 ParamCharN=OUTPUT
|
참조
Python 컴퓨터 학습 Services (In-database) 설치
T-SQL을 사용 하 여 Python 실행
https://docs.microsoft.com/ko-kr/sql/advanced-analytics/tutorials/run-python-using-t-sql
위에 입력했던 Screenshot이 포함된 Word 문서 :
SQL Server 2017 ML Services Python 구성하기.docx
흠, Flash Player 설치하기 싫어서, 파일 보관함을 통해 사진을 올렸더니 크기 조절이 안되네요. 원본 Word를 첨부파일로 추가하였습니다.