Spark 2.0.1 java.lang.NegativeArraySizeException

问题描述 投票:1回答:1

我开始玩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处理数据(即,选择,依靠信息对象)可以正常工作。

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

java apache-spark apache-spark-2.0
1个回答
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亿)对象可能会导致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序列化数据时是否跟踪对同一对象的引用,如果对象图形具有循环并且如果它们包含同一对象的多个副本,则这对于效率是有用的。如果您知道不是这种情况,可以禁用以提高性能。

© www.soinside.com 2019 - 2024. All rights reserved.