Spark Join 방식 톺아보기

노라에몽·2025년 7월 11일

Spark

목록 보기
4/4

1. Broadcast Hash Join

Broadcast Hash Join은 조인 시 하나의 테이블이 작은 사이즈일 경우 유용합니다. 작은 쪽의 데이터 값을 해시 테이블로 만들어 Driver를 통해 모든 Worker 노드에 복사되고 각 파티션 내에서 조인이 수행됩니다. spark.sql.autoBroadcastJoinThreshold 값을 통해 Broadcast Join이 일어나게 할 수 있는 값을 설정할 수 있습니다. (기본 10MB)
이 조인 방식은 모든 Worker 노드에 데이터가 복사되기 때문에 셔플이 일어나지 않습니다. 대신 큰 테이블이 브로드캐스트될 경우 네트워크 사용량이 많은 작업으로 인해 성능이 저하될 수 있습니다.

2. Shuffle Hash Join

Shuffle Hash Join은 셔플을 통해 동일한 조인 키를 가진 row를 동일한 executor 노드에 위치시킵니다. 그 이후 조인을 수행합니다.
Shuffle Hash Join이 일어나게 하기 위해서는 Sort Merge Join 옵션을 false로 설정해야합니다.
Shuffle Hash Join은 Dataset에 해시 테이블을 생성할 뿐만 아니라 셔플링도 일어나기 때문에 비용이 많이 듭니다.

spark.sql.join.preferSortMergeJoin=false

3. Shuffle Sort Merge Join

Shuffle Sort Merge Join은 셔플을 통해 동일 Key가 동일 파티션 내에 위치하도록 한 뒤 조인 키를 정렬한 후 조인 키를 기반으로 merge가 일어납니다.
Shuffle Sort Merge Join이 default 조인 전략이고, 조인 키는 정렬 가능해야합니다.

Hint

Hint를 통해 Spark가 사용해야하는 Join 전략을 사용자가 제안할 수 있습니다.
https://spark.apache.org/docs/latest/sql-ref-syntax-qry-select-hints.html#join-hints

(1) BROADCAST
브로드캐스트 조인을 제안합니다.

-- Join Hints for broadcast join
SELECT /*+ BROADCAST(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;
SELECT /*+ BROADCASTJOIN (t1) */ * FROM t1 left JOIN t2 ON t1.key = t2.key;
SELECT /*+ MAPJOIN(t2) */ * FROM t1 right JOIN t2 ON t1.key = t2.key;

(2) MERGE
shuffle sort merge join을 제안합니다.

-- Join Hints for shuffle sort merge join
SELECT /*+ SHUFFLE_MERGE(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;
SELECT /*+ MERGEJOIN(t2) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;
SELECT /*+ MERGE(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;

(3) SHUFFLE_HASH
Shuffle hash join을 제안합니다.

-- Join Hints for shuffle hash join
SELECT /*+ SHUFFLE_HASH(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;

(4) SHUFFLE_REPLICATE_NL
nested loop join을 제안합니다. (카테시안 곱, 조인 키가 없을 때)

-- Join Hints for shuffle-and-replicate nested loop join
SELECT /*+ SHUFFLE_REPLICATE_NL(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;

각 테이블에 두개의 조인 전략이 제시되었을 경우 Spark는 BROADCAST-> MERGE -> SHUFFLE_HASH -> SHUFFLE_REPLICATE_NL 순서로 고려합니다.

profile
대나무 헬리콥터

0개의 댓글