【问题标题】:Apache Spark - org.apache.spark.SparkException: Task not serializableApache Spark - org.apache.spark.SparkException:任务不可序列化
【发布时间】:2015-03-24 14:39:58
【问题描述】:

尝试运行我的方法时:

    def doGD() = {
       allRatings.foreach(rating => gradientDescent(rating));
    }

我收到错误:org.apache.spark.SparkException: Task not serialisable

我知道我的梯度下降方法不会并行化,因为每个步骤都取决于上一步 - 所以并行工作不是一种选择。但是,如果我这样做,从控制台:

    val gd = new GradientDescent()
    gd.doGD();

我收到上述错误。

但是,如果在控制台中我这样做:

    val gd = new GradientDescent()
    gd.allRatings.foreach(rating => gradientDescent(rating))

它工作得很好。您可能已经注意到,第二个示例中的代码与第一个示例中的代码相同,只是我只是将代码从方法中取出并直接调用它而不是方法。

为什么一个有效而另一个无效?我很困惑。

(补充说明:GradientDescent extends Serializable 类)。

gradientDescent 方法:

def gradientDescent(rating : Rating) = { 

var userVector = userFactors.get(rating.user).get
var itemVector = itemFactors.get(rating.product).get

userFactors.map(x => if(x._1 == rating.user)(x._1, x._2 += 0.02 * (calculatePredictionError(rating.rating, userVector, itemVector) * itemVector)))
userVector = userFactors.get(rating.user).get // updated user vector

itemFactors.map(x => if(x._1 == rating.product)(x._1, x._2 += 0.02 * (calculatePredictionError(rating.rating, userVector, itemVector) * itemVector)))
}

我知道我正在使用存储在主服务器上的 2 个变量 - userFactorsitemFactors - 由于该过程是顺序并行化的,因此不可能。但这并不能解释为什么从控制台调用方法不起作用但在控制台中重写方法的内部。

【问题讨论】:

    标签: apache-spark rdd gradient-descent


    【解决方案1】:

    如果没有 GradientDescent 类的完整来源,很难说,但您可能正在捕获一个不可序列化的值。在运行该方法时,它需要序列化完整的对象并将其发送给工作人员,而内联版本则不需要。

    【讨论】:

    • 你能解释一下为什么一个值可能是不可序列化的吗?我真的只是想知道为什么在调用方法doGD() 时它不起作用,但是当我编写方法中的代码时它确实起作用!感谢您的回复。
    • 清除闭包的详细代码在这里:github.com/apache/spark/blob/… 总之,任何对 spark 上下文或打开资源(套接字、文件等)的引用都会导致任务无法序列化
    • 谢谢,丹。但是,我不太确定您将我与什么联系起来。如果您愿意看一下,我已将梯度下降法添加到我的问题中。
    • 请注意,依赖关系是可传递的。看起来gradientDescent 引用了许多其他对象。有一些RDD吗?它们是否传递引用文件/套接字句柄等。JVM 将尝试序列化依赖关系树。
    • 全面了解Spark序列化stackoverflow.com/questions/40818001/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2015-05-31
    • 2016-07-27
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多