Hologres V2.2 以降、Object Storage Service (OSS) 上に構築されたデータレイクのメタデータソースとして Hive メタストア (HMS) をサポートします。データレイクがストレージレイヤーとして OSS または OSS-HDFS を使用する E-MapReduce (EMR) クラスター上で実行されている場合、Hologres を HMS に接続することで、データを移行またはコピーすることなく、SQL を使用して OSS データを直接クエリできます。
前提条件
開始する前に、次のものが準備されていることを確認してください:
-
OSS サービスが有効化されていること。「コンソールのクイックスタート」をご参照ください。
-
テストデータがロードされている EMR データレイククラスターがあること。「EMR HiveまたはSparkでのOSS-HDFSへのアクセス」および「クラスターの作成」をご参照ください。クラスターは、次のすべての条件を満たす必要があります:
-
Hive バージョン 3.1.3 以降
-
Kerberos 認証が無効であること
-
Metadata が Self-managed RDS または Built-in MySQL に設定されていること
-
-
データレイクアクセラレーションが有効化されており、データベースが作成されている Hologres インスタンスがあること。「Hologresインスタンスの購入」および「データベースの作成」をご参照ください。
データレイクアクセラレーションを有効にするには、Hologres コンソールに移動します。対象インスタンスの 操作 列で データレイクアクセラレーション をクリックし、確定します。
-
Hologres と EMR クラスター間のネットワーク接続があること。Hologres はクラシックネットワークにデプロイされ、EMR は仮想プライベートクラウド (VPC) で実行されるため、2 つのサービスが通信するにはリバースエンドポイントが必要です。ネットワーク接続リクエストを送信してください。その後、Hologres サポートチームが次の手順を案内します:
-
VPC コンソールにログインし、リバースエンドポイントを作成します。「Alibaba Cloudサービスへのアクセス」をご参照ください。
-
タイプ パラメーターで その他のエンドポイントサービス を選択し、EMR クラスターが配置されているリージョンのエンドポイントサービス名を入力します:
リージョン
エンドポイントサービス名
中国 (北京)
com.aliyuncs.privatelink.cn-beijing.epsrv-2zeokrydzjd6kx3cbwmb中国 (上海)
com.aliyuncs.privatelink.cn-shanghai.epsrv-uf61fvlfwta7f7dv9n3x中国 (張家口)
com.aliyuncs.privatelink.cn-zhangjiakou.epsrv-8vbno4k4wwvys0eg2swp
お使いのリージョンがリストにない場合、リクエストを送信すると Hologres チームがエンドポイントサービスを作成し、その名前をお知らせします。接続には IP アドレスを使用します。EMR クラスターの IP アドレスが変更された場合は、接続を再設定してください。
-
制限事項
-
読み取り専用のセカンダリ Hologres インスタンスは、データレイクアクセラレーションをサポートしていません。
-
外部テーブルでは
UPDATE、DELETE、TRUNCATEはサポートされていません。 -
自動ロード (HMS からの外部テーブルの一括マッピング) はサポートされていません。
-
Kerberos 認証が有効な EMR クラスターはサポートされていません。
Hologres と HMS の接続
Hologres には、HMS に接続するための 2 つの方法があります。インスタンスのバージョンや、列マッピングでどの程度の制御が必要かに応じて、いずれかを選択してください。
-
方法1:外部データベース (推奨)。Hologres V3.0 以降が必要です。外部データベースは、すべての HMS データベースとテーブルを Hologres の外部データベース、スキーマ、外部テーブルに一度にマッピングするため、ユーザーは一度に 1 つの外部テーブルを作成する代わりに、3 部構成の名前でデータをクエリできます。
-
方法2:hive_fdw。Hologres V2.2 以降、V3.0 より前のバージョン、または列のサブセットをマッピングしたり、テーブル名を変更したりする必要がある場合に使用します。
方法1:外部データベースの使用 (推奨)
-
Hologres インスタンスに接続し、外部データベースを作成します。この手順にはスーパーユーザー権限が必要です。
完全な構文については、「CREATE EXTERNAL DATABASE」をご参照ください。
CREATE EXTERNAL DATABASE <EXTERNAL_DATABASE_NAME> owner '<ACCOUNT_NAME>' metastore_type 'hms' catalog_type 'hive' hive_metastore_uris 'thrift://<HIVE_METASTORE_IP>:<PORT>' metadata_cache_ttl_sec '600' metadata_cache_update_interval_sec '60' metadata_refresh_interval_sec '7200' oss_endpoint 'oss-<REGION_ID>-internal.aliyuncs.com' table_count_limitation_per_schema '2000' comment '<EXTERNAL_DATABASE_COMMENT>';パラメーター
説明
例
external_database_name外部データベースの名前。
catalog_hiveowner外部データベースを所有する Hologres アカウント。
p4_<ACCOUNT_ID>metastore_typeメタデータサービスのタイプ。Hive メタストアの場合は hms に設定します。
hmscatalog_typeカタログのタイプ。Hive カタログの場合は hive に設定します。
hivehive_metastore_urisHive メタストアの URI。形式:thrift://<HIVE_METASTORE_IP>:<PORT>。デフォルトのポートは 9083 です。
thrift://10.0.0.1:9083metadata_cache_ttl_secオプション。キャッシュされたメタデータが有効である期間 (秒単位)。
600 (デフォルト)metadata_cache_update_interval_secオプション。メタデータキャッシュの更新間隔 (秒単位)。
60 (デフォルト)metadata_refresh_interval_secオプション。完全なメタデータリフレッシュの間隔 (秒単位)。
7200 (デフォルト)oss_endpointOSS エンドポイント。ネイティブ OSS の場合は、パフォーマンスを向上させるために内部エンドポイントを使用します。
oss-cn-beijing-internal.aliyuncs.comtable_count_limitation_per_schemaオプション。スキーマごとにロードされるテーブルの最大数。
2000 (デフォルト)commentオプション。外部データベースの説明。
holo-emr-hive上記のキャッシュ間隔とテーブル制限はサンプル値です。メタデータの更新頻度と HMS 内のテーブル数に合わせて調整してください。
-
(オプション) ユーザーマッピングの作成。
ユーザーマッピングは、特定の Hologres アカウントが OSS から読み取るために使用する認証情報を提供します。詳細については、「CREATE USER MAPPING」をご参照ください。
CREATE USER MAPPING FOR <ACCOUNT_NAME> EXTERNAL DATABASE <EXTERNAL_DATABASE_NAME> OPTIONS ( oss_access_id '<ACCESS_KEY_ID>', oss_access_key '<ACCESS_KEY_SECRET>' ); -
外部テーブルのクエリ。
外部データベースが存在すると、外部データベース、Hive データベース、Hive テーブルの 3 部構成の名前で任意のテーブルを参照できます。
非パーティション化テーブル:
SELECT * FROM <EXTERNAL_DATABASE_NAME>.<HIVE_DATABASE_NAME>.<HIVE_TABLE_NAME>;パーティションテーブル:WHERE 句でパーティションキーをフィルタリングします。
SELECT * FROM <EXTERNAL_DATABASE_NAME>.<HIVE_DATABASE_NAME>.<HIVE_PARTITION_TABLE_NAME> WHERE <PARTITION_KEY> = '<PARTITION_VALUE>';
方法2:hive_fdw の使用
ステップ1:拡張機能の作成
次の SQL コマンドを実行して、hive_fdw 外部データラッパー (FDW) をインストールします。この操作にはスーパーユーザー権限が必要で、データベースごとに一度だけ実行する必要があります。
CREATE EXTENSION IF NOT EXISTS hive_fdw;
ステップ2:外部サーバーの作成
HMS インスタンスと OSS ストレージを指す外部サーバーを作成します。
コマンドを実行する前に、次の値を用意します:
-
HMS IP アドレス:E-MapReduce コンソールで、クラスターの [Node Management] をクリックします。[Node Management] タブで、マスターノードの [Internal IP] を確認します。
-
OSS エンドポイント:OSS コンソールで、バケットの概要ページを開き、[Access Ports] エリアを確認します。
CREATE SERVER IF NOT EXISTS <SERVER_NAME> FOREIGN DATA WRAPPER hive_fdw
OPTIONS (
hive_metastore_uris 'thrift://<HIVE_METASTORE_IP>:<PORT>',
oss_endpoint '<OSS_ENDPOINT>'
);
|
パラメーター |
必須 |
説明 |
例 |
|
|
はい |
外部サーバーのカスタム名。 |
|
|
|
はい |
Hive メタストアの URI。形式: |
|
|
|
はい |
OSS エンドポイント。ネイティブ OSS の場合は、パフォーマンスを向上させるために内部エンドポイントを使用します。OSS-HDFS の場合は、内部エンドポイントのみがサポートされています。 |
以下の例をご参照ください |
oss_endpoint には、ストレージタイプに基づいて次のいずれかを選択します:
-
ネイティブ OSS:内部エンドポイントを使用します。
oss-cn-shanghai-internal.aliyuncs.com -
OSS-HDFS:内部ネットワークアクセスのみがサポートされています。
<BUCKET_NAME>.cn-beijing.oss-dls.aliyuncs.com
ステップ3:(オプション) ユーザーマッピングの作成
ユーザーマッピングは、どの Hologres アカウントが外部サーバーを介して外部データにアクセスできるかを制御します。このマッピングでは、Data Lake Formation (DLF) や Object Storage Service (OSS) など、使用するデータソースに応じた認証情報を指定する必要があります。たとえば、外部サーバーの所有者は、Resource Access Management (RAM) ユーザーにデータへのアクセスを許可できます。
CREATE USER MAPPING 構文の詳細については、「PostgreSQLドキュメント」をご参照ください。
-- 現在のユーザーに外部サーバーへのアクセスを許可
CREATE USER MAPPING FOR current_user SERVER <SERVER_NAME> OPTIONS (
-- データソースが Data Lake Formation (DLF) の場合は、その認証情報を指定します。
dlf_access_id '<ACCESS_KEY_ID>',
dlf_access_key '<ACCESS_KEY_SECRET>',
-- データソースが Object Storage Service (OSS) の場合は、その認証情報を指定します。
oss_access_id '<ACCESS_KEY_ID>',
oss_access_key '<ACCESS_KEY_SECRET>'
);
-- RAM ユーザー (123xxx) に外部サーバーへのアクセスを許可
CREATE USER MAPPING FOR "p4_123xxx" SERVER <SERVER_NAME> OPTIONS (
-- データソースが Data Lake Formation (DLF) の場合は、その認証情報を指定します。
dlf_access_id '<ACCESS_KEY_ID>',
dlf_access_key '<ACCESS_KEY_SECRET>',
-- データソースが Object Storage Service (OSS) の場合は、その認証情報を指定します。
oss_access_id '<ACCESS_KEY_ID>',
oss_access_key '<ACCESS_KEY_SECRET>'
);
-- ユーザーマッピングの削除
DROP USER MAPPING FOR CURRENT_USER SERVER <SERVER_NAME>;
DROP USER MAPPING FOR "p4_123xxx" SERVER <SERVER_NAME>;
ステップ4:外部テーブルの作成
Hologres は、外部テーブルを作成するための 2 つのコマンドを提供します:
|
コマンド |
最適なケース |
|
少数のテーブル、または列のサブセットをマッピングしたり、カスタムテーブル名を割り当てたりする必要がある場合。 |
|
|
外部スキーマから複数のテーブルを一括でマッピングする場合。 |
Hologres は OSS のパーティションテーブルをサポートしています。サポートされているパーティションキーのタイプは TEXT、VARCHAR、INT です。
CREATE FOREIGN TABLE を使用する場合:このコマンドはデータを格納せずにスキーマをマッピングするため、パーティションフィールドを通常の列として定義します。
IMPORT FOREIGN SCHEMA を使用する場合:システムがフィールドマッピングを自動的に処理します。
外部テーブル名が既存の Hologres 内部テーブルと競合する場合、IMPORT FOREIGN SCHEMAはそのテーブルをスキップします。CREATE FOREIGN TABLEを使用して、別の名前でマッピングしてください。
-- 単一の外部テーブルを作成
CREATE FOREIGN TABLE <HOLO_SCHEMA_NAME>.<TABLE_NAME>
(
column_name data_type
[, ...]
)
SERVER <SERVER_NAME>
OPTIONS (
schema_name '<HIVE_DATABASE_NAME>',
table_name '<HIVE_TABLE_NAME>'
);
-- 複数の外部テーブルを一括でインポート
IMPORT FOREIGN SCHEMA <HIVE_DATABASE_NAME>
[
{ LIMIT TO | EXCEPT }
( table_name [, ...] )
]
FROM SERVER <SERVER_NAME>
INTO <HOLO_SCHEMA_NAME>
OPTIONS (
if_table_exist 'update',
if_unsupported_type 'error'
);
ステップ5:外部テーブルのクエリ
外部テーブルを作成した後、それを直接クエリして OSS からデータを読み取ります。
非パーティション化テーブル:
SELECT * FROM <HOLO_SCHEMA_NAME>.<TABLE_NAME>;
パーティションテーブル:
SELECT * FROM <HOLO_SCHEMA_NAME>.<PARTITION_TABLE_NAME>
WHERE <PARTITION_KEY> = '<PARTITION_VALUE>';