美文网首页
SPARK java.io.NotSerializableExc

SPARK java.io.NotSerializableExc

作者: wangliang938 | 来源:发表于2017-06-09 16:47 被阅读1900次

    摘自:http://blog.csdn.net/zengchen__acmer/article/details/52063908
    最近一直在写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

    相关文章

      网友评论

          本文标题:SPARK java.io.NotSerializableExc

          本文链接:https://www.haomeiwen.com/subject/isjfqxtx.html