SQL Server機器學習服務中 Python 和 R 的已知問題

適用于:SQL Server 2016 (13.x) 和更新版本

重要事項

先前稱為 R Server) 的Machine Learning Server (支援將于 2022 年 7 月 1 日結束。 如需詳細資訊,請參閱Machine Learning Server發生什麼情況?

本文描述 Python 和 R 元件的已知問題或限制,這些元件會在 SQL Server 機器學習服務SQL Server 2016 R Services 中提供。

安裝和設定問題

如需初始安裝和設定相關程序的說明,請參閱安裝 SQL Server 機器學習服務。 該文章會提供升級、並存安裝,以及安裝新 R 或 Python 元件的相關資訊。

1.由於遺失環境變數而導致 MKL 計算不一致

適用範圍:R_SERVER 二進位檔 9.0、9.1、9.2 或 9.3。

R_SERVER 使用 Intel 數學核心函數庫 (MKL)。 對於涉及 MKL 的計算,如果您的系統遺失環境變數,可能會產生不一致的結果。

在 R_SERVER 中,設定環境變數 'MKL_CBWR'=AUTO 以確保條件式數值重現性。 如需詳細資訊,請參閱條件式數值重現性 (CNR) 的簡介 \(英文\)。

因應措施

  1. 在 [控制台] 中,按一下 [系統及安全性]>[系統]>[進階系統設定]>[環境變數]。

  2. 建立新的使用者或系統變數。

    • 將變數名稱設定為 'MKL_CBWR'。
    • 將「變數值」設定為 'AUTO'。
  3. 重新啟動 R_SERVER。 在 SQL Server 上,您可以重新啟動 SQL Server Launchpad 服務。

注意

如果您在 Linux 上執行 SQL Server 2019,請在使用者主目錄中加入 export MKL_CBWR="AUTO" 程式碼行以編輯或建立 .bash_profile。 在 bash 命令提示字元中輸入 source .bash_profile 來執行此檔案。 在 R 命令提示字元中輸入 Sys.getenv(),以重新啟動 R_SERVER。

2.R 指令碼執行階段錯誤 (SQL Server 2017 CU5-CU7 迴歸)

針對 SQL Server 2017,在累積更新 5 到 7 中,rlauncher.config 檔案內有一個迴歸,其中的暫存目錄檔案路徑包含一個空格。 此迴歸已在 CU8 中更正。

您在執行 R 指令碼時將看到包含下列訊息的錯誤:

無法與 'R' 指令碼的執行階段通訊。 請檢查 'R' 執行時間的需求。

來自外部指令碼的 STDERR 訊息:

嚴重錯誤: 無法建立 'R_TempDir'

因應措施

當 CU8 可供使用時加以套用。 或者,您可以在提升權限的命令提示字元上,搭配 uninstall/install 執行 registerrext.exe,重新建立 rlauncher.config

<SQLInstancePath>\R_SERVICES\library\RevoScaleR\rxLibs\x64\RegisterRExt.exe /uninstall /sqlbinnpath:<SQLInstanceBinnPath> /userpoolsize:0 /instance:<SQLInstanceName>

<SQLInstancePath>\R_SERVICES\library\RevoScaleR\rxLibs\x64\RegisterRExt.exe /install /sqlbinnpath:<SQLInstanceBinnPath> /userpoolsize:0 /instance:<SQLInstanceName>

下列範例顯示具有預設實例 「MSSQL14」 的命令。MSSQLSERVER「 已安裝到 」C:\Program Files\Microsoft SQL Server「:

"C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\R_SERVICES\library\RevoScaleR\rxLibs\x64\RegisterRext.exe" /uninstall /sqlbinnpath:"C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\Binn" /userpoolsize:0 /instance:MSSQLSERVER

"C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\R_SERVICES\library\RevoScaleR\rxLibs\x64\RegisterRext.exe" /install /sqlbinnpath:"C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\Binn" /userpoolsize:0 /instance:MSSQLSERVER

3.無法在網域控制站上安裝 SQL Server 機器學習功能

如果您嘗試在網域控制站上安裝 SQL Server 2016 R Services 或 SQL Server 機器學習服務,則安裝會失敗並出現下列錯誤:

功能的安裝程序期間發生錯誤

找不到具有身分識別的群組

元件錯誤碼:0x80131509

發生失敗的原因是,在網域控制站上,服務無法建立執行機器學習所需的 20 個本機帳戶。 通常,不建議您在網域控制站上安裝 SQL Server。 如需詳細資訊,請參閱支援佈告欄 2032911 \(機器翻譯\)。

4.安裝最新服務版本以確保與 Microsoft R Client 相容

如果您安裝最新的 Microsoft R Client 版本,並使用它在 SQL Server 上的遠端計算內容中執行 R,則可能發生類似下列的錯誤:

您電腦上執行的是 9.x.x 版的 Microsoft R Client,與 Microsoft R Server 8.x.x 版不相容。請下載並安裝相容版本。

SQL Server 2016 要求用戶端上的 R 程式庫必須完全符合伺服器上的 R 程式庫。 已針對 R Server 9.0.1 之後的版本移除此限制。 不過,如果您遇到此錯誤,請確認用戶端和伺服器所使用的 R 程式庫版本,並視需要更新用戶端以符合伺服器版本。

隨 SQL Server R Services 一起安裝的 R 版本,會在安裝 SQL Server 服務版本時更新。 為確保一律具有最新版的 R 元件,務必安裝所有 Service Pack。

為確保與 Microsoft R Client 9.0.0 相容,請安裝此支援文件 \(機器翻譯\) 中所述的更新。

若要避免發生 R 套件的問題,您也可以變更服務合約以使用新式生命週期支援原則,藉以升級伺服器上所安裝的 R 程式庫版本,如下一節所述。 當您執行此操作時,隨 SQL Server 安裝的 R 版本就會依機器學習伺服器 (先前稱為 Microsoft R Server) 更新所使用的相同排程進行更新。

適用範圍:含 R Server 9.0.0 版或更早版本的 SQL Server 2016 R Services

5.安裝 CU3 時遺失 R 元件

已佈建有限數量的 Azure 虛擬機器,但沒有應隨附於 SQL Server 的 R 安裝檔案。 此問題適用於從 2018-01-05 到 2018-01-23 期間所佈建的虛擬機器。 如果您已在 2018-01-05 到 2018-01-23 期間套用 SQL Server 2017 的 CU3 更新,此問題可能也會影響內部部署安裝。

已提供包含正確 R 安裝檔案版本的服務版本。

若要安裝元件並修復 SQL Server 2017 CU3,您必須解除安裝 CU3,然後重新安裝更新的版本:

  1. 下載更新的 CU3 安裝檔案,其中包含 R 安裝程式。
  2. 解除安裝 CU3。 在 [控制台] 中,搜尋解除安裝更新,然後選取 [適用於 SQL Server 2017 的 Hotfix 3015 (KB4052987) (64 位元)]。 繼續進行解除安裝步驟。
  3. 按兩下您剛下載的 KB4052987 更新,藉以重新安裝 CU3 更新:SQLServer2017-KB4052987-x64.exe。 遵循安裝指示進行。

6.無法在 SQL Server 2017 CTP 2.0 或更新版本的離線安裝中安裝 Python 元件

如果您在無法存取網際網路的電腦上安裝 SQL Server 2017 的發行前版本,安裝程式可能無法顯示提示已下載 Python 元件所在位置的頁面。 在這種情況下,您可以安裝機器學習服務功能,但無法安裝 Python 元件。

此問題已在發行版本中修正。 此外,此限制不適用於 R 元件。

適用範圍:搭配 Python 的 SQL Server 2017

當您使用 2017 SQL Server 2017 (14.x) 連線到舊版SQL Server R Services時,版本不相容的警告

當您在 SQL Server 2016 計算內容中執行 R 程式碼時,可能看到下列錯誤:

您正在電腦上執行 9.0.0 版的 Microsoft R Client,這與 Microsoft R Server 8.0.3 版不相容。 請下載並安裝相容版本。

如果下列兩個敘述中任一個為真,即會顯示此訊息。

  • 您使用 2017 SQL Server 2017 (14.x) 的安裝精靈,在用戶端電腦上安裝 R Server (獨立) 。
  • 您已使用單獨的 Windows 安裝程式 \(英文\) 來安裝 Microsoft R Server。

為確保伺服器和用戶端會使用相同版本,您可能需要使用「繫結」(支援 Microsoft R Server 9.0 和更新版本),來升級 SQL Server 2016 執行個體中的 R 元件。 若要判斷您的 R Services 版本是否支援升級,請參閱使用 SqlBindR.exe 升級 R Services 的執行個體

適用範圍:含 R Server 9.0.0 版或更早版本的 SQL Server 2016 R Services

7.SQL Server 2016 服務版本的安裝程式可能無法安裝較新版本的 R 元件

當您安裝累積更新,或在未連線到網際網路的電腦上安裝 SQL Server 2016 Service Pack 時,安裝精靈可能無法顯示提示,讓您能夠使用下載的 CAB 檔案來更新 R 元件。 當多個元件和資料庫引擎一起安裝時,通常會發生此失敗。

因應措施是,您可以使用命令列並指定 MRCACHEDIRECTORY 引數來安裝服務版本,如此範例所示 (其會安裝 CU1 更新):

C:\<path to installation media>\SQLServer2016-KB3164674-x64.exe /Action=Patch /IACCEPTROPENLICENSETERMS /MRCACHEDIRECTORY=<path to CU1 CAB files>

若要取得最新安裝程式,請參閱在沒有網際網路存取的情況下安裝機器學習元件

適用範圍:含 R Server 9.0.0 版或更早版本的 SQL Server 2016 R Services

8.如果版本與 R 版本不同,Launchpad 服務就無法啟動

如果您將 SQL Server R Services 與資料庫引擎分開安裝,且組建版本不同,則您可能會在系統事件記錄中看到下列錯誤:

SQL Server Launchpad 服務無法啟動,因為發生下列錯誤:服務並未以適時的方式回應啟動或控制請求。

例如,如果您使用發行版本安裝資料庫引擎、套用修補程式以升級資料庫引擎,然後使用發行版本新增 R Services 功能,可能會發生此錯誤。

若要避免此問題,請使用檔案管理員之類的公用程式,來比較 Launchpad.exe 版本與 SQL 二進位檔的版本,例如 sqldk.dll。 所有元件都應該具有相同的版本號碼。 如果升級某個元件,所有其他已安裝的元件請務必套用相同的升級。

在執行個體的 Binn 資料夾中尋找 Launchpad。 例如,在 SQL Server 2016 的預設安裝中,路徑可能是 C:\Program Files\Microsoft SQL Server\MSSQL.13.InstanceNameMSSQL\Binn

9.遠端計算內容遭到在 Azure 虛擬機器上執行之 SQL Server 執行個體中的防火牆封鎖

如果您已在 Azure 虛擬機器上安裝SQL Server,您可能無法使用需要使用虛擬機器工作區的計算內容。 原因在於 Azure 虛擬機器上的防火牆預設包含會封鎖對本機 R 使用者帳戶進行網路存取的規則。

因應措施是,在 Azure VM 上開啟 [具有進階安全性的 Windows 防火牆]、選取 [輸出規則],然後停用下列規則:封鎖 SQL Server 執行個體 MSSQLSERVER 中對 R 本機使用者帳戶的網路存取。 您也可以讓規則保持啟用狀態,但將安全性屬性變更為 [在安全時允許]。

10.SQLEXPRESS 的隱含驗證

當您使用整合式 Windows 驗證以從遠端資料科學工作站執行 R 作業時,SQL Server 會使用「隱含驗證」來產生指令碼可能需要的任何本機 ODBC 呼叫。 不過,這項功能在 SQL Server Express Edition 的 RTM 組建中不作用。

若要修正此問題,建議您升級至較新的服務版本。

如果升級不可行,因應措施是使用 SQL 登入來執行可能需要內嵌 ODBC 呼叫的遠端 R 作業。

適用範圍:SQL Server 2016 R Services Express Edition

11.從其他工具中呼叫 SQL Server 所使用的程式庫時的效能限制

它可能會呼叫從外部應用程式 (例如 RGui) 為 SQL Server 安裝的機器學習程式庫。 這麼做可能是完成某些工作最方便的方式,例如,安裝新套件,或在非常短的程式碼範例上執行臨機操作測試。 不過,在 SQL Server 外部,效能可能受到限制。

例如,即使您使用的是 SQL Server Enterprise Edition,當您使用外部工具來執行 R 程式碼時,R 還是會在單一執行緒模式中執行。 若要取得 SQL Server 中效能的優點,請起始 SQL Server 連線,並使用 sp_execute_external_script 來呼叫外部指令碼執行階段。

一般來說,避免從外部工具中呼叫 SQL Server 所使用的機器學習程式庫。 如果您需要對 R 或 Python 程式碼進行偵錯,通常可在 SQL Server 外部更輕鬆地執行此操作。 若要取得SQL Server中的相同程式庫,您可以安裝 Microsoft R Client 或SQL Server 2017 Machine Learning Server (獨立)

12.SQL Server Data Tools 不支援外部指令碼所需的權限

當您使用 Visual Studio 或 SQL Server Data Tools 來發佈資料庫專案時,如果有任何主體具備執行外部指令碼的特定權限,您可能會收到類似下列的錯誤:

TSQL 模型:在反向工程資料庫時偵測到錯誤。 權限無法辨識且尚未匯入。

DACPAC 模型目前不支援 R Services 或機器學習服務所使用的權限,例如,GRANT ANY EXTERNAL SCRIPT 或 EXECUTE ANY EXTERNAL SCRIPT。 未來版本會修正此問題。

因應措施是,在部署後指令碼中執行其他 GRANT 陳述式。

13.執行外部指令碼會因為資源管理預設值而受到節流處理

在 Enterprise Edition 中,您可以使用資源集區來管理外部指令碼程序。 在某些早期發行的組建中,可配置到 R 處理序的記憶體上限為 20%。 因此,如果伺服器有 32 GB 的 RAM,R 可執行檔 (RTerm.exe 和 BxlServer.exe) 可在單一要求中使用的上限為 6.4 GB。

如果您遇到資源限制,請檢查目前的預設值。 如果 20% 不足,請參閱SQL Server有關如何變更此值的檔。

適用範圍:SQL Server 2016 R Services Enterprise Edition

14.在 Linux 上使用不含 libc++.sosp_execute_external_script 時發生錯誤

在未安裝 libc++.so 的全新 Linux 電腦上,使用 Java 或外部語言執行 sp_execute_external_script (SPEES) 查詢會因為 commonlauncher.so 無法載入 libc++.so 而失敗。

例如:

EXECUTE sp_execute_external_script @language = N'Java'
    , @script = N'JavaTestPackage.PassThrough'
    , @parallel = 0
    , @input_data_1 = N'select 1'
WITH RESULT SETS((col1 INT NOT NULL))
GO

這會失敗並出現類似下列的訊息:

Msg 39012, Level 16, State 14, Line 0

Unable to communicate with the runtime for 'Java' script for request id: 94257840-1704-45E8-83D2-2F74AEB46CF7. Please check the requirements of 'Java' runtime.

mssql-launchpadd 記錄將顯示類似下列的錯誤訊息:

Oct 18 14:03:21 sqlextmls launchpadd[57471]: [launchpad] 2019/10/18 14:03:21 WARNING: PopulateLauncher failed: Library /opt/mssql-extensibility/lib/commonlauncher.so not loaded. Error: libc++.so.1: cannot open shared object file: No such file or directory

因應措施

您可以執行下列其中一項因應措施:

  1. libc++*/opt/mssql/lib 複製到預設系統路徑 /lib64

  2. 將下列項目新增至 /var/opt/mssql/mssql.conf 以公開路徑:

    [extensibility]
    readabledirectories = /opt/mssql
    

適用範圍:Linux 上的 SQL Server 2019

15.啟用 FIPS 的伺服器上具有安裝或升級錯誤

如果在啟用聯邦資訊處理標準 (FIPS) 的伺服器上安裝 SQL Server 2019 與機器學習服務和語言延伸模組功能,或升級 SQL Server 執行個體,將會收到下列錯誤:

安裝擴充性功能時發生錯誤,錯誤訊息如下:AppContainer 建立失敗,錯誤訊息為「無」,表示這個實作不是 Windows Platform FIPS 驗證加密演算法的一部分。

因應措施

在安裝 SQL Server 2019 與機器學習服務和語言延伸模組功能或升級 SQL Server 執行個體之前,請先停用 FIPS。 安裝或升級完成後,即可重新啟用 FIPS。

適用範圍: SQL Server 2019

16.使用特定演算法、串流或資料分割的 R 程式庫

  • 問題:下列限制適用于執行時間升級SQL Server 2017 (14.x) 。 此問題適用于Enterprise Edition。

    • 平行處理原則: RevoScaleR 案例 MicrosoftML 的演算法執行緒平行處理原則限制為最多 2 個執行緒。
    • 串流 & 資料分割: @r_rowsPerRead 不會套用傳遞至 T-SQL sp_execute_external_script 之參數的案例。
    • 串流 & 資料分割: RevoScaleRMicrosoftML 資料來源 (亦即 ODBCXDF) 不支援在定型或評分案例的區塊中讀取資料列。 這些案例一律會將所有資料帶入記憶體以進行計算,而且作業會系結記憶體
  • 解決方案:最佳解決方案是升級至 SQL Server 2019 (15.x) 。 或者,當您完成下列工作之後,您也可以繼續使用 SQL Server 2017 (14.x) ,並使用RegisterRext.exe /configure設定執行時間升級。

    1. 編輯登錄以建立機碼 Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\150 ,並新增具有資料 C:\Program Files\Microsoft SQL Server\150\Shared 或實例共用目錄的值 SharedCode ,如已設定。
    2. 從資料夾建立資料夾 C:\Program Files\Microsoft SQL Server\150\Shared and copy instapi140.dllC:\Program Files\Microsoft SQL Server\140\Shared 到新建立的資料夾。
    3. instapi140.dll 重新命名為 instapi150.dll 新資料夾中 C:\Program Files\Microsoft SQL Server\150\Shared 的 。

重要事項

如果您執行上述步驟,您必須先手動移除新增的金鑰,才能升級至更新版本的 SQL Server。

R 指令碼執行問題

本節包含在 SQL Server 上執行 R 的特定已知問題,以及一些與 Microsoft 所發佈之 R 程式庫和工具 (包括 RevoScaleR) 相關的問題。

如需可能影響 R 解決方案的其他已知問題,請參閱 Machine Learning Server \(英文\) 網站。

1.在 SQL Server 上的非預設位置中執行 R 指令碼時,發生拒絕存取的警告

如果已將 SQL Server 的執行個體安裝到非預設位置 (例如,在 Program Files 資料夾外部),則當您嘗試執行安裝套件的指令碼時,就會引發警告 ACCESS_DENIED。 例如:

normalizePath(path.expand(path), winslash, mustWork) 中 : path[2]="~ExternalLibraries/R/8/1":存取遭到拒絕

原因是 R 函數嘗試讀取路徑,如果內建的使用者群組 SQLRUserGroup 沒有讀取權限就會失敗。 引發的警告不會封鎖目前 R 指令碼的執行,但是,每當使用者執行任何其他 R 指令碼時,警告可能會重複發生。

如果您已將 SQL Server 安裝到預設位置,則不會發生此錯誤,因為所有 Windows 使用者都具備 Program Files 資料夾的讀取權限。

此問題已在即將推出的服務版本中解決。 因應措施是,為群組 SQLRUserGroup 提供 ExternalLibraries 所有父資料夾的讀取權限。

2.舊版和新版 RevoScaleR 之間發生序列化錯誤

當您使用序列化格式來將模型傳遞到遠端 SQL Server 執行個體時,可能會收到錯誤:

錯誤發生於 memDecompress(data, type = decompress) 內部錯誤 - memDecompress(2) 中的 3。

如果您使用最新版的序列化函數 (rxSerializeModel \(英文\)) 來儲存模型,但您將模型還原序列化所在的 SQL Server 執行個體具有舊版 RevoScaleR API (來自 SQL Server 2017 CU2 或更早版本),則會引發此錯誤。

因應措施是,您可以將 SQL Server 2017 執行個體升級為 CU3 或更新版本。

如果 API 版本相同,或者,如果您要將使用較舊的序列化函數所儲存的模型移至使用較新版序列化 API 的伺服器,則不會出現此錯誤。

換句話說,針對序列化和還原序列化作業,使用相同版本的 RevoScaleR。

3.即時評分不會正確處理樹狀結構和樹系模型中的 learningRate 參數

如果您使用決策樹或決策樹系方法建立模型,並指定學習速度,則相較於使用 rxPredict,在使用 sp_rxpredict 或 SQL PREDICT 函數時,您可能會看到不一致的結果。

原因在於 API 中所發生的錯誤,此 API 會處理序列化的模型並受限於 learningRate 參數:例如,在 rxBTrees \(英文\) 中,或

此問題已在即將推出的服務版本中解決。

4.R 作業處理器相似性的限制

在初始發行的 SQL Server 2016 組建中,您只能為第一個 k 群組中的 CPU 設定處理器親和性。 例如,如果伺服器是含有兩個 k 群組的雙插槽機器,R 處理序只會使用第一個 k 群組中的處理器。 設定 R 指令碼作業的資源管理時,適用相同的限制。

SQL Server 2016 Service Pack 1 已修正這個問題。 我們建議您升級至最新服務版本。

適用範圍:SQL Server 2016 R Services RTM 版本

5.讀取 SQL Server 計算內容中的資料,無法變更資料行類型。

如果您的計算內容設為 SQL Server 執行個體,則您無法使用 colClasses 引數 (或其他類似的引數) 來變更 R 程式碼中的資料行資料類型。

例如,如果資料行 CRSDepTimeStr 還不是整數,則下列陳述式會產生錯誤︰

data <- RxSqlServerData(
  sqlQuery = "SELECT CRSDepTimeStr, ArrDelay  FROM AirlineDemoSmall", 
  connectionString = connectionString, 
  colClasses = c(CRSDepTimeStr = "integer"))

因應措施是,您可以重新撰寫 SQL 查詢以使用 CAST 或 CONVERT,並使用正確的資料類型來向 R 呈現資料。 通常,效能最佳的時機是使用 SQL 來處理資料,而不是在 R 程式碼中變更資料。

適用範圍:SQL Server 2016 R Services

6.序列化模型的大小限制

當您將模型儲存至 SQL Server 資料表時,必須將模型序列化,並以二進位格式儲存它。 理論上,可以使用此方法儲存的模型大小上限為 2 GB,這是 SQL Server 中 varbinary 資料行的大小上限。

如果您需要使用較大的模型,可以使用下列因應措施:

  • 採取步驟來縮減模型大小。 某些開放原始碼 R 套件會在模型物件中包含大量資訊,而此資訊大部分都可移除以進行部署。

  • 使用特徵選取來移除不必要的資料行。

  • 如果您使用的是開放原始碼演算法,請考慮使用 MicrosoftML 或 RevoScaleR 中對應的演算法來執行類似的實作。 這些套件已針對部署案例進行最佳化。

  • 將模型合理化並使用上述步驟縮減大小之後,請查看是否可以使用基底 R 中的 memCompress \(英文\) 函數來縮減模型大小,然後將它傳遞至 SQL Server。 當模型接近 2 GB 限制時,最適合使用此選項。

  • 對於較大的模型,您可以使用 SQL Server FileTable 功能來儲存模型,而不是使用 varbinary 資料行。

    若要使用 Filetable,您必須新增防火牆例外狀況,因為儲存於 Filetable 的資料會由 SQL Server 中的 Filestream 檔案系統驅動程式來管理,而預設防火牆規則會封鎖網路檔案存取。 如需詳細資訊,請參閱啟用 FileTable 的必要條件

    啟用 FileTable 之後,若要撰寫模型,您可以使用 FileTable API 來取得 SQL 的路徑,然後從您的程式碼將模型寫入至該位置。 當您需要讀取模型時,您會取得 SQL 的路徑,然後從指令碼中使用該路徑來呼叫模型。 如需詳細資訊,請參閱使用檔案輸入輸出 API 存取 FileTable

7.避免在SQL Server計算內容中執行 R 程式碼時清除工作區

如果您在SQL Server計算內容中執行 R 程式碼時使用 R 命令清除物件的工作區,或者如果您使用sp_execute_external_script呼叫的 R 腳本清除工作區,您可能會收到此錯誤:找不到工作區物件 revoScriptConnection

revoScriptConnection是 R 工作區中的 物件,其中包含從 SQL Server 呼叫之 R 會話的相關資訊。 不過,如果 R 程式碼包含清除工作區的命令,例如 rm(list=ls())),則也會清除工作階段所有資訊和 R 工作區的其他物件。

