책너두 (데이터 중심 애플리케이션 설계) 35일차 (~406p)

요약

  • 맵리듀스와 분산 파일 시스템에 대해 이해함.
  • 맵리듀스 작업 실행하기에 대한 내용을 이해함.
    • 맵리듀스의 분산실행과 워크플로
  • 리듀스 사이드 조인과 그룹화에 대해 이해함.
    • 정렬 병합 조인
    • 같은 곳으로 연관된 데이터 가져오기
    • 그룹화
    • 쏠림 다루기
  • 맵 사이드 조인에 대해 이해함.
    • 브로드캐스트 해시 조인
    • 파티션 해시 조인
    • 맵 사이드 병합 조인
    • 맵 사이드 조인을 사용하는 맵리듀스 워크플로

메모

맵리듀스와 분산 파일 시스템

  • 맵리듀스는 수천 대의 장비로 분산해서 실행이 가능하다.
    • 이것이 유닉스 도구와의 차이임.
  • 유닉스 도구와 마찬가지로 맵리듀스 작업은 입력을 수정하지 않기 때문에 출력을 생산하는 것 외에 다른 부수 효과가 없음.
  • 유닉스 도구는 stdin, stdout 을 입력과 출력으로 사용하는데, 맵리듀스 작업은 분산 파일 시스템상의 파일을 입력과 출력으로 사용한다.
    • 하둡 맵리듀스 구현에서 이 파일 시스템은 HDFS(Hadoop Distributed File System)라고 함.
      • GFS(Google File System)를 재구현한 오픈소스임.
      • HDFS외에도 다양한 분산 파일 시스템이 있음. (ex: FlusterFS, QFS)
      • 아마존 s3, 애저 Blob 저장소, 오픈스택 스위프트 같은 객체 저장소도 여러 면에서 유사함.
        • 다른 점은, HDFS는 필요한 파일의 복사본이 저장된 장비에서 연산 작업을 수행할 수 있음.
        • 객체 저장은 저장소와 연산 장치가 분리되어 있음.
  • HDFS는 비공유 원칙을 기반으로함. (2부 소개 참고)
    • NAS(Network Attached Storage)SAN(Storage Area Network) 아키텍처에서 사용하는 공유 디스크 방식과 반대임
      • 공유 디스크 저장소는 중앙 집중 저장 장치를 사용함.
      • 반면, 비공유 방식은 특별한 하드웨어 필요 없이 일반적인 데이터 센터 네트워크에 연결된 컴퓨터면 충분함.
  • HDFS는 각 장비에서 실행되는 데몬 프로세스로 구성됨.
    • 데몬 프로세스는 다른 노드가 해당 장비에 저장된 파일에 접근 가능하게끔 네트워크 서비스를 제공함.
    • 이때, 데이터 센터 내 모든 범용 장비에 디스크가 장착돼 있다고 가정함.
      • 네임노드(NameNode) 라고 부르느 중앙 서버는 특정 파일 블록이 어떤 장비에 저장됐는지 추적함.
    • 즉, HDFS는 개념적으로 매우 큰 하나의 파일 시스템이고, 데몬이 실행 중인 모든 장비의 디스크를 사용할 수 있음.
  • 장비가 죽거나 디스크에 실패하는 경우에 대비해 파일 블록은 여러 장비에 복제됨.
    • 단순히 여러 장비에 동일한 데이터를 복사하는 방식이 있음.
    • 리드 솔로몬 코드(Reed-Solomon code) 같은 삭제 코딩(erasure coding) 방식을 사용해 데이터 전체를 복제하지 않는 방법도 있음.
      • 적은 저장소의 부담을 줄이고 손실된 데이터를 복구하는 방식임.
  • HDFS는 확장성이 뛰어남.
    • 가장 큰 HDFS 는 수만 대의 장비를 묶어 실행 중이고, 용량으 수백 페타바이트에 달함.
  • HDFS를 이용한 데이터 저장과 접근 비용은 범용 하드웨어와 오픈소스 소프트웨어를 사용하기 떄문에 동급 용량의 전용 저장소 장치를 사용하는 비용보다 훨씬 저렴함.
    • 따라서, 대규모 확장이 실제로 가능함.

