org.apache.spark.SparkException:任务不可序列化-JavaSparkContext

org.apache.spark.SparkException:任务不可序列化-JavaSparkContext,java,serialization,apache-spark,Java,Serialization,Apache Spark,我正在尝试运行以下简单的Spark代码: Gson gson = new Gson(); JavaRDD<String> stringRdd = jsc.textFile("src/main/resources/META-INF/data/supplier.json"); JavaRDD<SupplierDTO> rdd = stringRdd.map(new Function<String, SupplierDTO>() { private sta

我正在尝试运行以下简单的Spark代码:

Gson gson = new Gson();
JavaRDD<String> stringRdd = jsc.textFile("src/main/resources/META-INF/data/supplier.json");

JavaRDD<SupplierDTO> rdd = stringRdd.map(new Function<String, SupplierDTO>()
{
    private static final long serialVersionUID = -78238876849074973L;

    @Override
    public SupplierDTO call(String str) throws Exception
    {
        return gson.fromJson(str, SupplierDTO.class);
    }
});
这里的“jsc”是我正在使用的
JavaSparkContext
对象。 据我所知,
JavaSparkContext
不是一个可序列化的
对象,人们不应该在发送给Spark workers的任何函数中使用它


现在,我无法理解的是,
JavaSparkContext
的实例是如何被发送给工人的?我应该在代码中做些什么来避免这种情况?

gson
引用将外部类“拉”到闭包的范围内,并使用它的完整对象图

在这种情况下,在闭包中创建gson对象:

public SupplierDTO call(String str) throws Exception {   
   Gson gson = Gson();
   return gson.fromJson(str, SupplierDTO.class);
}
您还可以声明spark上下文
transient


如果GSON实例的创建成本很高,请考虑使用<代码> Mavituths<代码>,而不是<代码> MAP .< /P> < P>我用以下选项之一解决了这个问题:

  • 如上所述,通过将SparkContext声明为
    transient
  • 您还可以尝试将对象gson设置为静态
    static Gson Gson=new Gson()
  • 请参考文件


    要查看解决此问题的其他可用选项,可以使用下面的代码而不是第9行。(
    返回gson.fromJson(str,SupplierDTO.class);


    并删除第1行。(
    Gson-Gson=new-Gson();

    您确定这就是所有日志吗?我认为是Gson造成了这个问题,因为我以前也遇到过同样的问题。这是完整的日志。你能将SupplierDTO类粘贴到这里吗?@Sathish:这只是一个pojo,可以序列化。在call方法中创建Gson对象没有任何区别。你提到的另外两个选择都没有。请提供帮助。@ArkaGhosh将
    transient
    添加到
    sparkContext
    的声明中,至少应该-更改引发的异常。请您提及该
    transient
    注释的完整分类名称。@ArkaGhosh
    transient
    是Java中的一个关键字。您可以像这样使用它:
    transient JavaSparkContext context=new….
    My bad。。我以为你说的是
    transient
    注释。。让我再试试……我也有同样的问题。我将上下文引用标记为暂时的。我工作
    public SupplierDTO call(String str) throws Exception {   
       Gson gson = Gson();
       return gson.fromJson(str, SupplierDTO.class);
    }
    
    return new Gson().fromJson(str, SupplierDTO.class);//this is correct