我正在使用Spark(pyspark)进行大型矩阵向量乘法。
我有一个循环,它将矩阵乘以向量。矩阵是静态的,在循环内保持不变,但矢量会更新。
矩阵和向量都是我定义的类的实例,它保存数据(在RDD中)并且有一些实用的方法。
矩阵最初被倾倒"在磁盘中(来自saveAsTextFile操作)的坐标格式(i,j,value)。矢量也是如此。在循环开始之前,我将矩阵和向量恢复为两个独立的RDD。每次乘法都是通过变换它们的坐标,然后是两个RDD之间的连接,然后是reduceByKey来完成的。乘法后,我必须检查向量是否是单一的,所以我需要进行减少。
伪代码示例:
# matrix and vector are RDDs restored from disk
for i in range(steps):
# briefly, my multiplication is done with a join and reduceByKey operation
vector = matrix.multiply(vector)
# checking if the vector is unitary
if not vector.is_unitary():
raise ValueError
在我的第一次尝试中,在将矩阵恢复为RDD之后,我调用了persist()和count()以在内存中实现它,因此循环内的乘法会更快。我已经为矢量做了同样的事情,将它存储在内存中。问题是:当循环正在执行时,shuffle文件没有被清理(我想这是因为RDD是持久的),而且,当矩阵很大时,我的磁盘空间不足。
我的第二次尝试在循环的每次迭代结束时太过分析了RDD,因此可以按照建议here清理shuffle文件。同样,问题是shuffle文件仍然没有被清理......
如何避免随机文件在磁盘中累积?
如果需要,我可以提供更多详细信息。我正在使用MEMORY_AND_DISK StorageLevel和Spark 2.1.1。
提前致谢