SQL Server 2019 CTP 2.4 の PolyBase (2019 の新機能版) をインストールしようとした際の注意点についてまとめておこうかと。
日本語版の Windows Server 2019 + SQL Server 2019 CTP 2.4 の環境を使用していますが、日本語固有 (英語以外) の問題も一部ありそうです。
環境に依存しているかの細かな確認はできていないのですがフィードバックはしておこうかと思います。
1.PolyBase のインストールを正常完了させることができない
最初から致命的な現象なのですが私の環境では、CTP 2.4 の PolyBase のインストールを完了させることができませんでした…。
インストールとしては、SSMS 18.0 RC1 をインストール済みの環境に、次のように 2 つのコンポーネントを有効にして SQL Server をインストールしています。
(インストールパラメーターはデフォルトです)
この状態でインストールをすると、次のエラー (そのサービスは指定時間内に開始要求または制御要求に応答しませんでした。) が発生し PolyBase のインストールを完了させることができませんでした。
「SQL_Polybase_Install_Startup_Cpu64」というエラーで、PolyBase のサービス (SQL Server PolyBase エンジン)を起動することができなくてエラーが発生しています。
手動でサービスを起動しようとしてもすぐに終了してしまいます。
この原因ですが、次のエラーが発生していることに起因しています。
2019-04-01 00:24:19.15? Host startup succeeded
Executing Entry point in assembly DwEngineService, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Exception in InitService
System.Reflection.TargetInvocationException: 呼び出しのターゲットが例外をスローしました。 —> System.TypeInitializationException: ‘Microsoft.SqlServer.DataWarehouse.EngineService.Engine’ のタイプ初期化子が例外をスローしました。 —> System.IO.FileNotFoundException: ファイルまたはアセンブリ ‘Microsoft.SqlServer.XEvent.Configuration.dll’、またはその依存関係 の 1 つが読み込めませんでした。指定されたモジュールが見つかりません。
XEvent ですので拡張イベント関係のアセンブリで、PolyBase に必要となるものが読み込めていないようです…。
とりあえず、SSMS 17.9.1 をインストールしたところ、サービスを起動できるようになりましたので、同様のエラーとなった場合は、インストールしてみるとよいかと。
SSMS 17.9.1 をインストールした状態であれば、上記のエラーは発生しませんでした。
2.日本語環境で動作させることができない
SSMS 17.9.1 をインストールすることでひとまず起動するようになりました。
次に PolyBase のセットアップを実行して、標準で含まれている ODBC の一つである、SQL Server 用の ODBC ドライバーで外部に接続してみたいと思います。
EXEC sp_configure 'polybase enabled', 1 reconfigure
上記のクエリで PolyBase を有効にした後で、SQL Server のインスタンスを再起動することで PolyBase のサービスも再起動しています。
今回は次のようなクエリで外部テーブルを作成してみます。
CREATE EXTERNAL TABLE AzureSQLDB_NATION ( [N_NATIONKEY] [int] NOT NULL, [N_NAME] [char](25) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [N_REGIONKEY] [int] NOT NULL, [N_COMMENT] [varchar](152) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ) WITH ( LOCATION = 'tpch.dbo.NATION', DATA_SOURCE = SqlServerInstance );
そうすると次のエラーが発生しました。
メッセージ 105082、レベル 16、状態 1、行 17
105082; 汎用 ODBC エラー: [Microsoft][ODBC Driver Manager] SQL_HANDLE_ENV でのドライバーの SQLAllocHandle は失敗しました。 。
日本語環境で実行した場合、SQL Server の ODBC ドライバーの利用時に「C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Binn\Polybase\ODBC Drivers\PolyBase ODBC Driver for SQL Server\Resources\1033\msodbcsqlr17.rll」にアクセスが行われているようです。
ディレクトリを見ると「1033」しか入っていないのでエラーとなっているようです…。
ということで、1033 を 1041 としてコピーしてひとまず乗り切ります。
これで、SQL Server を使用した外部テーブルが作成することができるようになります。
ちなみにこの現象は CTP 2.3 でも発生していたようです。
(Windows 版の、PolyBase の環境、最初の方の CTP の時に構築した環境で止まっていたので気づきませんでした。。。。)
3.外部テーブルにアクセスできない
最後に外部テーブルにアクセスしてみると、次のようなエラーが発生しました。
メッセージ 7320、レベル 16、状態 110、行 31
リンク サーバー “(null)” の OLE DB プロバイダー “SQLNCLI11” に対するクエリ “Remote Query” を実行できません。CREATE TABLE 権限がデータベース ‘tempdb’ で拒否されました。
こちらは、2. と違って、CTP 2.3 では発生していなかったエラーですね。
権限周りの問題なので、あまり強すぎる権限はつけたくないのですが、こちらもひとまず乗り切るために次のクエリを実行しておきます。
(PolyBase のサービスが再起動するタイミングで権限周りがリセットされていそうで、実行タクトもいまいち…)
USE [tempdb] GO CREATE USER [NT AUTHORITY\NETWORK SERVICE] FOR LOGIN [NT AUTHORITY\NETWORK SERVICE] GO ALTER ROLE [db_owner] ADD MEMBER [NT AUTHORITY\NETWORK SERVICE] GO
これらの対応をしておくと、日本語環境の SQL Server 2019 CTP 2.4 でも PolyBase を使用した ODBC のアクセスができるようになるかと。