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: コネクタをインストールする¶
次のステップを実行して、コネクタをインストールします。
- Maven Central Repository(Sonatype または https://repo1.maven.org/maven2/net/snowflake/snowflake-hive-metastore-connector/)から、コネクタ JAR ファイルと構成 XML ファイルをダウンロードします。 
- 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 ファイルと構成ファイルを正しいディレクトリに追加します。
 
- 次のディレクトリに - snowflake-config.xmlという名前のファイルを作成します。- Amazon S3またはGoogle Cloud Storage:
- Hiveクラスパスの - confディレクトリ。
- Microsoft Azure HDInsight:
- Hiveクラスパスの - conf/conf.serverディレクトリ。
 
- テキストエディターで - 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ターゲットデータベースに名前を持つ最初のテーブルを作成しますが、同じ名前の追加のテーブルはスキップします。 - たとえば、データベース - mydb1、- mydb2、および- mydb3のすべてに- table1という名前のテーブルが含まれているとします。正規表現- mydb[^1]をプロパティ値として追加することで、命名規則が- mydb< number >(- mydb1を除く)のすべてのデータベースを省略できます。- プロパティノードの例 - <configuration> .. <property> <name>snowflake.hive-metastore-listener.database-filter-regex</name> <value>mydb[^1]</value> </property> </configuration> - 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> 
 
- ファイルへの変更を保存します。 
- 既存の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> 
- Microsoft Azure HDInsight:
- Azure HDInsight ドキュメント のステップを完了して、 - hive-site.xmlファイルを編集します。次のカスタムプロパティをクラスター構成に追加します。- hive.metastore.event.listeners=net.snowflake.hivemetastoreconnector.SnowflakeHiveListener- または、 HDInsight クラスター管理ポータルにカスタムプロパティを追加します。 - 左側のメニュー Hive » Configs » の Advanced タブをクリックします。 
- Custom Hive Site タブまで下にスクロールします。 
- カスタムプロパティを追加します。 
 
 - 注釈 - このファイルに他のコネクタが既に設定されている場合は、SnowflakeのHiveコネクタを - <value>ノードのコンマ区切りリストに追加します。
- ファイルへの変更を保存します。 
- Hiveメタストアサービスを再起動します。 
ステップ2: インストールを検証する¶
- Hiveで新しいテーブルを作成します。 
- Snowflakeデータベースとスキーマで、SHOW EXTERNAL TABLES を使用して外部テーブルのリストをクエリします。 - SHOW EXTERNAL TABLES IN <database>.<schema>; - ここで、 - 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テーブルと同じ名前の外部テーブルが、 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>; 
- 非パーティション化されたHiveテーブル:
- 次のコマンドを実行します。 - ALTER TABLE <table_name> TOUCH; 
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'; 
 
- 列名:
- Hiveの列名では大文字と小文字が区別されませんが、 VALUES から派生したSnowflake仮想列では大文字と小文字が区別されます。Hiveテーブルに大文字と小文字が混在する名前の列が含まれる場合、それらの列のデータは、Snowflake外部テーブルの対応する列の NULL になる可能性があります。