6

Używam współczynnika macierzy MLlib do polecania produktów użytkownikom. Mam na myśli dużą niejawną matrycę interakcji M = 20 milionów użytkowników i N = 50 000 elementów. Po szkoleniu modelu chcę uzyskać krótką listę (np. 200) zaleceń dla każdego użytkownika. Próbowałem recommendProductsForUsers w MatrixFactorizationModel, ale jest bardzo bardzo powolny (trwało 9 godzin, ale nadal daleko od końca.) Testuję z 50 executorami, każdy z 8g pamięci). Można się tego spodziewać, ponieważ od recommendProductsForUsers trzeba obliczyć wszystkie interakcje użytkownika z elementami użytkownika i uzyskać najlepsze dla każdego użytkownika.Przyspieszenie filtrowania grupowego dla dużego zestawu danych w Spark MLLib

Spróbuję użyć większej liczby executorów, ale z tego, co zobaczyłem z informacji o aplikacji w Spark UI, wątpię, że może to skończyć się w godzinach lub w ciągu dnia, nawet ja mam 1000 wykonawców (po 9 godzinach nadal jest to flatmap tutaj https://github.com/apache/spark/blob/master/mllib/src/main/scala/org/apache/spark/mllib/recommendation/MatrixFactorizationModel.scala#L279-L289 , 10000 zadań ogółem i tylko ~ 200 zakończonych) Czy są jeszcze inne rzeczy, które mogę dostroić, aby przyspieszyć proces rekomendacji przy zwiększaniu liczby wykonawców?

Oto przykładowy kod:

val data = input.map(r => Rating(r.getString(0).toInt, r.getString(1).toInt, r.getLong(2))).cache 
val rank = 20 
val alpha = 40 
val maxIter = 10 
val lambda = 0.05 
val checkpointIterval = 5 
val als = new ALS() 
    .setImplicitPrefs(true) 
    .setCheckpointInterval(checkpointIterval) 
    .setRank(rank) 
    .setAlpha(alpha) 
    .setIterations(maxIter) 
    .setLambda(lambda) 
val model = als.run(ratings) 
val recommendations = model.recommendProductsForUsers(200) 
recommendations.saveAsTextFile(outdir) 
+0

Jesteś pewny, że Spark pełni wykorzystuje 8g RAM? Może to naprawdę często trafia w pamięć podręczną dysku. – stholzm

Odpowiedz

1

@Jack Lei: Czy można znaleźć odpowiedź na to? Sam próbowałem kilku rzeczy, ale tylko trochę pomogłem.

Dla np: Próbowałem

javaSparkContext.setCheckpointDir("checkpoint/"); 

Pomaga ponieważ posiadał uniknięcia powtórnych obliczeń pomiędzy.

próbował także dodanie większej ilości pamięci na Wykonawcy i napowietrznych pamięci zapłonową

--conf spark.driver.maxResultSize=5g --conf spark.yarn.executor.memoryOverhead=4000 
Powiązane problemy