我是Spark新手,这是我第一次在这里发帖。
目前,我尝试为Lasso / SVM实施ADMM优化算法 然后我遇到了一个问题:
由于训练数据(标签,特征)很大,所以我创建了一个RDD并将训练数据(标签,特征)缓存在内存中。然后对于ADMM,它需要保留本地参数(u,v)(每个分区不同)。对于每次迭代,我需要使用训练数据(仅在该分区上),u,v来计算u和v的新值。
这里,如果u,v不是RDD,我可以将它们视为一个局部变量,它位于标题中。如果(u,v)是RDD,那么我遇到了在一个函数中处理两个RDD(训练数据,(u,v))的问题。详细问题如下
一种方法是将(训练数据,u,v)压缩到rdd并在每次迭代中更新它,但正如我们所看到的,训练数据很大并且在整个时间内都不会改变,只有你,v(小)在每次迭代中都会改变。如果我压缩这三个,我无法缓存该RDD(因为它在每次迭代时都会更改)。但如果没有缓存,我需要在每次迭代时重用训练数据,我该怎么办呢?
与问题1相关,在线文档中,它表示如果我们不缓存RDD,它就不会在内存中。并且RDD使用延迟操作,然后我很困惑何时可以在内存中查看先前的RRD。
<案例1B = 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()
<案例2
B = A.map(function1).
D = B.map(function3)
D.collect()
<案例3
B = A.map(function1)
C = A.map(function2)
D = B.map(function3)
D.collect()
在这种情况下,当我计算D?
时,我可以在每个簇的内存中查看B吗?我可以使用函数对两个RDD进行操作吗?
E.g Function newfun(rdd1, rdd2)
rdd1
很大,并且不会一直改变(训练数据),我可以使用缓存。
rdd2
很小,每次迭代都会改变(u,v)。
还是有其他方法可以解决这类问题吗?我认为这是常见问题,但我找不到任何好的解决方案?
非常感谢,
韩
答案 0 :(得分:0)
问题1 我会说你应该缓存第一个RDD,因为它不会改变并使用u,v作为计算的正常变量,并使用算法中的任何逻辑计算它们。
问题2 当您应用collect(),count()等操作时,将评估操作的实际DAG,并将最终结果转储给驱动程序,并且不会将其保留在内存中,因此每次应用操作时,所有再次应用创建RDD所需的转换,并且驱动程序获得结果。 因此,除非您缓存RDD,否则每次应用操作时都会从头开始完全计算RDD。
问题3 是的,您编写的代码只是一个Scala代码(或Java,Python),您可以将RDD视为具有许多花哨属性的集合并分布在集群中,因此,您可以编写一个可以在两个上运行的函数或更多RDD。