Xplenty에서 JOIN 처리의 고속화 방법

올바른 Join유형의 선택으로 데이터 통합 성능을 향상시킬 수 있다는 것을 알고 계시나요? 
Pig(Xplenty의 기반기술)는 몇가지 알고리즘(영어)을 가지고 있으며 데이터 셋의 특성에 따라 최적의 방법으로 조인 처리를 수행하여 작업 실행 시간을 크게 절약 할 수 있습니다.

Xplenty의 Join 컴포넌트는 Pig에서 사용할 수있는 Join 유형 중에서 다음 유형을 지정할 수 있습니다.

복제된 조인(Replicated Join)

  • 어떤 경우에 사용합니까?
    데이터 세트가 메모리에 들어갈 정도로 작을 때

  • 어떻게 작동합니까?
    Replicated join은 작은 데이터 셋를 분산 캐시 (모든 클러스터 시스템에서 사용 가능한 공간)에 복사하여 메모리에 로드합니다. 각 매퍼는 큰 데이터 세트가 분할된 데이터를 처리하고 더 작은 데이터 세트 중에서 일치하는 레코드를 찾습니다. 데이터는 메모리에서 처리되고 MapReduce의 맵 측에서 처리되므로 이 작업은 기본 조인보다 훨씬 빠르게 작동합니다. 
    내부 및 외부 조인 모두 사용할 수 있으며 작은 데이터 셋은 join의 오른쪽에 설정해야합니다.

  • 제약
    Replicated join을 사용하기 위해 얼마나 작은 데이터 세트까지 가능한지 명확하지 않습니다. Pig 문서(영어) 에 따르면 프로세스 전체에서 1GB의 메모리가 필요한 경우 최대 100MB의 리레이션(조인 대상 데이터)를 사용할 수 있습니다. 데이터를 로드하기에 충분한 메모리가 없으면 런타임 에러가 발생합니다.
    Xplenty에서 Replicated join을 지정하는 경우 Inner와 Left join에서만 사용가능합니다.

기울어진 조인(Skewed Join)

  • 어떤 경우에 사용합니까?
    특정 키의 값이 다른 값보다 훨씬 많은 부분을 차지하고 데이터가 너무 커서 메모리에 모두 들어가지 않는 경우(키의 값이 균등하게 분산되지 않고 특정 키의 값에 편향된 경우)

  • 어떻게 작동합니까?
    Standard joins은 프로세스간에 키 값을 분할하여 다른 reducer간에 병렬로 실행됩니다. 특정 키를 가진 데이터가 많은 경우, 데이터는 각 reducer에 균등하게 분산되지 않고, 어느 reducer에 대부분의 데이터가 몰려 처리 됩니다. Skewed join은 이러한 경우를 해결하는 데 사용되는데, 히스토그램을 계산하여 어떤 키가 가장 많이 차지하는지 확인하고 최적의 성능을 얻기 위해 각 reducer로 데이터를 분할합니다.

  • 제약
    Skewed join은 내부 및 외부 결합을 모두 지원하지만 두 개의 입력 데이터만 사용할 수 있습니다. 두 개 이상의 테이블 간의 조인은 다른 조인으로 분리되어야 합니다. 또한 pig.skwedjoin.reduce.memusage라는 Java 매개변수가 있으며, 이 조인을 수행하기 위해 Reducer가 사용할 수 있는 힙 비율을 지정합니다. 
    낮은 값을 설정하면 더 많은 Reducer가 사용됨을 의미하지만 데이터를 복사하는 데 드는 비용이 증가합니다. Pig 개발자는 이 값을 0.1-0.4 사이로 설정하면 좋은 성능을 얻을 수 있다고 주장하지만, 이상적인 값을 찾으려면 확인이 필요합니다.

기본(Default)

  • 어떤 경우에 사용합니까?
    위의 경우 중 하나에 해당하지 않는 경우

  • 어떻게 작동합니까?
    Join은 특정 키로 두 가지 입력 데이터 세트의 레코드를 연결 시킵니다. 예를 들어, CRM의 레코드와 ERP의 레코드를 이메일 주소와 같은 키로 결합하여 여러 개의 개별 데이터 세트가 아닌 모든 고객 정보를 동일한 데이터 세트로 그룹화 할 수 있습니다. 외부 조인도 가능하며, 이 경우 상대방에서 일치하지 않는 레코드의 누락된 필드는 Null 값이 설정되어 포함됩니다.
    Pig는 맵 단계에서 모든 조인 대상의 입력 데이터 세트(2개 이상)를 읽고 각 레코드의 소스에 주석을 추가합니다. 조인 키를 셔플 키로 사용하고 동일한 키를 가진 행을 그룹화합니다. 각 키 값에 대해 왼쪽 입력 데이터 세트(또는 여러 입력 데이터 세트)의 모든 레코드가 캐시됩니다(하나의 키 값에 대해 여러 레코드가 있을 수 있음). 그런 다음 오른쪽의 입력 데이터 세트를 캐시된 레코드와 곱하여 출력 레코드를 생성합니다.
    이 말은 일대다 조인에서는 조인 성능을 향상시키기 위해 키 값당 레코드 수가 많은 입력 데이터 세트를 항상 오른쪽에 배치해야 합니다.

  • 제약
    모든 Pig의 join은 등결합이며, join 연산자에는 등호 비교(equals/not equals)만을 사용할 수 있는 것을 의미합니다. Pig는 세타(비등호) 조인을 지원하지 않으며 MapReduce에서 구현하기가 어렵습니다. 세타 조인이 필요한 경우 Cross-join을 실행한 다음 필터를 사용합니다.
    join 연산자는 NULL의 경우 SQL 표준에 따라 작동합니다. NULL 키를 가진 모든 행은 내부 조인에서 무시됩니다. 따라서 낭비된 레코드 처리를 줄이고 성능을 향상시키기 위해 내부 조인 처리 전에 널 키를 필터링하고 제외하십시오. Null 값은 외부 조인에서 보존되지만 조인 대상 레코드에는 조인되지 않습니다.

JOIN시의 필드명에 관한 주의점

조인할 입력 데이터 세트에 동일한 필드 이름이 포함된 경우 필드 이름 앞에 데이터 세트 이름의 자동부여가 안됩니다. (예: sample_input_data1::customer_id).
이 경우 작업 실행시 오류가 발생할 수 있으므로 후속 처리에서 select 컴포넌트를 사용하여 필드의 열 이름을 수정하거나 조인 프로세스 전에 동일한 값을 포함하는 필드를 삭제 하세요.

요약

데이터 통합의 성능은 올바른 조인 유형을 선택하고 사용하여 향상됩니다. 
한 데이터 세트의 크기가 작 으면 Replicated join을 사용하고 특정 키가 매우 일반적인 경우 Skewed Join을 사용하십시오.

thumbnail image