Spark ALS隐式异常

时间:2015-11-19 09:51:16

标签: azure pyspark

我们在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()调用显式评级也能正常工作。

有没有人遇到过这种问题? 我们还是新的所以请帮忙!谢谢。

2 个答案:

答案 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似乎有所帮助,但我不确定它是否有用将永久修复我的问题...