맵리듀스 작업 실행하기

  • 맵리듀스는 HDFS 같은 분산 파일 시스템 위에서 대용량 데이터셋을 처리하는 코드를 작성하는 프로그래밍 프레임워크임.
  • p387 단순 로그 분석에 나와 있는 웹 서버 로그 분석과 비교하면 맵리듀스를 쉽게 이해할 수 있음.
    1. 입력 파일을 읽는다. (레코드를 쪼갠다.)
    2. 각 입력 레코드마다 매퍼 함수를 호출해 키와 값을 추출한다.
    3. 키를 기준으로 키-값 쌍을 모두 정렬한다.
    4. 정렬된 키-값 쌍 전체를 대상으로 리듀스 함수를 호출한다.
  • 맵리듀스 작업 하나는 4가지 단계로 수행한다.
    • 2단계(맵)와 4단계(리듀스)는 사용자가 직접 작성한 데이터 처리 코드임.
    • 1단계는 파일을 나누어 레코드를 만드는 데 입력 형식 파서를 씀.
  • 맵리듀스 작업을 생성하려면 매퍼리듀서라는 두 가지 콜백 함수를 구현해야 함.
    • 매퍼(Mapper)
      • 모든 입력 레코드마다 한 번씩만 호출됨.
      • 입력 레코드로부터 키와 값을 추출하는 작업임.
    • 리듀서(Reducer)
      • 맵리듀스 프레임워크는 매퍼가 생산한 키-값 쌍을 받아 같은 키를 가진 레코드를 모으고 해당 값의 집합을 반복해 리듀서 함수를 호출한다.
  • 매퍼는 정렬에 적합한 형태로 데이터를 준비하는 역할을 함.
  • 리듀서는 정렬된 데이터를 가공하는 역할을함.

맵리듀스의 분산 실행

  • 맵리듀스는 병렬로 수행하는 코드를 직접 작성하지 않고도 여러 장비에서 동시에 처리가 가능함.
    • 유닉스 명령어 파이프라인과의 가장 큰 차이점임.
  • 맵리듀스 프레임워크가 장비 간에 데이터가 이동하는 복잡한 부분을 처리함.
    • 따라서 매퍼와 리듀서는 한 번에 하나의 레코드만 처리하고, 입력이 어디서 오고 출력이 어디로 가는지는 신경쓰지 않음.
  • 맵리듀스 작업의 데이터 플로는 다음과 같다.
    1. 여러 장비에서 동시에 처리 가능
      • 매퍼와 리듀서는 한 번에 하나의 레코드만 처리함.
      • 프레임워크가 장비 간 데이터 이동의 복잡한 부분을 처리함.
    2. 함수 작성
      • 맵리듀스는 일반적인 프로그래밍 언어로 함수를 작성할 수 있음.
      • 맵리듀스 작업의 병렬 실행은 파티셔닝을 기반으로 함.
    3. 작업 입력
      • 작업 입력으로 HDFS상의 디렉터리를 사용하는 것이 일반적임.
      • 입력 디렉터리 내 각 파일 또는 파일 블록을 독립된 맵 태스크에서 처리할 독립 파티션으로 간주함.
    4. 데이터 가까이에서 연산하기 원리
      • 맵리듀스 스케줄러는 입력 파일이 있는 장비에서 작업을 수행하려고 함.
      • 이 원리를 적용하면 네트워크를 통해 입력 파일을 복사하는 부담과 네트워크 부하가 감소하고 지역성이 증가함.
    5. 맵리듀스 프레임워크
      • 애플리케이션 코드는 작업이 할당된 장비에 아직 존재하지 않기 때문에, 맵리듀스 프레임워크가 작업을 수행하기에 적절한 장비로 코드를 복사함.
      • 복사가 끝나면 장비에서 매퍼 태스크가 시작되고 입력 파일을 읽기 시작함.
      • 매퍼의 출력은 키-값 쌍으로 구성됨.
    6. 리듀서 측 연산
      • 맵 태스크 수는 입력 파일의 블록 수로 결정되지만 리듀스 태스크 수는 사용자가 설정함.
      • 맵리듀스 프레임워크는 같은 키를 가진 모든 키-값 쌍을 같은 리듀서에서 처리하는 것을 보장함.
    7. 셔플
      • 매퍼가 입력 파일을 읽어서 정렬된 출력 파일을 기록하기를 완료하면, 맵리듀스 스케줄러는 리듀서에게 알려줌.
      • 리듀서는 각 매퍼와 연결해서 리듀서가 담당하는 파티션에 해당하는 정렬된 키값 쌍 파일을 다운로드함.
      • 리듀서를 기준으로 파티셔닝하고 정렬한 뒤 매퍼로부터 데이터 파티션을 복사하는 과정을 셔플이라고 함.
    8. 병합 및 정렬
      • 리듀스 태스크는 매퍼로부터 파일을 가져와 정렬된 순서를 유지하면서 병합함.
      • 서로 인접한 위치에 동일한 키를 가진 레코드가 위치하게 됨.
    9. 리듀서 처리
      • 리듀서는 키와 반복자(iterator)를 인자로 호출하고, 이를 통해 동일한 키를 가진 레코드를 모두 처리할 수 있음.
      • 리듀서는 임의의 로직을 사용해서 레코드들을 처리하고, 여러 출력 레코드를 생성할 수 있음.
    10. 출력
      • 생성된 출력 레코드는 분산 파일 시스템에 파일로 기록됨.
      • 대개 리듀서를 수행한 장비의 로컬 디스크에 사본을 하나 만들고, 다른 장비에 복제본을 만듦.
  • 맵리듀스 프레임워크를 사용하면, 위와 같은 과정을 거쳐 분산 시스템에서 데이터를 효과적으로 처리할 수 있음.
    • 이를 통해 복잡한 분산 처리 작업을 손쉽게 수행할 수 있게 됨.

