我们在Azure Spark上使用ALS来构建我们的推荐系统。
对于不能为每个用户输出不同推荐列表的计算能力原因。因此,我们将用户划分为群集,并使用ALS为每个群集质心输出推荐列表。
在对用户进行群集之前,我们在Spark上使用standardscaler和normalizer来预处理数据,以便获得更好的群集结果。但是,这将在使用ALS.trainImplicit
时导致以下异常15/11/16 15:43:11 INFO TaskSetManager:执行者localhost上的阶段15.0(TID 197)中丢失的任务30.0:java.lang.AssertionError(断言失败:lapack.dppsv返回4.)[重复9] Traceback(最近一次调用最后一次): 文件“/home/rogeesjir_huasqngfda/woradofkapkspace/jigsusLaudfadfecher/scripts/RecommendationBackend/AzureSpark/src/collaborativeFiltering/spark_als.py”,第92行, 主要() 文件“/home/rogeesjir_huasqngfda/rogeesjir_huasqngfda/jigsusLaudfadfecher/scripts/RecommendationBackend/AzureSpark/src/collaborativeFiltering/spark_als.py”,第39行,主要 model = ALS.trainImplicit(rating,rank,numIter,alpha = 0.01) 文件“/home/jigsusLaudfadfecher/spark-1.3.1-bin-hadoop2.6/python/pyspark/mllib/recommendation.py”,第147行,在trainImplicit中 15/11/16 15:43:11 INFO TaskSetManager:在执行程序localhost上的阶段15.0(TID 192)中丢失任务25.0:java.lang.AssertionError(断言失败:lapack.dppsv返回4.)[重复10] 迭代,lambda_,块,alpha,非负,种子) 在callMLlibFunc中输入文件“/home/jigsusLaudfadfecher/spark-1.3.1-bin-hadoop2.6/python/pyspark/mllib/common.py”,第120行 return callJavaFunc(sc,api,* args) 在callJavaFunc中输入文件“/home/jigsusLaudfadfecher/spark-1.3.1-bin-hadoop2.6/python/pyspark/mllib/common.py”,第113行 return _java2py(sc,func(* args)) 文件“/home/jigsusLaudfadfecher/spark-1.3.1-bin-hadoop2.6/python/lib/py4j-0.8.2.1-src.zip/py4j/java_gateway.py”,第538行,调用 在get_return_value中输入文件“/home/jigsusLaudfadfecher/spark-1.3.1-bin-hadoop2.6/python/lib/py4j-0.8.2.1-src.zip/py4j/protocol.py”,第300行 py4j.protocol.Py4JJavaError15 / 11/16 15:43:11 INFO TaskSetManager:执行程序localhost上的阶段15.0(TID 183)中丢失的任务16.0:java.lang.AssertionError(断言失败:lapack.dppsv返回4.)[复制11 ]
:调用o39.trainImplicitALSModel时发生错误。 :org.apache.spark.SparkException:作业因阶段失败而中止:阶段15.0中的任务8失败1次,最近失败:阶段15.0中丢失的任务8.0(TID 175,localhost):java.lang.AssertionError:断言失败:lapack.dppsv返回4。 在scala.Predef $ .assert(Predef.scala:179) 在org.apache.spark.ml.recommendation.ALS $ CholeskySolver.solve(ALS.scala:355) 在org.apache.spark.ml.recommendation.ALS $$ anonfun $ org $ apache $ spark $ ml $ recommended $ ALS $$ computeFactors $ 1.apply(ALS.scala:1131) 在org.apache.spark.ml.recommendation.ALS $$ anonfun $ org $ apache $ spark $ ml $ recommended $ ALS $$ computeFactors $ 1.apply(ALS.scala:1092) 在org.apache.spark.rdd.PairRDDFunctions $$ anonfun $ mapValues $ 1 $$ anonfun $ apply $ 15.apply(PairRDDFunctions.scala:674) 在org.apache.spark.rdd.PairRDDFunctions $$ anonfun $ mapValues $ 1 $$ anonfun $ apply $ 15.apply(PairRDDFunctions.scala:674) 在scala.collection.Iterator $$ anon $ 11.next(Iterator.scala:328) 在org.apache.spark.storage.MemoryStore.unrollSafely(MemoryStore.scala:249) 在org.apache.spark.CacheManager.putInBlockManager(CacheManager.scala:172) 在org.apache.spark.CacheManager.getOrCompute(CacheManager.scala:79) 在org.apache.spark.rdd.RDD.iterator(RDD.scala:242) 在org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:35) 在org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:277) 在org.apache.spark.rdd.RDD.iterator(RDD.scala:244) 在org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:61) 在org.apache.spark.scheduler.Task.run(Task.scala:64) 在org.apache.spark.executor.Executor $ TaskRunner.run(Executor.scala:203) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615) 在java.lang.Thread.run(Thread.java:745)
当我们删除“正规化”组件(即,不执行standardcaler和normalizer)时,一切正常。 顺便说一句,即使我们在ALS模型培训之前对数据进行规范化,ALS.train()调用显式评级也能正常工作。
有没有人遇到过这种问题? 我们还是新的所以请帮忙!谢谢。
答案 0 :(得分:3)
对于未来的读者:
给定数据集中的多个列仅包含零。在这种情况下, 数据矩阵没有满级。因此,Gramian矩阵是 单数,因此不可逆。 Cholesky分解会 在这种情况下失败。如果标准偏差更大,也会发生这种情况 比一列为零(即使值不为零)。我想我们 应该在代码中捕获此错误并退出并显示警告消息。 或者我们可以删除零方差的列,并继续 算法
取自comment。
只需确保大部分评级均为非零,即可使用。
答案 1 :(得分:2)
我在ALS.train()
时遇到了类似的错误:
java.lang.AssertionError: assertion failed: lapack.dpotrs returned 6.
...
Google向我介绍了Spark JIRA https://issues.apache.org/jira/browse/SPARK-11918上报告的问题,其中使用加权最小二乘法(WLS)进行线性回归时会出现相同的错误。显然,当您尝试解决病态的线性方程组时,LAPACK会抛出此错误。
在我的情况下,将ALS.train()
参数lambda_
从默认值0.01
增加到更高的值>= 0.02
似乎有所帮助,但我不确定它是否有用将永久修复我的问题...