Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何为spark中的每个群集保留一个局部变量?_Python_Scala_Apache Spark - Fatal编程技术网

Python 如何为spark中的每个群集保留一个局部变量?

Python 如何为spark中的每个群集保留一个局部变量?,python,scala,apache-spark,Python,Scala,Apache Spark,我是Spark的新手,这是我第一次在这里发帖 目前,我尝试为Lasso/SVM实现ADMM优化算法 然后我遇到了一个问题: 因为训练数据(标签、特征)很大,所以我创建了一个RDD并将训练数据(标签、特征)缓存在内存中。然后对于ADMM,它需要保留本地参数(u,v)(每个分区的参数不同)。对于每个迭代,我需要使用训练数据(仅在该分区上),u,v来计算u和v的新值 在这里,如果u,v不是RDD,我可以将它们视为局部变量,这在标题中。如果(u,v)是RDD,那么在一个函数中处理两个RDD(训练数据,(

我是Spark的新手,这是我第一次在这里发帖

目前,我尝试为Lasso/SVM实现ADMM优化算法 然后我遇到了一个问题:

因为训练数据(标签、特征)很大,所以我创建了一个RDD并将训练数据(标签、特征)缓存在内存中。然后对于ADMM,它需要保留本地参数(u,v)(每个分区的参数不同)。对于每个迭代,我需要使用训练数据(仅在该分区上),u,v来计算u和v的新值

在这里,如果u,v不是RDD,我可以将它们视为局部变量,这在标题中。如果(u,v)是RDD,那么在一个函数中处理两个RDD(训练数据,(u,v))会遇到一个问题。具体问题如下:

问题1 一种方法是将(训练数据,u,v)压缩到rdd中,并在每次迭代中更新它,但正如我们所看到的,训练数据很大,并且不会在整个时间内改变,只有u,v(很小)在每次迭代中改变。如果我压缩这三个,我就不能缓存RDD(因为每次迭代它都会改变)。但是如果没有缓存,我需要在每次迭代中重用训练数据,我怎么做呢

问题2 与问题1相关的是,在在线文档中,它说如果我们不缓存RDD,它就不会在内存中。RDD使用延迟操作,那么我不知道什么时候可以查看内存中以前的RRD

案例1 案例2 案例3 在这种情况下,当我计算D时,我可以查看每个集群中的内存中的B吗

问题3 我可以使用一个函数在两个RDD上执行操作吗

例如
函数newfun(rdd1、rdd2)

rdd1
很大,在整个时间内都不会改变(训练数据),我可以使用缓存

rdd2
很小,每次迭代都会发生变化(u,v)

问题4 还是有其他方法来解决这类问题?我认为这是常见的问题,但我找不到任何好的解决办法

非常感谢,
韩。

问题1 我想说,您应该缓存第一个RDD,因为它不会改变,并使用u,v作为计算的正常变量,并使用算法中的任何逻辑来计算它们

问题2 当您应用像collect()、count()等操作时,操作的实际DAG会被计算,最终结果只会转储到驱动程序,而不会保存在内存中,因此每次应用操作时,创建RDD所需的所有转换都会再次应用,驱动程序会得到结果。 因此,除非缓存RDD,否则每次应用操作时,都是完全从头开始计算RDD

问题3
是的,您编写的代码只是一个Scala代码(或Java、Python),您可以将RDD视为一个具有许多奇特属性的集合,并分布在集群中,因此,您可以编写一个可以处理两个或多个RDD的函数。

Question1,如果我使用第一个RDD,则每个分区的RDD、u、v都不同(我认为它们也应该是RDD),如果我不把u,v当作rdd,我怎么能把精确的u,v发送给每个分区问题2,你能告诉我在这三种情况下,我能看到哪个B在内存中吗?问题3:如何创建一个使用两个RDD的函数?他们如何匹配?(我需要这两个RDD在同一个分区中)谢谢
B = A.map(function1)

B.collect()    #This forces B to be calculated ? After that, the node just release B since it is not cached ???   

D = B.map(function3) 

D.collect()
B = A.map(function1).

D = B.map(function3)   

D.collect()
B = A.map(function1)

C = A.map(function2)

D = B.map(function3) 

D.collect()