Python 如何为spark中的每个群集保留一个局部变量?
我是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上执行操作吗 例如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(训练数据,(
函数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()