2

1 億レコードのクエリを実行した後にいくつかの R コードを実行すると、プロセスが 6 時間以上実行された後に次のエラーが発生します。

Msg 39004, Level 16, State 19, Line 300
A 'R' script error occurred during execution of 'sp_execute_external_script'     
with HRESULT 0x80004005.

HRESULT 0x80004005 は、Windows で接続、アクセス許可、または「未指定」エラーに関連付けられているようです。

R コードにログインすると、プロセスが R スクリプトにまったく到達しないことがわかります。また、1M などの少数のレコードでは、手順全体が 4 分後に完了することもわかっています。これは、R コードのバグではなく、スケーリングの問題またはデータの何らかの問題であると私は信じています。独自の理由から、R コードまたは完全なクエリは含めていません。

ただし、ディスクまたはメモリ エラーが発生した場合は、0x80004004 メモリ不足エラーが表示されると思います。

SQL ERRORLOG で気づいた 1 つの手がかりは次のとおりです。

SQL Server received abort message and abort execution for major error : 18 
and minor error : 42

ただし、このログ行の時間はプロセスの中断とは一致しませんが、開始後に発生します。残念ながら、「メジャー エラー 18」についてはウェブ上に貴重な情報がほとんどありません。

SSMS から実行している場合の SQL トレースは、クライアントが約 6 分ごとにログインおよびログアウトしていることを示していますが、これは通常のキープアライブ動作であるとしか考えられません。

サニタイズされた sp_execute_external_script 呼び出し:

      EXEC sp_execute_external_script
                    @language = N'R'
                  , @script = N'#We never get here
                                #returns name of output data file'
                  , @input_data_1 = N'SELECT TOP 100000000 FROM DATA'   
                  , @input_data_1_name = N'x'
                  , @output_data_1_name = N'output_file_df'
                  WITH RESULT SETS ((output_file varchar(100) not null))

サーバー仕様: 8 コア 256 GB RAM SQL Server 2016 CTP 3

アイデア、提案、またはデバッグのヒントをいただければ幸いです。

更新: rlauncher.config で TRACE_LEVEL=3 を設定して、より高いレベルのログを有効にし、プロセスを再実行します。ログは、6.5 時間後にプロセス全体が失敗した時点で実行されたクリーンアップ プロセスを明らかにし、セッション ファイルを削除します。

[2016-05-30 01:35:34.419][00002070][00001EC4][情報] SQLSatellite_LaunchSatellite (1、A187BC64-C349-410B-861E-BFDC714C8017、1、49232、nullptr) 完了: 00000000

[2016-05-30 01:35:34.420][00002070][00001EC4][情報] < SQLSatellite_LaunchSatellite、dllmain.cpp、223

[2016-05-30 08:04:02.443][00002070][00001EC4][情報] > SQLSatellite_LauncherCleanUp、dllmain.cpp、309

[2016-05-30 08:04:07.443][00002070][00001EC4][警告] セッション A187BC64-C349-410B-861E-BFDC714C8017 クリーンアップ待機が 258 とエラー 0 で失敗しました

[2016-05-30 08:04:07.444][00002070][00001EC4][情報] セッション (A187BC64-C349-410B-861E-BFDC714C8017) は 2 つの出力ファイルを記録しました

[2016-05-30 08:04:07.444][00002070][00001EC4][警告] TryDeleteSingleFile(C:\PROGRA~1\MICROS~1\MSSQL1~1.MSS\MSSQL\EXTENS~1\MSSQLSERVER06\A187BC64- C349-410B-861E-BFDC714C8017\Rscript1878455a2528) は 32 で失敗しました

[2016-05-30 08:04:07.445][00002070][00001EC4][警告] TryDeleteSingleDirectory(C:\PROGRA~1\MICROS~1\MSSQL1~1.MSS\MSSQL\EXTENS~1\MSSQLSERVER06\A187BC64- C349-410B-861E-BFDC714C8017) は 32 で失敗しました

[2016-05-30 08:04:08.446][00002070][00001EC4][情報] セッション A187BC64-C349-410B-861E-BFDC714C8017 が MSSQLSERVER06 ユーザーから削除されました

[2016-05-30 08:04:08.447][00002070][00001EC4][情報] SQLSatellite_LauncherCleanUp (A187BC64-C349-410B-861E-BFDC714C8017) 完了: 00000000

実行時間の長いプロセスを続行できるようにする唯一の方法は、次の方法のようです: a) ジョブ クリーンアップの待機時間を延長して、ジョブが終了できるようにする b) ジョブ クリーンアップ プロセスを無効にする

これまでのところ、MSSQLLaunchpad サービスでジョブ クリーンアップの待機時間を設定する値を見つけることができませんでした。JOB_CLEANUP_ON_EXIT フラグが rlauncher.config に存在しますが、これを 0 に設定しても効果はありません。サービスを再起動すると、サービスはそれを 1 にリセットするようです。

繰り返しになりますが、提案や支援をいただければ幸いです。

4

5 に答える 5

2

既定では、SQL Server は、R スクリプトの実行を開始する前に、すべてのデータをデータ フレームとして R メモリに読み取ります。スクリプトが 1M 行で動作し、1 億行で開始できないという事実に基づいて、これはメモリ不足エラーである可能性があります。メモリの問題を解決するには (マシンのメモリを増やす/データ サイズを縮小する以外)、次の解決策のいずれかを試すことができます。

  1. sys.resource_governor_external_resource_pools max_memory_percent 設定を使用して、R プロセス実行のメモリ割り当てを増やします。既定では、SQL Server は R プロセスの実行をメモリの 20% に制限します。
  2. すべてのデータをメモリにロードする代わりに、R スクリプトのストリーミング実行。このパラメーターは、R​​ スクリプトの出力が行セット全体の読み取りまたは参照に依存しない場合にのみ使用できることに注意してください。

R スクリプトの実行後に発生したデータのクリーンアップに関する RLauncher.log の警告は、無視しても安全であり、表示されているエラーの根本的な原因ではない可能性があります。

于 2016-06-01T19:56:31.410 に答える
0

SQL でこの問題を解決できませんでした。処理を中断していた SQL Server Launchpad サービスを回避し、R RODBC ライブラリを使用して SQL からデータを取得しました。プルには 3 時間強かかりました (sp_execute_external_procedure を使用した場合は 6 時間以上かかりました)。

これは SQL Launchpad サービスに関係している可能性があり、メモリが問題ではないことを示唆しています。

于 2016-06-04T01:23:06.460 に答える
0

SQL Server 2016 RTM-CU1 でもほぼ同じ問題が発生しました。クエリがエラー 0x80004005 ではなく 0x80004004 で失敗しました。そして、10,000,000 レコードから始めて失敗しましたが、それは 16 GB のメモリしかないことや異なるデータに関連している可能性があります。

「*」の代わりにフィールドリストを使用して回避しました。フィールド リストにデータ ソースのすべてのフィールドが含まれている場合でも (私の場合はかなり複雑なビューです)、フィールド リストを使用するクエリは常に成功しますが、"SELECT TOP x * FROM ..." は大きな x に対して常に失敗します。 .

于 2016-09-15T09:15:21.050 に答える
0

SQL Server 2016 RTM でシナリオを試してください。CTP3 以降、多くの機能およびパフォーマンスの修正が行われました。

SQL Server 2016 RTM チェックアウトを取得する方法の詳細については、SQL Server 2016 が本日一般公開されたブログ投稿を参照してください。

于 2016-06-06T20:48:38.343 に答える