Spark Join Strategy

yozzum·2022년 4월 24일
0

Spark

목록 보기
15/21

1. Broadcast Join

  • 모든 executor의 메모리에 복사하여 shuffle 없이 join하는 방식
  • 모든 executor와 driver의 memory에 충분한 공간이 있어야함.
  • 일반적으로 사이즈가 작은 master성 테이블(dimemsion 테이블)에 적용
  • 하나의 테이블이 2GB(8GB in spark3.0>) 이하인 경우 사용가능 (default < 10M otherwise use Hint)
  • base table에는 적용되지 않음.
  • full outer join 외에 모두 적용 가능함.
  • equi join(==) 에만 적용됨.
  • 모든 노드에서 개별적으로 조인이 수행되므로 CPU가 가장 큰 병목구간이 된다.

2. Shuffled Hash Join(SHJ)

  • 작은 테이블에 대해 hash table을 만들어 메모리에 올리고 shuffle > 큰 테이블 shuffle 해서 각각 대응되는 파티션이 같은 key값을 가지도록 만들어 join하는 방식
  • hash table을 메모리에 올리기에 memory에 부하가 있음.
  • OOM(Out Of Memory)에 취약함
  • full outer join 외에 모두 적용 가능함.
  • equi join(==) 에만 적용됨.
  • broadcast 될 정도는 아니지만 한쪽 테이블이 상대적으로 많이 작은 경우 SMJ보다 빠를 가능성이 있음.

3. Sort Merge Join(SMJ)

  • join key 기준 정렬이 되도록 shuffle 후에 join하는 방식
  • 가장 일반적인 join stategy임.
  • memory spill은 디스크에 저장되어 OOM이 잘 일어나지 않음.
  • join key가 sortable 해야함.
  • full outer join 까지 모두 적용 가능함.
  • equi join(==) 에만 적용됨.
  • Bucketing 을 통해 최적화 가능

4. Broadcast Nested Loop Join(BNLJ)

  • used for non-equi joins(>, <)
  • 만약 하나의 테이블이 상대적으로 작다면 Broadcast join과 같은 방식으로 풀리지만, 크다면 cartesian product로 풀림.
profile
yozzum

0개의 댓글