【问题标题】:Spark 2.0.1 java.lang.NegativeArraySizeExceptionSpark 2.0.1 java.lang.NegativeArraySizeException
【发布时间】:2016-11-11 19:56:09
【问题描述】:

我开始使用 Spark 2.0.1。新的 Dataset 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 对象)工作正常。

如何在 Dataset 和 RDD 之间切换?

【问题讨论】:

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


    【解决方案1】:

    一般来说,这个错误来自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 亿)对象可能会导致 java.lang.NegativeArraySizeException.

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

      Kryo kryo = new Kryo();
      kryo.setReferences(false);
    

    或者如果你想以编程方式设置它,或者spark-default.confsparkConf 对象中的spark.kryo.refferenceTrackingEnabled=false 之类的属性..

    Spark docs says that

    spark.kryo.referenceTracking默认值true

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

    【讨论】:

    • 感谢您的回答。问题是spark.read()等指令都是库调用,即我刚刚使用了库,没有自定义代码,除了Info.class。
    • 你能粘贴更多细节,比如你的 json,完整的错误堆栈跟踪和信息模型对象等...
    • 根据Spark Docsspark-default.conf 中上述答案的设置现在称为spark.kryo.referenceTracking
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多