맵리듀스 워크플로

  • 맵리듀스 워크플로는 여러 개의 맵리듀스 작업을 연결하여 더 복잡한 문제를 해결할 수 있음.
    • 이 과정에서 여러 도구와 스케줄러를 사용해 작업을 관리함.
  • 워크플로 구성
    • 하나의 맵리듀스 작업 출력을 다른 맵리듀스 작업 입력으로 사용함.
    • 하둡 맵리듀스 프레임워크는 워크플로를 직접 제공하지 않으므로, 작업들은 디렉터리 이름을 통해 암묵적으로 연결됨.
  • 유닉스 명령 파이프라인과의 차이점
    • 연결된 맵리듀스 작업은 유닉스 명령 파이프라인과 유사하지만, 각 명령의 출력이 임시 파일에 쓰여 다음 명령이 그 임시 파일로부터 입력을 읽는 방식에 가까움.
  • 스케줄러의 사용
    • 일괄 처리 작업의 출력은 작업이 성공적으로 끝났을 때만 유효함.
      • 따라서 워크플로 상에서 해당 작업의 입력 디렉터리를 생성하는 선행 작업이 완전히 끝나야만 다음 작업을 시작할 수 있음.
    • 하둡 맵리듀스 작업 간 수행 의존성을 관리하기 위해 다양한 스케줄러가 개발됨.
    • ex)우지(Oozie), 아즈카반(Azkaban), 루이지(Luigi), 에어플로(Airflow), 핀볼(Pinball) 등이 있음.
      • 이러한 스케줄러는 많은 일괄 처리 작업의 집합을 유지보수할 떄 유용한 관리 기능이 있음.
      • 이러한 복잡한 데이터 플로를 관리하기 위한 고수준 도구를 지원하는 일은 매우 중요함.
  • 고수준 도구의 사용
    • 피그(Pig), 하이브(Hive), 캐스캐이딩(Cascading), 크런치(Crunch), 플룸자바(FlumeJava) 같은 다양한 하둡용 고수준 도구는 다중 맵리듀스를 서로 적절하게 자동으로 엮어 워크플로를 설정함.
  • 이렇게 여러 단계의 맵리듀스 작업을 연결하여 워크플로를 구성하고, 스케줄러와 고수준 도구를 사용해 작업을 관리하면, 복잡한 문제를 효율적으로 해결할 수 있음.

