すべてのプロダクト
Search
ドキュメントセンター

Hologres:Hive メタストアを使用した OSS データへのアクセス

最終更新日:Sep 12, 2026

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 サポートチームが次の手順を案内します:

    1. VPC コンソールにログインし、リバースエンドポイントを作成します。「Alibaba Cloudサービスへのアクセス」をご参照ください。

    2. タイプ パラメーターで その他のエンドポイントサービス を選択し、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:外部データベースの使用 (推奨)

  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_hive

    owner

    外部データベースを所有する Hologres アカウント。

    p4_<ACCOUNT_ID>

    metastore_type

    メタデータサービスのタイプ。Hive メタストアの場合は hms に設定します。

    hms

    catalog_type

    カタログのタイプ。Hive カタログの場合は hive に設定します。

    hive

    hive_metastore_uris

    Hive メタストアの URI。形式:thrift://<HIVE_METASTORE_IP>:<PORT>。デフォルトのポートは 9083 です。

    thrift://10.0.0.1:9083

    metadata_cache_ttl_sec

    オプション。キャッシュされたメタデータが有効である期間 (秒単位)。

    600 (デフォルト)

    metadata_cache_update_interval_sec

    オプション。メタデータキャッシュの更新間隔 (秒単位)。

    60 (デフォルト)

    metadata_refresh_interval_sec

    オプション。完全なメタデータリフレッシュの間隔 (秒単位)。

    7200 (デフォルト)

    oss_endpoint

    OSS エンドポイント。ネイティブ OSS の場合は、パフォーマンスを向上させるために内部エンドポイントを使用します。

    oss-cn-beijing-internal.aliyuncs.com

    table_count_limitation_per_schema

    オプション。スキーマごとにロードされるテーブルの最大数。

    2000 (デフォルト)

    comment

    オプション。外部データベースの説明。

    holo-emr-hive

    上記のキャッシュ間隔とテーブル制限はサンプル値です。メタデータの更新頻度と HMS 内のテーブル数に合わせて調整してください。
  2. (オプション) ユーザーマッピングの作成。

    ユーザーマッピングは、特定の 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>'
    );
  3. 外部テーブルのクエリ。

    外部データベースが存在すると、外部データベース、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>'
);

パラメーター

必須

説明

例

server_name

はい

外部サーバーのカスタム名。

hive_server

hive_metastore_uris

はい

Hive メタストアの URI。形式:thrift://<HIVE_METASTORE_IP>:<PORT>。デフォルトのポートは 9083 です。

thrift://172.16.0.250:9083

oss_endpoint

はい

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 つのコマンドを提供します:

コマンド

最適なケース

「CREATE FOREIGN TABLE」

少数のテーブル、または列のサブセットをマッピングしたり、カスタムテーブル名を割り当てたりする必要がある場合。

「IMPORT FOREIGN SCHEMA」

外部スキーマから複数のテーブルを一括でマッピングする場合。

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>';