2016-11-11 3 views
0

私はSpark 2.0.1でプレイを開始しています。新しいデータセットAPIは非常にきれいですが、私は非常に単純な操作で問題を抱えています。Spark 2.0.1 java.lang.NegativeArraySizeException

多分私は何かが不足している、誰かが助けることを願っています。

これらの命令

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を切り替えるにはどうすればよいですか?

答えて

1

一般に、このエラーはwhen an application tries to create an array with negative size.です。以下の例を参照してください。

一般的なJavaエラーです。あなたのケースでは、私は、これはあなたが完全なスタックトレースを印刷することで、どのシナリオでそのnegetively初期化をこのコードを確認でき

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) 

注:ユースケースの一つは apacheの火花とともにKryo直列化を使用している...それは/修正が起こることができるときは、以下のようなものです...

Very large object graphs

参考限度

Kryoは、int配列に基づく参照をマップに格納します。 Java配列のインデックスがInteger.MAX_VALUEに制限されているため、 という大きなオブジェクト(10億を超える)をシリアル化すると java.lang.NegativeArraySizeExceptionとなることがあります。あなたがプログラム的にそれを設定したい場合は

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

か、他spark-default.confまたはsparkConfオブジェクト内= falsespark.kryo.refferenceTrackingEnabledのようなプロパティ..:この問題の

この問題を回避するには、以下に示す としてKryoの参照の追跡を無効にしています

Spark docs says that

spark.kryo.referenceTrackingデフォルト値true

必要があるKryo、とのデータ をシリアル化するときにあれば、あなたのオブジェクトグラフはループを持っていると効率のために 便利な場合は、同じオブジェクトへの参照を追跡するかどうか同じ オブジェクトの複数のコピーが含まれています。これが ではないことがわかっている場合は、パフォーマンスを向上させるために無効にすることができます。

+0

ありがとうございました。問題は、spark.read()と他の命令はライブラリ呼び出しです。つまり、Info.classを除いて、カスタムコードなしでライブラリを使用したばかりです。 – besil

+0

json、完全なエラースタックトレース、Infoモデルオブジェクトなどの詳細を貼り付けることができますか? –

関連する問題