sql-server - SQL Server 2016 R 服务 : sp_execute_external_script returns 0x80004005 error

标签 sql-server r sql-server-2016 microsoft-r bigdata

我在查询 100M 条记录后运行一些 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 中注意到的一条线索如下:

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

然而,该日志行的时间与进程的中断并不相符,尽管它确实发生在进程启动之后。不幸的是,网络上关于“重大错误 18”的信息很少。

从 SSMS 运行时的 SQL 跟踪显示客户端每 6 分钟左右登录和注销一次,但我只能假设这是正常的 keepalive 行为。

清理后的 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 内存 SQL Server 2016 CTP 3

任何想法、建议或调试提示将不胜感激!

更新: 在 rlauncher.config 中设置 TRACE_LEVEL=3 以打开更高级别的日志记录并重新运行该进程。日志显示了一个正在运行的清理过程,删除 session 文件,整个过程在 6.5 小时后失败。

[2016-05-30 01:35:34.419][00002070][00001EC4][Info] 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][Info] > SQLSatellite_LauncherCleanUp,dllmain.cpp,309

[2016-05-30 08:04:07.443][00002070][00001EC4][警告] session A187BC64-C349-410B-861E-BFDC714C8017 清理等待失败,出现 258 和错误 0

[2016-05-30 08:04:07.444][00002070][00001EC4][Info] session (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][Info] session A187BC64-C349-410B-861E-BFDC714C8017 从 MSSQLSERVER06 用户中删除

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

看来让我的长时间运行的进程继续下去的唯一方法是: a) 延长作业清理等待时间以允许作业完成 b) 禁用作业清理进程

到目前为止,我无法找到在 MSSQLLaunchpad 服务中设置作业清理等待时间的值。 虽然 rlauncher.config 中存在 JOB_CLEANUP_ON_EXIT 标志,但将其设置为 0 无效。该服务似乎在重新启动时将其重置为 1。

再次强调,如有任何建议或帮助,我们将不胜感激!

最佳答案

默认情况下,SQL Server 在开始执行 R 脚本之前将所有数据作为数据帧读取到 R 内存中。由于脚本适用于 1M 行,但无法以 100M 行启动,因此这可能是内存不足错误。要解决内存问题(除了增加机器内存/减少数据大小之外),您可以尝试以下解决方案之一

  1. 使用 sys.resource_governor_external_resource_pools 增加 R 进程执行的内存分配max_memory_percent 设置。默认情况下,SQL Server 将 R 进程执行限制为内存的 20%。
  2. Streaming execution for R script而不是将所有数据加载到内存中。请注意,此参数只能在 R 脚本的输出不依赖于读取或查看整个行集的情况下使用。

RLauncher.log 中有关 R 脚本执行后发生的数据清理的警告可以安全地忽略,并且可能不是您所看到的失败的根本原因。

关于sql-server - SQL Server 2016 R 服务 : sp_execute_external_script returns 0x80004005 error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37499853/

相关文章:

python - arcpy 中同一数据集中所有对象的重叠 (st_overlaps)

SQL Server : retrieving stored procedure errors and use them

sql-server - 是否可以查看 sp_executesql 的代码?是SQL吗?

sql - 强制事务从另一个连接提交?

r - 第一次执行代码时颜色不正确

sql - 在 Case 表达式结果 SQL 中插入换行符

c# - SQL 在负载测试中拒绝连接

java - 并发日志记录到 sql DB - 线程不并行运行

java - JdbcTemplate 插入成功但数据库中没有行

r - R中非空数值向量的维数