Snowflake와 Apache Hive 메타스토어 통합

이 항목에서는 Snowflake용 Hive 메타스토어 커넥터를 사용하여 외부 테이블을 사용하여 Apache Hive 메타스토어를 Snowflake와 통합하는 방법에 대한 지침을 제공합니다. 커넥터는 메타스토어 이벤트를 감지하고 Snowflake로 전송하여 외부 테이블을 Hive 메타스토어와 동기화된 상태로 유지합니다. 이를 통해 사용자는 Snowflake에서 쿼리하는 동안 Hive에서 스키마를 관리할 수 있습니다.

Apache Hive 메타스토어는 다음 클라우드 플랫폼 중 1개의 클라우드 저장소와 통합되어야 합니다.

  • Amazon Web Services

  • Google Cloud Platform

  • Microsoft Azure

이 항목의 내용:

Hive 메타스토어 커넥터 설치 및 구성하기

이 섹션에서는 Snowflake용 Hive 메타스토어 커넥터 설치 및 구성에 대한 자세한 지침을 제공합니다.

전제 조건

Snowflake용 Hive 커넥터에는 다음과 같은 전제 조건이 있습니다.

Snowflake 데이터베이스 및 스키마:

메타스토어의 Hive 테이블에 매핑되는 외부 테이블을 저장합니다.

지정된 Snowflake 사용자:

커넥터는 이 사용자로 외부 테이블에서 작업을 실행하도록 구성됩니다.

저장소 통합:

저장소 통합을 통해 시크릿 키 또는 액세스 토큰과 같은 명시적 클라우드 공급자 자격 증명을 전달하지 않고도 외부 클라우드 저장소에 대한 보안 액세스를 구성할 수 있습니다. CREATE STORAGE INTEGRATION 을 사용하여 Hive 테이블에서 참조하는 클라우드 저장소 위치에 액세스하기 위한 저장소 통합을 생성합니다.

저장소 통합을 위한 Location 매개 변수는 메타스토어에 있는 Hive 테이블의 STORAGE_ALLOWED_LOCATIONS 매개 변수에서 참조되는 것과 동일한 저장소 컨테이너를 나열해야 합니다.

역할:

역할은 지정된 Snowflake 사용자에게 할당되어야 하며 이 섹션에서 식별된 다른 Snowflake 오브젝트에 대한 다음 오브젝트 권한을 포함해야 합니다.

오브젝트

권한

데이터베이스

USAGE

스키마

USAGE , CREATE STAGE , CREATE EXTERNAL TABLE

저장소 통합

USAGE

1단계: 커넥터 설치

