Сходства PySpark, полученные с помощью IndexedRowMatrix().columnSimilarities(), недоступны: INFO ExternalSorter: Thread * пролив карты в памяти

Когда я запускаю код:

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()?

У меня ~86000 строк и столбцов в переменной sim.

Мой набор данных представлял собой список кортежей (user_id, item_id, значение). Я превращаю диапазон user_id и item_id в значения от 0 до len(user_id| tem_id). Это значит, что идентификатор 800000 не делает матрицу такой большой.

Таких записей 800 000. Матрица в переменной 'mat' содержит значение из кортежа с координатами (user_id, item_id). Это проверено мной как таковое.

Матрица в 'mat' насчитывает ~41 000 пользователей и примерно 86 000 элементов. Столбец «Сходство» создает сравнения между каждым элементом, поэтому он имеет размеры 86k x 86k.

Все это было сделано в терминале pyspark ./bin/pyspark.


person GreatGather    schedule 01.04.2016    source источник
comment
Какую версию искры используете? Какова конфигурация вашего кластера?   -  person eliasah    schedule 01.04.2016
comment
@eliasah Я просто запускаю это локально, чтобы проверить. Я использую текущий spark-master из github.   -  person GreatGather    schedule 01.04.2016
comment
Можешь попробовать с веткой 1.6? Чтобы убедиться, что это не только в версии 2.0. Эта версия еще официально не выпущена.   -  person eliasah    schedule 01.04.2016
comment
Используемая мной функция - columnSimilarity() выпущена только в версии 2.0. Должен ли я добавить эту функцию в ветку 1.6 в моей локальной системе?   -  person GreatGather    schedule 01.04.2016
comment
К сожалению, это не так прямолинейно. Тем более, что может показаться, что утечка вызвана этой функцией. Надо исследовать раньше.   -  person eliasah    schedule 01.04.2016
comment
Хорошо, я считаю, что эта функция является источником. Я думаю, мне, возможно, придется искать альтернативу   -  person GreatGather    schedule 01.04.2016
comment
Еще один вопрос: можете ли вы добавить информацию о своем наборе данных? Объем ? Формат. Количество строк и столбцов и т. д., поэтому я могу попытаться воспроизвести ошибку.   -  person eliasah    schedule 01.04.2016
comment
Пожалуйста, добавьте информацию в вопрос, отредактировав, чтобы другие могли видеть ее напрямую :)   -  person eliasah    schedule 01.04.2016
comment
Как и ваша команда отправки! :)   -  person eliasah    schedule 01.04.2016
comment
Хорошо, дайте мне знать, если есть что-то еще   -  person GreatGather    schedule 01.04.2016
comment
Можете ли вы начать с увеличения памяти и, возможно, ваших разделов данных после этого?   -  person eliasah    schedule 01.04.2016
comment
Это была проблема разделов. Спасибо за предложение. Для этого требуется гораздо больше разделов, чем требовалось для предыдущего разделения разделов. Его просто нужно было перераспределить.   -  person GreatGather    schedule 02.04.2016
comment
Я резюмировал это как ответ. Вы можете принять это, пожалуйста, чтобы отметить эту проблему решенной.   -  person eliasah    schedule 02.04.2016


Ответы (1)


Как обсуждалось в комментарии, проблема связана с тем, что у вас есть много данных, которые не были должным образом разделены с учетом конфигурации вашего кластера. Вот почему это было пролито на диск.

Вам нужно будет предоставить вашему приложению больше ресурсов памяти и/или увеличить разделы данных.

person eliasah    schedule 01.04.2016