하이브 테이블에서 데이터를 읽는 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 partitioning 및 why 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 제한은 어디에서 제공됩니까?
당신이 https://stackoverflow.com/questions/42247630/sql-query-in-spark-scala-size-exceeds- [이] (확인 할 수 있습니다 "유지"를 사용하십시오 integer-max-value) – MaxU
@MaxU는 링크에 대해 고맙지 만 기본적으로 두 번째 게시물과 동일합니다. rdd가 다시 분할을 무시합니다 (100). –