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

Snowflake用Hiveメタストアコネクタを使用すると、外部テーブルを使用して`Apache Hive <https://hive.apache.org/>`_メタストアをSnowflakeに統合できます。コネクタは、メタストアイベントを検出し、それらのイベントをSnowflakeに送信して、外部テーブルとHiveメタストアの同期を維持します。この機能により、ユーザーはHiveでスキーマを管理しながら、Snowflakeからメタストアをクエリできます。

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

  • Amazon Web Services

  • Google Cloud

  • 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(Sonatype または https://repo1.maven.org/maven2/net/snowflake/snowflake-hive-metastore-connector/)から、コネクタ JAR ファイルと構成 XML ファイルをダウンロードします。

  2. JAR ファイルを次のディレクトリにコピーします。

    Amazon S3またはGoogle Cloud Storage:

    Hiveクラスパスの lib ディレクトリ。場所は、Hiveのインストールに応じて異なる場合があります。クラスパスを決定するには、 HIVE_AUX_JARS_PATH 環境変数を確認してください。

    Microsoft Azure HDInsight:

    ユーザーディレクトリ内の hive ディレクトリ。例: file:/usr/hdp/<hdinsight_version>/atlas/hook/hive/。場所は、Azure HDInsight のバージョンとインストールの選択によって異なる場合があります。

    Tip

    カスタムスクリプトの例は、Hive <https://github.com/snowflakedb/snowflake-hive-metastore-connector/>`_ の GitHub プロジェクトページの :file:`scripts フォルダーにあります。スクリプトは、 JAR ファイルと構成ファイルを正しいディレクトリに追加します。

  3. 次のディレクトリに snowflake-config.xml という名前のファイルを作成します。

    Amazon S3またはGoogle Cloud Storage:

    Hiveクラスパスの conf ディレクトリ。

    Microsoft Azure HDInsight:

    Hiveクラスパスの conf/conf.server ディレクトリ。

  4. テキストエディターで snowflake-config.xml ファイルを開き、次の <name> プロパティと対応する <values>` をファイルに入力します。

    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(推奨): 組織内のアカウント名 をご参照ください。

    または、アカウントがホストされている*アカウントロケーター*と地理的な :doc:` リージョン </user-guide/intro-regions>`、および必要に応じて クラウドプラットフォーム を指定します。詳細については、 形式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] をプロパティ値として追加することで、命名規則が mydb< number > mydb1 を除く)のすべてのデータベースを省略できます。

    プロパティノードの例

    <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. Snowflakeデータベースとスキーマで、SHOW EXTERNAL TABLES を使用して外部テーブルのリストをクエリします。

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

    ここで、databaseschema は、このトピックの前半の ステップ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 を使用して)削除します。

サポートされている機能とサポートされていない機能

次のセクションでは、Snowflake用のHiveメタストアコネクタとの統合において、Apache Hiveメタストアでサポートされている機能とサポートされていない機能を一覧で示します。

サポートされている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 になる可能性があります。