现在可以将 set.seed 与 Sparklyr 一起使用吗?

Does using set.seed with Sparklyr work now?

我上次使用 Sparklyr(2017 年 10 月)时,在使用 Sparklyr 时出现了使用 set.seed 的问题。我不确定确切的问题是什么,而且我似乎无法在任何地方找到任何相关信息。 set.seed 现在可以与 Sparklyr 正常工作还是仍然是一个悬而未决的问题?

一般

set.seed 工作得很好,它应该在本地 R 会话 a.k.a 驱动程序中(您调用 spark_connect 的地方)。

它不起作用,并且由于多种原因不能跨执行器工作,包括不同的执行上下文(R、JVM)和/或不同的环境(使用 spark_apply 等方法)。

使用 Spark 包装器:

使用 ml_*ft_ 等方法。种子由 Spark 设置,通常使用 seed 参数公开。例如 ml_kmeans:

> ml_kmeans
function (x, formula = NULL, k = 2L, max_iter = 20L, tol = 1e-04, 
    init_steps = 2L, init_mode = "k-means||", seed = NULL, features_col = "features", 
    prediction_col = "prediction", uid = random_string("kmeans_"), 
    ...) 
{
    UseMethod("ml_kmeans")
}
<environment: namespace:sparklyr>

也可以为 RNG SQL 函数设置种子:

> df %>% mutate(rand = rand(42L), randn = randn(42L)) %>% head(3)
# Source:   lazy query [?? x 3]
# Database: spark_connection
     id  rand  randn
  <int> <dbl>  <dbl>
1     1 0.666  0.409
2     2 0.858  0.881
3     3 0.914 -2.01 
> df %>% mutate(rand = rand(42L), randn = randn(42L)) %>% head(3)
# Source:   lazy query [?? x 3]
# Database: spark_connection
     id  rand  randn
  <int> <dbl>  <dbl>
1     1 0.666  0.409
2     2 0.858  0.881
3     3 0.914 -2.01 

使用执行端R代码

据我所知,目前还没有可用的选项。在多台机器上正确设置 RNG 种子需要 API 访问低级任务信息,即使假设没有其他非确定性来源,在异构环境中也可能很脆弱。

不过

RNG 状态并不是分布式系统中不确定行为的唯一来源。由于在 Spark 中通常不保证任何特定的执行顺序,即使 RNG 状态设置正确,不同运行的结果也可能不同。

总体:

如果你的目标是可重现的研究,你可能仍然可以使用 Spark,但它需要防御性编程,有意识地设置集群,这不是你使用内置工具可以做到的,更不用说有限的高级包装器,例如 sparklyr.