適用シナリオ
- 典型的シナリオ
- リアルタイムレポート:OceanBaseのリアルタイム取引データとオフラインのワイドテーブルを組み合わせます。
- システム間の統合分析:ユーザー行動ログ(Hive/Iceberg)とユーザープロファイルデータ(OceanBase)。
- 核心的な価値
- データ移行なしで、冗長ストレージと同期遅延を回避します。
- 統一されたSQLエンジンで、開発の複雑さを軽減します。
- オンデマンド読み取りで、計算とI/Oコストを節約します。
概要
OceanBase V4.4.1以降では、HMS Catalogがサポートされています。OceanBaseデータベースのAP機能を早期に理解し、事前に計画できるよう、本マニュアル(V4.3.5)では参考として使用方法を説明しています。
その基本的な仕組みは以下のとおりです:
カタログメカニズム
- カタログ(データディレクトリ)はメタデータの論理コンテナであり、各カタログは外部データソース(例:MaxComputeプロジェクト、Hive Metastore)に対応します。
- OceanBaseは内部カタログを持っており、ローカルテーブルを管理します。
フェデレーテッドクエリ(Federated Query)
- クエリエンジンは、カタログ間のテーブル参照(例:
hms_prod.project.table)を識別します。 - メタデータの取得:カタログを通じてHMSからテーブル構造を取得します。
- データの読み取り:テーブルのLocationに指定された下層ストレージタイプに応じて、対応するアクセスプロトコルと認証方式を使用します。
- HDFSの場合は、Kerberos認証をサポートしています。
- OSSまたはS3プロトコル互換のオブジェクトストレージの場合は、互換性のあるファイルシステム(例:S3A、OSS-HDFS)を使用してアクセスし、AccessKey / SecretKey(AK/SK)による署名認証を行います。
このチュートリアルの目標
- OceanBaseがAPシナリオにおいて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がHive / Icebergテーブルにアクセスするための実験手順
前提条件
開始する前に、以下の環境が整っていることを確認してください。
| 条件 | 説明 |
|---|---|
| Hive Metastore (HMS) が正常に動作している | メタデータサービスを提供し、URI形式はthrift://host:portのようになります。 |
| 基盤となるストレージにアクセス権限がある | 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の内部Catalogで実行します。
データベースとテーブルの作成
-- internal catalogに切り替えます(デフォルト)
SET CATALOG internal;
-- 新しいデータベースを作成します(オプション。既存のデータベースを使用することもできます)
CREATE DATABASE IF NOT EXISTS federated_demo;
USE federated_demo;
-- 内部テーブルを作成します
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:フェデレーテッドクエリ(内部 + 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