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

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

Hiveコネクタは現在、メタストア内のデータベースとスキーマ全体のすべてのテーブルを単一のSnowflakeデータベースとスキーマと統合しています。

注釈

この機能は現在、Amazon S3またはGoogle Cloud Storageに保存されているデータファイルを参照するHiveテーブルでのみサポートされています。Microsoft Azureのサポートが計画されています。

このトピックの内容:

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

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

前提条件

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

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

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

指定Snowflakeユーザー

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

ストレージ統合

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

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

ロール

ロールは指定されたSnowflakeユーザーに割り当てられ、このセクションで識別される他のSnowflakeオブジェクトに対する次のオブジェクト権限を含む必要があります:

オブジェクト

権限

データベース

USAGE

スキーマ

USAGE , CREATE STAGE , CREATE EXTERNAL TABLE

ストレージ統合

USAGE

ステップ1:コネクタをインストールする

次のステップを実行して、コネクタをインストールします。

  1. Maven Central Repositoryからコネクタ JAR ファイルと構成 XML ファイルをダウンロードします。

    http://search.maven.org/ (またはhttps://repo1.maven.org/maven2/net/snowflake/snowflake-hive-metastore-connector/)

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

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

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

    snowflake.jdbc.username

    外部テーブルの更新操作用に指定されたSnowflakeユーザーのログイン名を指定します。

    snowflake.jdbc.password

    ログイン名のパスワードを指定します。Hadoopのバージョンに応じて、システムプロパティまたは環境変数に基づいてパスワードのプレースホルダーを設定できることに注意してください。この構成は、他のHadoop構成と同様に動作します。詳細については、 Hadoopドキュメント をご参照ください。

    snowflake.jdbc.account

    アカウントの名前を指定します(Snowflakeが提供)。例: xy12345

    snowflake.jdbc.db

    Hiveメタストア統合に使用する既存のSnowflakeデータベースを指定します。詳細については、 前提条件 セクション(このトピック内)をご参照ください。

    snowflake.jdbc.schema

    指定されたデータベース内の既存のSnowflakeスキーマを指定します。詳細については、 前提条件 セクション(このトピック内)をご参照ください。

    snowflake.jdbc.role

    Hiveコネクタが使用するアクセス制御ロールを指定します。ロールは、指定されたユーザーに既に割り当てられている既存のロールでなければなりません。

    ここでロールが指定されていない場合、Hiveコネクタは指定されたユーザーの既定のロールを使用します。

    snowflake.jdbc.connection

    アカウントのフルネーム(Snowflakeが提供)を次の形式で指定します。

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

    完全なアカウント名には、アカウントがホストされている 地域、および クラウドプラットフォーム を識別する 追加 のセグメントが含まれている場合があります。

    地域別のアカウント名の例

    アカウント名が xy12345 の場合、

    クラウドプラットフォーム/地域

    完全なアカウント名

    AWS

    US 西部(オレゴン)

    xy12345

    US 東部(オハイオ)

    xy12345.us-east-2.aws

    US 東部(バージニア北部)

    xy12345.us-east-1

    US 東部(商業組織、バージニア政府北部)

    xy12345.us-east-1-gov.aws

    カナダ(中部)

    xy12345.ca-central-1.aws

    EU (アイルランド)

    xy12345.eu-west-1

    EU (フランクフルト)

    xy12345.eu-central-1

    アジア太平洋(東京)

    xy12345.ap-northeast-1.aws

    アジア太平洋(ムンバイ)

    xy12345.ap-south-1.aws

    アジア太平洋(シンガポール)

    xy12345.ap-southeast-1

    アジア太平洋(シドニー)

    xy12345.ap-southeast-2

    GCP

    US 中央部1(アイオワ)

    xy12345.us-central1.gcp

    ヨーロッパ西部2(ロンドン)

    xy12345.europe-west2.gcp

    ヨーロッパ西部4(オランダ)

    xy12345.europe-west4.gcp

    Azure

    西 US 2(ワシントン)

    xy12345.west-us-2.azure

    東 US 2(バージニア)

    xy12345.east-us-2.azure

    US 政府バージニア

    xy12345.us-gov-virginia.azure

    カナダ中央部(トロント)

    xy12345.canada-central.azure

    西ヨーロッパ(オランダ)

    xy12345.west-europe.azure

    スイス北部(チューリッヒ)

    xy12345.switzerland-north.azure

    東南アジア(シンガポール)

    xy12345.southeast-asia.azure

    オーストラリア東部(ニューサウスウェールズ)

    xy12345.australia-east.azure

    重要

    次のいずれかの条件に該当する場合、アカウント名はこの例の構造とは異なります。

    • Snowflake Editionが VPS の場合、アカウント名の詳細については Snowflakeサポート にお問い合わせください。

    • AWS PrivateLink がアカウントで有効になっている場合、アカウント名には追加の privatelink セグメントが 必要 です。詳細については、 AWS PrivateLink とSnowflake をご参照ください。

    snowflake.hive-metastore-connector.integration

    メタストアのHiveテーブルで参照される外部ストレージの場所への安全なアクセスに使用するストレージ統合オブジェクトの名前を指定します。詳細については、 前提条件 セクション(このトピック内)をご参照ください。

    オプションで、次のプロパティを追加します。

    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>
    

    サンプル :file:`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>
    </configuration>
    
  5. ファイルへの変更を保存します。

  6. テキストエディターで既存のHive構成ファイル(hive-site.xml)を開きます。次のように、構成ファイルにコネクタを追加します。

    <configuration>
     ...
     <property>
      <name>hive.metastore.event.listeners</name>
      <value>net.snowflake.hivemetastoreconnector.SnowflakeHiveListener</value>
     </property>
    </configuration>
    

    注釈

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

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

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

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

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

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

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

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

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

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

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

既存のHiveテーブルとパーティションをSnowflakeと統合するには、テーブルとパーティションごとにHiveで次のコマンドを実行します。

ALTER TABLE <table_name> TOUCH [PARTITION partition_spec];

詳細については、 Hiveのドキュメント をご参照ください。

または、Snowflakeは、既存のHiveテーブルとパーティションを同期するためのスクリプトを提供します。詳細については、 GitHub のプロジェクトページ をご参照ください。

機能

サポートされている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>;
非パーティション化されたHiveテーブル

次のコマンドを実行します:

ALTER TABLE <table_name> TOUCH;

HiveテーブルとSnowflake外部テーブルの違い

このセクションでは、HiveテーブルとSnowflake外部テーブルの主な違いについて説明します。

パーティション
  • Snowflakeパーティションは、テーブルが参照する保存場所のサブパスで構成されますが、Hiveパーティションにはこの制約はありません。保存場所のサブパスではないHiveテーブルにパーティションが追加された場合、それらのパーティションはSnowflakeの対応する外部テーブルに追加されません。

    例えば、Hiveテーブル(および対応するSnowflake外部テーブル)に関連付けられた保存場所が s3://path/ である場合、Hiveテーブル内のすべてのパーティションの場所にも s3://path/ をプレフィックスとして付ける必要があります。

  • 単一の外部テーブル内の2つのSnowflakeパーティションは、まったく同じ保存場所を指すことはできません。例えば、次のパーティションは互いに競合します:

    ALTER TABLE exttable ADD PARTITION (partcol='1') LOCATION 's3:///files/2019/05/12';
    
    ALTER TABLE exttable ADD PARTITION (partcol='2') LOCATION 's3:///files/2019/05/12';
    
列名

Hiveの列名では大文字と小文字が区別されませんが、 VALUES から派生したSnowflake仮想列では大文字と小文字が区別されます。Hiveテーブルに大文字と小文字が混在する名前の列が含まれる場合、それらの列のデータは、Snowflake外部テーブルの対応する列の NULL になる場合があります。