应用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。对此有什么建议吗?应用检查点后,当抛出异常时,您是否仍然看到涉及
    ObjectInputStream
    的相同堆栈跟踪,或者异常是否已更改?嗨,Dennis;本质上:不再有错误,但与代码的其余部分相比,我们应用预测的部分(即使用Functions PredictAll或RecommendProducts ForUsers)非常慢(需要2小时,而ALS.train只需要2分钟)。有什么加速的建议吗?我现在转到1 Master+30 small workes,在这一步中,它似乎在CPU和ram上都没有挑战。wdyt?@BartV,发生这种情况的原因是,当你确实“预测”或“推荐”时,你需要在你的用户和你的产品之间创建一个交叉点。基本上,对于你的每个用户,你都需要预测每个产品,并且第二个得分最高的。你在运行多少执行者?在我的第一次尝试中,我发现我使用了默认值(3…),当我增加到50时(这意味着预测必须处理50^2=2500个任务!),我看到性能有了显著的提高。
     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()