因應措施是,避免在 SQL Server 中執行 R 時任意清除變數和其他物件。 雖然在 R 主控台內工作時清除工作區很常見,但它可能造成意想不到的結果。

  • 若要刪除特定變數,請使用 R remove 函數:例如 remove('name1', 'name2', ...)
  • 如有多個變數要刪除,請將暫存變數名稱儲存至清單,並執行定期記憶體回收。

8.可作為輸出提供給 R 指令碼的資料限制

您無法在 R 指令碼中使用下列類型的查詢結果:

  • 來自參考 AlwaysEncrypted 資料行之 Transact-SQL 查詢的資料。

  • 來自參考遮罩資料行之 Transact-SQL 查詢的資料。

    若您需要在 R 指令碼中使用遮罩的資料,一項可行的因應措施是在暫存資料表中製作資料複本,並改用該資料。

9.使用字串作為因素可能導致效能降低

使用字串類型變數作為因素,可能會大幅增加 R 作業所使用的記憶體數量。 這通常是 R 的已知問題,而且有很多關於該主題的文章。 例如,請參閱 R-bloggers) 或 stringsAsFactors 中的 R-Mount 不是 R 中第一級公民的因素 :由 John Peng 授權的書目。

雖然問題並非SQL Server特有,但它可能會大幅影響在 SQL Server 中執行的 R 程式碼效能。 字串通常會儲存為 varchar 或 nvarchar,而且如果字串資料的資料行有許多唯一值,則在內部將這些字串轉換為整數,並由 R 傳回到字串的流程甚至可能導致記憶體配置錯誤。

