OceanBaseはV4.4.1バージョンからHMS(Hive Metastore)を介した接続とHMSカタログの作成をサポートしており、これによりHive Metastoreが管理するテーブルへの一貫したアクセスが可能になりました。これには従来のHiveテーブルだけでなく、Iceberg形式で保存されているもののメタデータがHive Metastoreに登録されているテーブルも含まれます。ユーザーはデータ移行なしで、Hadoopエコシステム内でHMSが管理するデータを直接照会できるため、データレイクのクエリ高速化シナリオに適しています。
- メタデータ管理の統合:Hive Metastoreによるテーブル構造の自動同期。
- フェデレーテッドクエリ:OceanBase内部テーブルとのJOIN分析。
- 読み取り専用の安全性:誤操作によるソースデータの変更を防ぐ。
OceanBaseはV4.4.1バージョンから公式にHMSカタログ機能をサポートしています。本ドキュメントは、ユーザーがOceanBaseデータベースのAP能力を事前に理解し計画できるよう、V4.3.5ドキュメント集で関連する使用方法を提供しています。
サポート機能
読み取り専用アクセス:すべてのHMS Catalog下のオブジェクトは読み取り専用であり、現時点では
INSERT、UPDATE、DROP TABLEなどのDML/DDL操作を実行することはサポートされていません。対応テーブルタイプ:
Hiveテーブル:ORC、Parquet、TextFile、CSV。
- 複合型については、現バージョンではParquet形式のARRAY型のみがサポートされています。
- ARRAY型の詳細については、配列要素型の概要を参照してください。
Icebergテーブル:V1 / V2バージョン、Parquet形式を推奨します。
高度な機能:
- Iceberg Schema Evolution(列の追加・削除)
- Iceberg Partition Transform(bucket()、year()などのパーティション式)
Hiveバージョンの互換性
- サポートバージョン:Hive 1.2.x、Hive 2.3.x、Hive 3.1.x、Hive 4.x。
- 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などの計算エンジンによって作成・書き込まれ、同時にIcebergメタデータはHive Metastoreに登録されます。OceanBaseはHMS内のこれらのメタデータ情報に依存してIcebergテーブルを識別し読み取ります。
したがって、IcebergテーブルのメタデータがHive Metastoreに正しく登録されていれば(どのエンジンによって書き込まれた場合でも)、OceanBaseからアクセス可能です。
使用前提
環境依存性:基盤ストレージがHDFSの場合、事前にJava SDK環境をデプロイする必要があります。 詳細については、OceanBase JAVA SDK環境のデプロイを参照してください。
権限要件
HMSサービス:OceanBaseクラスタはHive Metastore(Thriftプロトコル)にアクセスできる必要があります。 HMSサービスのアドレスとポートは、お客様の運用チームが提供する必要があります。オープンソースHiveはデフォルトでポート9083を使用しますが、実際のデプロイでは異なる場合があるため、現場の設定に従ってください。
ストレージシステム:すべてのOBServerノードはHDFS/S3/OSSに対して読み取り可能です。
HMSカタログの作成構文
CREATE EXTERNAL CATALOG [IF NOT EXISTS] catalog_name
PROPERTIES (
TYPE = 'HMS',
URI = 'thrift://host:port',
[PRINCIPAL = '...'],
[KEYTAB = '...'],
[KRB5CONF = '...'],
[MAX_CLIENT_POOL_SIZE = 20],
[SOCKET_TIMEOUT = 10000000]
);
パラメータの説明
| パラメータ | 必須 | 説明 |
|---|---|---|
| TYPE | 必須 | 固定値は 'HMS' |
| URI | 必須 | HMS Thriftアドレス。形式:thrift://$host:$port
"thrift://<HMS IPアドレス1>:<HMSポート番号1>,thrift://<HMS IPアドレス2>:<HMSポート番号2>,thrift://<HMS IPアドレス3>:<HMSポート番号3>"。 |
| PRINCIPAL | オプション | Kerberos主体(通常は service/HOST@REGION.com の形式で存在し、例えば hive/hadoop@QA.COM などです)。 |
| KEYTAB | オプション | Kerberos認証を有効にしたHMSサービスへのアクセス時に必要なKEYTABキーファイルのパスを指定します。OceanBaseクラスタが分散デプロイされている場合、関連するOBServerに対応するマシンのすべてのノードにおいて、該当するパスにこのファイルが存在する必要があります。注記:KEYTABパラメータは、HMSでKerberos認証が有効になっている場合にのみ設定する必要があります。 |
| KRB5CONF | オプション | Kerberos設定ファイルのパス(例えば /etc/krb5.conf)。OceanBaseクラスタが分散デプロイされている場合、関連するOBServerに対応するマシンのすべてのノードにおいて、該当するパスにこのファイルが存在する必要があります。 |
| MAX_CLIENT_POOL_SIZE | オプション | HMSクライアント接続プールのサイズ(デフォルトは20で、現在のHMS Catalogで最大20個のHMSサービスに接続するクライアントを起動できることを意味します)。 |
| SOCKET_TIMEOUT | オプション | Hive metastoreへの接続タイムアウト時間(マイクロ秒。デフォルトは10000000(10秒)) |
SIMPLE認証のHMS Catalogを作成する
通常の認証モードでは、Location認証を設定する必要はありません。
obclient> CREATE EXTERNAL CATALOG test_hms_catalog
PROPERTIES = (
TYPE = 'HMS',
URI = "thrift://xxx.xxx.xxx.xxx:xxxx"
);
Hadoop認証モードの詳細については、以下の「HMS CatalogとHDFSストレージの認証メカニズム」セクションを参照してください。
Kerberos認証のHMS Catalogを作成する
Hadoop認証モードの詳細については、以下の「HMS CatalogとHDFSストレージの認証メカニズム」のセクションを参照してください。
ステップ1:Kerberos認証のHMS Catalog(メタデータ層)を作成する
CREATE EXTERNAL CATALOG hms_kerberos
PROPERTIES (
TYPE = 'HMS',
URI = 'thrift://hms.example.com:9083',
PRINCIPAL = 'hive/hms.example.com@EXAMPLE.COM',
KEYTAB = '/etc/ob/hive.keytab',
KRB5CONF = '/etc/krb5.conf'
);
ステップ2:Kerberos認証のHDFS Location(データ層)を作成する
CREATE LOCATION hdfs_kerberos_ha
URL = 'hdfs://namenode:8020/'
CREDENTIAL (
PRINCIPAL = "ob_hdfs@EXAMPLE.COM",
KEYTAB = "/etc/ob/hdfs.keytab",
KRB5CONF = "/etc/krb5.conf",
CONFIGS = '...' -- 上記HA設定と同じ
);
HMS Catalogはテーブル構造を正常に検出でき、LocationはHDFSデータファイルを安全に読み取ることができます。
カタログの切り替え
SET CATALOG hms_catalog;
Catalogを使用した外部データソースのクエリ
-- Hiveテーブル
SELECT city, COUNT(*) FROM hive_db.customer WHERE dt >= '2025-04-01' GROUP BY city;
-- Icebergテーブル
SELECT product_id, SUM(sales) FROM iceberg_db.sales_iceberg WHERE event_time >= '2025-04-01' GROUP BY product_id;
-- フェデレーテッドクエリ
SELECT o.order_id, h.city
FROM internal.test_db.orders o
JOIN hms_catalog.hive_db.customer h ON o.user_id = h.id;
HMSカタログとHDFSストレージの認証メカニズム
OceanBaseでは、Hive Metastore(HMS)へのアクセスには、2つの独立した認証層が関与します:
カタログ層:Hive Metastoreに接続し(テーブル構造、パーティションなどのメタデータを取得するために使用されます)。
ロケーション層:HDFSなどのファイルシステムに実際に保存されているデータファイルを読み取るために使用されます。
これら2つの認証方式はそれぞれ個別に設定する必要があり、Hadoopクラスタのセキュリティポリシーと整合させる必要があります。
Hadoop認証モードはサーバー側が決定する
Hadoopクラスタは、hdfs-site.xml 内の構成パラメータ hadoop.security.authentication を使用してセキュリティモードを定義します。
<property>
<name>hadoop.security.authentication</name>
<value>kerberos</value> <!-- または simple -->
</property>
kerberos:Kerberos認証を有効にし、すべてのクライアント(HMS ClientおよびHDFS Clientを含む)はKerberos認証を通過する必要があります。simple:Hadoopサーバーはクライアントが宣言したOSユーザー名を信頼し、パスワードや資格情報の検証は行いません。権限制御はHDFSファイル/ディレクトリの所有者、グループ、およびPOSIX権限(例:drwxr-xr-x(755))に基づいており、Kerberos認証は不要です。
注意
この設定はHadoopサーバー側($HADOOP_HOME/etc/hadoop/hdfs-site.xml)にあります。OceanBaseはこのファイルを直接読み取ることなく、独自のCatalogおよびLocation設定を通じてこのモードに適応します。
OceanBaseの認証設定方法
| Hadoopモード | HMSカタログ設定 | HDFSロケーション設定 |
|---|---|---|
| SIMPLE | カタログ作成時に認証方式を指定しない場合(デフォルトはSIMPLE) |
|
| KERBEROS | カタログ作成時に AUTHENTICATION = 'KERBEROS' を指定し、PRINCIPAL、KEYTAB、KRB5CONF を提供します。 |
Kerberos認証のHDFS Locationを作成する必要があり、同様にPrincipal、Keytab、krb5.confを提供する必要があります。 |
重要な設定ルール:HMSまたはHDFSのいずれか一方でKerberosが有効になっている場合は、デプロイが正しく行われているか確認してください。
2種類の認証モードの詳細解説
SIMPLEモード(開発/テスト環境で一般的)
適用シナリオ:
HDFSでKerberosが有効にされておらず、Linuxのファイル権限制御のみに依存している場合。
テーブルが特定のユーザーによって書き込まれる場合(例えば、ImpalaによってHDFSパスに書き込まれる場合、そのパスの所有者はimpalaとなります。また、Hive on Tezでは、作業を送信したユーザーが所有者となり、例えばhiveとなります)。
構成要件:
匿名読み取り可能なパス:HDFSディレクトリの権限が開放されている(例えばdrwxr-xr-x (755))場合、任意のユーザーが読み取り可能 → Locationを作成する必要はありません。
制限されたパス:OceanBase Observerプロセスのユーザー(例えばadmin)がディレクトリの認可ユーザー/グループに含まれていない場合、次のことが必要です:
Locationを作成し、権限を持つユーザーを指定します:
CREATE LOCATION my_loc URI = 'hdfs://mycluster/' CREDENTIAL = (USER = 'username');
シナリオ1:Kerberos不要かつHDFSユーザーの指定も不要(デフォルトは匿名)
適用:HDFSクラスタでKerberos認証が有効にされていない(つまりhadoop.security.authentication=simple)開発またはテスト環境に適用されます。
操作:Locationを作成する必要はありません。
シナリオ2:Kerberosは不要だが、HDFSユーザーを指定する必要がある
適用:HDFSクラスタでKerberos認証が有効にされていない(つまり
hadoop.security.authentication=simple)開発またはテスト環境に適用されますが、ターゲットHiveテーブルのデータファイルは権限が制限されたHDFSパスに保存されています(例えば、Impala、Hive、または他のエンジンによって書き込まれ、パスの所有者が特定のユーザーであり、グローバルな読み取り権限が開放されていない場合)。典型的なケース:
- テーブルがImpalaによってHDFSパスに書き込まれ、そのパスの所有者がimpalaとなります。
- テーブルがHiveジョブの送信ユーザーによって書き込まれる場合 → 所有者はhive、etl_userなどになる可能性があります。
- OceanBase ObserverはデフォルトでOSユーザー(例えばadmin)としてHDFSにアクセスします。このユーザーに読み取り権限がない場合、クエリは失敗します。
例:あるHiveテーブルがImpalaによって書き込まれ、そのHDFSパスが
hdfs://namenode:8020/warehouse/sales.db/click_logであると仮定します。
CREATE LOCATION hdfs_impala_data
URL = 'hdfs://namenode:8020/' -- URL、以下の説明を参照
CREDENTIAL (
USERNAME = 'username' -- HDFSへのアクセスユーザー名を指定
);
正しいURLを決定する方法:
Hive CLIまたはBeelineで実行します:
SHOW CREATE TABLE your_db.your_table;出力内のLOCATIONフィールドを確認します。例:
LOCATION 'hdfs://namenode:8020/warehouse/your_db.db/your_table'プロトコル + サービス名/ホスト名 + サービスポートをURLとして抽出します。つまり、CREATE LOCATIONのURLに
hdfs://namenode:8020/と入力します。
シナリオ3:Kerberosが有効にされておらず、HDFSが高可用性(HA)である場合
操作:PRINCIPAL、KEYTAB、およびKRB5CONFパラメータを設定する必要はありません。
CREATE LOCATION hdfs_location_ha
URL = 'hdfs://${nameservice_id}' -- ロジックサービス名の使用を推奨
CREDENTIAL (
CONFIGS = 'dfs.nameservices=${nameservice id}#dfs.ha.namenodes.${nameservice id}=${namenode1}, ${namenode2}#dfs.namenode.rpc-address.${nameservice id}.${namenode1}=${namenode 1 address}#dfs.namenode.rpc-address.${nameservice id}.${namenode2}=${namenode 2 address}#dfs.ha.automatic-failover.enabled.${nameservice id}=true#dfs.client.failover.proxy.provider.${nameservice id}=org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider'
);
KERBEROSモード(本番環境の標準)
適用シナリオ:
- エンタープライズ向けHadoopクラスタで、HMSまたはHDFSにKerberosセキュリティ認証を有効にする場合。
構成要件:
HMS Catalog:
CREATE EXTERNAL CATALOG hms_krb PROPERTIES ( 'type' = 'hms', 'hive.metastore.uris' = 'thrift://metastore:9083', 'authentication' = 'KERBEROS', 'kerberos.principal' = 'ob@REALM', 'kerberos.keytab' = '/path/to/ob.keytab', 'kerberos.krb5.conf' = '/etc/krb5.conf' );HDFS Location:
CREATE LOCATION hdfs_krb_loc URI = 'hdfs://nn:8020', CREDENTIAL = ( KERBEROS = ( PRINCIPAL = 'ob@REALM', KEYTAB = '/path/to/ob.keytab', KRB5CONF = '/etc/krb5.conf' ) );
シナリオ4:Kerberosを有効にし、HDFSが単一のNameNode(非HAモード)の場合
-- LOCATIONの作成:Kerberos認証 + ポイントツーポイントHDFS
CREATE LOCATION hdfs_kerberos_single
URL = 'hdfs://namenode.example.com:8020/' -- SHOW CREATE TABLEを実行してテーブルの完全なHDFSパスを取得し、ルートURLを抽出してください。
CREDENTIAL (
PRINCIPAL = "hdfs/TEST@EXAMPLE.COM",
KEYTAB = "/data/hdfs.keytab",
KRB5CONF = "/data/krb5.conf",
CONFIGS = 'dfs.data.transfer.protection=integrity'
);
説明
CONFIGSのdfs.data.transfer.protectionパラメータは、HDFSデータ転送チャネルのセキュリティレベル(authentication、integrity、privacy、またはnullなど)を指定します。
- この値は、Hadoopクラスタの
hdfs-site.xmlで設定されているdfs.data.transfer.protectionと完全に一致していなければなりません。そうでない場合、読み取り時にセキュリティポリシーの不一致により失敗する可能性があります。
- この構成パラメータの実際の値は、Hadoop管理者から確認するか、HDFSクラスタの
hdfs-site.xmlファイルを直接参照することを推奨します。
シナリオ5:Kerberosを有効にし、HDFSが高可用性(HA)の場合
CREATE LOCATION hdfs_kerberos_ha
URL = 'hdfs://${nameservice id}' -- ロジックサービス名の使用を推奨
CREDENTIAL (
PRINCIPAL = "ob_hdfs@EXAMPLE.COM",
KEYTAB = "/etc/ob/hdfs.keytab",
KRB5CONF = "/etc/krb5.conf",
CONFIGS = 'dfs.data.transfer.protection=integrity#dfs.nameservices=mycluster#dfs.ha.namenodes.mycluster=nn1,nn2#dfs.namenode.rpc-address.mycluster.nn1=nn1:8020#dfs.namenode.rpc-address.mycluster.nn2=nn2:8020#dfs.client.failover.proxy.provider.mycluster=org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider'
);
説明
- すべてのOBServerノードに同じkeytabとkrb5.confをデプロイする必要があります。
- "Unknown Host"エラーが発生した場合は、/etc/hostsにHDFSノードのマッピングを追加してください。
Locationパラメータの設定の詳細については、Create Locationを参照してください。
設定の説明と注意点
- 認証分離:Catalog(メタデータ)とLocation(データ)の認証は独立して設定します。
- モードの整合性:OceanBaseの認証方式は、Hadoopクラスタの
hadoop.security.authentication設定と一致している必要があります。 - Kerberosの強制的な整合性:HMSまたはHDFSのいずれか一方でKerberosが有効になっている場合、両方でKerberos資格情報を設定する必要があります。
- SIMPLEモードでは権限に注意:Observerユーザーまたは指定されたUSERがHDFSパスに対する読み取り権限を持っていることを確認してください。