Spark 2.0.1 java.lang.NegativeArraySizeException

时间:2016-11-11 19:56:10

标签: java apache-spark apache-spark-2.0

我开始玩Spark 2.0.1。新的数据集API非常干净,但我遇到了非常简单的操作问题。

也许我错过了什么,希望有人可以提供帮助。

这些说明

SparkConf conf = new SparkConf().setAppName("myapp").setMaster("local[*]");
SparkSession spark = SparkSession
        .builder()
        .config(conf)
        .getOrCreate();

Dataset<Info> infos = spark.read().json("data.json").as(Encoders.bean(Info.class));

System.out.println(infos.rdd().count());

制作

 java.lang.NegativeArraySizeException

并且JVM(1.8)检测到致命错误。

使用数据集api处理数据(即,选择,依靠infos对象)可以正常工作。

如何在数据集和RDD之间切换?

2 个答案:

答案 0 :(得分:5)

一般来说,此错误来自when an application tries to create an array with negative size.,请参见下面的示例。

它的一般java错误。在你的情况下,我怀疑这是由

引起的
 Dataset<Info> infos = spark.read().json("data.json").as(Encoders.bean(Info.class));

System.out.println(infos.rdd().count());

您可以通过打印完整的堆栈跟踪来查看此代码在哪种情况下的初始化。

import java.util.*;
import java.io.*;
public class Stacktest
{
public static void main(String args[])throws IOException
{
int c[]=new int[-2];
Scanner in=new Scanner(new InputStreamReader(System.in));
int b=in.nextInt();
int a[]=new int[b];
}
}


output:

-2
Exception in thread "main" java.lang.NegativeArraySizeException
        at Stacktest.main(Stacktest.java:10)
  

注意:其中一个用例是使用Kryo序列化   apache spark ...当它可能发生/修复就像下面......

     

Very large object graphs

     

参考限制

     

Kryo在基于int数组的地图中存储引用。   由于Java数组索引仅限于Integer.MAX_VALUE,   序列化大(> 10亿)对象可能导致a   java.lang.NegativeArraySizeException

     

此问题的解决方法是禁用Kryo的引用跟踪   如下所示:

  Kryo kryo = new Kryo();
  kryo.setReferences(false);
如果您想以编程方式设置它,请在spark.kryo.refferenceTrackingEnabledfalse对象中使用spark-default.conf = sparkConf这样的属性。

Spark docs says that

spark.kryo.referenceTracking默认值true

  

在序列化数据时是否跟踪对同一对象的引用   使用Kryo,如果你的对象图有循环和必要,这是必要的   如果它们包含相同的多个副本,则对效率有用   宾语。如果您知道不是,可以禁用以提高性能   案件。

答案 1 :(得分:0)

根据Spark Docsspark-default.conf中来自上面答案的设置现在称为spark.kryo.referenceTracking