2016-06-15 4 views
4

Spark SQL 또는 Dataframe API를 사용하여 테이블을 조인해야합니다. 그것을 성취 할 수있는 최적의 방법이 무엇인지 알아야합니다.Spark SQL에서 대형 테이블을 결합하는 최적화 된 방법

시나리오는 다음과 같습니다

  1. 모든 데이터는 ORC 형식 하이브 (자료 Dataframe 및 참조 파일)에 존재한다.
  2. 나는 (크기 1 주위 TB)

을 큰 메모리 구조 (400 열)을 만들 11-13 다른 참조 파일과 하이브에서 읽어 하나 개의 자료 파일 (Dataframe)에 가입 할 필요가 무엇을 할 수 이것을 달성하기위한 최선의 방법이 될 수 있을까요? 비슷한 문제가 발생하는 경우 경험을 공유하십시오.

답변

1

원본 파티션을 분할 할 때 해시 파티션이나 범위 파티션을 사용하거나 조인 필드에 대해 더 잘 알고있는 경우 사용자 지정 파티션을 작성할 수 있습니다. 파티션은 같은 파티션에 존재하는 동일한 파티션의 스파크 데이터가 같은 위치에 존재하기 때문에 조인 중에 파티션을 다시 분할하지 않아도됩니다. ORC가 원인을 확실히 돕습니다. 이 IF 여전히 유출, 조인 최적화하는 방법에

5

내 기본 조언 디스크보다 더 빨리 될 것이다 타키온를 사용해보십시오 일으키는 것은 :

  1. 은 (this notebook 참조) 수 있다면 방송에 참여합니다. 귀하의 질문에 테이블이 큰 것 같습니다 방송 조인은 옵션이 아닙니다.

  2. 매우 큰 클러스터를 사용하는 것을 고려하십시오 (생각하면 비용이 저렴합니다). 현재 250 달러 (6/2016)에 EC2 현장 인스턴스 시장에서 6Tb RAM 및 많은 SSD로 800 코어의 약 24 시간을 구입합니다. 큰 데이터 솔루션의 총 비용을 생각할 때, 나는 인간이 시간을 과소 평가하는 경향이 있음을 발견했다.

  3. 동일한 분할자를 사용하십시오. 공동 그룹화 조인에 대한 정보는 this question을 참조하십시오.

  4. 데이터가 크거나 위의 (3)조차도 OOM으로 이어질 정도로 클러스터가 커질 수없는 경우 2 패스 접근 방식을 사용하십시오. 먼저 데이터를 다시 파티션하고 파티션 된 테이블 (dataframe.write.partitionBy())을 사용하여 지속하십시오. 그런 다음 서브 파티션을 루프에서 순차적으로 조인하고 동일한 최종 결과 테이블에 "추가"하십시오.

사이드 노트 : 생산에서 결코 SaveMode.Append을 사용하지 않기 때문에 위의 "추가"라고 말합니다. 그것은 멱등수가 아니며 위험한 것입니다. 파티션 된 테이블 트리 구조의 하위 트리에 깊은 SaveMode.Overwrite을 사용합니다. 2.0.0 및 1.6.2 이전에는 _SUCCESS을 삭제하거나 메타 데이터 파일 또는 동적 파티션 검색이 중단됩니다.

희망이 도움이됩니다.

+0

감사합니다. –

+0

AWS의 6TB + 800 코어 서버 중 하나입니까? – user650749

+0

단일 서버가 아닌 클러스터였습니다. 예, AWS에 있습니다. – Sim