2016-11-11 1 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()); 

는 JVM (180)에 의해 검출 된

java.lang.NegativeArraySizeException 

및 치명적인 오류를 생성한다.

데이터 세트 api를 사용하여 데이터 작업 (즉, 선택, infos 개체 계산)이 올바르게 작동합니다.

어떻게 데이터 세트와 RDD를 전환 할 수 있습니까?

답변

1

일반적으로이 오류는 when an application tries to create an array with negative size.입니다. 아래 예를 참조하십시오.

일반적인 자바 오류입니다. 귀하의 경우에는 내가 의심이가

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

참조 제한

Kryoint 배열을 기반으로하는 참조를 맵에 저장합니다. Java 배열 인덱스가 Integer.MAX_VALUE으로 제한되어 있으므로 큰 개체 (10 억 개 이상)를 직렬화하면 java.lang.NegativeArraySizeException이 될 수 있습니다.

이 문제에 대한 해결 방법

아래에 표시 로 Kryo의 참조 추적을 사용하지 않도록 설정되어

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

또는 다른 spark-default.conf에서 spark.kryo.refferenceTrackingEnabled = false 같은 속성이나 sparkConf 객체를 사용하면 프로그래밍 방식을 설정하려면 ..

Spark docs says that

spark.kryo.referenceTracking 기본값 true

개체 그래프가 루프를 가지고 효율성 유용한 경우 필요 Kryo와 데이터 를 직렬화 할 때 동일한 개체에 대한 참조를 추적할지 여부 만약 그들이 동일한 개체의 사본이 여러 개 있습니다. 사례가 아는 경우 성능을 향상 시키려면 사용 중지 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 문제는 spark.read() 및 기타 지침은 라이브러리 호출입니다. 즉, Info.class를 제외하고 사용자 정의 코드없이 라이브러리를 사용한 것입니다. – besil

+0

json, 오류 스택 추적 및 Info 모델 개체 등을 추가로 붙여 넣을 수 있습니까? –