2017-11-03 1 views
0

하이브 테이블에서 데이터를 읽는 SparkSQL 쿼리를 실행하려고하는데 특정 임계 값을 초과하면 실패합니다. 매직 넘버의 일종 인 50 만 행SparkSQL rdd 파티션이 캐시 메모리에 맞지 않습니다.

val 500k = spark.sql("""select myid, otherfield, count(*) as cnt from mytable 
group by otherfield, myid order by cnt desc limit 500000""").cache(); 

500k.show(); 

:

나는 명령을 실행합니다. 내가 더 가면 작업 인해 오류로 실패 보관 UI를에서

15:02:05 WARN MemoryStore: Not enough space to cache rdd_52_0 in memory! (computed 2046.7 MB GB so far) 
15:02:05 INFO MemoryStore: Memory use = 624.7 KB (blocks) + 2043.5 MB (scratch space shared across 1 tasks(s)) = 2044.1 MB. Storage limit = 2.7 GB. 
15:02:05 WARN CacheManager: Persisting partition rdd_52_0 to disk instead. 
15:17:56 ERROR Executor: Exception in task 1.0 in stage 4.0 (TID 24002) 
java.lang.IllegalArgumentException: Size exceeds Integer.MAX_VALUE 

내가 GB 후 디스크에 기록 크기 3.1로 rdd_52_0을 볼 수 있습니다.

Understanding Spark partitioningwhy I got the error: "Size exceed Integer.MAX_VALUE" when using spark+cassandra? 을 상담 한 결과, rdd가 커지므로 오버플로가 발생합니다. WebUI에서는 문제가되는 1 rdd 만 표시됩니다. 셔플 후 캐시 된 rdd 수를 어떻게 강요 할 수 있습니까? 내가 500k.repartition(100)로 파티션을 다시 시도

, 나는 내가 spark.default.parallelism와 같은 시도, spark.sessionstate.conf.setConf(SHUFFLE_PARTITIONS, 100)와 shufflePartitions의 수를 증가하고 난 16 GB의 두 드라이버와 집행 메모리를 증가 - 모든 succes에없이.

또한 2.7GB 제한은 어디에서 제공됩니까?

+0

당신이 https://stackoverflow.com/questions/42247630/sql-query-in-spark-scala-size-exceeds- [이] (확인 할 수 있습니다 "유지"를 사용하십시오 integer-max-value) – MaxU

+0

@MaxU는 링크에 대해 고맙지 만 기본적으로 두 번째 게시물과 동일합니다. rdd가 다시 분할을 무시합니다 (100). –

답변

0

rdd.persist(StorageLevel) where Storagelevel = { 
MEMORY_ONLY, MEMORY_AND_DISK, 
MEMORY_ONLY_SER, MEMORY_AND_DISK_SER, DISK_ONLY} 


cachce is rdd.persist(MEMORY_ONLY). 
please use rdd.persist(MEMORY_AND_DISK) 
+0

답장을 보내 주셔서 감사합니다. 불행히도 이것은 내 문제를 완전히 해결하지 못한다. Spark이 디스크에 덤프 할 수있게 해준다. –

관련 문제