现在使用带有Sparklyr的set.seed会有效吗?

时间:2018-02-04 23:02:02

标签: r apache-spark sparklyr

我最后一次与Sparklyr(17年10月)一起玩时,在使用Sparklyr时使用set.seed存在问题。我不确定究竟是什么问题,我似乎无法在任何地方找到任何相关信息。 set.seed现在是否正常使用Sparklyr,还是一个悬而未决的问题?

1 个答案:

答案 0 :(得分:1)

一般

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这样的高级包装器。