2016-10-25 3 views
0

을 감안할 때 다음과 같은 파일 :스파크 그룹화 튜닝

  • 직원
  • 기술
  • 보고서
직원 사이

및 다른 파일의 각 1 대이 N 관계, 예. 한 직원에게 여러 기술이 해당됩니다. 각 파일은 500MB에서 1.5GB 사이이며 합계로 약 10 개의 파일이 있습니다.

<employees> 
    <employee> 
    <skills> 
     <skill>...</skill> 
     <skill>...</skill> 
     ... 
    </skills> 
    <reports 
     <report>...</report> 
     <report>...</report> 
     ... 
    </reports> 
    ... 
    </employee> 
    ... 
</employees> 

내가 라인을 따라 뭔가를하고 있어요 : 는 각 직원, 나는/집계 (등 기술, 보고서) 모든 파일의 모든 정보를 수집하고 XML 구조에 기록 할 :

val employeesRdd = employeesDf.map(r => (r.getAs[String]("employeeId"), r)) 
val skillsRdd = skillsDf.map(r => (r.getAs[String]("employeeId"), r)).groupByKey() 
val reportsRdd = reportsDf.map(r => (r.getAs[String]("employeeId"), r)).groupByKey() 
... 

employeesRdd 
    .leftOuterJoin(skillsRdd) 
    .leftOuterJoin(reportsRdd) 
    ... 
    .toLocalIterator 
    ... // write <employee> nodes one by one 

문제점 모든 groupByKey() 작업은 많은 시간이 소요되는 것처럼 매우 느립니다. 그리고 너무 오래 실행하면 java.lang.OutOfMemoryError : GC 오버 헤드 한도를 초과하여 폭발합니다. 저는 로컬 모드에서 Spark 1.5.1을 사용하고 있습니다. 약 20GB가 jvm에 할당되어 있습니다.

답변

0

Spark DataFrame을 파티션하는 것이 최선의 선택입니다.

관련 정보는 관련 정보에 대한 데이터를 neary에 저장하는 데 도움이됩니다. 따라서 필요한 정보에 신속하게 액세스하는 프로세스가 도움이됩니다.

offical docdoc