应用pyspark ALS时出现堆栈溢出错误';s";推荐俄罗斯产品“;(尽管可用的群集内存大于300GB)
寻找专业知识来指导我在下面的问题 背景:应用pyspark ALS时出现堆栈溢出错误';s";推荐俄罗斯产品“;(尽管可用的群集内存大于300GB),pyspark,apache-spark-mllib,recommendation-engine,google-cloud-dataproc,gcp,Pyspark,Apache Spark Mllib,Recommendation Engine,Google Cloud Dataproc,Gcp,寻找专业知识来指导我在下面的问题 背景: 我正试图开始一个基本的PySpark脚本,灵感来源于 作为部署基础设施,我使用Google Cloud Dataproc集群 我的代码中的基石是有文档记录的函数“recommendProductsForUsers”,它为模型中的所有用户返回了前X个产品 我遇到的问题 ALS.Train脚本运行平稳,在GCP上可以很好地扩展(很容易>1mn客户) 但是,应用预测:即使用函数“PredictAll”或“recommendProductsForUsers
- 我正试图开始一个基本的PySpark脚本,灵感来源于
- 作为部署基础设施,我使用Google Cloud Dataproc集群
- 我的代码中的基石是有文档记录的函数“recommendProductsForUsers”,它为模型中的所有用户返回了前X个产品
- ALS.Train脚本运行平稳,在GCP上可以很好地扩展(很容易>1mn客户)
- 但是,应用预测:即使用函数“PredictAll”或“recommendProductsForUsers”,根本无法进行缩放。我的脚本对于一个小数据集运行平稳(从堆栈跟踪来看,这似乎与
基本上,Spark以递归方式表达RDD沿袭,这样当在迭代工作负载过程中没有延迟评估时,就可以得到深度嵌套的对象。调用sc.setCheckpointDir并调整检查点间隔将缩短此RDD沿袭的长度。嗨,丹尼斯,谢谢你的想法。我确实看到了在另一个线程&我同意ALS.train确实有一个可以自定义的检查点间隔参数。但是,predictAll或recommendProductsForUsers函数都有这个参数;那么检查点设置将如何工作?更新:已实现的检查点设置(感谢dennis的提示)。尽管它允许非常好地扩展ALS.train功能(很容易>1mn客户),它不适用于应用预测:即,使用Functions PredictAll或RecommendProducts ForUsers。对此有什么建议吗?应用检查点后,当抛出异常时,您是否仍然看到涉及
的相同堆栈跟踪,或者异常是否已更改?嗨,Dennis;本质上:不再有错误,但与代码的其余部分相比,我们应用预测的部分(即使用Functions PredictAll或RecommendProducts ForUsers)非常慢(需要2小时,而ALS.train只需要2分钟)。有什么加速的建议吗?我现在转到1 Master+30 small workes,在这一步中,它似乎在CPU和ram上都没有挑战。wdyt?@BartV,发生这种情况的原因是,当你确实“预测”或“推荐”时,你需要在你的用户和你的产品之间创建一个交叉点。基本上,对于你的每个用户,你都需要预测每个产品,并且第二个得分最高的。你在运行多少执行者?在我的第一次尝试中,我发现我使用了默认值(3…),当我增加到50时(这意味着预测必须处理50^2=2500个任务!),我看到性能有了显著的提高。ObjectInputStream
16/08/16 14:38:56 WARN org.apache.spark.scheduler.TaskSetManager: Lost task 22.0 in stage 411.0 (TID 15139, productrecommendation-high-w-2.c.main-nova-558.internal): java.lang.StackOverflowError at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373) at scala.collection.immutable.$colon$colon.readObject(List.scala:362) at sun.reflect.GeneratedMethodAccessor11.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1058) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1909) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373) at scala.collection.immutable.$colon$colon.readObject(List.scala:362)
predictions = model.recommendProductsForUsers(10).flatMap(lambda p: p[1]).map(lambda p: (str(p[0]), str(p[1]), float(p[2]))) pprint.pprint(predictions.take(10)) schema = StructType([StructField("customer", StringType(), True), StructField("sku", StringType(), True), StructField("prediction", FloatType(), True)]) dfToSave = sqlContext.createDataFrame(predictions, schema).dropDuplicates()