복붙노트

[HADOOP] Hive / Hadoop의 고유 한 키 생성

HADOOP

Hive / Hadoop의 고유 한 키 생성

큰 데이터 하이브 테이블에서 레코드 집합을 선택하는 동안 각 레코드마다 고유 한 키를 만들어야합니다. 순차적 인 연산 모드에서는 max (id)와 같은 것을 호출함으로써 고유 한 id를 생성하는 것이 쉽습니다. 하이브는 작업을 병렬로 실행하기 때문에, 어떻게 우리가 선택한 쿼리의 일부로 고유 키를 생성 할 수 있으며, hadoop의 성능을 손상시키지 않습니다. 이것은 실제로지도를 줄이는 문제입니까 아니면 이것을 해결하기 위해 순차적 인 접근 방식을 취해야합니까?

해결법

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

    1.어떤 이유로 UUID를 다루지 않으려는 경우 (숫자 값을 기반으로 한)이 솔루션은 병렬 장치가 서로 "말하고"또는 무엇이든 동기화 할 필요가 없습니다. 따라서 매우 효율적이지만 정수 키가 연속적 일 수는 없습니다.

    어떤 이유로 UUID를 다루지 않으려는 경우 (숫자 값을 기반으로 한)이 솔루션은 병렬 장치가 서로 "말하고"또는 무엇이든 동기화 할 필요가 없습니다. 따라서 매우 효율적이지만 정수 키가 연속적 일 수는 없습니다.

    N 개의 병렬 실행 단위가 있고 N을 알고 있고 각 단위에 0에서 N - 1까지의 ID가 할당 된 경우 모든 단위에서 고유 한 정수를 간단히 생성 할 수 있습니다

    Unit #0:   0, N, 2N, 3N, ...
    Unit #1:   1, N+1, 2N+1, 3N+1, ...
    ...
    Unit #N-1: N-1, N+(N-1), 2N+(N-1), 3N+(N-1), ...
    

    키 (매퍼 (mapper) 또는 감속기 (reducer))를 생성해야하는 위치에 따라 당신은 N을 hadoop 구성에서 얻을 수 있습니다 :

    Mapper: mapred.map.tasks
    Reduce: mapred.reduce.tasks
    

    ... 귀하 유닛의 ID : Java에서는 다음과 같습니다.

     context.getTaskAttemptID().getTaskID().getId()
    

    하이브에 대해서는 확실하지 않지만 가능해야합니다.

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

    2.숫자 대신 UUID를 사용하십시오. 진정한 분산 방식으로 작동합니다.

    숫자 대신 UUID를 사용하십시오. 진정한 분산 방식으로 작동합니다.

    select reflect("java.util.UUID", "randomUUID")
    
  3. ==============================

    3.

    SELECT T.*, ROW_NUMBER () OVER (ORDER BY T.C1) AS SEQ_NBR 
    FROM TABLE T
    

    여기서 C1은 T의 모든 숫자 열입니다. 테이블 T에서 1에서 시작하여 선택하는 동안 각 레코드에 대해 고유 번호가 생성됩니다. 이것이 1 회 활동 인 경우 솔루션이 정상입니다.

    이 프로세스를 매일 반복하여이 데이터를 테이블 T2에 삽입하고 고유 ID를 생성해야하는 경우 다음과 같은 방법으로 시도 할 수 있습니다.

    SELECT T.*, ROW_NUMBER () OVER (ORDER BY T.C1)+ SEQ_T2  AS SEQ_NBR 
    FROM TABLE T, (SELECT MAX(SEQ) AS SEQ_T2 FROM TABLE T2)
    

    희망이 도움이 !!

  4. from https://stackoverflow.com/questions/27835062/unique-key-generation-in-hive-hadoop by cc-by-sa and MIT license