由IndexedRowMatrix()。columnSimilarities()检索的PySpark相似性是不可访问的:INFO ExternalSorter:Thread *溢出内存映射

时间:2016-04-01 17:16:22

标签: python apache-spark pyspark recommendation-engine bigdata

当我运行代码时:

from pyspark import SparkContext
from pyspark.mllib.recommendation import ALS, MatrixFactorizationModel, Rating
from random import random
import os
from scipy.sparse import csc_matrix
import pandas as pd
from pyspark.mllib.linalg.distributed import RowMatrix
from pyspark.mllib.linalg import Vectors
from pyspark.mllib.linalg.distributed import CoordinateMatrix, MatrixEntry

from pyspark.sql import SQLContext

sc =SparkContext()
sqlContext = SQLContext(sc)
df = pd.read_csv("/Users/Andre/Code/blitsy-analytics/R_D/Data/cust_item_counts.csv", header=None)
customer_map = {x[1]:x[0] for x in enumerate(df[0].unique())}
item_map = {x[1]:x[0] for x in enumerate(df[1].unique())}
df[0] = df[0].map(lambda x: customer_map[x])
df[1] = df[1].map(lambda x: item_map[x])
#matrix = csc_matrix((df[2], (df[0], df[1])),shape=(max(df[0])+1, max(df[1])+1))

entries = sc.parallelize(df.apply(lambda x: tuple(x), axis=1).values)
mat = CoordinateMatrix(entries).toIndexedRowMatrix()
sim = mat.columnSimilarities()
sim.entries.map(lambda x: x).first()

我被抛入一个溢出到磁盘上的线程循环:

> 16/04/01 12:09:25 INFO ContextCleaner: Cleaned accumulator 294
> 16/04/01 12:09:25 INFO ContextCleaner: Cleaned accumulator 293
> 16/04/01 12:09:25 INFO ContextCleaner: Cleaned accumulator 292
> 16/04/01 12:09:25 INFO ContextCleaner: Cleaned accumulator 291
> 16/04/01 12:09:42 INFO ExternalSorter: Thread 108 spilling in-memory
> map of 137.6 MB to disk (1 time so far) 16/04/01 12:09:42 INFO
> ExternalSorter: Thread 112 spilling in-memory map of 158.1 MB to disk
> (1 time so far) 16/04/01 12:09:42 INFO ExternalSorter: Thread 114
> spilling in-memory map of 154.2 MB to disk (1 time so far) 16/04/01
> 12:09:42 INFO ExternalSorter: Thread 113 spilling in-memory map of
> 143.4 MB to disk (1 time so far)

这不符合矩阵' mat'返回它的第一行条目。

这与内存管理或函数columnSimilarity()本身有关吗?

我在sim变量中有~86000行和列。

我的数据集是元组列表(user_id,item_id,value)。我将user_id和item_id范围转换为0到len(user_id | tem_id)之间的值。这是800000的id不会强制一个大的矩阵。

此类型有800,000个条目。变量' mat中的矩阵。保存元组在(user_id,item_id)坐标处的值。我已经证实这是事实。

' mat'拥有~41,000个用户和~86,000个项目。相似性列在每个项目之间进行比较,这就是为什么它的尺寸为86k x 86k

这一切都在pyspark终端./bin/pyspark完成。

1 个答案:

答案 0 :(得分:1)

正如评论中所讨论的那样,该问题与您考虑到群集配置的大量数据没有很好地分区有关。这就是它溢出磁盘的原因。

您需要以内存方式为应用程序提供更多资源和/或扩充数据分区。