本記事では、SQLステートメントを使用してExternal Catalogを作成する方法について説明します。
権限要件
External Catalogを作成するには、現在のユーザーがCREATE CATALOG権限を持っている必要があります。OceanBaseデータベースの権限の詳細については、MySQLモードの権限分類を参照してください。
構文
External Catalogを作成するSQLステートメントの形式は次のとおりです:
CREATE EXTERNAL CATALOG [IF NOT EXISTS] external_catalog_name
PROPERTIES [=] (properties_type_options);
properties_type_options:
odps_type_list
| hms_type_list
odps_type_list:
TYPE = 'ODPS',
[ACCESSTYPE = 'accesstype_string',]
ACCESSID = 'string',
ACCESSKEY = 'string',
STSTOKEN = 'string',
ENDPOINT = 'string',
TUNNEL_ENDPOINT = 'string',
PROJECT_NAME = 'string',
[QUOTA_NAME = 'string',]
[COMPRESSION = 'compression_string',]
REGION = 'string'
hms_type_list:
TYPE = 'HMS',
URI = "string"
[, KRB5CONF = "string"]
[, KEYTAB = "string"]
[, PRINCIPAL = "string"]
[, MAX_CLIENT_POOL_SIZE = 20]
[, SOCKET_TIMEOUT = 10000000]
accesstype_string:
aliyun
| sts
| app
compression_string:
zlib
| zstd
| lz4
| odps_lz4
パラメータ説明:
IF NOT EXISTS:オプションです。この句を指定すると、作成しようとする外部データカタログが現在のテナント内に既に存在してもエラーは報告されず、システムはWarningメッセージを表示します。指定しない場合はエラーが報告されます。external_catalog_name:作成する外部データカタログの名前を表します。PROPERTIES [=] (properties_type_options):外部データカタログタイプの関連プロパティオプションを指定するために使用されます。odps_type_list:ODPSタイプの外部データカタログ(ODPS Catalog)の関連プロパティリストを表します。hms_type_list:HMSタイプの外部データカタログ(HMS Catalog)の関連プロパティリストを表します。
External Catalog作成構文の詳細なパラメータ説明については、CREATE EXTERNAL CATALOGを参照してください。
ODPSタイプのExternal Catalogを作成する
外部テーブルがMaxComputeデータを読み書きする際、値はODPSとなります。
CREATE EXTERNAL CATALOGを使用してMaxCompute(ODPS)への接続を作成し、マッピングテーブルを手動で作成することなく、ODPSテーブルデータの直接クエリと書き込みを実現します。
例:
obclient> CREATE EXTERNAL CATALOG test_odps_catalog
PROPERTIES = (
TYPE = 'ODPS',
ACCESSID = '$odps_accessid',
ACCESSKEY = '$odps_accesskey',
ENDPOINT = '$odps_endpoint',
TUNNEL_ENDPOINT = 'http://xxx.maxcompute.aliyun.com',
PROJECT_NAME = 'mysqltest_regression_sqlqa',
QUOTA_NAME = '',
COMPRESSION_CODE = ''
);
HMSタイプのExternal Catalogを作成する
OceanBaseデータベースは、HMS Catalog機能により、Hiveメタデータ(Metastore)の統一管理を実現します。HMS Catalogを通じて、OceanBaseはHiveテーブルに対応するHDFSストレージパス内のデータに直接アクセスでき、効率的なデータレイクのクエリと分析をサポートします。
注意
HMS Catalogを作成する前に、HMSが基盤ストレージのファイルデータにアクセスする予定がHDFS上にある場合は、Java SDK環境のデプロイが完了している必要があります。JAVA SDK環境の設定に関する詳細は、OceanBaseデータベースJAVA SDK環境のデプロイを参照してください。
HMS Catalogのサポート状況
現在のバージョンのHMS Catalogは、HiveとIcebergの2種類のテーブル形式をサポートしており、HiveとIcebergの統計情報の読み取りとSQLプランの最適化をサポートしています。
Hive形式のサポート状況
現在のバージョンでは、Parquet、ORC、Textfile、OpenCSV の4種類の形式をサポートしています。
説明
複合型では、現在のバージョンでは Parquet 形式の ARRAY 型のみをサポートしています。
Icebergのサポート状況
現在のバージョンでは、Iceberg V1とV2の2つのバージョンをサポートしています。
OceanBaseデータベースは、Schema EvolutionとPartition Transformを経たIcebergテーブルの読み取りをサポートしています。
Hiveバージョンのサポート
OceanBaseは現在、以下のHiveバージョンのHMS Catalogをサポートしています:
- Hive 1.2.x
- Hive 2.3.x
- Hive 3.1.x
- Hive 4.x
認証タイプのサポート
OceanBaseデータベースは、以下の2種類のHMS Catalog認証方式をサポートしています:
認証タイプ |
説明 |
設定要件 |
|---|---|---|
| SIMPLE | ユーザー名とパスワードによるシンプルな認証(デフォルト)。 | PROPERTIES 句では、KRB5CONF、KEYTAB、PRINCIPAL パラメータを指定する必要はありません。 |
| KERBEROS | Kerberosプロトコルに基づく強力な認証(エンタープライズレベルのセキュリティ環境に適しています)。 | PROPERTIES 句で KRB5CONF、KEYTAB、PRINCIPAL パラメータを指定する必要があります。 |
例:
SIMPLE認証のHMS Catalogを作成します。通常認証モードで、Location認証の設定は不要です。
obclient> CREATE EXTERNAL CATALOG test_hms_catalog PROPERTIES = ( TYPE = 'HMS', URI = "thrift://xxx.xxx.xxx.xxx:xxxx" );Kerberos認証のHMS Catalogを作成します。
obclient> CREATE EXTERNAL CATALOG test_hms_catalog_kerberos PROPERTIES = ( TYPE = 'HMS', URI = "thrift://xxx.xxx.xxx.xxx:xxxx", PRINCIPAL = "hive/xxx@xxx.COM", KEYTAB = "/xxx/xxx/xxx/hadoop.keytab", KRB5CONF = "/etc/xxx.conf" );
Location認証
OceanBaseデータベースHMS Catalogは、External Locationを通じてキーの管理をサポートし、外部ストレージへの安全なアクセスを実現します。HMS内のテーブルにアクセスする際、システムはテーブルパスに基づいて対応するExternal Locationを自動的にマッチングします。マッチングに成功した場合、そのキーを用いて認証アクセスが行われます。
Location認証のシナリオ
ストレージタイプとセキュリティ要件に基づき、Location認証は以下のシナリオに分類されます。
ストレージタイプ |
認証方式 |
|---|---|
| OSS | AK/SK認証。 |
| HDFS | HDFSには以下の認証方式があります:
|
手順
Location認証シナリオを決定します。
ストレージタイプとセキュリティ要件に基づいて、対応する認証シナリオを選択します。
Locationオブジェクトを作成します。
CREATE LOCATIONステートメントを使用して、対応するシナリオのLocationオブジェクトを作成します。Locationの作成方法の詳細については、CREATE LOCATIONを参照してください。Catalogを関連付けます。
Catalogを作成する際に追加の設定は不要で、システムは対応するテーブルのストレージパスに基づいて自動的にLocationをマッチングします。
Location認証シナリオの設定例
OSSストレージ認証
Alibaba Cloud OSSオブジェクトストレージアクセス用のLocationオブジェクトを作成します。
CREATE LOCATION oss_credential
URL = 'oss://bucket-name/path'
CREDENTIAL = (
ACCESSID = 'your-access-key-id'
ACCESSKEY = 'your-access-key-secret'
HOST = 'oss-region.aliyuncs.com'
);
HDFSストレージ認証
シナリオ1:無認証モード。
Locationを作成する必要はありません。HDFSクラスタでKerberos認証が有効になっていない(
hadoop.security.authentication=simpleの場合)開発またはテスト環境に適しています。シナリオ2:ユーザー認証モード。
Kerberosは不要ですが、特定のHDFSユーザーとしてアクセスする必要があります。
説明
Kerberos権限認証が有効になっていないクラスタに適用されますが、関連するHDFSパスには特定のユーザーでのアクセスが必要なシナリオです。
Locationの作成:HDFSユーザーを指定します。
CREATE LOCATION hdfs_user01 URL = 'hdfs://namenode:8020/' CREDENTIAL ( USER = 'hdfs_user_name' );シナリオ3:Kerberosを有効にし、HDFSを単一NameNode(非HAモード)に設定します。
説明
CONFIGS内のdfs.data.transfer.protectionは、HDFSクラスタの設定と一致させる必要があります。Locationの作成:Kerberos認証 + 単一ポイントHDFS。
CREATE LOCATION hdfs_kerberos_single URL = 'hdfs://namenode.example.com:8020/' CREDENTIAL ( PRINCIPAL = "hdfs/xxx@xxx.COM", KEYTAB = "/data/hdfs.keytab", KRB5CONF = "/data/krb5.conf", CONFIGS = 'dfs.data.transfer.protection=integrity' );シナリオ4:Kerberosを有効にし、HDFSを高可用性(HA)モードに設定します。
CREATE LOCATION hdfs_kerberos_ha URL = 'hdfs://${nameservice id}' CREDENTIAL ( PRINCIPAL = "hdfs/xxx@xxx.COM", KEYTAB = "/etc/ob/hdfs.keytab", KRB5CONF = "/etc/krb5.conf", CONFIGS = 'dfs.data.transfer.protection=${string}#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' );シナリオ5:Kerberosは有効にされていませんが、HDFSは高可用性(HA)モードに設定されています。
説明
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' );