SQL Server 2016 R服务:sp_execute_external_script返回0x80004005错误

时间:2016-05-28 13:53:43

标签: 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脚本。我也知道整个过程在4分钟后在较少数量的记录上完成,例如1M。这让我相信这是一个扩展问题或数据的一些问题,而不是我的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分钟左右登录并注销,但我只能假设这是正常的保持活动行为。

已清理的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,4922,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 < / p>

[2016-05-30 08:04:07.444] [00002070] [00001EC4] [Info]会话(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]会话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服务中设置Job Cleanup等待时间的值。 虽然rlauncher.config中存在JOB_CLEANUP_ON_EXIT标志,但将其设置为0无效。该服务似乎在重新启动时将其重置为1.

同样,任何建议或协助都会非常感谢!

5 个答案:

答案 0 :(得分:1)

默认情况下,SQL Server在开始执行R脚本之前将所有数据作为数据帧读入R存储器。基于脚本使用1M行并且无法以100M行启动的事实,这可能是内存不足错误。要解决内存问题,(除了增加机器内存/减少数据大小),您可以尝试其中一种解决方案

  1. 使用sys.resource_governor_external_resource_pools max_memory_percent设置增加R进程执行的内存分配。默认情况下,SQL Server将R进程执行限制为20%的内存。
  2. Streaming execution for R script而不是将所有数据加载到内存中。请注意,此参数仅可用于R脚本的输出不依赖于读取或查看整个行集的情况。
  3. RLauncher.log中关于数据清理的警告发生在可以安全地忽略R脚本执行之后,可能不是您看到的故障的根本原因。

答案 1 :(得分:0)

无法在SQL中解决此问题,我只是避免了SQL Server Launchpad服务,该服务正在中断处理并使用R RODBC库从SQL中提取数据。拉动花了3个多小时(而不是6+使用sp_execute_external_procedure)。

这可能暗示SQL Launchpad服务,并建议内存不是问题。

答案 2 :(得分:0)

请在SQL Server 2016 RTM中尝试您的方案。自CTP3以来,已经进行了许多功能和性能修复。

有关如何获取SQL Server 2016 RTM结帐SQL Server 2016 is generally available today博文的详细信息。

答案 3 :(得分:0)

我对SQL Server 2016 RTM-CU1几乎有同样的问题。我的查询失败,错误0x80004004而不是0x80004005。它以10,000,000条记录开始失败,但这可能只与16 GB内存和/或不同数据有关。

我通过使用字段列表而不是“*”来解决它。即使字段列表包含数据源中的所有字段(在我的情况下是一个相当复杂的视图),具有字段列表的查询总是成功的,而“SELECT TOP x * FROM ...”总是因某些大的x而失败

答案 4 :(得分:0)

我遇到了类似的错误(0x80004004),问题是其中一列中的一行包含一个“非常”的特殊字符(我说的是“非常”,因为其他特殊字符没有导致此错误。)

因此,当我用'Folkel a net Telefinans'取代'Folkel å net Telefinans'时,问题就消失了。

在您的情况下,最后99M行中至少有一个值包含类似该字符的内容,您只需要替换它。我希望微软能够在某个时候解决这个问题。