OceanBaseはV4.3.5 BP2からODPS Catalogをサポートし、V4.4.1バージョンでさらにHMS Catalog(Hive Metastore Catalog)メカニズムを導入し、データレイクおよびオフラインデータウェアハウスへのシームレスなアクセスを実現しました。この機能により、ユーザーは標準SQLを使用して、Hive Metastore(HMS)が管理するHiveテーブルやIcebergテーブル、およびMaxCompute(ODPS)内のオフラインテーブルを直接照会できます。
これらのテーブルは通常、ParquetやORCなどの効率的なカラムストア形式で保存されており、HDFS、OSS、またはS3などの分散型ストレージシステムに格納されています。これらは企業の主要なデータレイクの重要な構成要素となっています。
単純なメタデータ連携とは異なり、OceanBaseはデータレイクを「読み取る」だけでなく、高性能な計算エンジンとして、レイク上のデータに対して顕著なクエリ高速化を提供します。これは、組み込まれた複数のAP最適化機能によるものです:
- 述語プッシュダウンとカラムプルーニング:WHERE条件とSELECT列情報をデータソース(例えばODPS Storage API、HDFSファイル読み取り層)にプッシュダウンします。
- 並列実行とベクトル化計算:大規模テーブルスキャンタスクを自動的に並列化し、ベクトル化エンジンを利用してカラムストアデータを効率的に処理します。
- 外部テーブルデータキャッシュ(オプション):頻繁にアクセスされる静的なレイクテーブルについて、データファイルのキャッシュをサポートし、重複クエリの遅延を低減します。
これらの機能により、ユーザーはデータレイクやデータウェアハウス内の生データをデータベース内部に移行することなく、OceanBase内でクエリの高速化を実現できます。
- OceanBase内部のリアルタイムビジネステーブル(注文、ユーザープロファイルなど)。
- データレイク内の履歴ログ、ワイドテーブル、またはIcebergテーブル(ユーザー行動、IoT時系列データなど)、およびODPSなどのクラウドネイティブデータウェアハウス内のオフラインテーブル。
これにより、OceanBaseはデータレイククエリの入口となり、「一箇所でクエリ、全域データ」のフェデレーション分析体験を真に実現します。わずか1つのSQLで、データベースとデータレイク内のデータに同時にアクセスでき、ソース間分析のプロセスを大幅に簡素化し、データレイクの使用をよりシンプルかつ効率的にします。
デプロイメントと環境依存関係
| クロスデータセンター配置の推奨事項 | HDFSストレージ依存関係 |
|---|---|
| HMSとOBServerがマシンルーム間でデプロイされる場合、ネットワーク遅延によりメタデータ取得に数秒かかる可能性があり、クエリの遅延が大幅に増加します。HMSとOBServerは、同じ低遅延ネットワーク内にデプロイすることを推奨します。 | ベースストレージがHDFSの場合、事前にOBServerノードにJava実行環境(JDK 8/11)をデプロイし、Javaサポート(enable_java = true)を有効にする必要があります。詳細については、OceanBase JAVA SDK環境のデプロイを参照してください。 |
Catalogと外部テーブルの関係
OceanBaseは2種類の外部データアクセスモードを提供します:
| モード | 適用シナリオ | メタデータ管理 | 使用例 |
|---|---|---|---|
| Catalogモード (HMS Catalog、ODPS Catalogなど) |
事前定義済みの構造化データソース(Hiveデータウェアハウス、ODPSプロジェクトなど) | メタデータの自動同期 | SET CATALOG my_hms;SELECT * FROM db1.sales; |
| 明示的外部テーブル (ファイル/JDBC/ODPS外部テーブル) |
一時ファイル、カスタムパス、またはCatalog以外のデータソース | テーブル定義と構造の手動作成 | CREATE EXTERNAL TABLE t1 (...) LOCATION = 'oss://...'; |
注意
- Catalogは、Parquet/ORCファイルやODPSテーブルなどの下層データに対するメタデータの抽象化です。
- 現在、HMS CatalogはHive Metastoreへの接続のみをサポートしており、任意のHDFSパスを直接指定することはできません。HMSに登録されていないファイルにアクセスする必要がある場合は、
CREATE EXTERNAL TABLE ... LOCATIONを使用してください。
Catalogの種類
OceanBaseでは、Catalogはデータベースオブジェクトのトップレベルネームスペースであり、異なるデータソースのメタデータを整理し分離するために使用されます。OceanBaseは以下のCatalogタイプをサポートしています:
| Catalogの種類 | データソース | サポートされるテーブルタイプ | 典型的なシナリオ |
|---|---|---|---|
| 内部Catalog | OceanBaseローカルストレージ | OceanBaseテーブル | 内部のコア業務データ |
| ODPSCatalog | Alibaba Cloud MaxCompute(ODPS) | ODPSテーブル | ビッグデータのオフライン分析 |
| HMSCatalog | Hive Metastore(HMS) | Hiveテーブル、Icebergテーブル | Hadoopエコシステムとの連携 |
Catalogの作成
OceanBaseには、データベース自身のメタデータを管理するための組み込み内部Catalogがあり、手動で作成する必要はありません。外部データソースを使用する場合は、CREATE EXTERNAL CATALOGステートメントを使用してODPSCatalogまたはHMSCatalogを作成できます。
Catalogへのアクセス
説明
現在、データCatalog機能はOceanBase MySQLモードのみでサポートされています。
現在のテナントのCatalogを表示する
SHOW CATALOGS; ステートメントを使用して、現在のテナントで作成されたすべてのCatalogを表示できます。
例:
SHOW CATALOGS;
Catalog内のデータを表示する
Catalogでは、データベース内のテーブルと同様に任意のクエリ操作を実行できるほか、Catalog間で連携クエリを実行することもできます。
例:
SELECT * FROM internal.ap_db.ap_table, odps_catalog.odps_db.odps_table;
Catalog間のクエリ
OceanBaseは単一のSQL文で複数のCatalog(例えばinternal、hive_catalog、odps_catalogなど)にアクセスし、フェデレーテッドクエリを実現することをサポートしています。ユーザーは以下の2つの方法で、現在のコンテキスト以外のテーブルを参照できます:
基本原則:
- セッションのコンテキストが切り替わっていない場合、完全な3部構成識別子を使用する必要があります:
catalog_name.database_name.table_name; - ターゲットのCatalogとデータベースに切り替わっている場合は、省略されたテーブル名を直接使用できます。
方法1:3部構成識別子を使用する(コンテキスト切り替え不要)
現在どのCatalogにいる場合でも、catalog.db.table という3部構成識別子を使用して、任意のCatalog内のテーブルに直接アクセスできます。
例1:デフォルトのinternalCatalogからHMSテーブルをクエリする
-- 現在のセッションコンテキストを確認する
SELECT CURRENT_CATALOG(); -- 'internal'を返す
SELECT DATABASE(); -- またはSELECT SCHEMA()を使用して、現在のデータベースを返します。例:'ap_db'
-- Catalog間でHiveテーブルをクエリする
SELECT * FROM hive_catalog.hive_db.hive_table;
HMSCatalog内のローカルテーブルをクエリする場合も同様で、catalog.db.table という3部構成識別子を使用して直接アクセスできます。
例2:フェデレーテッドクエリ(混合ソース)
-- 現在internal.ap_dbにいると仮定します
SELECT CURRENT_CATALOG(); -- 'internal'を返す
SELECT DATABASE(); -- またはSELECT SCHEMA()を使用して、現在のデータベースを返します。例:'ap_db'
-- HMSテーブルとローカルテーブルに同時にアクセスする
SELECT h.*, o.*
FROM hive_catalog.hive_db.hive_table h
JOIN internal.ap_db.ap_table o ON h.id = o.id;
方法2:セッションコンテキストを切り替えてから省略されたテーブル名を使用する
SET CATALOG と USE を使用して、現在のセッションのCatalogとデータベースを明示的に切り替えた後、プレフィックスなしでテーブル名を直接使用できます。
例:hive_catalog.hive_dbでフェデレーテッドクエリを実行する
-- Catalogとデータベースを切り替える
SET CATALOG hive_catalog;
USE hive_db;
-- 現在のコンテキストを確認する
SELECT CURRENT_CATALOG(); -- 'hive_catalog'を返す
SELECT DATABASE(); -- 'hive_db'を返す
-- この時点で、hive_db下のテーブル(例えばhive_table)を直接参照できます
-- 同時に、3部構成識別子を使用して他のCatalog(例えばinternal)にもアクセスできます
SELECT h.*, o.*
FROM hive_table h -- 略称:現在のCatalog + データベース
JOIN internal.ap_db.ap_table o ON h.id = o.id;
説明
SET CATALOGとUSEを実行しない場合、SELECT * FROM hive_table;を直接記述するとエラーが発生します。これは、システムが現在のCatalog(例えばinternal)でそのテーブルを検索するためです。
- コンテキストの切り替えは、接続やトランザクションの状態には影響せず、後続のステートメントにのみ影響します。
詳細ドキュメントについては、CATALOGを表示するを参照してください。
Catalogの切り替え
SET CATALOG catalog_name; を使用してCatalogを切り替えるか、クエリ内で明示的に指定します。
SELECT * FROM odps_catalog.database_name.table_name;
詳細なSQL構文ドキュメントについては、SET CATALOGを参照してください。
HMS/ODPSCatalogのサポート内容
HMSCatalogのサポート内容
アクセスモード
- 読み取り専用アクセス:すべてのHMSCatalog下のオブジェクトは読み取り専用であり、
INSERT、UPDATE、DROP TABLEなどのDML/DDL操作を実行することは禁止されています。
サポートされるテーブルタイプ
| テーブルタイプ | 対応フォーマット | 説明 |
|---|---|---|
| Hiveテーブル | ORC、Parquet、TextFile、CSV | - 現在、複合型はParquet形式のARRAYタイプのみをサポートしています。 詳細については、配列要素タイプの概要を参照してください。 |
| Icebergテーブル | V1 / V2(Parquetを推奨) | Schema Evolution(列の追加・削除)、Partition Transform(例:bucket()、year()など)などの高度な機能をサポートします。 |
Hiveバージョンの互換性
| Hiveバージョン | Icebergサポートの説明 |
|---|---|
| Hive 4.x | HiveエンジンはIcebergテーブルをネイティブサポートしており、Hiveを使用してテーブルの作成・更新が可能です。OceanBaseではHMS Catalog経由で直接アクセスできます。 |
| Hive 1.2.x / 2.3.x / 3.1.x | Hive自体はIcebergをサポートしていません。ただし、IcebergテーブルがSparkやFlinkなどのエンジンによって作成され、そのメタデータがHive Metastoreに登録されている場合、OceanBaseはそれを読み取ることができます。 |
重要な原則:IcebergテーブルのメタデータがHMSに正しく登録されていれば(どのエンジンによって書き込まれたものであっても)、OceanBaseはそれにアクセスできます。
ODPSCatalogのサポート内容
- サポートされる操作:
SELECT、JOIN、GROUP BYなどの分析系クエリ - サポートされない操作:
INSERT、UPDATE、DROP TABLEなどの書き込みまたはDDL操作 - 最適化機能:パーティションプルーニングおよびカラムプルーニング条件を自動的にプッシュダウンし、ODPSから転送されるデータ量を削減します。
Catalog権限管理
OceanBaseはCatalogレベルの権限制御をサポートしており、細かい粒度での権限付与が可能です。ユーザーは対応する権限を持っていなければ、外部Catalog(ODPSやHMSなど)を作成、切り替え、またはクエリを実行することができません。
Catalog権限には2つのレベルがあります:
- ユーザーレベル(グローバルレベル):すべてのCatalogに適用されます(MySQLモードでは*.*に相当します)
- Catalogレベル(オブジェクトレベル):指定されたCatalogにのみ適用されます
MySQLモードの権限体系
| 権限 | 適用範囲 | 用途 |
|---|---|---|
CREATE CATALOG |
ユーザーレベル | CREATE / DROP EXTERNAL CATALOG の実行を許可する |
USE CATALOG |
ユーザーレベルまたはCatalogレベル | SET CATALOG、SHOW CATALOGS、SELECT FROM catalog.db.table を許可する |
構文
グローバル権限の付与
任意のCatalogを操作する管理者に適用されます:
GRANT CREATE CATALOG ON *.* TO 'user1';
GRANT USE CATALOG ON *.* TO 'user1' WITH GRANT OPTION;
REVOKE CREATE CATALOG ON *.* FROM 'user1';
REVOKE USE CATALOG ON *.* FROM 'user1';
特定Catalogへの権限付与
通常ユーザーが指定されたCatalogにのみアクセスする場合に適用されます(推奨方法):
-- catalog 'odps_prod' に対するUSEおよびSELECT権限を付与
GRANT SELECT, USE CATALOG ON CATALOG odps_prod TO 'user1' WITH GRANT OPTION;
-- 権限の取り消し
REVOKE USE CATALOG ON CATALOG odps_prod FROM 'user1';
重要な追加説明:
- 作成者は自動的に権限を保有
ユーザーが CREATE EXTERNAL CATALOG ... を正常に実行すると、そのCatalogに対する USE CATALOG および SELECT 権限が自動的に付与され、追加の認証は不要です。
例:
-- user1が実行
CREATE EXTERNAL CATALOG odps_dev TYPE = 'ODPS' ...;
-- この時点でuser1はそのCatalogを直接使用できます
SET CATALOG odps_dev;
SELECT * FROM project_db.table1 LIMIT 1;
- Catalog権限 ≠ データアクセス権限
ユーザーが USE CATALOG および SELECT 権限を取得した場合でも、Catalog内のテーブルのクエリが失敗する可能性があります。その理由は以下の通りです:
- Catalog層:Hive Metastoreに接続して(テーブル構造、パーティションなどのメタデータを取得するために使用されます)
- Location層:HDFSなどのファイルシステムに実際に保存されているデータファイルを読み取るために使用されます
これら2つの層の認証方式は別々に設定する必要があり、Hadoopクラスタのセキュリティポリシーと一致させる必要があります。
例:
-- user1にodps_prodのUSE CATALOG権限がある
SET CATALOG hms_prod;
USE sales_db;
-- テーブルのクエリ時に失敗
SELECT * FROM sales_log LIMIT 1;
-- エラーが発生
-- 原因:Locationが作成されていないか、user1にそのLocationへのアクセス権限がない
-- 解決策:認証情報を含むLocationを作成
CREATE LOCATION hms_sales URL = 'hdfs://nn:8020/sales/'
CREDENTIAL (USER = 'username');
HMS CatalogとHDFSストレージの認証メカニズムの詳細については、HMS Catalogを参照してください。
権限検証例
-- 権限付与
GRANT SELECT, USE CATALOG ON CATALOG ca1 TO zhangsan WITH GRANT OPTION;
-- 権限の確認
SHOW GRANTS FOR zhangsan;
出力:
+-------------------------------------------------------------------------+
| Grants for zhangsan@% |
+-------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'zhangsan' |
| GRANT SELECT, USE CATALOG ON CATALOG `ca1` TO 'zhangsan' WITH GRANT OPTION |
+-------------------------------------------------------------------------+
権限クエリビュー
以下のシステムビューを使用して権限を確認できます。
information_schema.USER_PRIVILEGES:ユーザーのグローバル権限oceanbase.DBA_OB_USERS/CDB_OB_USERS:ユーザー関連メタデータ