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:コネクタをインストールする¶
次のステップを実行して、コネクタをインストールします。
Maven Central Repositoryからコネクタ JAR ファイルと構成 XML ファイルをダウンロードします。
http://search.maven.org/ (またはhttps://repo1.maven.org/maven2/net/snowflake/snowflake-hive-metastore-connector/)
JAR ファイルをHiveクラスパスの
lib
ディレクトリにコピーします。場所は、Hiveのインストールに応じて異なる場合があります。クラスパスを決定するには、 HIVE_AUX_JARS_PATH 環境変数を確認してください。Hiveクラスパスの
conf
ディレクトリにsnowflake-config.xml
ファイルという名前のファイルを作成します。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
ヨーロッパ(ロンドン)xy12345.eu-west-2.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 またはAzure Private Linkが有効になっている場合、アカウント名には、地域セグメントの代わりに
privatelink
セグメントが 必要 です。詳細については、以下をご参照ください。
snowflake.hive-metastore-connector.integration
メタストアのHiveテーブルで参照される外部ストレージの場所への安全なアクセスに使用するストレージ統合オブジェクトの名前を指定します。詳細については、 前提条件 セクション(このトピック内)をご参照ください。
オプションで、次のプロパティを追加します。
snowflake.hive-metastore-listener.database-filter-regex
統合でスキップする、Hiveメタストア内のデータベースの名前を指定します。このプロパティを使用すると、Snowflakeと統合するデータベースを制御できます。このオプションは、Hiveデータベース全体で複数のテーブルが同じ名前を持つ場合に特に役立ちます。現在この状況では、Hiveコネクタは、Snowflakeターゲットデータベースに名前を持つ最初のテーブルを作成しますが、同じ名前の追加のテーブルはスキップします。
たとえば、データベース
mydb1
、mydb2
、およびmydb3
のすべてにtable1
という名前のテーブルが含まれているとします。プロパティ値として正規表現mydb[^1]
を追加することで、mydb1
を 除き、命名規則がmydb<数>
のすべてのデータベースを省略できます。サンプルプロパティノード
<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> </configuration>
ファイルへの変更を保存します。
テキストエディターで既存のHive構成ファイル(
hive-site.xml
)を開きます。次のように、構成ファイルにコネクタを追加します。<configuration> ... <property> <name>hive.metastore.event.listeners</name> <value>net.snowflake.hivemetastoreconnector.SnowflakeHiveListener</value> </property> </configuration>
注釈
このファイルに他のコネクタが既に設定されている場合は、SnowflakeのHiveコネクタを
<value>
ノードのコンマ区切りリストに追加します。ファイルへの変更を保存します。
Hiveメタストアサービスを再起動します。
ステップ2:インストールを検証する¶
Hiveで新しいテーブルを作成します。
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および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 になる場合があります。