我正在尝试使用Pyspark进行大小为67584 * 67584的矩阵乘法链,但它会不断耗尽内存或OOM错误。这里有详细信息: 输入是matlab文件(.mat文件),它在单个文件中包含矩阵。我使用scipy loadmat加载文件,将文件拆分为多个块大小(1024 * 1024)的文件,然后以.mat格式存储它们。 现在mapper使用filelist加载每个文件并创建一个块的rdd。
filelist = sc.textFile(BLOCKS_DIR + 'filelist.txt',minPartitions=200)
blocks_rdd = filelist.map(MapperLoadBlocksFromMatFile).cache()
MapperLoadBlocksFromMatFile是一个函数如下:
def MapperLoadBlocksFromMatFile(filename):
data = loadmat(filename)
G = data['G']
id = data['block_id'].flatten()
n = G.shape[0]
if(not(isinstance(G,sparse.csc_matrix))):
sub_matrix = Matrices.dense(n, n, G.transpose().flatten())
else:
sub_matrix = Matrices.dense(n,n,np.array(G.todense()).transpose().flatten())
return ((id[0], id[1]), sub_matrix)
现在有了这个rdd,我就从它创建一个BlockMatrix。并用它进行矩阵乘法。
adjacency_mat = BlockMatrix(blocks_rdd, block_size, block_size, adj_mat.shape[0], adj_mat.shape[1])
我正在使用BlockMatrix实现中的multiply方法,并且每次都会耗尽内存。
Result = adjacency_mat.multiply(adjacency_mat)
以下是群集配置详细信息:
50 nodes of 64gb Memory and 20 cores processors.
worker-> 60gb and 16 cores
executors-> 15gb and 4 cores each
driver.memory -> 60gb and maxResultSize->10gb
我甚至尝试使用rdd.compress。尽管有足够的内存和内核,但每次都会耗尽内存。每次不同节点的内存不足时,我都无法在群集中使用visualVM。我究竟做错了什么? blockmatrix的创建方式是错误的吗?或者我不记得足够的内存? OOM Error Stacktrace