리듀스 사이드 조인과 그룹화

  • 리듀스 사이드 조인그룹화는 여러 데이터셋 간의 관계를 처리하는 방법임.
    • 조인을 사용하여 관련 레코드를 함께 처리하고 그룹화를 통해 데이터를 구성함.
  1. 조인의 필요성
    • 여러 데이터셋에서 한 레코드가 다른 레코드와 연관되는 것은 일반적이며, 이 경우 조인이 필수적임.
    • 비정규화 작업으로 조인을 줄일 수 있지만 완전히 제거하기는 어려움.
  2. 데이터베이스에서의 조인 처리
    • 데이터베이스는 색인(index)을 사용해 관심 있는 레코드의 위치를 빨리 찾음.
    • 하지만 맵리듀스에는 일반적으로 색인 개념이 없음.
  3. 전체 테이블 스캔
    • 맵리듀스 작업은 입력 파일 전체 내용을 읽는데, 이를 전체 테이블 스캔이라고 함.
    • 적은 수의 레코드만 읽고 싶을 때 전체 테이블 스캔을 사용하면 색인 탐색에 비해 비용이 많이 듦.
  4. 분석 질의의 경우
    • 분석 질의는 대량의 레코드를 대상으로 집계 연산을 하는 것이 일반적이므로, 이 경우 입력 전체를 스캔하는 것이 합리적임.
    • 여러 장비에 걸쳐 병렬 처리가 가능한 경우에는 더욱 그렇다.
  5. 일괄 처리 맥락에서의 조인
    • 일괄 처리 맥락에서 조인은 데이터셋 내 모든 연관 관계를 다룸.
    • 예를 들어, 특정 사용자의 데이터만을 찾는 것이 아니라 모든 사용자 데이터를 동시에 처리함.
  • 리듀스 사이드 조인과 그룹화를 사용하여 데이터 처리를 최적화하고, 필요한 경우 분석 질의를 수행하여 대량의 데이터를 효율적으로 처리할 수 있음.
  • 일괄 처리 작업을 사용하여 모든 사용자 데이터를 동시에 처리하는 것이 더 효율적일 수 있음.

사용자 활동 이벤트 분석 예제

  • 사용자 활동 이벤트 분석 예제에서 사용자 활동과 사용자 프로필 정보를 연관시키는 분석 작업을 수행해야 함.
    • 데이터 준비
      • 왼쪽에는 이벤트 로그(활동 이벤트 또는 클릭스트림 데이터)가 있고, 오른쪽에는 사용자 데이터베이스가 있음.
      • 활동 이벤트는 사용자 ID만 포함하고 전체 사용자 프로필 정보는 포함하지 않음.
    • 사용자 프로필 조인
      • 사용자 활동 이벤트에 사용자 프로필 데이터베이스를 조인해야 함.
      • 이를 위해 원격 서버에 있는 사용자 데이터베이스에 질의를 보내는 것이 가장 간단한 방법이지만, 성능이 좋지 않음.
    • 일괄 처리에서 처리량 높이기
      • 가능한 한 한 장비 내에서 연산을 수행하여 처리량을 높여야 함.
      • 네트워크를 통해 임의 접근 요청을 하는 것은 느림.
    • 사용자 데이터베이스 사본 사용
      • 사용자 데이터베이스의 사본을 추출하여 사용자 활동 이벤트 로그가 저장된 분산 파일 시스템에 넣는다.
      • 이렇게 하면 사용자 데이터베이스와 사용자 활동 레코드가 같은 HDFS 상에 존재하게 됨.
    • 맵리듀스를 사용한 처리
      • 맵리듀스를 사용하여 연관된 레코드끼리 모두 같은 장소로 모아 효율적으로 처리할 수 있습니다.
  • 사용자 활동 이벤트 분석 예제에서는 사용자 활동과 사용자 프로필 정보를 연관시키는 작업을 수행하며, 일괄 처리 작업을 통해 처리량을 높이고 효율적인 연산을 수행할 수 있음.
    • 이를 위해 사용자 데이터베이스 사본을 사용하고 맵리듀스를 활용하여 데이터 처리를 진행한다.