如果您不一定需要字串資料類型來進行其他作業,在資料準備過程中,將字串值對應到數值 (整數) 資料類型,從效能和規模觀點來看是有益的。

如需此問題的討論和其他秘訣,請參閱 R Services 的效能 - 資料最佳化

10.SQL Server 資料來源不支援 varsToKeepvarsToDrop 引數

當您使用 rxDataStep 函數來將結果寫入至資料表時,使用 varsToKeepvarsToDrop 是指定要包含為作業一部分或或排除在外之資料行的便捷方式。 不過,SQL Server 資料來源不支援這些引數。

11.sp_execute_external_script中 SQL 資料類型的支援有限

並非 SQL 支援的所有資料類型都能用在 R。因應措施是考慮將不支援的資料類型先轉換成支援的資料類型,再將資料傳遞至 sp_execute_external_script。

如需詳細資訊,請參閱 R 程式庫和資料類型

12.在 varchar 資料行中使用 unicode 字串可能損毀字串

將 Varchar 資料行中的 unicode 資料從 SQL Server 傳遞至 R/Python 可能會導致字串損毀。 這是因為SQL Server定序中這些 Unicode 字串的編碼方式可能與 R/Python 中使用的預設 UTF-8 編碼不符。

若要將任何非 ASCII 字串資料從 SQL Server 傳送至 R/Python,請使用 SQL Server 2019 (15.x) ) 中提供的 UTF-8 編碼 (,或針對相同類型使用 Nvarchar 類型。

13.只能從 sp_execute_external_script 傳回一個 raw 類型的值

當 R 傳回二進位資料類型 (R raw 資料類型) 時,必須在輸出資料框架中傳送此值。

利用 raw 以外的資料類型,加上 OUTPUT 關鍵字,就能將參數值和預存程序的結果一起傳回。 如需詳細資訊,請參閱參數

如果您想要使用包含原始類型值的多個輸出集,其中一個可能的因應措施是執行多個預存程式的呼叫,或使用 ODBC 將結果集傳回至SQL Server。

14.遺失有效位數

由於 Transact-SQL 和 R 支援各種資料類型,因此數值資料類型在轉換期間可能會遺失精確度。

如需有關隱含資料類型轉換的詳細資訊,請參閱 R 程式庫和資料類型

15.當您使用 transformFunc 參數時發生變數範圍錯誤

若要在進行模型化時轉換資料,您可以在 rxLinmodrxLogit 等函數中傳遞 transformFunc 引數。 不過,巢狀函數呼叫可能會在 SQL Server 計算內容中導致範圍設定錯誤,即使呼叫可在本機計算內容中正常運作也一樣。

適用於分析的範例資料集沒有任何變數

例如,假設您已在本機全域環境中定義兩個函數 fg,而 g 會呼叫 f。 在涉及 g 的分散式或遠端呼叫中,即使您已將 fg 都傳遞至遠端呼叫,對 g 的呼叫也可能會因為找不到 f 而失敗並產生此錯誤。

若遇到此問題,您可以在 f 定義內嵌 g的定義以解決此問題, g 前的任何位置則會正常呼叫 f

例如:

f <- function(x) { 2*x * 3 }
g <- function(y) {
              a <- 10 * y
               f(a)
}

若要避免此錯誤,請重寫定義,如下所示:

g <- function(y){
              f <- function(x) { 2*x +3}
              a <- 10 * y
              f(a)
}

16.使用 RevoScaleR 匯入及操作資料

從資料庫讀取 varchar 資料行時,會修剪空白字元。 若要避免此情況,請在字串頭尾使用非空白字元。

使用 rxDataStep 等函數來建立包含 varchar 資料行的資料庫資料表時,會依據資料範例來估計資料行寬度。 如果寬度各有不同,則可能需要將所有字串填補到常見長度。

使用 rxImportrxTextToXdf 的重複呼叫來匯入或附加資料列,將多個輸入檔案結合成單一 .xdf 檔案時,不支援使用轉換來變更變數的資料類型。

17.對 rxExec 的支援有限

在 SQL Server 2016 中,RevoScaleR 套件所提供的 rxExec 函數只能在單一執行緒模式中使用。

18.提高參數大小上限以支援 rxGetVarInfo

如果您使用變數數目極大 (例如 40,000 個以上) 的資料集,就必須在啟動 R 時設定 max-ppsize 旗標,才能使用 rxGetVarInfo 等函數。 max-ppsize 旗標會指定指標保護堆疊的大小上限。

如果您使用 R 主控台 (例如,RGui.exe 或 RTerm.exe),則可輸入下列內容來將 max-ppsize 的值設為 500000:

R --max-ppsize=500000

19.rxDTree 函數的問題

rxDTree 函數目前不支援公式內的轉換。 尤其不支援使用 F() 語法即時建立因數。 不過,會將數值資料自動量化。

要求的因數會被視為與所有 RevoScaleR 分析函數中的因數相同,除了 rxDTree以外。

20.使用 Data.table 作為 R 中的 OutputDataSet

在 SQL Server 2017 累積更新 13 (CU13) 和更早版本中,不支援使用 data.table 作為 R 中的 OutputDataSet。 可能出現以下訊息:

Msg 39004, Level 16, State 20, Line 2
A 'R' script error occurred during execution of 
'sp_execute_external_script' with HRESULT 0x80004004.
Msg 39019, Level 16, State 2, Line 2
An external script error occurred: 
Error in alloc.col(newx) : 
  Internal error: length of names (0) is not length of dt (11)
Calls: data.frame ... as.data.frame -> as.data.frame.data.table -> copy -> alloc.col

Error in execution.  Check the output for more information.
Error in eval(expr, envir, enclos) : 
  Error in execution.  Check the output for more information.
Calls: source -> withVisible -> eval -> eval -> .Call
Execution halted

在 SQL Server 2017 累積更新 14 (CU14) 和更新版本中,支援使用 data.table 作為 R 中的 OutputDataSet

21.安裝程式庫時執行長指令碼失敗

執行長時間執行的外部指令碼工作階段,並讓 dbo 平行嘗試在不同資料庫上安裝程式庫,即可終止指令碼。

例如,針對 master 執行此外部指令碼:

USE MASTER
DECLARE @language nvarchar(1) = N'R'
DECLARE @script nvarchar(max) = N'Sys.sleep(100)'
DECLARE @input_data_1 nvarchar(max) = N'select 1'
EXEC sp_execute_external_script @language = @language, @script = @script, @input_data_1 = @input_data_1 with result sets none
go

雖然 dbo 會在 LibraryManagementFunctional 中平行安裝程式庫:

USE [LibraryManagementFunctional]
go

CREATE EXTERNAL LIBRARY [RODBC] FROM (CONTENT = N'/home/ani/var/opt/mssql/data/RODBC_1.3-16.tar.gz') WITH (LANGUAGE = 'R')
go

DECLARE @language nvarchar(1) = N'R'
DECLARE @script nvarchar(14) = N'library(RODBC)'
DECLARE @input_data_1 nvarchar(8) = N'select 1'
EXEC sp_execute_external_script @language = @language, @script = @script, @input_data_1 = @input_data_1
go

先前針對 master 長時間執行的外部指令碼將會終止,並出現下列錯誤訊息:

執行 'sp_execute_external_script' 時發生 'R' 指令碼錯誤,HRESULT 為 0x800704d4。

因應措施

不要與長時間執行的查詢平行執行程式庫安裝。 或者,在安裝完成之後,重新執行長時間執行的查詢。

僅適用于:僅限 Linux & 上的 SQL Server 2019 巨量資料叢集。

22.SQL Server 在執行包含平行執行的 R 指令碼時停止回應

SQL Server 2019 包含會影響使用平行執行之 R 指令碼的迴歸。 範例包括搭配 RxLocalPar 計算內容和使用平行套件的指令碼,來使用 rxExec。 這個問題是因為在 SQL Server 中執行時,平行套件在寫入 Null 裝置時遇到的錯誤所造成。

適用範圍:SQL Server 2019。

23.money/numeric/decimal/bigint 資料類型的精確度遺失

使用 sp_execute_external_script 執行 R 指令碼,允許使用 money、numeric、decimal 和 bigint 資料類型作為輸入資料。 不過,由於這些資料類型會轉換成 R 的數值類型,因此高度值或具有小數點的值會失去精確度。

  • Money:有時候,美分值不精確,且會發出警告:警告:無法精確地表示美分值。
  • Numeric/Decimal:搭配 R 指令碼的 sp_execute_external_script 不支援這些資料類型的完整範圍,且會改變最後幾個小數位數,特別是分數的小數位數。
  • Bigint:R 最多只支援 53 位元整數,之後即會開始失去精確度。

Python 指令碼執行問題

本節包含在 SQL Server 上執行 Python 的特定已知問題,以及與 Microsoft 所發佈之 Python 套件相關的問題,包括 revoscalepy \(英文\) 和 microsoftml \(英文\)。

1.如果模型的路徑太長,呼叫預先定型的模型即會失敗

如果您在 SQL Server 2017 的早期版本中安裝預先定型的模型,則已定型之模型檔案的完整路徑可能太長,以致於 Python 無法讀取。 此限制已在較新的服務版本中修正。

有數個可能的因應措施:

  • 當您安裝預先定型的模型時,請選擇自訂位置。
  • 如果可能,在含有較短路徑的自訂安裝路徑 (例如 C:\SQL\MSSQL14.MSSQLSERVER) 底下,安裝 SQL Server 執行個體。
  • 使用 Windows 公用程式 Fsutil \(英文\),來建立將模型檔案對應至較短路徑的永久連結。
  • 更新至最新服務版本。

2.將序列化模型儲存至 SQL Server 時發生錯誤

當您將模型傳遞至遠端 SQL Server 執行個體,並嘗試使用 revoscalepy \(英文\) 中的 rx_unserialize 函數來讀取二進位模型時,您可能收到下列錯誤:

NameError: 尚未定義名稱 'rx_unserialize_model'

如果您使用最新版本的序列化函式儲存模型,但還原序列化模型的SQL Server實例無法辨識序列化 API,就會引發此錯誤。

若要解決問題,請將 SQL Server 2017 執行個體升級為 CU3 或更新版本。

3.無法將 varbinary 變數初始化,會在 BxlServer 中導致錯誤

如果您使用 sp_execute_external_script 在 SQL Server 中執行 Python 程式碼,而且程式碼具有類型 varbinary(max)、varchar(max) 或類似類型的輸出變數,則變數必須初始化或設定為指令碼的一部分。 否則,資料交換元件 BxlServer 會引發錯誤並停止運作。

此限制將會在即將推出的服務版本中修正。 因應措施是,確定已在 Python 指令碼內將變數初始化。 您可以使用任何有效的值,如下列範例所示:

declare @b varbinary(max);
exec sp_execute_external_script
  @language = N'Python'
  , @script = N'b = 0x0'
  , @params = N'@b varbinary(max) OUTPUT'
  , @b = @b OUTPUT;
go
declare @b varchar(30);
exec sp_execute_external_script
  @language = N'Python'
  , @script = N' b = ""  '
  , @params = N'@b varchar(30) OUTPUT'
  , @b = @b OUTPUT;
go

4.成功執行 Python 程式碼時的遙測警告

從 SQL Server 2017 CU2 開始,即使 Python 程式碼執行成功,也可能出現下列訊息:

來自外部指令碼的 STDERR 訊息:~PYTHON_SERVICES\lib\site-packages\revoscalepy\utils\RxTelemetryLoggerSyntaxWarning: telemetry_state 會在全域宣告之前使用

此問題已在 SQL Server 2017 累積更新 3 (CU3) 中修正。

5.不支援數值、小數和貨幣資料類型

從 SQL Server 2017 累積更新 12 (CU12) 開始,在搭配使用 Python 與 sp_execute_external_script 時,不支援 WITH RESULT SETS 中的 numeric、decimal 及 money 資料類型。 可能出現以下訊息:

[Code: 39004, SQL State: S1000]使用 HRESULT 0x80004004 執行'sp_execute_external_script' 時發生 'Python' 腳本錯誤。

[Code: 39019, SQL State: S1000]發生外部腳本錯誤:

SqlSatelliteCall 錯誤:輸出架構中不支援的類型。 支援的類型:bit、Smallint、int、datetime、smallmoney、real 和 float。 char、Varchar 受到部分支援。

此問題已在 SQL Server 2017 累積更新 14 (CU14) 中修正。

6.在 Linux 上使用 pip 安裝 Python 套件時,發生錯誤的解譯器錯誤

在 SQL Server 2019 上,如果您嘗試使用 pip。 例如:

/opt/mssql/mlservices/runtime/python/bin/pip -h

接著,您將收到下列錯誤:

bash: /opt/mssql/mlservices/runtime/python/bin/pip: /opt/microsoft/mlserver/9.4.7/bin/python/python: 錯誤的解譯器:無此檔案或目錄

因應措施

Python 套件授權單位 (PyPA) \(英文\) 安裝 pip

wget 'https://bootstrap.pypa.io/get-pip.py' 
/opt/mssql/mlservices/bin/python/python ./get-pip.py 

建議

請參閱使用 sqlmlutils 安裝 Python 套件

適用範圍:Linux 上的 SQL Server 2019

7.在 Windows 上安裝 SQL Server 2019 之後,無法使用 pip 安裝 Python 套件

在 Windows 上安裝 SQL Server 2019 之後,嘗試從 DOS 命令列透過 pip 安裝 Python 套件將會失敗。 例如:

pip install quantfolio

這將傳回下列錯誤訊息:

使用需要 TLS/SSL 的位置設定了 pip,但是無法使用 Python 中的 SSL 模組。

這是 Anaconda 套件特有的問題。 它將會在即將推出的服務版本中修正。

因應措施

複製下列檔案:

  • libssl-1_1-x64.dll
  • libcrypto-1_1-x64.dll

從下列資料夾
C:\Program Files\Microsoft SQL Server\MSSSQL15.MSSQLSERVER\PYTHON_SERVICES\Library\bin

到下列資料夾
C:\Program Files\Microsoft SQL Server\MSSSQL15.MSSQLSERVER\PYTHON_SERVICES\DLLs

然後開啟新的 DOS 命令殼層提示字元。

適用範圍:Windows 上的 SQL Server 2019

8.在 Linux 上使用不含 libc++abo.sosp_execute_external_script 時發生錯誤

在未安裝 libc++abi.so 的全新 Linux 電腦上,執行 sp_execute_external_script (SPEES) 查詢會失敗,並出現「無此檔案或目錄」錯誤。

例如:

EXEC sp_execute_external_script
    @language = N'Python'
    , @script = N'
OutputDataSet = InputDataSet'
    , @input_data_1 = N'select 1'
    , @input_data_1_name = N'InputDataSet'
    , @output_data_1_name = N'OutputDataSet'
    WITH RESULT SETS (([output] int not null));
Msg 39012, Level 16, State 14, Line 0
Unable to communicate with the runtime for 'Python' script for request id: 94257840-1704-45E8-83D2-2F74AEB46CF7. Please check the requirements of 'Python' runtime.
STDERR message(s) from external script:

Failed to load library /opt/mssql-extensibility/lib/sqlsatellite.so with error libc++abi.so.1: cannot open shared object file: No such file or directory.

SqlSatelliteCall error: Failed to load library /opt/mssql-extensibility/lib/sqlsatellite.so with error libc++abi.so.1: cannot open shared object file: No such file or directory.
STDOUT message(s) from external script:
SqlSatelliteCall function failed. Please see the console output for more information.
Traceback (most recent call last):
  File "/opt/mssql/mlservices/libraries/PythonServer/revoscalepy/computecontext/RxInSqlServer.py", line 605, in rx_sql_satellite_call
    rx_native_call("SqlSatelliteCall", params)
  File "/opt/mssql/mlservices/libraries/PythonServer/revoscalepy/RxSerializable.py", line 375, in rx_native_call
    ret = px_call(functionname, params)
RuntimeError: revoscalepy function failed.
Total execution time: 00:01:00.387

因應措施

執行以下命令:

sudo cp /opt/mssql/lib/libc++abi.so.1 /opt/mssql-extensibility/lib/

適用範圍:Linux 上的 SQL Server 2019

9.無法使用 sqlmlutils 來安裝 tensorflow 套件

sqlmlutils 套件是用來在 SQL Server 2019 中安裝 Python 套件。 您必須下載、安裝及更新 Microsoft Visual C++ 2015-2019 可轉散發套件 (x64)。 不過,您無法使用 sqlmlutils 來安裝 tensorflow 套件。 Tensorflow 套件相依於較新版本的 numpy,而不是安裝在 SQL Server 中的版本。 不過,numpy 是預先安裝的系統套件,當嘗試安裝 tensorflow 時,sqlmlutils 無法更新該套件。

因應措施

在系統管理員模式中使用命令提示字元,執行下列命令,並以 SQL 實例名稱取代 "MSSQLSERVER":

"C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\PYTHON_SERVICES\python.exe" -m pip install --upgrade tensorflow

如果收到 "TLS/SSL" 錯誤,請參閱本文稍早的 7.無法使用 pip 安裝 Python 套件

適用範圍: Windows 上的 SQL Server 2019

Revolution R Enterprise 和 Microsoft R Open

本節列出 Revolution Analytics 提供的 R 連線能力、開發及效能工具的特定問題。 這些工具是在舊版的 SQL Server 中提供。

通常建議您解除安裝這些舊版本,並安裝最新版的 SQL Server 或 Microsoft R Server。

1.不支援 Revolution R Enterprise

不支援將 Revolution R Enterprise 與任何版本的 R 服務並存安裝 (資料庫內) 。

如果您有 Revolution R Enterprise 的現有授權,則必須將它放在與SQL Server實例以及您想要用來連線到SQL Server實例的任何工作站不同的電腦上。

某些發行前版本的 R Services (資料庫內) 包含由 Revolution Analytics 所建立之 Windows 的 R 開發環境。 此工具已不再提供且不受支援。

若要與 R Services () 相容,建議您改為安裝Microsoft R Client。 Visual Studio R 工具Visual Studio Code \(英文\) 也支援 Microsoft R 解決方案。

2.SQLite ODBC 驅動程式與 RevoScaleR 的相容性問題

SQLite ODBC 驅動程式修訂版 0.92 與 RevoScaleR 不相容。 修訂版 0.88-0.91 及 0.93 和更新版本已知是相容的。

後續步驟

收集資料以針對機器學習服務進行疑難排解SQL Server