将set.seed与Sparkyr一起使用现在可以工作了吗?

将set.seed与Sparkyr一起使用现在可以工作了吗?,r,apache-spark,sparklyr,R,Apache Spark,Sparklyr,上次我玩SparkyR(10月17日)时,在使用SparkyR时使用set.seed时出现问题。我不确定确切的问题是什么,而且我似乎在任何地方都找不到关于它的任何东西。set.seed现在是否可以正常使用Sparkyr,还是仍然是一个悬而未决的问题?总体而言 set.seed在本地R会话a.k.a驱动程序(您调用spark\u connect的地方)中正常工作 由于多种原因,它不能工作,也不能跨执行器工作,包括不同的执行上下文(R、JVM)和/或不同的环境(使用spark\u apply)等方法

上次我玩SparkyR(10月17日)时,在使用SparkyR时使用set.seed时出现问题。我不确定确切的问题是什么,而且我似乎在任何地方都找不到关于它的任何东西。set.seed现在是否可以正常使用Sparkyr,还是仍然是一个悬而未决的问题?

总体而言

set.seed
在本地R会话a.k.a驱动程序(您调用
spark\u connect
的地方)中正常工作

由于多种原因,它不能工作,也不能跨执行器工作,包括不同的执行上下文(R、JVM)和/或不同的环境(使用
spark\u apply
)等方法)

带火花包装器

使用
ml.*
ft.
等方法。种子由Spark设置,通常使用
seed
参数公开。例如
ml\u 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>
>ml\u kmeans
函数(x,公式=NULL,k=2L,最大值=20L,tol=1e-04,
init_steps=2L,init_mode=“k-means | |”,seed=NULL,features_col=“features”,
prediction\u col=“prediction”,uid=随机字符串(“kmeans”),
...) 
{
使用方法(“ml_kmeans”)
}
也可以为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 
>df%>%变异(rand=rand(42L),randn=randn(42L))%>%头(3)
#来源:惰性查询[?×3]
#数据库:spark_连接
兰德·兰登
1     1 0.666  0.409
2     2 0.858  0.881
3     3 0.914 -2.01 
>df%>%变异(rand=rand(42L),randn=randn(42L))%>%头(3)
#来源:惰性查询[?×3]
#数据库:spark_连接
兰德·兰登
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,但这需要防御性编程,有意识地设置集群,而且这不是内置工具可以实现的,更不用说像
Sparkyr

这样有限的高级包装器了,设置种子是为了可复制性。它用于预测建模。如果我没记错的话,即使在使用Scala时,我仍然会设定种子。在数据科学中,集合种子通常位于创建模型的任何脚本的顶部。我希望Sparkyr也能以同样的方式工作。很好!如果可以的话,我会不止一次地投票。谢谢你的全面回答。