2016-11-11 5 views
0

Ich fange an, mit Spark 2.0.1 zu spielen. Die neue Dataset API ist sehr sauber, aber ich habe Probleme mit sehr einfachen Operationen.Spark 2.0.1 java.lang.NegativeArraySizeException

Vielleicht vermisse ich etwas, hoffe jemand kann helfen.

Diese Anweisungen

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()); 

produzieren eine

java.lang.NegativeArraySizeException 

und einen fatalen Fehler durch die JVM erkannt (1.8).

Arbeiten an den Daten mit Dataset api (d. H. Wählt, zählen auf Infos-Objekt) funktioniert gut.

Wie kann ich zwischen Dataset und RDD wechseln?

Antwort

1

Im Allgemeinen kommt dieser Fehler when an application tries to create an array with negative size. siehe unten Beispiel.

Der allgemeine Java-Fehler. In Ihrem Fall bezweifle ich dies durch

Dataset<Info> infos = spark.read().json("data.json").as(Encoders.bean(Info.class)); 

System.out.println(infos.rdd().count()); 

verursacht wurde, konnte man diesen Code überprüfen, in dem Szenario, dessen negetively Initialisierung durch Drucken kompletten Stack-Trace.

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) 

Hinweis: Einer des Anwendungsfalles wird mit Kryo Serialisierung zusammen mit Apache Funken ... wenn es fix/wie unten passieren kann, ist ...

Very large object graphs

Referenzgrenzen

Kryo speichert Referenzen in einer Karte, die auf einem Array int basiert. Da Java-Array-Indizes auf Integer.MAX_VALUE, beschränkt sind, kann das Serialisieren von großen Objekten (> 1 Milliarde) zu einem java.lang.NegativeArraySizeException führen.

Eine Abhilfe für dieses Problem ist das Deaktivieren Kryo des Referenznachführmerkmal als unten angegeben:

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

oder aber eine Eigenschaft wie spark.kryo.refferenceTrackingEnabled = false in spark-default.conf oder sparkConf Objekt, wenn Sie es programmatisch festlegen möchten ..

Spark docs says that

spark.kryo.referenceTracking Standardwert true

Ob Referenzen auf das gleiche Objekt zu verfolgen, wenn Daten mit Kryo Serialisierung, die notwendig ist, wenn Ihre Objektgraphen Schleifen haben und nützlich für die Effizienz, wenn sie enthalten mehrere Kopien desselben Objekts . Kann deaktiviert werden, um die Leistung zu verbessern, wenn Sie wissen, dass dies nicht der Fall ist.

+0

Vielen Dank für Ihre Antwort. Problem ist, dass spark.read() und andere Anweisungen Bibliotheksaufrufe sind, dh ich habe gerade die Bibliothek verwendet, ohne benutzerdefinierten Code, außer für Info.class. – besil

+0

können Sie weitere Details wie Ihre JSON, komplette Fehler-Stack-Trace und Info-Modell-Objekt usw. einfügen ... –

Verwandte Themen