2016-11-11 3 views
0

Я начинаю играть с Spark 2.0.1. Новый API Dataset очень чист, но у меня проблемы с очень простыми операциями.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. В вашем случае я сомневаюсь, что это было вызвано

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

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

вы могли бы рассмотреть этот код, в котором сценарий, его negetively инициализации, печатая полный трассировки стека.

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 сериализации вместе с апача искры ... когда это может случиться/исправить это, как показано ниже ...

Very large object graphs

Опорные лимиты

Kryo хранит ссылки на карте, которая основана на массиве int. Поскольку индексы массива Java ограничены Integer.MAX_VALUE, Сериализация больших (> 1 млрд.) Объектов может привести к java.lang.NegativeArraySizeException.

Обойти этот вопрос отключение ссылочного отслеживания Kryo как , указанные ниже:

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

или же свойство, как spark.kryo.refferenceTrackingEnabled = false в spark-default.conf или sparkConf объекта, если вы хотите установить его программно ..

Spark docs says that

spark.kryo.referenceTracking значение по умолчанию true

ли отслеживать ссылки на тот же объект при сериализации данных с Kryo, которая необходима, если ваш объект графика имеет петлю и полезна для повышения эффективности, если они содержат несколько копий одного и того же объекта . Может быть отключено для повышения производительности, если вы знаете, что это не .

+0

Благодарим вас за ответ. Проблема в том, что spark.read() и другие инструкции являются библиотечными вызовами, т.е. я только что использовал библиотеку без специального кода, кроме Info.class. – besil

+0

вы можете вставить более подробную информацию, такую ​​как ваш json, полная трассировка стека ошибок и объект Info model и т. Д. ... –

Смежные вопросы