작성
·
232
1
3.0에서 추가된 merge, shuffle_hash, shuffle_replicate_nl hint는 어떤 상황에서 효과적일까요? 문서에서는 아쉽게도 각 힌트가 뭘 수행하는 지와 BROADCAST
> MERGE
> SHUFFLE_HASH
> SHUFFLE_REPLICATE_NL
순서로 힌트 우선순위를 정한다는 것만 적혀있네요.
spark optimizer가 어떤 기준으로 join 전략을 택하는지도 알려주시면 좋을 것 같아요.
답변 1
0
안녕하세요 김문수님,
하나의 질문에 꽤 많은 질문이 들어가있지만, 좋은 질문 입니다. 일단 모두 다 Join을 할 때 사용하는 전략인 것을 아시고 계실거라 생각됩니다. 짧게나마 하나 하나씩 설명해 보겠습니다.
MERGE: 간략하게 얘기하자면 Sort merge join이고 대용량 데이타를 사용할 때 쓰입니다. 데이타가 너무 큰 나머지, 메모리에 넣을 수 없을 때에 데이터가 정렬이 되어 있다면 조인을 할 때 서로 찾기 쉽기 때문에 유용하게 사용합니다.
SHUFFLE_HASH: 중간 사이즈 데이타를 조인할 때 사용하며, 조인하려는 데이타의 크기가 많이 차이날 때 많이 사용합니다. 작은 쪽은 해쉬화를 해서 조인하기 때문에 둘다 Sort할 필요가 없어서 좋습니다.
SHUFFLE_REPLICATE_NL: 카르테시안 조인일 때 많이 사용하고, 이름 그대로 Nested Loop(한글로 뭘라고 부르는지 모르겠네요) 조인할 때 많이 사용합니다. 하나하나씩 다 비교해봐야하는 아주 Expsensive한 프로세스기 때문에 어쩔 수 없을 경우에만 사용합니다.
마지막으로 "spark optimizer가 어떤 기준으로 join 전략을 택하는지도 알려주시면 좋을 것 같아요."에 대한 대답은, 경험상 Spark가 유저가 제안한 hint를 100%로 따라가지도 않고, 데이타 마다 그 조건이 너무 다르기 때문에 뭐라고 딱히 이렇게 한다라고 말할 수는 없겠지만, 위에 설명대로 Spark가 하나하나씩 테스트 해보고 가장 Optimal한 결정을 한다라고 말씀 드릴 수 밖에 없을 듯 합니다.