PySpark Block Matrix乘法失败,OOM

时间:2016-09-07 22:02:58

标签: apache-spark pyspark matrix-multiplication

我正在尝试使用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

0 个答案:

没有答案