RevoScaleR を使用して R パッケージをインストールする
適用対象: SQL Server 2016 (13.x) SQL Server 2017 (14.x)
この記事では、RevoScaleR (バージョン 9.0.1 以降) 関数を使用して、Machine Learning Services または R Services を使って SQL Server に R パッケージをインストールする方法について説明します。 RevoScaleR 関数を使用すると、リモートの管理者以外のユーザーが、サーバーに直接アクセスせずに SQL Server にパッケージをインストールできます。
パッケージ管理の RevoScaleR 関数
次の表では、R パッケージのインストールと管理に使用される関数について説明します。
関数 | 説明 |
---|---|
rxSqlLibPaths | リモート SQL Server のインスタンス ライブラリのパスを特定します。 |
rxFindPackage | リモート SQL Server にある 1 つ以上のパッケージのパスを取得します。 |
rxInstallPackages | リモートの R クライアントからこの関数は呼び出して、指定したリポジトリから、またはローカルに保存されている zip 形式のパッケージを読み取ることで、SQL Server 計算コンテキストにパッケージをインストールします。 この関数では、依存関係をチェックして、ローカル計算コンテキストでの R パッケージのインストールなど、関連するパッケージを SQL Server にインストールできることを確認します。 このオプションを使用するには、サーバーとデータベースでパッケージ管理が有効になっている必要があります。 クライアント環境とサーバー環境の両方に、同じバージョンの RevoScaleR が必要です。 |
rxInstalledPackages | 指定した計算コンテキストにインストールされているパッケージの一覧を取得します。 |
rxSyncPackages | 指定した計算コンテキストについて、ファイル システムとデータベースの間にあるパッケージ ライブラリに関する情報をコピーします。 |
rxRemovePackages | 指定した計算コンテキストからパッケージを削除します。 また、依存関係を計算し、SQL Server の他のパッケージで使用されなくなったパッケージが削除されていることを確認して、リソースを解放します。 |
前提条件
SQL Server でリモート管理が有効になっている。 詳細については、SQL Server でのリモート R パッケージ管理の有効化に関する記事をご覧ください。
クライアント環境とサーバー環境の両方に、同じバージョンの RevoScaleR がある。 詳細については、「R パッケージ情報の取得」を参照してください。
サーバーとデータベースに接続して、R コマンドを実行する権限がある。 また、データベース ロールのメンバーで、指定したインスタンスとデータベースにパッケージをインストールできる。
共有スコープのパッケージは、指定したデータベースの
rpkgs-shared
ロールに属しているユーザーがインストールできます。 このロールのユーザーはすべて、共有パッケージをアンインストールできます。非公開スコープのパッケージは、データベースの
rpkgs-private
ロールに属しているすべてのユーザーがインストールできます。 ただし、ユーザーが表示およびアンインストールできるのは自分のパッケージのみです。データベース所有者は、共有または非公開パッケージを操作できます。
クライアント接続
重要
2022 年 7 月 1 日に、Machine Learning Server (以前の Microsoft R Server) のサポートは終了しました。 詳細については、Machine Learning Server の現状に関するページを参照してください。
同じネットワーク上にある Microsoft R Client または Microsoft Machine Learning Server (データ サイエンティストは無料の Developer エディションを使用することが多い) を、クライアント ワークステーションにできます。
リモート R クライアントからパッケージ管理関数を呼び出すときは、RxInSqlServer 関数を使用して、最初に計算コンテキスト オブジェクトを作成する必要があります。 その後、使用するパッケージ管理関数それぞれに、計算コンテキストを引数として渡します。
ユーザー ID は、通常、計算コンテキストを設定するときに指定されます。 計算コンテキストを作成するときにユーザー名とパスワードを指定しない場合は、R コードを実行しているユーザーの ID が使用されます。
R コマンド ラインで、インスタンスとデータベースへの接続文字列を定義します。
接続文字列を使用して、RxInSqlServer コンストラクターを使って、SQL Server 計算コンテキストを定義します。
sqlcc <- RxInSqlServer(connectionString = myConnString, shareDir = sqlShareDir, wait = sqlWait, consoleOutput = sqlConsoleOutput)
インストールするパッケージの一覧を作成し、その一覧を文字列変数に保存します。
packageList <- c("e1071", "mice")
rxInstallPackages を呼び出し、計算コンテキストと、パッケージ名を含む文字列変数を渡します。
rxInstallPackages(pkgs = packageList, verbose = TRUE, computeContext = sqlcc)
依存パッケージが必要な場合は、そのパッケージも、クライアントでインターネット接続が利用できることを前提としてインストールされます。
パッケージは、接続を確立しているユーザーの資格情報を使用して、そのユーザーの既定のスコープでインストールされます。
ストアド プロシージャでパッケージ管理関数を呼び出す
パッケージ管理関数は sp_execute_external_script
内で実行できます。 その場合、関数は、ストアド プロシージャ呼び出し元のセキュリティ コンテキストを使用して実行されます。
例
このセクションでは、計算コンテキストとして SQL Server インスタンスまたはデータベースに接続するときに、リモート クライアントからこれらの関数を使用する方法の例を示します。
すべての例で、接続文字列、または接続文字列を必要とする計算コンテキストを指定する必要があります。 この例は、SQL Server の計算コンテキストを作成する方法の 1 つを示しています。
instance_name <- "computer-name/instance-name";
database_name <- "TestDB";
sqlWait= TRUE;
sqlConsoleOutput <- TRUE;
connString <- paste("Driver=SQL Server;Server=", instance_name, ";Database=", database_name, ";Trusted_Connection=true;", sep="");
sqlcc <- RxInSqlServer(connectionString = connString, wait = sqlWait, consoleOutput = sqlConsoleOutput, numTasks = 4);
サーバーが配置されている場所とセキュリティ モデルによっては、接続文字列にドメインとサブネットの仕様を指定するか、SQL ログインを使用することが必要になる場合があります。 次に例を示します。
connStr <- "Driver=SQL Server;Server=myserver.financeweb.contoso.com;Database=Finance;Uid=RUser1;Pwd=RUserPassword"
リモート SQL Server 計算コンテキストにあるパッケージ パスを取得する
この例では、計算コンテキスト sqlcc
にある RevoScaleR パッケージのパスを取得します。
sqlPackagePaths <- rxFindPackage(package = "RevoScaleR", computeContext = sqlcc)
print(sqlPackagePaths)
結果
"C:/Program Files/Microsoft SQL Server/MSSQL14.MSSQLSERVER/R_SERVICES/library/RevoScaleR"
ヒント
SQL コンソール出力を表示するオプションを有効にした場合は、print
ステートメントの前にある関数から状態メッセージが表示されることがあります。 コードのテストが完了したら、計算コンテキスト コンストラクターで consoleOutput
を FALSE に設定して、メッセージを削除します。
複数のパッケージの場所を取得する
次の例では、計算コンテキスト sqlcc
にある RevoScaleR および lattice パッケージのパスを取得します。 複数のパッケージに関する情報を取得するには、パッケージ名を含む文字列ベクトルを渡します。
packagePaths <- rxFindPackage(package = c("RevoScaleR", "lattice"), computeContext = sqlcc)
print(packagePaths)
リモート計算コンテキストにあるパッケージのバージョンを取得する
このコマンドを R コンソールから実行して、計算コンテキスト sqlServer にインストールされているパッケージのビルド番号とバージョン番号を取得します。
sqlPackages <- rxInstalledPackages(fields = c("Package", "Version", "Built"), computeContext = sqlServer)
SQL Server にパッケージをインストールする
この例では、forecast パッケージとその依存関係を計算コンテキストにインストールします。
pkgs <- c("forecast")
rxInstallPackages(pkgs = pkgs, verbose = TRUE, scope = "private", computeContext = sqlcc)
パッケージを SQL Server から削除する
この例では、forecast パッケージとその依存関係を計算コンテキストから削除します。
pkgs <- c("forecast")
rxRemovePackages(pkgs = pkgs, verbose = TRUE, scope = "private", computeContext = sqlcc)
データベースとファイル システムの間でパッケージを同期する
次の例では、データベース TestDB をチェックして、すべてのパッケージがファイル システムにインストールされているかどうかを確認します。 不足しているパッケージがある場合は、そのパッケージがファイル システムにインストールされます。
# Instantiate the compute context
connectionString <- "Driver=SQL Server;Server=myServer;Database=TestDB;Trusted_Connection=True;"
computeContext <- RxInSqlServer(connectionString = connectionString )
# Synchronize the packages in the file system for all scopes and users
rxSyncPackages(computeContext=computeContext, verbose=TRUE)
パッケージの同期は、データベースごと、およびユーザーごとに実行されます。 詳細については、「SQL Server の R パッケージ同期」を参照してください。
ストアド プロシージャを使用して SQL Server にあるパッケージの一覧を表示する
Management Studio または T-SQL をサポートする他のツールから次のコマンドを実行し、ストアド プロシージャで rxInstalledPackages
を使用して、現在のインスタンスにインストールされているパッケージの一覧を取得します。
EXEC sp_execute_external_script
@language=N'R',
@script=N'
myPackages <- rxInstalledPackages();
OutputDataSet <- as.data.frame(myPackages);
'
rxSqlLibPaths
関数を使用すると、SQL Server Machine Learning Services によって使用されているアクティブなライブラリを特定できます。 このスクリプトは、現在のサーバーのライブラリ パスのみを返すことができます。
declare @instance_name nvarchar(100) = @@SERVERNAME, @database_name nvarchar(128) = db_name();
exec sp_execute_external_script
@language = N'R',
@script = N'
connStr <- paste("Driver=SQL Server;Server=", instance_name, ";Database=", database_name, ";Trusted_Connection=true;", sep="");
.libPaths(rxSqlLibPaths(connStr));
print(.libPaths());
',
@input_data_1 = N'',
@params = N'@instance_name nvarchar(100), @database_name nvarchar(128)',
@instance_name = @instance_name,
@database_name = @database_name;