Dataproc Metastore에서 트랜잭션 테이블 사용

ACID 시맨틱스를 사용하는 트랜잭션은 Dataproc Metastore의 Apache Hive Metastore에서 지원됩니다. 자세한 내용은 Hive 트랜잭션을 참조하세요. Hive 3에서는 기본적으로 이러한 트랜잭션이 사용 설정됩니다.

구성

트랜잭션 지원을 사용 설정하려면 서버 및 클라이언트 측 구성을 설정해야 합니다.

서버 측 구성

다음 서버 측 구성은 Dataproc Metastore에서 서비스를 만드는 동안 기본적으로 설정됩니다. 재정의를 Metastore 구성 재정의 아래에 입력하여 이를 재정의하도록 선택할 수 있습니다.

  • metastore.compactor.initiator.on - Dataproc Metastore 서비스에서 개시자 및 클리너 스레드를 실행할지 여부입니다.

    개시자를 사용 설정하려면 true로 설정합니다.

  • metastore.compactor.worker.threads - Dataproc Metastore에서 실행할 압축기 작업자 스레드 수입니다.

    압축기를 사용 설정할 양의 숫자로 설정합니다. 특히 개발자 등급의 경우 이 값을 높게 설정하면 서비스 성능에 영향을 줄 수 있습니다. 값을 조정해야 할 경우 8과 같이 낮은 값을 사용하는 것이 좋습니다.

  • hive.metastore.event.db.notification.api.auth - Dataproc Metastore 서비스가 데이터베이스 알림 관련 API로 승인해야 하는지 여부입니다.

    false로 설정합니다. true로 설정하면 프록시 설정의 수퍼유저만 권한을 갖습니다. 수퍼유저 프록시 권한에 대한 자세한 내용은 Metastore 알림 API 보안을 참조하세요.

클라이언트 측 구성

클라이언트 측 구성은 트랜잭션 검증에 설명된 대로 Hive 클라이언트에 설정됩니다.

  • hive.support.concurrency - 삽입, 업데이트, 삭제 트랜잭션을 지원하려면 true로 설정합니다.

  • hive.exec.dynamic.partition.mode - 엄격한 모드에서는 모든 파티션을 실수로 덮어쓸 경우에 대비해서 정적 파티션을 하나 이상 지정해야 합니다. 엄격하지 않은 모드에서는 모든 파티션을 동적으로 설정해도 됩니다.

    삽입, 업데이트, 삭제 트랜잭션을 지원하려면 nonstrict로 설정합니다.

  • hive.txn.managerorg.apache.hadoop.hive.ql.lockmgr.DbTxnManager로 설정합니다.

트랜잭션 검증

Hive 3에서 Dataproc Metastore 서비스를 사용하는 Dataproc 클러스터를 사용하여 Hive 트랜잭션을 검증할 수 있습니다.

Dataproc Metastore 서비스와 동일한 프로젝트에 Hive 3가 있는 Dataproc 클러스터를 만들어야 합니다. Dataproc 2.0 이미지, 2.0-ubuntu18, 2.0-debian10은 Hive 3 및 트랜잭션을 지원합니다. --image-version 플래그를 사용하여 2.0 이미지를 설정할 수 있습니다. 예를 들면 다음과 같습니다.

gcloud dataproc clusters create DATAPROC_CLUSTER_ID \
   --dataproc-metastore=projects/PROJECT_ID/locations/LOCATION/services/SERVICE \
   --region=REGION \
   --image-version 2.0-debian10

다음 안내에서는 Dataproc 클러스터에서 사용되는 Dataproc Metastore 서비스에서 트랜잭션을 검증하는 방법을 설명합니다.

  1. Dataproc 클러스터에 SSH로 연결합니다. 브라우저 또는 명령줄로 이를 수행할 수도 있습니다.

  2. hive 명령어를 실행하여 Hive 클라이언트를 엽니다.

    $> hive
    
  3. Hive 클라이언트 세션에서 트랜잭션에 대해 Hive ACID 지원을 사용 설정하도록 클라이언트 측 구성을 설정합니다.

    SET hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
    SET hive.support.concurrency=true;
    SET hive.exec.dynamic.partition.mode=nonstrict;
    
  4. 삽입 및 업데이트를 수행할 트랜잭션 테이블을 만듭니다. 예시는 다음과 같습니다.

    1. 트랜잭션 테이블을 만듭니다.

      create table student (id int, name string, age int)
      STORED AS ORC TBLPROPERTIES ('transactional' = 'true');
      
    2. 트랜잭션 테이블인지 확인합니다.

      describe formatted <tableName>;
      

      테이블 속성 목록이 출력됩니다. 트랜잭션 테이블에는 해당 테이블 매개변수에 transactional=true가 포함됩니다.

    3. 데이터를 테이블에 삽입합니다.

      INSERT INTO student VALUES
      (1, 'Alice', 10),
      (2, 'Bob', 10),
      (3, 'Charlie', 10);
      
      1. 서비스의 웨어하우스 디렉터리에서 student 디렉터리에 delta 폴더가 생성되는지 확인합니다. 삽입 또는 업데이트 문을 여러 번 실행하면 delta 폴더가 여러 개 생성됩니다.
    4. 실행 중인 압축 및 해당 상태를 확인합니다. Hive Metastore는 5분 간격으로 개시자라고 부르는 스레드를 실행하여 압축해야 할 테이블을 확인하고 해당 테이블에 대해 압축을 요청합니다.

      show compactions;
      
      1. 수동 압축(주 압축 또는 부 압축)을 시작합니다.

          ALTER TABLE student COMPACT 'minor';
          ALTER TABLE student COMPACT 'major';
        

다음 단계