適用シナリオ
- 典型的なシナリオ
- リアルタイムレポート:OceanBaseのリアルタイム取引データとオフラインワイドテーブルを組み合わせる。
- システム間の連携分析:ユーザー行動ログ(Hive/Iceberg)+ ユーザープロファイルデータ(OceanBase)。
- コアバリュー
- データ移行不要、冗長なストレージと同期遅延を回避します。
- 統一SQLエンジン、開発の複雑さを低減します。
- オンデマンド読み取り、計算およびI/Oコストを節約します。
原理の概要
OceanBaseはV4.4.1バージョンからHMS Catalog機能を正式にサポートしています。本ドキュメントは、ユーザーが事前にOceanBaseデータベースのAP能力を理解し計画するためのものであり、関連する使用方法は既にV4.3.5ドキュメント集で提供されています。
その中核となる原理は以下の通りです:
Catalogメカニズム
- Catalog(データカタログ)はメタデータの論理コンテナであり、各Catalogは外部データソース(例:MaxComputeプロジェクト、Hive Metastore)に対応します。
- OceanBaseは内部にinternal Catalogを備え、ローカルテーブルを管理します。
フェデレーションクエリ(Federated Query)
- クエリエンジンは、Catalog間のテーブル参照(例:
hms_prod.project.table)を認識します。 - メタデータ取得:Catalogを通じてHMSからテーブル構造を取得します。
- データ読み取り:テーブルのLocationが指す基盤ストレージタイプに応じて、対応するアクセスプロトコルと認証方式を採用します。
- HDFSの場合、Kerberos認証をサポートします。
- OSSまたはS3プロトコル互換のオブジェクトストレージの場合、S3AやOSS-HDFSなどの互換ファイルシステムを介してアクセスし、AccessKey / SecretKey(AK/SK)を用いた署名認証を行います。
本チュートリアルの目的
- APシナリオにおいて、OceanBaseがCatalogを通じてETL不要の連携クエリを実現するコア機能を習得する
- HMS Catalogを熟知し、Hive / Icebergデータにアクセスする
環境要件
- OceanBaseバージョン ≥ V4.4.1(HMS Catalogをサポート)
- ネットワーク接続性:
- HMS:OceanBaseノードがHive MetastoreおよびHDFS/S3/OSSにアクセス可能であること。
- 権限の準備:
- Hive:HMS読み取り権限 + HDFSファイル読み取り権限(Location設定を通じて)。詳細については、HMS Catalogを参照してください。
HMS Catalog による Hive/Iceberg テーブルへのアクセス実験手順
前提条件
開始する前に、以下の環境が準備されていることを確認してください:
条件 |
説明 |
|---|---|
| Hive Metastore (HMS)が正常に稼働していること | メタデータサービスを提供するためには、thrift://host:port のようなURI形式が必要です。 |
| 基盤ストレージへのアクセスが可能であること | HDFS、OSS、S3 などのストレージシステムが設定済みであり、OBServerノードに読み取り権限が付与されていること |
| ネットワーク接続性 | OBServerがHMS(デフォルトポート9083またはカスタムポート)および基盤ストレージにアクセスできること |
| OceanBaseがデプロイ済みでJavaサポートが有効になっていること (オプション) | HDFSにアクセスする必要がある場合は、事前に OceanBaseデータベースJAVA SDK環境のデプロイ を行ってください。 |
説明
HMSでKerberos認証が有効な場合は、KERBEROS_PRINCIPALとKEYTABパラメータを追加で指定する必要があります。
HMS Catalog内のデータディレクトリ名をhive_metaと仮定します。hive_meta catalog内のtest_databaseデータベースには、test_tableという名前のテーブルがあり、そのテーブルデータは以下のとおりです:
+------------+--------+---------+--------+------------+
| product_id | amount | country | region | event_date |
+------------+--------+---------+--------+------------+
| 1001 | 2500 | CN | East | 2023-10-01 |
| 1003 | 1800 | JP | Kanto | 2023-10-03 |
| 1002 | 3500 | US | West | 2023-10-02 |
+------------+--------+---------+--------+------------+
ここでHMS Catalog内のテーブル構造を示すのは、後続の手順での検証結果をより明確にするためです。実際のアプリケーションシナリオでテーブル構造が不明な場合は、SHOW CREATE TABLE ${catalog_name}.${hive_db_name}.${table_name}; を実行してテーブル作成ステートメントを確認してください。
ステップ1:OceanBaseにHMS Catalogを作成する
-- 外部Catalogを作成
CREATE EXTERNAL CATALOG hive_meta
PROPERTIES (
TYPE = 'HMS',
URI = 'thrift://xx.xx.xx.xx:9083' -- 実際の設定に応じてURIを入力してください
);
-- 作成が成功したか確認
SHOW CATALOGS;
HMSがKerberos認証を使用している場合は、KERBEROS_PRINCIPALとKEYTABを追加で設定する必要があります。
表示結果は次のとおりです:
+-----------+
| Catalog |
+-----------+
| hive_meta |
| internal |
+-----------+
ステップ2:OceanBase Internal Catalogにリアルタイム注文テーブルを準備する
このステップは、OceanBaseのInternal Catalogで実行します。
データベースとテーブルの作成
-- Internal Catalogに切り替える(デフォルト)
SET CATALOG internal;
-- 新しいデータベースを作成する(オプション。既存のデータベースを使用しても構いません)
CREATE DATABASE IF NOT EXISTS federated_demo;
USE federated_demo;
-- Internalテーブルを作成する
CREATE TABLE test_table_internal (
product_id INT,
amount DOUBLE,
country VARCHAR(10),
region VARCHAR(20),
event_date DATE
);
テストデータの挿入
INSERT INTO test_table_internal VALUES
(1004, 4200, 'DE', 'Berlin', '2023-10-04'),
(1005, 1900, 'FR', 'Paris', '2023-10-05'),
(1001, 3000, 'CN', 'South', '2023-10-06'); -- Hiveテーブルとproduct_idが重複している
-- 検証
SELECT * FROM test_table_internal;
OceanBaseで以下のSQLを実行してデータを検証します:
-- Internalテーブルのクエリ
SELECT * FROM sales_data_internal;
-- 出力:
+------------+--------+---------+--------+------------+
| product_id | amount | country | region | event_date |
+------------+--------+---------+--------+------------+
| 1004 | 4200 | DE | Berlin | 2023-10-04 |
| 1005 | 1900 | FR | Paris | 2023-10-05 |
| 1001 | 3000 | CN | South | 2023-10-06 |
+------------+--------+---------+--------+------------+
3 rows in set
-- OceanBaseで以下のステートメントを実行し、現在設定されているHMS Catalog下のテーブルをクエリする(正常にアクセスできることを確認する)
SELECT * FROM hive_meta.test_database.test_table;
-- 出力:
+------------+--------+---------+--------+------------+
| product_id | amount | country | region | event_date |
+------------+--------+---------+--------+------------+
| 1001 | 2500 | CN | East | 2023-10-01 |
| 1003 | 1800 | JP | Kanto | 2023-10-03 |
| 1002 | 3500 | US | West | 2023-10-02 |
+------------+--------+---------+--------+------------+
3 rows in set
ステップ3:フェデレーションクエリ(internalとHiveの結合)
シナリオ1:すべての販売データをマージする
SELECT
product_id,
amount,
country,
region,
event_date,
'internal' AS data_source
FROM federated_demo.test_table_internal
UNION ALL
SELECT
product_id,
amount,
country,
region,
STR_TO_DATE(event_date, '%Y-%m-%d') AS event_date, -- Hiveのevent_dateはstring型なので、DATE型に変換する
'hive' AS data_source
FROM hive_meta.test_database.test_table
ORDER BY event_date;
注意
Hiveテーブルのevent_dateはstring型なので、STR_TO_DATE()を使用してDATE型に変換し、型の一致を保証する必要があります。
+------------+--------+---------+--------+------------+-------------+
| product_id | amount | country | region | event_date | data_source |
+------------+--------+---------+--------+------------+-------------+
| 1001 | 2500 | CN | East | 2023-10-01 | hive |
| 1002 | 3500 | US | West | 2023-10-02 | hive |
| 1003 | 1800 | JP | Kanto | 2023-10-03 | hive |
| 1004 | 4200 | DE | Berlin | 2023-10-04 | internal |
| 1005 | 1900 | FR | Paris | 2023-10-05 | internal |
| 1001 | 3000 | CN | South | 2023-10-06 | internal |
+------------+--------+---------+--------+------------+-------------+
6 rows in set
シナリオ2:国別に総売上高を集計する(クロスソース集計)
SELECT
country,
SUM(amount) AS total_sales,
COUNT(*) AS record_count
FROM (
SELECT product_id, amount, country, region, event_date
FROM federated_demo.test_table_internal
UNION ALL
SELECT product_id, amount, country, region, event_date
FROM hive_meta.test_database.test_table
) AS all_sales
GROUP BY country
ORDER BY total_sales DESC;
期待される出力:
+---------+-------------+--------------+
| country | total_sales | record_count |
+---------+-------------+--------------+
| US | 3500 | 1 |
| CN | 5500 | 2 | -- 2500 (Hive) + 3000 (Internal)
| DE | 4200 | 1 |
| FR | 1900 | 1 |
| JP | 1800 | 1 |
+---------+-------------+--------------+
シナリオ3:internalにのみ存在する製品を特定する
SELECT i.product_id, i.country
FROM federated_demo.test_table_internal i
LEFT JOIN hive_meta.test_database.test_table h
ON i.product_id = h.product_id
WHERE h.product_id IS NULL;
出力:
+------------+---------+
| product_id | country |
+------------+---------+
| 1004 | DE |
| 1005 | FR |
+------------+---------+
フェデレーション集計
-- フェデレーション集計
SELECT country, SUM(amount) AS total
FROM (
SELECT product_id, amount, country FROM federated_demo.test_table_internal
UNION ALL
SELECT product_id, amount, country FROM hive_meta.test_database.test_table
) t
GROUP BY country;
期待される出力結果は次のとおりです:
+---------+-------+
| country | total |
+---------+-------+
| DE | 4200 |
| FR | 1900 |
| CN | 5500 |
| JP | 1800 |
| US | 3500 |
+---------+-------+
5 rows in set