2017-04-07 4 views
0

우리는 50MM 행을 처리해야하는 Spark 환경이 있습니다. 이 행에는 키 열이 들어 있습니다. 고유 한 키 수는 2000에 가깝습니다. 2000 개의 키를 모두 병렬로 처리하고 싶습니다. 따라서 우리는 다음과 같은스파크 파티션 - DISTRIBUTE BY 옵션 사용

hiveContext.sql("select * from BigTbl DISTRIBUTE by KEY") 

같은 스파크 SQL을 사용하고 그 후 우리는 병렬로 모든 파티션에서 잘 작동하는 mapPartitions 있습니다. 그러나 문제는 기본적으로 200 개의 파티션 만 생성한다는 것입니다. 다음과 같은 명령을 사용하여 나는 고유 키의 숫자가 무엇인지 모르겠다 실제 생산 실행시 파티션 그러나

hiveContext.sql("set spark.sql.shuffle.partitions=500"); 

을 높일 수 있어요. 나는 이것이 자동 관리되기를 원한다. 이 작업을 수행 할 수있는 방법이 있습니까?

감사

발라

답변

1

난 당신이 "다시 분할"기능을 사용하고 새로운 임시 테이블로 다시 파티션도 추가로 캐쉬 빠른 처리를 위해 등록 할 것을 제안합니다. 추가 쿼리에 대한

val distinctValues = hiveContext.sql("select KEY from BigTbl").distinct().count() // find count distinct values 

hiveContext.sql("select * from BigTbl DISTRIBUTE by KEY") 
     .repartition(distinctValues.toInt) // repartition to number of distinct values 
     .registerTempTable("NewBigTbl") // register the repartitioned table as another temp table 

hiveContext.cacheTable("NewBigTbl") // cache the repartitioned table for improving query performance 

는 "NewBigTbl"빠른 응답을 너무 많이

+0

감사를 사용합니다. 다른 기능 테스트를 마칩니다. 일단 내가 끝내면 제안하고 업데이트하는 접근 방식을 확실히 시도 할 것입니다. 도움에 다시 한번 감사드립니다 –

+0

Thanks @Snchit Grover. 그것은 매우 잘 작동했습니다. 고맙습니다. 그러나 나는 많은 수의 파티션으로 인해 다른 문제를 겪고있다. 우리는 Spark 1.6.1을 사용하고 있으며 SPARK-12837이라는 버그가 발생했다고 생각합니다. 우리가 2.0으로 업그레이드 할 수 있는지 알아볼 것입니다. 지금이 문제는 마감되었으며 다시 한 번 감사드립니다. –