R Shiny 和 Spark:如何释放 Spark 资源?
R Shiny and Spark: how to free Spark resources?
假设我们有一个 Shiny 应用程序 部署 在 Shiny 服务器上。我们预计该应用程序将像往常一样通过网络浏览器供多个用户使用。
Shiny 应用程序的 server.R
包含一些 sparklyr
包代码,这些代码连接到经典 filter
、select
、mutate
和 arrange
对位于 HDFS 上的数据的操作。
是否必须断开与 Spark 的连接:在 server.R 代码末尾包含一个 spark_disconnect
以释放资源? 我认为我们应该永远不要断开连接,让 Spark 为每个到达和离开的用户处理负载。有人可以帮我确认一下吗?
TL;DR SparkSession
和 SparkContext
不是可以按需启动的轻量级资源。
抛开与直接从面向用户的应用程序启动 Spark 会话相关的所有安全考虑,在服务器内部维护 SparkSession
(在进入时启动会话,在退出时停止)根本不是一个可行的选择。
server
函数将在每次即将发生的事件有效地重新启动整个 Spark 应用程序并使项目无法使用时执行。而这只是冰山一角。由于 Spark 重用现有 sessions
(单个 JVM 只允许一个上下文),如果重用会话已从另一个 server
调用中停止,多用户访问可能会导致随机失败。
一个可能的解决方案是用 spark_disconnect
注册 onSessionEnded
,但我很确定它只在单用户环境中有用。
另一种可能的方法是使用全局连接,并在退出时用函数调用 spark_disconnect_all
包装 runApp
:
runApp <- function() {
shiny::runApp()
on.exit({
spark_disconnect_all()
})
}
尽管在实践中资源管理器应该在驱动程序解除关联时释放资源,而不是显式停止会话。
假设我们有一个 Shiny 应用程序 部署 在 Shiny 服务器上。我们预计该应用程序将像往常一样通过网络浏览器供多个用户使用。
Shiny 应用程序的 server.R
包含一些 sparklyr
包代码,这些代码连接到经典 filter
、select
、mutate
和 arrange
对位于 HDFS 上的数据的操作。
是否必须断开与 Spark 的连接:在 server.R 代码末尾包含一个 spark_disconnect
以释放资源? 我认为我们应该永远不要断开连接,让 Spark 为每个到达和离开的用户处理负载。有人可以帮我确认一下吗?
TL;DR SparkSession
和 SparkContext
不是可以按需启动的轻量级资源。
抛开与直接从面向用户的应用程序启动 Spark 会话相关的所有安全考虑,在服务器内部维护 SparkSession
(在进入时启动会话,在退出时停止)根本不是一个可行的选择。
server
函数将在每次即将发生的事件有效地重新启动整个 Spark 应用程序并使项目无法使用时执行。而这只是冰山一角。由于 Spark 重用现有 sessions
(单个 JVM 只允许一个上下文),如果重用会话已从另一个 server
调用中停止,多用户访问可能会导致随机失败。
一个可能的解决方案是用 spark_disconnect
注册 onSessionEnded
,但我很确定它只在单用户环境中有用。
另一种可能的方法是使用全局连接,并在退出时用函数调用 spark_disconnect_all
包装 runApp
:
runApp <- function() {
shiny::runApp()
on.exit({
spark_disconnect_all()
})
}
尽管在实践中资源管理器应该在驱动程序解除关联时释放资源,而不是显式停止会话。