R Shiny 和 Spark:如何释放 Spark 资源?

R Shiny and Spark: how to free Spark resources?

假设我们有一个 Shiny 应用程序 部署 在 Shiny 服务器上。我们预计该应用程序将像往常一样通过网络浏览器供多个用户使用。

Shiny 应用程序的 server.R 包含一些 sparklyr 包代码,这些代码连接到经典 filterselectmutatearrange 对位于 HDFS 上的数据的操作。

是否必须断开与 Spark 的连接:在 server.R 代码末尾包含一个 spark_disconnect 以释放资源? 我认为我们应该永远不要断开连接,让 Spark 为每个到达和离开的用户处理负载。有人可以帮我确认一下吗?

TL;DR SparkSessionSparkContext 不是可以按需启动的轻量级资源。

抛开与直接从面向用户的应用程序启动 Spark 会话相关的所有安全考虑,在服务器内部维护 SparkSession(在进入时启动会话,在退出时停止)根本不是一个可行的选择。

server 函数将在每次即将发生的事件有效地重新启动整个 Spark 应用程序并使项目无法使用时执行。而这只是冰山一角。由于 Spark 重用现有 sessions(单个 JVM 只允许一个上下文),如果重用会话已从另一个 server 调用中停止,多用户访问可能会导致随机失败。

一个可能的解决方案是用 spark_disconnect 注册 onSessionEnded,但我很确定它只在单用户环境中有用。

另一种可能的方法是使用全局连接,并在退出时用函数调用 spark_disconnect_all 包装 runApp

runApp <- function() {
  shiny::runApp()
  on.exit({
    spark_disconnect_all()
  })
}

尽管在实践中资源管理器应该在驱动程序解除关联时释放资源,而不是显式停止会话。