SPARK java.io.NotSerializableException 异常处理

本文介绍了在Spark standalone模式下遇到的`java.io.NotSerializableException`异常情况,包括当类未实现Serializable接口和传入含有SparkContext的参数时引发的问题。同时,文章还讨论了`org.apache.spark.SparkException: Only one SparkContext may be running in this JVM`错误,解释了在同一次函数调用或同一个main中创建多个SparkContext的不正确做法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近一直在写spark 相关的项目, 但是以前从没有接触过spark 相关的东西, 只能是边学边用。
后面准备在 这里记录 在学习、使用spark过程中,遇到的问题
今天要记录的问题是: 使用 spark alone 运行模式下, 进场遇到的问题—— java.io.NotSerializableException

1、在哪几种情况下, 会发生这个问题

(1)类、方法  没有被序列化
    类没有被序列化, 代码如下: 
class GetData {
    def init(): Unit = {
        val rdd = sc.textfile(.....)
        val local = rdd.map(.....)
    }
}

object test {
    val s = new GetData()
    s.init()
}

这种情况下, 就会出现 NotSerializableException 异常, 因为在 scala 中, 类是不会自动序列化, 所以需要这样改: class GetData extends java.io.Serializable {…..}

(2) 方法没有被序列化
在 scala 中, 尽管 函数(方法)会自动序列化, 但是在下面那种情况, 是不会自动序列化的
val local = rdd.map(theRow => {
    theRow.getString(0)     
})
上面, 这种情况,scala 就不会自动 序列化, 需要修改为
val local = rdd.map(transfrom)

def transfrom(theRow: org.apache.spark.sql.Row): String = {
    theRow.getString(0)
}

(3)、传入的参数有 SparkContext
这种情况下, 会出现着这种异常: java.io.NotSerializableException: org.apache.spark.SparkContext
原因是: SparkContext, 是不能被序列话的
所以, 这种情况下, 是不能把 SparkContext 当成参数, 进行传递的

2、 org.apache.spark.SparkException: Only one SparkContext may be running in this JVM
产生这种情况的原因是: 在同一个 driver(同一次 函数调用 或者 同一个main中) 定义了两个 sparkContext
这是不允许的, 只能定义一个 sparkContext

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值