복붙노트

[HADOOP] Hive에서 테이블 분할 및 버킷 팅의 차이점은 무엇입니까?

HADOOP

Hive에서 테이블 분할 및 버킷 팅의 차이점은 무엇입니까?

둘 다 테이블의 열에서 수행되지만 각각의 작업은 어떻게 다른지 알고 있습니다.

해결법

  1. ==============================

    1.파티셔닝 데이터는 종종로드를 수평 적으로 분산시키는 데 사용되며 성능상의 이점이 있으며 논리적 인 방법으로 데이터를 구성하는 데 도움이됩니다. 예 : 대형 직원 테이블을 다루고 있으며 결과를 특정 국가 또는 부서로 제한하는 WHERE 절을 사용하여 쿼리를 실행하는 경우가 많습니다. 더 빠른 쿼리 응답 하이브 테이블은 PARTITIONED BY (국가 STRING, DEPT STRING) 일 수 있습니다. 파티션 테이블은 Hive가 데이터 스토리지를 구성하는 방법을 변경하고 Hive는 아래와 같은 파티션 구조를 반영하는 서브 디렉토리를 생성합니다.

    파티셔닝 데이터는 종종로드를 수평 적으로 분산시키는 데 사용되며 성능상의 이점이 있으며 논리적 인 방법으로 데이터를 구성하는 데 도움이됩니다. 예 : 대형 직원 테이블을 다루고 있으며 결과를 특정 국가 또는 부서로 제한하는 WHERE 절을 사용하여 쿼리를 실행하는 경우가 많습니다. 더 빠른 쿼리 응답 하이브 테이블은 PARTITIONED BY (국가 STRING, DEPT STRING) 일 수 있습니다. 파티션 테이블은 Hive가 데이터 스토리지를 구성하는 방법을 변경하고 Hive는 아래와 같은 파티션 구조를 반영하는 서브 디렉토리를 생성합니다.

    국가 = ABC에서 직원에 대한 쿼리 제한이있는 경우 한 디렉터리 국가의 콘텐츠 만 검색합니다. ABC. 이는 파티셔닝 스키마가 공통 필터링을 반영하는 경우에만 쿼리 성능을 크게 향상시킬 수 있습니다. 파티셔닝 기능은 Hive에서 매우 유용하지만, 너무 많은 파티션을 생성하는 디자인은 일부 쿼리를 최적화 할 수 있지만 다른 중요한 쿼리에는 해를 끼칠 수 있습니다. 또 다른 단점은 파티션이 너무 많다는 것입니다. 파일 시스템의 모든 메타 데이터를 메모리에 보관해야하기 때문에 Hadoop 파일과 디렉토리가 불필요하게 생성되고 NameNode에 오버 헤드가 많이 발생합니다.

    버켓 팅은 데이터 세트를보다 관리하기 쉬운 부분으로 분해하는 또 다른 기술입니다. 예를 들어, date를 최상위 레벨 파티션으로 사용하고 employee_id를 두 번째 레벨 파티션으로 사용하는 테이블이 너무 많은 작은 파티션을 생성한다고 가정합니다. 대신 직원 테이블을 버킷으로 만들고 employee_id를 버킷 열로 사용하면이 열의 값이 사용자 정의 숫자로 버킷에 해시됩니다. 동일한 employee_id를 가진 레코드는 항상 동일한 버킷에 저장됩니다. employee_id의 수가 버킷의 수보다 훨씬 많다고 가정하면 각 버킷에는 많은 employee_id가 있습니다. 테이블을 만드는 동안 CLUSTERED BY (employee_id) INTO XX BUCKETS와 같이 지정할 수 있습니다. 여기서 XX는 버킷의 수입니다. Bucketing에는 몇 가지 장점이 있습니다. 버킷 수는 고정되어 있으므로 데이터와 함께 변동하지 않습니다. 두 테이블이 employee_id에 의해 버킷 화되면 Hive는 논리적으로 올바른 샘플링을 생성 할 수 있습니다. Bucketing은 효율적인지도 측 조인 등을 수행하는 데 도움을줍니다.

  2. ==============================

    2.이전 설명에서 누락 된 몇 가지 세부 사항이 있습니다. 파티셔닝 및 버킷 팅이 어떻게 작동하는지 더 잘 이해하려면 데이터가 하이브에 저장되는 방법을 살펴 봐야합니다. 테이블이 있다고 가정 해 봅시다.

    이전 설명에서 누락 된 몇 가지 세부 사항이 있습니다. 파티셔닝 및 버킷 팅이 어떻게 작동하는지 더 잘 이해하려면 데이터가 하이브에 저장되는 방법을 살펴 봐야합니다. 테이블이 있다고 가정 해 봅시다.

    CREATE TABLE mytable ( 
             name string,
             city string,
             employee_id int ) 
    PARTITIONED BY (year STRING, month STRING, day STRING) 
    CLUSTERED BY (employee_id) INTO 256 BUCKETS
    

    하이브는 다음과 같은 디렉토리 계층에 데이터를 저장합니다.

    /user/hive/warehouse/mytable/y=2015/m=12/d=02
    

    따라서 partitioning시주의해야합니다. 예를 들어 employee_id로 파티션을 만들고 수백만 명의 직원이 있으면 파일 시스템에 수백만 개의 디렉토리가 생기게됩니다. '카디널리티'라는 용어는 필드가 가질 수있는 가능한 값의 수를 나타냅니다. 예를 들어, '국가'필드가있는 경우 세계 국가 수가 약 300이므로 카디널리티는 ~ 300입니다. 밀리 초마다 변경되는 'timestamp_ms'와 같은 필드의 경우 카디널리티는 수십억이 될 수 있습니다. 일반적으로 파티셔닝을위한 필드를 선택할 때 파일 시스템에 너무 많은 디렉토리가 생기게되므로 높은 카디널리티가 없어야합니다.

    반면에 버킷을 클러스터링하는 것은 버킷의 수를 지정하므로 고정 된 수의 파일로 이루어집니다. 하이브가 할 일은 필드를 가져 와서 해시를 계산하고 해당 버킷에 레코드를 할당하는 것입니다. 그러나 let let 's use 256 buckets을 사용하면 버킷 화하는 필드의 카디널리티가 낮아집니다 (예 : 미국의 상태이므로 50 개의 다른 값이 될 수 있습니다). 데이터가있는 50 개의 버킷과 데이터가없는 206 개의 버킷이 있습니다.

    이미 파티션이 쿼리하는 데이터 양을 크게 줄일 수있는 방법에 대해 언급 한 사람이 있습니다. 따라서 필자의 예제 테이블에서 특정 날짜부터 만 쿼리하려는 경우 연도 / 월 / 일별로 파티셔닝하면 IO 양이 급격히 줄어 듭니다. 나는 누군가가 또한 버킷 팅이 동일한 버킷 팅을 가진 다른 테이블과의 조인 속도를 높일 수있는 방법을 언급했다. 따라서 나의 예에서는 같은 employee_id에 두 개의 테이블을 조인하면 하이브가 버킷으로 조인 버킷을 수행 할 수있다. employee_id로 이미 정렬 된 경우 이미 정렬 된 부분을 병합 할 것이므로 선형 시간 (일명 O (n))으로 작동합니다.)

    따라서 필드의 카디널리티가 높고 데이터가 버킷에 균등하게 배분되면 버킷은 잘 작동합니다. 파티셔닝은 파티셔닝 필드의 카디널리티가 너무 높지 않을 때 가장 효과적입니다.

    또한 주문을 여러 필드로 분할 할 수 있으며 (예 : 연도 / 월 / 일이 좋은 예입니다), 한 필드에서만 버킷을 만들 수 있습니다.

  3. ==============================

    3.나는이 질문에 답하는 것에 늦었다 고 생각하지만 그것은 내 피드에 계속 올라와있다.

    나는이 질문에 답하는 것에 늦었다 고 생각하지만 그것은 내 피드에 계속 올라와있다.

    Navneet은 훌륭한 답을 제공했습니다. 시각적으로 추가.

    분할은 WHERE 절에서 사용되는 경우 데이터 제거에 도움이됩니다. WHERE 절에서는 각 분할 영역의 데이터를 여러 파일로 구성하는 데 버킷이 도움이되므로 동일한 데이터 집합이 항상 동일한 버킷에 작성됩니다. 기둥을 결합하는 데 많은 도움이됩니다.

    예를 들어 name, server_date, some_col3, some_col4 및 some_col5라는 5 개의 열이있는 테이블이 있다고 가정합니다. server_date에 테이블을 분할하고 10 개의 버킷에있는 name 열에 버킷을 넣었다 고 가정하면 파일 구조는 다음과 같습니다.

    여기서 server_date = xyz는 파티션이고 000 파일은 각 파티션의 버킷입니다. 버킷은 일부 해시 함수를 기반으로 계산되므로 name = Sandy 인 행은 항상 동일한 버킷으로 이동합니다.

  4. ==============================

    4.하이브 파티셔닝 :

    하이브 파티셔닝 :

    파티션은 테이블 열의 값을 기반으로 많은 양의 데이터를 여러 슬라이스로 나눕니다.

    엔트리가 약 500 개에 이르는 196 개 이상의 국가에 퍼져있는 전세계 사람들의 정보를 저장한다고 가정합니다. 특정 국가 (바티칸시) 출신의 사람들에게 칸막이가없는 상황에서 질문을 보내려면 1000 개 항목을 가져 오기 위해 500 개의 모든 항목을 스캔해야합니다. 국가에 따라 테이블을 분할하는 경우 하나의 국가 파티션에 대한 데이터 만 확인하여 쿼리 프로세스를 미세 조정할 수 있습니다. 하이브 파티션은 열 값에 대해 별도의 디렉토리를 만듭니다.

    장점 :

    단점 :

    하이브 버켓 팅 :

    버켓 팅은 데이터를보다 관리 가능하거나 동등한 부분으로 분해합니다.

    파티셔닝을 사용하면 컬럼 값을 기반으로 여러 개의 작은 파티션을 생성 할 수 있습니다. 버킷 팅을 할 경우 버킷 수를 제한하여 데이터를 저장합니다. 이 x 호는 테이블 작성 스크립트 중에 정의됩니다.

    찬성

    단점

  5. ==============================

    5.차이점은 버킷 팅은 파일을 열 이름으로 나눕니다. 분할은 파일을 테이블로 나누는 것입니다.

    차이점은 버킷 팅은 파일을 열 이름으로 나눕니다. 분할은 파일을 테이블로 나누는 것입니다.

    바라기를 나는 그것을 올바르게 정의했다.

  6. ==============================

    6.Bucketing에 들어가기 전에 우리는 Partitioning이 무엇인지 이해해야합니다. 아래 표를 예로 들어 보겠습니다. 초급 수준의 이해를 위해 아래 예에서 12 개의 레코드 만 제공했습니다. 실시간 시나리오에는 수백만 개의 레코드가있을 수 있습니다.

    Bucketing에 들어가기 전에 우리는 Partitioning이 무엇인지 이해해야합니다. 아래 표를 예로 들어 보겠습니다. 초급 수준의 이해를 위해 아래 예에서 12 개의 레코드 만 제공했습니다. 실시간 시나리오에는 수백만 개의 레코드가있을 수 있습니다.

    분할 --------------------- 파티셔닝은 데이터를 쿼리하는 동안 성능을 얻는 데 사용됩니다. 예를 들어 위의 테이블에서 아래의 sql을 작성하면 테이블의 모든 레코드를 스캔하여 성능을 저하시키고 오버 헤드를 증가시켜야합니다.

    select * from sales_table where product_id='P1'
    

    전체 테이블 스캔을 피하고 product_id = 'P1'과 관련된 레코드 만 읽으려면 product_id 열을 기반으로 여러 파일로 분할 (하이브 테이블의 파일 분할) 할 수 있습니다. 이를 통해 하이브 테이블의 파일은 product_id = 'P1'과 product_id = 'P2'의 두 파일로 분리됩니다. 이제 위 쿼리를 실행하면 product_id = 'P1'파일 만 검색합니다.

    ../hive/warehouse/sales_table/product_id=P1
    ../hive/warehouse/sales_table/product_id=P2
    

    파티션을 만드는 구문은 다음과 같습니다. 아래 구문에서 product_id 열 정의와 파티션되지 않은 열을 함께 사용해서는 안됩니다. 이것은 partitioned by 절에만 있어야합니다.

    create table sales_table(sales_id int,trans_date date, amount int) 
    partitioned by (product_id varchar(10))
    

    단점 : 파티셔닝시 매우 신중해야합니다. 즉, 반복되는 값의 수가 적은 열 (특히 기본 키 열)에 대해서는 분할 된 파일 수를 늘리고 이름 노드에 대한 오버 헤드를 증가시켜야하므로이 열을 사용해서는 안됩니다.

    배킹 ------------------ Bucketing은 내가 파티션 섹션에서 언급 한 단점을 극복하기 위해 사용됩니다. 이것은 열에 반복 값이 거의 없을 때 사용되어야합니다 (예 : 기본 키 열). 이는 RDBMS의 기본 키 열에 대한 인덱스 개념과 유사합니다. 이 표에서 Sales_Id 열을 버킷에 넣을 수 있습니다. sales_id 열을 쿼리해야 할 때 유용합니다.

    다음은 버킷 작성 구문입니다.

    create table sales_table(sales_id int,trans_date date, amount int) 
    partitioned by (product_id varchar(10)) Clustered by(Sales_Id) into 3 buckets
    

    여기에서는 데이터를 파티션 위에 몇 개의 파일로 더 나눕니다.

    3 개의 버킷을 지정 했으므로 각 product_id에 대해 3 개의 파일로 분할됩니다. 내부적으로 모듈로 연산자를 사용하여 각 sales_id를 저장할 버킷을 결정합니다. 예를 들어 product_id = 'P1'의 경우 sales_id = 1은 000001_0 파일 (예 : 1 % 3 = 1)에 저장되고 sales_id = 2는 000002_0 파일에 저장됩니다 (예 : 2 % 3 = 2). sales_id = 3은 000000_0 파일에 저장됩니다 (예 : 3 % 3 = 0).

  7. from https://stackoverflow.com/questions/19128940/what-is-the-difference-between-partitioning-and-bucketing-a-table-in-hive by cc-by-sa and MIT license