정렬 병합 조인

  • 정렬 병합 조인은 맵리듀스 작업을 사용하여 두 데이터 세트를 효율적으로 결합하는 방법임.
    • 이 방법에서는 다음과 같은 단계를 거친다.
      1. 매퍼 작업
        • 매퍼의 목적은 입력 레코드로부터 키와 값을 추출하는 것임.
        • 예를 들어, 한 매퍼는 활동 이벤트에서 사용자 ID를 키로, 활동 이벤트를 값으로 추출하고, 다른 매퍼는 사용자 데이터베이스에서 사용자 ID를 키로, 사용자 생일을 값으로 추출함.
      2. 파티셔닝 및 정렬
        • 맵리듀스 프레임워크는 키를 기준으로 매퍼의 출력을 파티션하고 키-값 쌍을 정렬함.
        • 이렇게 하면 같은 사용자의 활동 이벤트와 사용자 레코드가 리듀서의 입력에서 서로 인접하게 됨.
      3. 보조 정렬
        • 맵리듀스 작업은 사용자 데이터베이스를 먼저 처리하고 활동 이벤트를 시간 순으로 처리하도록 작업 레코드를 재배열함.
        • 이 기술을 보조 정렬(secondary sort)이라고 함.
      4. 리듀서 작업
        • 보조 정렬 후 리듀서가 수행하는 실제 조인 로직은 간단함.
        • 리듀서 함수는 모든 사용자 ID당 한 번만 호출되며, 첫 번째 값은 사용자 데이터베이스의 생년월일 레코드를 저장함.
        • 리듀서는 지역 변수에 생년월일을 저장하고, 같은 사용자 ID가 동일한 활동 이벤트를 순회하여 본 URL과 본 사람의 연령 쌍을 출력함.
      5. 결과 처리
        • 맵리듀스 작업들은 각 URL마다 본 사람의 연령 분포를 계산하고 연령대별로 클러스터링할 수 있음.
        • 리듀서는 특정 사용자 ID의 모든 레코드를 한 번에 처리하므로 메모리와 네트워크 요청을 절약할 수 있음.

같은 곳으로 연관된 데이터 가져오기

  • 맵리듀스 프레임워크가 데이터 처리와 네트워크 통신을 분리하여 처리 효율을 높이고 실패에 대한 고민을 줄이는 것임.
    1. 매퍼는 키-값 쌍을 추출하여 해당 데이터를 분류함.
    2. 정렬 프로세스는 키를 기준으로 데이터를 정렬하여 연관된 데이터를 같은 곳으로 모음.
    3. 리듀서는 간단한 코드 조각으로 효율적인 데이터 처리를 수행하며, 한 번에 하나의 사용자 ID를 처리하여 메모리 부담을 줄임.
    4. 맵리듀스는 네트워크 통신애플리케이션 로직을 분리하여, 실패한 태스크의 재시도를 관리하고 애플리케이션 로직에 영향을 주지 않음.
  • 이 방식은 데이터 처리와 네트워크 통신의 분리로 인해 높은 처리 효율과 강력한 오류 처리 능력을 제공함.

그룹화

  • 그룹화는 데이터를 특정 키로 묶어 집계 연산을 수행하는 과정임.
  • 이는 SQL에서 GROUP BY 절과 유사한 기능을 제공함.
  • 맵리듀스에서 그룹화를 구현하는 가장 간단한 방법은 매퍼가 생성하는 키-값 쌍에서 그룹화할 대상을 키로 사용하는 것임.
    1. 같은 키를 가진 모든 레코드를 그룹화한다.
    2. 각 그룹 내에서 집계 연산을 수행한다.
      • ex) 레코드 수를 카운트 (SQL에서는 COUNT(*)로 표현)
      • 특정 필드 내 모든 값을 더하기 (SQL에서는 SUM(fieldname))
      • 랭킹 함수를 실행하여 상위 k개의 레코드를 선택
  • 맵리듀스에서 그룹화와 조인은 상당히 유사한 구현을 가짐.
  • 그룹화는 주로 세션화 과정에서 사용됨.
    • 세션화는 사용자 세션별 활동 이벤트를 분석하는 과정으로, A/B 테스트를 확인하거나 마케팅 활동의 가치를 분석할 때 사용됨.
    • 세션화를 구현하려면, 웹 서버에서 생성된 다양한 로그 파일에 분산된 특정 사용자의 활동 이벤트를 모아야 함.
    • 이를 위해 세션 쿠키, 사용자 ID 등의 식별자를 그룹화 키로 사용하여 특정 사용자의 활동 이벤트를 한 곳으로 모은다.
    • 이 과정에서 서로 다른 사용자의 이벤트는 다른 파티션으로 분산됨.

