이 페이지에서는 Cloud Data Fusion의 JOIN
작업에 관한 성능 조정을 설명합니다.
JOIN
작업은 파이프라인에서 가장 비용이 많이 드는 부분일 수 있습니다. 파이프라인의 다른 모든 것과 마찬가지로 작업은 동시에 실행됩니다. JOIN
의 첫 번째 단계는 데이터를 셔플하여 동일한 JOIN
키가 있는 모든 레코드가 동일한 실행자로 전송되는 것입니다. 모든 데이터가 셔플된 후 조인되고 파이프라인을 통해 출력이 계속됩니다.
JOIN
작업의 병렬 처리 예
예를 들어 Purchases
및 Items
라는 데이터 세트에 대해 JOIN
작업을 실행한다고 가정해 보겠습니다. 각 구매 기록에는 구매한 품목 이름과 번호가 포함되어 있습니다. 각 품목 레코드에는 해당 품목 이름과 품목 가격이 포함됩니다. 품목 이름에 JOIN
가 실행되어 각 구매의 총 가격이 계산됩니다. 데이터가 조인되면 클러스터 전체에서 데이터가 셔플되어 동일한 ID를 가진 레코드가 동일한 실행자에 배치됩니다.
JOIN
키가 상당히 균일하게 배포되면 병렬로 실행될 수 있으므로 JOIN
작업이 잘 수행될 수 있습니다.
다른 모든 셔플과 마찬가지로 데이터 편향은 성능에 부정적인 영향을 줍니다. 위 예시에서 계란은 닭고기나 우유보다 훨씬 더 자주 구매되므로 계란 구매에 조인하는 실행자가 다른 실행자보다 더 많은 작업을 수행합니다. JOIN
이 편향된 것을 알게 되면 성능을 개선하는 두 가지 방법이 있습니다.
편향된 파티션 자동 분할
적응형 쿼리 실행을 사용하면 매우 심한 편향이 자동으로 처리됩니다.
JOIN
으로 인해 다른 파티션보다 훨씬 큰 파티션이 생성되는 즉시 더 작은 파티션으로 분할됩니다. 적응형 쿼리 실행이 사용 설정되어 있는지 확인하려면 자동 조정을 참고하세요.
인메모리 JOIN
사용
JOIN
의 한 쪽이 메모리에 들어갈 만큼 작으면 인메모리에 JOIN
을 실행할 수 있습니다. 이 경우 작은 데이터 세트가 메모리에 로드된 후 모든 실행자에게 브로드캐스트됩니다. 대용량 데이터 세트는 전혀 셔플되지 않으므로 JOIN
키로 셔플할 때 생성되는 불균형한 파티션이 삭제됩니다.
이전 예에서는 항목 데이터 세트가 먼저 Spark 드라이버의 메모리에 로드됩니다. 그런 다음 각 실행자에게 브로드캐스트됩니다. 이제 실행자는 구매 데이터 세트를 셔플하지 않고도 데이터를 조인할 수 있습니다.
이 접근 방식을 사용하려면 Spark 드라이버와 실행자가 브로드캐스트 데이터 세트를 메모리에 저장할 수 있도록 충분한 메모리를 제공해야 합니다. 기본적으로 Spark는 이 유형의 데이터를 저장하기 위해 메모리의 30% 미만을 예약합니다. 인메모리 JOIN
를 사용하는 경우 데이터 세트 크기에 4를 곱한 값을 실행자 및 드라이버 메모리로 설정합니다. 예를 들어 항목 데이터 세트의 크기가 1GB인 경우 실행자 및 드라이버 메모리를 4GB 이상으로 설정해야 합니다. 8GB보다 큰 데이터 세트는 메모리에 로드할 수 없습니다.
키 배포
JOIN
의 양쪽이 너무 커서 메모리에 맞지 않는 경우 다른 기법을 사용하여 각 JOIN
키를 여러 키로 분할하여 병렬 처리 수준을 높일 수 있습니다. 이 기법은 INNER JOIN
및 LEFT OUTER JOIN
작업에 적용할 수 있습니다. FULL OUTER JOIN
작업에는 사용할 수 없습니다.
이 접근 방식에서는 1~N까지의 난수가 있는 새 정수 열을 사용하여 편향된 쪽에 솔트 처리를 적용합니다. 편향되지 않은 쪽이 제거되고 기존 행마다 N
개의 새 행이 생성됩니다. 1부터 N까지의 각 숫자로 채워진 새 열이 제거된 측면에 추가됩니다. 그런 다음 새 열이 JOIN
키의 일부로 추가되는 점을 제외하고 일반 JOIN
이 실행됩니다. 이렇게 하면 단일 파티션으로 이동하던 모든 데이터가 이제 최대 N
개의 서로 다른 파티션으로 분산됩니다.
위 예에서 분포 계수 N
은 3
으로 설정됩니다. 원본 데이터 세트는 왼쪽에 표시됩니다. 데이터 세트의 솔트 처리 및 분해 버전이 가운데에 표시됩니다. 오른쪽에는 한 명이 아닌 세 명의 다른 실행자가 계란 구매에 참여한 셔플된 데이터가 표시됩니다.
배포를 늘리면 병렬 처리 성능이 개선됩니다. 하지만 이 경우 JOIN
의 한 쪽이 폭발적으로 증가하여 클러스터 전반에서 더 많은 데이터가 셔플됩니다. 따라서 배포가 증가할수록 이익은 감소합니다. 대부분의 경우 20개 이하로 설정합니다.
다음 단계
- Cloud Data Fusion의 병렬 처리 알아보기