커넥터를 설치하려면 다음 단계를 완료하십시오.

  1. Maven Central Repository에서 커넥터 JAR 파일 및 구성 XML 파일을 다운로드합니다.

    Sonatype (또는 https://repo1.maven.org/maven2/net/snowflake/snowflake-hive-metastore-connector/)

  2. JAR 파일을 다음 디렉터리에 복사합니다.

    Amazon S3 또는 Google Cloud Storage:

    Hive 클래스 경로의 lib 디렉터리. 위치는 Hive 설치에 따라 다를 수 있습니다. 클래스 경로를 확인하려면 HIVE_AUX_JARS_PATH 환경 변수를 확인하십시오.

    Microsoft Azure HDInsight:

    사용자 디렉터리의 hive 디렉터리, 예: /usr/hdp/<hdinsight_버전>/atlas/hook/hive/ 위치는 Azure HDInsight 버전 및 설치 선택 사항에 따라 다를 수 있습니다.

    참고

    GitHub 프로젝트 페이지scripts 폴더에서 예제 사용자 정의 스크립트를 사용할 수 있습니다. 스크립트는 JAR 파일과 구성 파일을 해당 디렉터리에 추가합니다.

  3. 다음 디렉터리에 이름이 snowflake-config.xml 인 파일을 생성합니다.

    Amazon S3 또는 Google Cloud Storage:

    Hive 클래스 경로의 conf 디렉터리.

    Microsoft Azure HDInsight:

    Hive 클래스 경로의 conf/conf.server 디렉터리.

  4. 텍스트 편집기에서 snowflake-config.xml 파일을 열고 다음 <이름> 속성과 해당 <값> 으로 파일을 채웁니다.

    snowflake.jdbc.username

    외부 테이블에서 새로 고침 작업을 위해 지정된 Snowflake 사용자의 로그인 이름을 지정합니다.

    snowflake.jdbc.password

    로그인 이름의 비밀번호를 지정합니다.

    참고

    • Hadoop 버전에 따라 시스템 속성 또는 환경 변수를 기반으로 비밀번호 자리 표시자를 설정할 수 있습니다. 구성은 다른 Hadoop 구성에서와 동일하게 작동합니다. 자세한 내용은 Hadoop 설명서 를 참조하십시오.

    • snowflake.jdbc.privateKey

    또는 키 페어 인증을 사용하여 인증합니다. 키 페어를 생성하고 사용자에게 공개 키를 할당하는 방법에 대한 지침은 키 페어 인증 및 키 페어 순환 섹션을 참조하십시오.

    개인 키를 Snowflake에 전달하려면 snowflake-config.xml 파일에 snowflake.jdbc.privateKey 속성을 추가하십시오. 텍스트 편집기에서 개인 키 파일(예: rsa_key.p8)을 엽니다. -----BEGIN RSA PRIVATE KEY----------END RSA PRIVATE KEY----- 사이의 행을 속성 값 또는 환경 변수 값으로 복사합니다.

    snowflake.jdbc.account

    계정 이름(Snowflake 제공, 예: xy12345)을 지정합니다.

    snowflake.jdbc.db

    Hive 메타스토어 통합에 사용할 기존 Snowflake 데이터베이스를 지정합니다. 자세한 내용은 이 항목의 전제 조건 섹션을 참조하십시오.

    snowflake.jdbc.schema

    지정된 데이터베이스의 기존 Snowflake 스키마를 지정합니다. 자세한 내용은 이 항목의 전제 조건 섹션을 참조하십시오.

    Hive 메타스토어의 여러 스키마를 Snowflake 데이터베이스의 해당 스키마에 매핑하려면 현재 속성 외에 snowflake.hive-metastore-listener.schemas 속성을 설정합니다. snowflake.jdbc.schema 속성에 기본 Snowflake 스키마를 지정합니다.

    snowflake.jdbc.role

    Hive 커넥터에서 사용할 액세스 제어 역할을 지정합니다. 역할은 지정된 사용자에게 이미 할당된 기존 역할이어야 합니다.

    여기에 역할이 지정되지 않은 경우 Hive 커넥터는 지정된 사용자의 기본 역할을 사용합니다.

    snowflake.jdbc.connection

    Snowflake 계정에 대한 연결 문자열을 다음 형식으로 지정합니다.

    jdbc:snowflake://<account_identifier>.snowflakecomputing.com

    여기서:

    <account_identifier>

    Snowflake 계정에 대한 고유 식별자입니다.

    계정 식별자의 선호 형식은 다음과 같습니다.

    organization_name-account_name

    Snowflake 조직 및 계정의 이름입니다. 자세한 내용은 형식 1(기본 설정): 조직의 계정 이름 섹션을 참조하십시오.

    아니면, 계정이 호스팅되는 지리적 리전클라우드 플랫폼 과 함께 계정 로케이터 를 지정합니다. 자세한 내용은 형식 2(레거시): 리전의 계정 로케이터 섹션을 참조하십시오.

    snowflake.hive-metastore-connector.integration

    메타스토어의 Hive 테이블에서 참조하는 외부 저장소 위치에 대한 보안 액세스에 사용할 저장소 통합 오브젝트의 이름을 지정합니다. 자세한 내용은 이 항목의 전제 조건 섹션을 참조하십시오.

    snowflake.hive-metastore-listener.schemas

    snowflake.jdbc.db 에 지정된 Snowflake 데이터베이스에 존재하는 Snowflake 스키마의 쉼표로 구분된 목록을 지정합니다.

    Hive 메타스토어에 테이블이 생성되면 커넥터는 이 속성이 새 테이블을 포함하는 Hive 스키마/데이터베이스와 이름이 같은 Snowflake 스키마를 나열하는지 확인합니다.

    • 동일한 이름의 Snowflake 스키마가 나열되면 커넥터는 이 스키마에 외부 테이블을 생성합니다.

    • 같은 이름의 Snowflake 스키마가 목록에 없으면 커넥터는 snowflake.jdbc.schema 속성에 정의된 기본 스키마에 외부 테이블을 생성합니다.

    외부 테이블은 새 Hive 테이블과 이름이 같습니다.

    참고

    Hive 커넥터 버전 0.5.0 이상이 필요합니다.

    선택적으로 다음 속성을 추가합니다.

    snowflake.hive-metastore-listener.database-filter-regex

    통합과 함께 건너뛸 Hive 메타스토어의 데이터베이스 이름을 지정합니다. 이 속성을 사용하면 Snowflake와 통합할 데이터베이스를 제어할 수 있습니다. 이 옵션은 Hive 데이터베이스에서 여러 테이블의 이름이 같은 경우에 특히 유용합니다. 현재 이 상황에서 Hive 커넥터는 Snowflake 대상 데이터베이스에 이름이 있는 첫 번째 테이블을 생성하지만 이름이 같은 추가 테이블은 건너뜁니다.

    예를 들어, 데이터베이스 mydb1, mydb2mydb3 에 모두 table1 이라는 테이블이 포함되어 있다고 가정합니다. 속성 값으로 정규식 mydb[^1] 를 추가하여 mydb1제외하고 명명 규칙이 mydb<숫자> 인 모든 데이터베이스를 생략할 수 있습니다.

    샘플 속성 노드

    <configuration>
      ..
      <property>
        <name>snowflake.hive-metastore-listener.database-filter-regex</name>
        <value>mydb[^1]</value>
      </property>
    </configuration>
    
    Copy

    샘플 snowflake-config.xml 파일

    <configuration>
      <property>
        <name>snowflake.jdbc.username</name>
        <value>jsmith</value>
      </property>
      <property>
        <name>snowflake.jdbc.password</name>
        <value>mySecurePassword</value>
      </property>
      <property>
        <name>snowflake.jdbc.role</name>
        <value>custom_role1</value>
      </property>
      <property>
        <name>snowflake.jdbc.account</name>
        <value>myaccount</value>
      </property>
      <property>
        <name>snowflake.jdbc.db</name>
        <value>mydb</value>
      </property>
      <property>
        <name>snowflake.jdbc.schema</name>
        <value>myschema</value>
      </property>
      <property>
        <name>snowflake.jdbc.connection</name>
        <value>jdbc:snowflake://myaccount.snowflakecomputing.com</value>
      </property>
      <property>
        <name>snowflake.hive-metastore-listener.integration</name>
        <value>s3_int</value>
      </property>
      <property>
        <name>snowflake.hive-metastore-listener.schemas</name>
        <value>myschema1,myschema2</value>
      </property>
    </configuration>
    
    Copy
  5. 파일에 변경 사항을 저장합니다.

  6. 기존 Hive 구성 파일(hive-site.xml) 편집:

    Amazon S3 또는 Google Cloud Storage:

    텍스트 편집기에서 hive-site.xml 파일을 엽니다. 다음과 같이 구성 파일에 커넥터를 추가합니다.

    <configuration>
     ...
     <property>
      <name>hive.metastore.event.listeners</name>
      <value>net.snowflake.hivemetastoreconnector.SnowflakeHiveListener</value>
     </property>
    </configuration>
    
    Copy
    Microsoft Azure HDInsight:

    Azure HDInsight 설명서 의 단계를 완료하여 hive-site.xml 파일을 편집합니다. 클러스터 구성에 다음 사용자 지정 속성을 추가합니다.

    hive.metastore.event.listeners=net.snowflake.hivemetastoreconnector.SnowflakeHiveListener

    또는 HDInsight 클러스터 관리 포털에서 사용자 지정 속성을 추가합니다.

    1. 왼쪽 메뉴 » Configs » Advanced 에서 Hive 탭을 클릭합니다.

    2. Custom Hive Site 탭으로 스크롤을 내립니다.

    3. 사용자 지정 속성을 추가합니다.

    참고

    이 파일에 이미 구성된 다른 커넥터가 있는 경우 <value> 노드의 쉼표로 구분된 목록에 Snowflake용 Hive 커넥터를 추가합니다.

  7. 파일에 변경 사항을 저장합니다.

  8. Hive 메타스토어 서비스를 다시 시작합니다.

2단계: 설치 확인

  1. Hive에서 새 테이블을 생성합니다.

  2. SHOW EXTERNAL TABLES 을 사용하여 Snowflake 데이터베이스 및 스키마의 외부 테이블 목록을 쿼리합니다.

    SHOW EXTERNAL TABLES IN <database>.<schema>;
    
    Copy

    여기서 databaseschema 는 이 항목의 1단계: 커넥터 설치 에 있는 snowflake-config.xml 파일에 지정한 데이터베이스 및 스키마입니다.

    결과에 새 Hive 테이블과 이름이 같은 외부 테이블이 표시되어야 합니다.

커넥터 레코드는 Hive 메타스토어 로그에 기록됩니다. 커넥터에서 실행된 쿼리는 다른 쿼리와 유사하게 Snowflake QUERY_HISTORY 뷰/함수 출력에서 볼 수 있습니다.

Snowflake와 기존 Hive 테이블 및 파티션 통합하기

기존 Hive 테이블 및 파티션을 Snowflake와 통합하려면 Hive에서 각 테이블 및 파티션에 대해 다음 명령을 실행합니다.

ALTER TABLE <table_name> TOUCH [PARTITION partition_spec];
Copy

자세한 내용은 Hive 설명서 를 참조하십시오.

또는 Snowflake는 기존 Hive 테이블 및 파티션을 동기화하기 위한 스크립트를 제공합니다. 자세한 내용은 GitHub 프로젝트 페이지 를 참조하십시오.

참고

Hive 테이블과 이름이 같은 외부 테이블이 snowflake.jdbc.db 속성에 지정된 데이터베이스의 해당 Snowflake 스키마에 이미 있는 경우 ALTER TABLE … TOUCH 명령을 실행해도 외부 테이블을 다시 생성되지 않습니다. 외부 테이블을 다시 만들어야 하는 경우 Hive 메타스토어에서 ALTER TABLE … TOUCH 명령을 실행하기 전에 (DROP EXTERNAL TABLE 을 사용해) 외부 테이블을 삭제하십시오.

기능

지원되는 Hive 작업 및 테이블 타입

Hive 작업

커넥터는 다음 Hive 작업을 지원합니다.

  • 테이블 만들기

  • 테이블 삭제

  • 테이블 추가 열 변경

  • 테이블 삭제 열 변경

  • 테이블 변경(즉, 터치)

  • 파티션 추가

  • 파티션 삭제

  • 파티션 변경(터치)

Hive 테이블 타입

커넥터는 지원하는 Hive 테이블의 타입은 다음과 같습니다.

  • 외부 및 관리형 테이블

  • 분할 및 미분할 테이블

Hive 및 Snowflake 데이터 타입

다음 테이블은 Hive와 Snowflake 데이터 타입 사이의 매핑을 보여줍니다.

Hive

Snowflake

BIGINT

BIGINT

BINARY

BINARY

BOOLEAN

BOOLEAN

CHAR

CHAR

DATE

DATE

DECIMAL

DECIMAL

DOUBLE

DOUBLE

DOUBLE PRECISION

DOUBLE

FLOAT

FLOAT

INT

INT

INTEGER

INT

NUMERIC

DECIMAL

SMALLINT

SMALLINT

STRING

STRING

TIMESTAMP

TIMESTAMP

TINYINT

SMALLINT

VARCHAR

VARCHAR

기타 모든 데이터 타입

VARIANT

지원되는 파일 형식 및 옵션

지원되는 데이터 파일 형식 및 Hive 파일 형식 옵션은 다음과 같습니다.

  • CSV

    다음 옵션은 SerDe(직렬 변환기/역직렬 변환기) 속성을 사용하여 지원됩니다.

    • field.delim / separatorChar

    • line.delim

    • escape.delim / escapeChar

  • JSON

  • AVRO

  • ORC

  • PARQUET

    다음 옵션은 테이블 속성을 사용하여 지원됩니다.

    • parquet.compression.

지원되지 않는 Hive 명령, 함수 및 사용 사례

커넥터는 다음 Hive 명령, 기능 및 사용 사례를 지원하지 않습니다.

  • Hive 뷰

  • TOUCH, ADD COLUMNS 및 DROP COLUMNS을 제외한 ALTER 문

  • 사용자 지정 SerDe 속성

  • 기존 관리형 Hive 테이블을 외부 Hive 테이블로 또는 그 반대로 수정하기

클라우드 저장소 이벤트를 반영하도록 외부 테이블 메타데이터 새로 고치기

이 항목의 지원되는 Hive 작업 및 테이블 타입 에 나열된 Hive 작업이 테이블에서 실행되면 Hive 커넥터는 Hive 이벤트를 수신하고 이후 Snowflake의 해당 외부 테이블에 대한 메타데이터를 새로 고칩니다.

그러나 커넥터는 데이터 파일 추가 또는 제거와 같은 클라우드 저장소의 이벤트를 기반으로 외부 테이블 메타데이터를 새로 고치지 않습니다. 클라우드 저장소의 이벤트를 반영하도록 외부 테이블의 메타데이터를 새로 고치려면 분할되거나 분할되지 않은 Hive 테이블에 대해 각각의 ALTER TABLE … TOUCH 명령을 실행합니다. TOUCH는 메타데이터를 읽고 다시 씁니다. 명령에 대한 자세한 내용은 Hive 설명서: 를 참조하십시오.

분할된 Hive 테이블:

다음 명령을 실행합니다.

ALTER TABLE <table_name> TOUCH PARTITION <partition_spec>;
Copy
분할되지 않은 Hive 테이블:

다음 명령을 실행합니다.

ALTER TABLE <table_name> TOUCH;
Copy

Hive 테이블과 Snowflake 외부 테이블의 사이의 차이점

이 섹션에서는 Hive 테이블과 Snowflake 외부 테이블 사이의 주요 차이점에 대해 설명합니다.

파티션:
  • Snowflake 파티션은 테이블이 참조하는 저장 위치의 하위 경로로 구성되지만 Hive 파티션에는 이 제약 조건이 없습니다. 저장소 위치의 하위 경로가 아닌 Hive 테이블에 파티션이 추가되면 해당 파티션은 Snowflake의 해당 외부 테이블에 추가되지 않습니다.

    예를 들어, Hive 테이블(및 해당 Snowflake 외부 테이블)과 연결된 저장소 위치가 s3://path/ 인 경우 Hive 테이블의 모든 파티션 위치에도 s3://path/ 접두사를 추가해야 합니다.

  • 단일 외부 테이블에 있는 두 개의 Snowflake 파티션은 정확히 동일한 저장소 위치를 가리킬 수 없습니다. 예를 들어, 다음 파티션은 서로 충돌합니다.

    ALTER EXTERNAL TABLE exttable ADD PARTITION(partcol='1') LOCATION 's3:///files/2019/05/12';
    
    ALTER EXTERNAL TABLE exttable ADD PARTITION(partcol='2') LOCATION 's3:///files/2019/05/12';
    
    Copy
열 이름:

Hive 열 이름은 대소문자를 구분하지 않지만 VALUES에서 파생된 Snowflake 가상 열은 대소문자를 구분합니다. Hive 테이블에 대소문자가 혼합된 이름이 있는 열이 포함된 경우 해당 열의 데이터는 Snowflake 외부 테이블의 해당 열에 NULL일 수 있습니다.