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: コネクタをインストールする¶
次のステップを実行して、コネクタをインストールします。
Maven Central Repositoryからコネクタ JAR ファイルと構成 XML ファイルをダウンロードします。
Sonatype (またはhttps://repo1.maven.org/maven2/net/snowflake/snowflake-hive-metastore-connector/)
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 ファイルと構成ファイルを正しいディレクトリに追加します。
次のディレクトリに
snowflake-config.xml
ファイルという名前のファイルを作成します。- Amazon S3またはGoogle Cloud Storage:
Hiveクラスパスの
conf
ディレクトリ。- Microsoft Azure HDInsight:
Hiveクラスパスの
conf/conf.server
ディレクトリ。
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ターゲットデータベースに名前を持つ最初のテーブルを作成しますが、同じ名前の追加のテーブルはスキップします。
たとえば、データベース
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> <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 クラスター管理ポータルにカスタムプロパティを追加します。
左側のメニュー » Configs » Advanced の Hive タブをクリックします。
Custom Hive Site タブまで下にスクロールします。
カスタムプロパティを追加します。
注釈
このファイルに他のコネクタが既に設定されている場合は、SnowflakeのHiveコネクタを
<value>
ノードのコンマ区切りリストに追加します。ファイルへの変更を保存します。
Hiveメタストアサービスを再起動します。
ステップ2: インストールを検証する¶
Hiveで新しいテーブルを作成します。
SHOW EXTERNAL TABLES を使用して、Snowflakeデータベースとスキーマの外部テーブルのリストをクエリします。
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 を使用して)。
機能¶
サポートされている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 になる場合があります。