쏠림 다루기

  • 쏠림 현상은 키 하나에 너무 많은 데이터가 연관될 때 발생함.
    • 이러한 불균형한 데이터베이스 레코드를 린치핀 객체(linchpin object) 또는 핫키(hot key)라고 함.
    • 이로 인해 한 리듀서가 다른 리듀서보다 엄청나게 많은 레코드를 처리해야 하는 상황이 발생하며, 이를 핫스팟이라고 함.
  • 핫 키가 존재하는 경우, 핫스팟을 완화할 수 있는 몇 가지 알고리즘이 있음.
    1. 피그(Pig)의 쏠린 조인(skewed join) 메서드
      • 샘플링 작업을 수행하여 핫 키를 결정함.
      • 매퍼는 핫 키를 가진 레코드를 여러 리듀서 중 임의로 선택한 하나로 보냄.
      • 핫 키로 조인할 다른 입력은 핫 키가 전송된 모든 리듀서에 복제함.
    2. 크런치(Crunch)의 공유 조인(shared join) 메서드
      • 샘플링 작업 대신 핫 키를 명시적으로 지정해야 함.
      • 랜덤화를 사용하여 핫스팟을 경감시키는 기법과 비슷함.
    3. 하이브(Hive)의 최적화 방법
      • 핫 키를 테이블 메타데이터에 명시적으로 지정함.
      핫 키와 관련된 레코드를 나머지 키와는 별도 파일에 저장함.
      • 맵 사이드 조인(map-side join)을 사용해 핫 키를 가진 레코드를 처리함.
  • 핫 키로 레코드를 그룹화하고 집계하는 작업은 두 단계로 수행됨.
    1. 첫 번째 맵리듀스 단계에서 레코드를 임의의 리듀서로 보냄
      • 각 리듀서는 핫 키 레코드의 일부를 그룹화하고 키별로 집계해 간소화된 값을 출력함.
    2. 두 번째 맵리듀스 작업에서 첫 단계 모든 리듀서에서 나온 값을 키별로 모두 결합해 하나의 값으로 만듦.

맵 사이드 조인

  • 맵 사이드 조인(map-side join)은 리듀스 사이드 조인(reduce-side join)과 달리 조인 로직을 매퍼에서 수행하는 기법임.
    • 리듀스 사이드 조인은 입력 데이터에 대한 특정 가정이 필요 없지만, 정렬 및 리듀서로의 복사 과정에 드는 비용이 큰 단점이 있음.
  • 맵 사이드 조인은 입력 데이터에 대해 특정 가정이 가능한 경우 사용할 수 있으며, 이 기법은 축소된 맵리듀스 작업으로, 리듀서와 정렬 작업이 없음.
    • 각 매퍼의 작업은 분산 파일 시스템에서 입력 파일 블럭 하나를 읽어 다시 해당 분산 파일 시스템에 출력하는 것이 전부임.
  • 맵 사이드 조인의 장점은 리듀스 사이드 조인보다 빠른 조인 수행이 가능하다는 점임.
    • 하지만 이 방법은 입력 데이터에 대한 특정 가정이 가능한 경우에만 적용할 수 있음.

브로드캐스트 해시 조인

  • 브로드캐스트 해시 조인(broadcast hash join)은 작은 데이터셋과 매우 큰 데이터셋을 조인하는 경우에 적용할 수 있는 간단하고 효율적인 알고리즘임.
    • 작은 데이터셋은 각 매퍼 메모리에 적재 가능할 정도로 충분히 작아야 함.
  • 이 방법에서 매퍼는 시작할 때 분산 파일 시스템에서 작은 데이터셋(예: 사용자 데이터베이스)을 읽어 인메모리 해시 테이블에 넣는다.
    • 그 후 매퍼는 큰 데이터셋(예: 사용자 활동 이벤트)을 스캔하고, 각 이벤트의 사용자 ID를 해시 테이블에서 조회함.
  • 매퍼 태스크를 여러 개 사용할 수 있으며, 각 맵 태스크는 큰 입력 파일 블록 중 하나를 할당받는다.
    • 모든 매퍼는 작은 입력 전체를 메모리에 적재한다.
    • 브로드캐스트라는 단어는 작은 입력이 큰 입력의 모든 파티션에 전달된다는 것을 의미하며, 해시는 해시 테이블을 사용한다는 뜻임.
  • 브로드캐스트 해시 조인은 피그(복제 조인), 하이브(맵조인), 캐스캐이딩, 크런치 등이 지원하며, 데이터 웨어하우스 엔진(예: 임팔라)에서도 사용됨.
    • 작은 조인 입력을 인메모리 해시 테이블 대신 로컬 디스크에 읽기 전용 색인으로 저장할 수도 있음.
    • 이 경우 자주 사용되는 부분은 운영체제의 페이지 캐시에 남아 있어, 거의 인메모리 해시 테이블만큼 빠른 임의 접근 조회가 가능함.

