인프런 커뮤니티 질문&답변
broadcast Join과 boradcast + UDF 차이
해결된 질문
작성
·
21
·
수정됨
0
안녕하세요!
좋은 강의 잘 듣고 있습니다!
강의를 듣던 중 궁금한게 생겨서 질문 남깁니다
UDF + broadcast 대신에 아래 방법으로 lookup테이블을 활용해서BROADCAST JOIN한다면 스파크 내부적으로 다르게 동작하는지,
다르게 동작한다면 어떤 상황에서 각각 이점이 있는지 궁금합니다
lookup_df = spark.createDataFrame(
[(k, v) for k, v in meta.items()],
["occupation_id", "occupation_name"]
)
df_result = interviewer_count.join(
broadcast(lookup_df),
on="occupation_id",
how="left"
)감사합니다.
답변 2
0
안녕하세요 sgjeong1108님,
좋은 질문이네요.
일단 실행 계층 측면에서 봤을때, broadcast join은 JVM 내부에서 해시 조인, Whole-Stage Codegen 최적화를 가능하게 하지만 UDF + broadcast(파이썬 UDF)는 JVM와 Python를 계속 왕복해서 비효율적이며, 코드젠/컬럼너 실행도 비활성화되어있습니다.
또한 broadcast join는 카탈리스트 최적화, 통계, AQE 활용 가능해서 대체로 빠른 반면에, UDF + broadcast는 필터,프루닝,프레디킷 푸시다운 등 대부분 막혀서 느립니다.
결과적으로 기본은 항상 broadcast join로 설계를 하시되, Lookup 자체가 함수형 변환이어야 하거나, 외부 라이브러리를 꼭 써야 할때나... 조인으로 표현이 어려울 때는 UDF + broadcast를 사용하시면 됩니다.
0
안녕하세요, 인프런 AI 인턴입니다. sgjeong1108님.
Spark를 사용하면서 UDF + broadcast와 BROADCAST JOIN의 차이점을 잘 이해하는 것은 성능 최적화에 커다란 도움이 됩니다. 두 방법은 데이터의 처리 방식에 있어 차이가 있습니다.
Broadcast Join vs UDF + Broadcast
Broadcast Join:
- 작은 데이터를 브로드캐스트하여 전체 노드의 메모리에 복제합니다. 이렇게 하면 각 노드에서 작은 데이터셋을 빠르게 참조할 수 있어 성능이 향상됩니다.
- 브로드캐스트 데이터가 충분히 작다면, Spark 클러스터의 각 노드에 데이터를 전송하여 조인의 병목을 줄일 수 있습니다. 이는 일반적으로 Join 연산에서 셔플링의 필요성을 줄여 성능을 높입니다.
broadcast()로 명시적인 브로드캐스트를 구현하면서 데이터의 크기가 특정 임계값보다 작을 경우에 적합합니다. Spark는 10MB를 기본 자동 브로드캐스트 임계값으로 사용합니다.
- 작은 데이터를 브로드캐스트하여 전체 노드의 메모리에 복제합니다. 이렇게 하면 각 노드에서 작은 데이터셋을 빠르게 참조할 수 있어 성능이 향상됩니다.
UDF + Broadcast:
UDF는 사용자 정의 함수를 활용하여 각 레코드별로 연산을 수행합니다. 이는 개별 값을 참조하거나 변환할 때 유용합니다.
UDF사용 시, 개별 레코드에 대해 브로드캐스트된 데이터를 참조하여 복잡한 로직을 처리할 수 있지만, 일반적으로UDF는 Spark의 최적화(예: Catalyst optimizer)의 혜택을 받지 못해 성능에 있어 불리할 수 있습니다.
- 데이터의 변환 혹은 특정 로직의 적용이 요구될 때 UDF를 사용하는 것을 고려합니다.
관련 질문 및 유용한 링크
- 대용량 데이터 Join: 이 게시물에서는 Spark에서 데이터 Join 방법과 발생할 수 있는 문제점들, 그리고 이를 다루기 위해 고려할 수 있는 다양한 테크닉들에 대한 설명이 포함되어 있습니다.
BROADCAST JOIN에 대한 이해를 높이는 데 도움이 될 것입니다.
실제로 사용하시는 시나리오에 따라 각 방법의 성능 차이가 있을 수 있습니다. 데이터 크기와 유형, 처리 요구사항에 따라 적절한 방법을 선택하시는 것이 중요합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.






답변 감사합니다!