一般情况
set.seed 工作得很好,它假设在本地 R 会话中,也就是驱动程序(您调用 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。