我开始玩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之间切换?
答案 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 ...当它可能发生/修复就像下面......参考限制
Kryo
在基于int
数组的地图中存储引用。 由于Java数组索引仅限于Integer.MAX_VALUE
, 序列化大(> 10亿)对象可能导致ajava.lang.NegativeArraySizeException
。此问题的解决方法是禁用Kryo的引用跟踪 如下所示:
Kryo kryo = new Kryo(); kryo.setReferences(false);
spark.kryo.refferenceTrackingEnabled
或false
对象中使用spark-default.conf
= sparkConf
这样的属性。
spark.kryo.referenceTracking
默认值true
在序列化数据时是否跟踪对同一对象的引用 使用Kryo,如果你的对象图有循环和必要,这是必要的 如果它们包含相同的多个副本,则对效率有用 宾语。如果您知道不是,可以禁用以提高性能 案件。
答案 1 :(得分:0)
根据Spark Docs,spark-default.conf
中来自上面答案的设置现在称为spark.kryo.referenceTracking
。