我开始玩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之间切换?
一般来说,这个错误来自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 ...当它可能发生/修复时如下所示......参考限制
Kryo
将引用存储在基于int
数组的地图中。由于Java数组索引仅限于Integer.MAX_VALUE
,序列化大(> 10亿)对象可能会导致java.lang.NegativeArraySizeException
。此问题的解决方法是禁用Kryo的参考跟踪,如下所示:
Kryo kryo = new Kryo(); kryo.setReferences(false);
如果你想以编程方式设置它,或者像spark.kryo.refferenceTrackingEnabled
或false
对象中的spark-default.conf
= sparkConf
这样的属性。
spark.kryo.referenceTracking
默认值true
在使用Kryo序列化数据时是否跟踪对同一对象的引用,如果对象图形具有循环并且如果它们包含同一对象的多个副本,则这对于效率是有用的。如果您知道不是这种情况,可以禁用以提高性能。