org.apache.spark.SparkException:任务不可序列化-JavaSparkContext
我正在尝试运行以下简单的Spark代码: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
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>我用以下选项之一解决了这个问题:
transient
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
注释的完整分类名称。@ArkaGhoshtransient
是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