Apache HiveメタストアとSnowflakeの統合

このトピックでは、Snowflake用Hiveメタストアコネクタを使用して、 Apache Hive メタストアとSnowflakeを外部テーブルにより統合する手順を説明します。コネクタは、メタストアイベントを検出し、それらをSnowflakeに送信して、外部テーブルとHiveメタストアの同期を維持します。これにより、ユーザーはHiveでスキーマを管理しながら、Snowflakeからクエリを実行できます。

Apache Hiveメタストアは、次に挙げるいずれかのクラウドプラットフォーム上のクラウドストレージと統合する必要があります。

  • Amazon Web Services

  • Google Cloud Platform

  • Microsoft Azure

このトピックの内容:

Hiveメタストアコネクタのインストールと構成

このセクションでは、Snowflake用のHiveメタストアコネクタをインストールおよび構成するための詳細な手順を説明します。

前提条件

SnowflakeのHiveコネクタには、次の前提条件があります。

Snowflakeデータベースとスキーマ

メタストアのHiveテーブルにマップする外部テーブルを保存します。

指定Snowflakeユーザー

コネクタは、このユーザーとして外部テーブルで操作を実行するように構成されます。

ストレージ統合

ストレージ統合により、シークレットキーやアクセストークンなどの明示的なクラウドプロバイダーの認証情報を渡すことなく、外部クラウドストレージへの安全なアクセスを構成できます。 CREATE STORAGE INTEGRATION を使用して、Hiveテーブルで参照されるクラウドストレージの場所にアクセスするためのストレージ統合を作成します。

ストレージ統合の STORAGE_ALLOWED_LOCATIONS パラメーターには、メタストアのHiveテーブルの Location パラメーターで参照されているものと同じストレージコンテナーをリストする必要があります。

ロール

ロールは指定された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.jdbc.privateKey プロパティを snowflake-config.xml ファイルに追加します。テキストエディタで秘密キーファイル(例: 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ターゲットデータベースに名前を持つ最初のテーブルを作成しますが、同じ名前の追加のテーブルはスキップします。

    たとえば、データベース mydb1mydb2、および mydb3 のすべてに 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 » AdvancedHive タブをクリックします。

    2. Custom Hive Site タブまで下にスクロールします。

    3. カスタムプロパティを追加します。

    注釈

    このファイルに他のコネクタが既に設定されている場合は、SnowflakeのHiveコネクタを <value> ノードのコンマ区切りリストに追加します。

  7. ファイルへの変更を保存します。

  8. Hiveメタストアサービスを再起動します。

ステップ2:インストールを検証する

  1. Hiveで新しいテーブルを作成します。

  2. SHOW EXTERNAL TABLES を使用して、Snowflakeデータベースとスキーマの外部テーブルのリストをクエリします。

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

    database および schema は、 ステップ1: コネクタをインストールする (このトピック内)の snowflake-config.xml ファイルで指定するデータベースおよびスキーマです。

    結果には、新しいHiveテーブルと同じ名前の外部テーブルが表示されます。

コネクタレコードは、Hiveメタストアログに書き込まれます。コネクタによって実行されたクエリは、他のクエリと同様にSnowflake QUERY_HISTORY ビュー/関数出力で表示できます。

既存のHiveテーブルとパーティションのSnowflakeとの統合

既存の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操作をサポートします:

  • テーブルを作成

  • テーブルを削除

  • テーブル列追加を変更

  • テーブル列削除を変更

  • テーブルの変更(つまり、 touch

  • パーティションを追加

  • パーティションを削除

  • (タッチ)パーティションを変更

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 (Serializer/Deserializer)プロパティを使用すると、次のオプションがサポートされます:

    • 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/ をプレフィックスとして付ける必要があります。

  • 単一の外部テーブル内の2つの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 になる場合があります。