파티션 해시 조인

  • 파티션 해시 조인(partitioned hash join)은 맵 사이드 조인의 입력을 파티셔닝하여 각 파티션에 독립적으로 해시 조인 접근법을 적용할 수 있는 방법임.
    • 이 방법의 장점은 각 매퍼의 해시 테이블에 적재해야 할 데이터의 양을 줄일 수 있다는 점임.
  • 파티션 해시 조인은 조인할 두 입력이 같은 키와 같은 해시 함수를 기반으로 같은 수로 파티셔닝되어야 작동한다.
    • 하이브에서는 이를 버킷 맵 조인(bucketed map join)이라고 함.

맵 사이드 병합 조인

  • 맵 사이드 병합 조인(map-side merge join)은 입력 데이터셋이 같은 방식으로 파티셔닝되고 같은 키를 기준으로 정렬된 경우 적용할 수 있는 변형된 맵 사이드 조인임.
    • 이 방법에서 입력 크기가 메모리에 적재 가능한지 고려할 필요가 없음.
    • 매퍼는 리듀서에서 일반적으로 수행하는 것과 동일한 병합 연산을 수행하기 때문.
    • 수행 과정에서 양쪽 입력을 오름차순으로 점진적으로 읽어 키가 동일한 레코드를 맞춤.
  • 맵 사이드 병합 정렬이 가능한 경우, 선행 맵리듀스 작업이 이미 입력 데이터셋을 파티셔닝하고 정렬해 놓았다는 뜻임.
    • 이론상으로 이전 맵리듀스 작업의 리듀스 단계에서 맵 사이드 병합 정렬을 수행할 수도 있지만, 맵 전용 작업에서 병합 조인을 수행하는 것이 나을 때도 있음.
    • 예를 들어, 파티셔닝 및 정렬된 데이터셋이 바로 이 조인 외에 다른 용도로 필요한 경우가 그렇다.

맵 사이드 조인을 사용하는 맵리듀스 워크플로

  • 맵리듀스 워크플로에서 맵 사이드 조인을 사용하면, 출력 구조가 리듀스 사이드 조인을 사용할 경우와 달라짐.
    • 리듀스 사이드 조인은 조인 키로 파티셔닝하고 정렬해서 출력하지만, 맵 사이드 조인은 큰 입력과 동일한 방법으로 파티셔닝하고 정렬함.
    • 이는 큰 조인 입력의 파일 블록마다 맵 태스크가 실행되기 때문.
  • 맵 사이드 조인을 수행하기 위해서는 크기, 정렬, 입력 데이터의 파티셔닝과 같은 제약 사항이 따름.
    • 조인 전략을 최적화할 때는 분산 파일 시스템 내 저장된 데이터셋의 물리적 레이아웃 파악이 중요하며, 단지 부호화 형식이나 데이터가 저장된 디렉터리 이름을 아는 것으로는 부족함.
    • 파티션 수가 몇 개인지, 데이터가 어떤 키를 기준으로 파티셔닝되고 정렬됐는지도 꼭 알아야 함.
  • 하둡 생태계에서는 데이터셋 파티셔닝 관련 메타데이터를 관리하는데 H카탈로그(HCatalog)나 하이브(Hive) 메타스토어를 사용하기도 함.
    • 이를 통해 데이터셋의 파티션 정보를 관리하고, 조인 전략을 최적화하는데 도움이 됨.

댓글

Designed by JB FACTORY