Apache spark Spark流式处理任务不可序列化

Apache spark Spark流式处理任务不可序列化,apache-spark,spark-streaming,amazon-kinesis,Apache Spark,Spark Streaming,Amazon Kinesis,我正在使用齐柏林飞艇运行流媒体作业 下面的代码抛出以下错误- 原因:java.io.NotSerializableException:org.apache.spark.streaming.kinesis.KinesisInputDStream的对象正在序列化,可能是RDD操作关闭的一部分。这是因为DStream对象是从闭包中引用的。请在此数据流中重写RDD操作以避免此情况。这是为了避免Spark任务因不必要的对象而膨胀。 序列化堆栈: 我在map闭包之外使用的唯一函数是 变换\u iso\u时间

我正在使用齐柏林飞艇运行流媒体作业

下面的代码抛出以下错误-

原因:java.io.NotSerializableException:org.apache.spark.streaming.kinesis.KinesisInputDStream的对象正在序列化,可能是RDD操作关闭的一部分。这是因为DStream对象是从闭包中引用的。请在此数据流中重写RDD操作以避免此情况。这是为了避免Spark任务因不必要的对象而膨胀。 序列化堆栈:

我在map闭包之外使用的唯一函数是 变换\u iso\u时间戳2

这是一个简单的函数

def transform_iso_timestamp2(event_type:String,ts:String):String = {

event_type match{
        case "low_balance" => ts.replace("T", " ").stripMargin.substring(0,19)
        case _ =>  ts.replace("T", " ").stripMargin.substring(0,16)+":00"
    }
}   
我想了解为什么这是不可序列化的?。它没有引用自身之外的东西

请注意,如果我使用映射中定义的函数transform\u iso\u timestamp3,那么它就可以工作

如果我创建一个包含transform\u iso\u timestamp2的简单scala对象,将其打包到jar中,然后将其导入到我的代码中,那么它就可以正常工作


另一种方法是在数据流上使用变换而不是映射。我不知道为什么会这样。

为什么映射中定义了一个函数?如果我使用映射中定义的函数,它就会工作。因为它不在映射闭包之外。要理解您的第一个块代码并不容易,您能缩进并关闭括号吗?它将很容易帮助您。它不需要为每个
x
元素重新定义。如果你把它移出去,它应该可以工作。为什么一个函数在映射中定义?如果我使用映射中定义的函数,它就可以工作。因为它不在映射闭包之外。要理解您的第一个块代码并不容易,您能缩进并关闭括号吗?它将很容易帮助您。它不需要为每个
x
元素重新定义。如果你把它搬出去,它应该能用。
def transform_iso_timestamp2(event_type:String,ts:String):String = {

event_type match{
        case "low_balance" => ts.replace("T", " ").stripMargin.substring(0,19)
        case _ =>  ts.replace("T", " ").stripMargin.substring(0,16)+":00"
    }
}