首页 > 解决方案 > RStudio Connect - 从雪花数据库下载时出现间歇性 C 堆栈使用错误

问题描述

从 Snowflake 数据库视图下载相当大的数据集时出现间歇性问题。数据集大约有 6000 万行。以下是用于连接到 Snowflake 并下载数据的代码:

sf_db <- dbConnect(odbc::odbc(),
                  Driver="SnowflakeDSIIDriver",
                  AUTHENTICATOR = "SNOWFLAKE_JWT",
                  Server = db_param_snowflake$server,
                  Database = db_param_snowflake$db,
                  PORT=db_param_snowflake$port,
                  Trusted_Connection = "True",
                  uid = db_param_snowflake$uid,
                  db = db_param_snowflake$db,
                  warehouse = db_param_snowflake$warehouse,
                  PRIV_KEY_FILE = db_param_snowflake$priv_key_file,
                  PRIV_KEY_FILE_PWD = db_param_snowflake$priv_key_file_pwd,
                  timeout = 20)

snowflake_query <- 'SELECT "address" FROM ABC_DB.DEV.VW_ADDR_SUBSET'

my_table <- tbl(sf_db, sql(snowflake_query)) %>%
collect() %>%
data.table()

大约 50% 的时间,这部分脚本运行良好。当它失败时,RStudio Connect 日志包含如下消息:

2021/05/05 18:17:51.522937848 Error: C stack usage  940309959492 is too close to the limit
2021/05/05 18:17:51.522975132 In addition: Warning messages:
2021/05/05 18:17:51.523077000 Lost warning messages
2021/05/05 18:17:51.523100338 
2021/05/05 18:17:51.523227401  *** caught segfault ***
2021/05/05 18:17:51.523230793 address (nil), cause 'memory not mapped'
2021/05/05 18:17:51.523251671 Warning: stack imbalance in 'lazyLoadDBfetch', 113 then 114

为了使这项工作始终如一,我尝试使用分批下载行的过程,并且通常在下载数百万条记录之后也会间歇性地失败。我也尝试过连接 Pool 和下载,这有时也只能工作。还尝试了 dbGetQuery,同样的结果不一致。

我对此进行了广泛的谷歌搜索,发现了与 C 堆栈错误和递归相关的线程,但这些问题似乎是一致的(不像这个有时有效的问题),我不确定如果有一些递归进程正在运行,我能做什么此下载的一部分。

我们在具有 125GB 内存的 Connect 服务器上运行此脚本,并且在此脚本运行时没有其他脚本在运行,并且(至少根据显示 CPU 和内存使用情况的管理屏幕)此脚本不使用任何在它(有时)失败之前超过 8-10GB。至于它何时成功和何时失败,我没有注意到任何模式。我现在可以运行它但它失败了,然后立即再次运行它并且它可以工作。成功后,大约需要 7-8 分钟。当它失败时,它通常会在 3-8 分钟后失败。所有软件包都是最新版本,而且这一直工作不一致,所以想不出什么可以回滚。

欢迎任何有关故障排除的想法或替代方法的想法。谢谢你。

标签: rsnowflake-cloud-data-platform

解决方案


推荐阅读