OSS Tables は、Apache Iceberg REST Catalog プロトコルと互換性があります。Trino のネイティブ S3 ファイルシステム (fs.native-s3) を使用して OSS Tables に接続し、標準 SQL を使用してテーブルバケット内のデータをクエリおよび書き込みできます。この方法では、oss:// プロトコルをサポートするために Trino のソースコードに軽微な変更を加える必要があり、ビルド環境を制御できるシナリオに適しています。
Trino コミュニティは、oss:// ファイルシステムプロトコルをネイティブにサポートしていません。Trino を使用して OSS テーブルにアクセスするには、Trino のソースコードを修正し、2 つのモジュールを再コンパイルする必要があります。その後、Trino 環境の元の JAR パッケージを新しくコンパイルされたものに置き換え、サービスを再起動する必要があります。
ステップ 1: Trino のソースコードを変更する
OSS テーブルは、oss:// がプレフィックスとして付いたデータパスを返しますが、Trino のネイティブ S3 ファイルシステムは s3://、s3a://、および s3n:// スキームしか認識しません。以下の 2 つのモジュールに oss スキームを登録する必要があります。
trino-filesystem-s3 の変更
S3 ロケーション検証ロジックを特定し、許可されたスキームのセットに oss を追加します。
// 変更前
checkArgument(Set.of("s3", "s3a", "s3n").contains(location.scheme().get()), "Wrong scheme for S3 location: %s", location);
// 変更後
checkArgument(Set.of("s3", "s3a", "s3n", "oss").contains(location.scheme().get()), "Wrong scheme for S3 location: %s", location);trino-filesystem-manager の変更
ファイルシステムファクトリのバインディングに、oss スキーム用のバインディングを追加します:
factories.addBinding("s3").to(Key.get(TrinoFileSystemFactory.class, FileSystemS3.class));
factories.addBinding("s3a").to(Key.get(TrinoFileSystemFactory.class, FileSystemS3.class));
factories.addBinding("s3n").to(Key.get(TrinoFileSystemFactory.class, FileSystemS3.class));
// 既存の s3/s3a/s3n バインディングの後に、次の行を追加します。
factories.addBinding("oss").to(Key.get(TrinoFileSystemFactory.class, FileSystemS3.class));JAR パッケージのビルドと置換
2 つのモジュールをビルドした後、Trino のデプロイメントディレクトリ内にある元の JAR パッケージを新しいパッケージに置き換え、Trino サービスを再起動します。
# trino-filesystem-s3 をビルドします
mvn -pl lib/trino-filesystem-s3 -am package -DskipTests
# trino-filesystem-manager をビルドします
mvn -pl lib/trino-filesystem-manager -am package -DskipTests
# JAR パッケージを置き換えます (Trino が /opt/trino にインストールされていると仮定)
cp lib/trino-filesystem-s3/target/trino-filesystem-s3-*.jar /opt/trino/lib/
cp lib/trino-filesystem-manager/target/trino-filesystem-manager-*.jar /opt/trino/lib/ステップ 2: テーブルバケットの作成
データを書き込む前に、テーブルバケットと名前空間を作成する必要があります。ossutil または AWS CLI のいずれかを使用できます。
方法 1: ossutil の使用
1. ossutil のインストールまたはアップグレード
ossutil 2.3.0 以降をインストールします。古いバージョンの ossutil がインストールされている場合は、次のコマンドを実行して最新バージョンにアップグレードします。
ossutil update -f2. 認証情報の設定
ossutil config コマンドを実行し、プロンプトに従って AccessKey ID、AccessKey Secret、およびリージョンを入力します。
3. テーブルバケットの作成
ossutil tables-api create-table-bucket --name <table_bucket_name> --endpoint http://<endpoint> --region <region>コマンドが成功すると、出力にテーブルバケットの ARN が含まれます。この ARN は後で使用するため、記録しておいてください。
4. 名前空間の作成
ossutil tables-api create-namespace --table-bucket-arn <table_bucket_arn> --namespace <namespace_name> --endpoint http://<endpoint>名前空間名とテーブル名にハイフン (-) は使用できません。これらの名前は SQL ステートメントで識別子として使用されるため、代わりにアンダースコア (_) を使用してください。
5. テーブルの作成
Iceberg テーブルは次のいずれかの方法で作成できます。
Spark などの別のコンピューティングエンジンを使用して作成します。
ossutil を使用して作成します。テーブルスキーマを JSON ファイルに保存し、
create-tableを呼び出します。次のスキーマファイルの例は
schema.jsonという名前で、3 つのフィールドを定義します:{ "iceberg": { "schema": { "fields": [ {"name": "event_id", "type": "string", "required": true}, {"name": "event_time", "type": "string"}, {"name": "event_type", "type": "string"} ] } } }スキーマファイルに基づいてテーブルを作成します。
ossutil tables-api create-table --table-bucket-arn <bucket_arn> --namespace <namespace_name> --name <table_name> --format ICEBERG --metadata file://<file_path> --endpoint http://<endpoint>
方法 2: AWS CLI の使用
OSS Tables は S3 Tables API と互換性があるため、AWS CLI を使用してテーブルバケットを管理することもできます。
1. AWS CLI のインストール
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install2. 認証情報の設定
aws configure コマンドを実行し、プロンプトに従ってアクセスキー ID、アクセスキーシークレット、およびリージョンを入力します。
3. テーブルバケットの作成
aws s3tables --endpoint http://<endpoint> create-table-bucket --region <region> --name <table_bucket_name>コマンドが成功すると、出力にテーブルバケットの ARN が含まれます。
4. 名前空間の作成
aws s3tables --endpoint http://<endpoint> create-namespace --table-bucket-arn <table_bucket_arn> --namespace <namespace_name>5. テーブルの作成
Spark などの別のコンピューティングエンジンを使用してテーブルを作成します。
AWS CLI を使用して、すべてのパラメーターを
create-table.jsonなどの JSON ファイルに保存してから、create-tableを呼び出します。{ "tableBucketARN": "<bucket_arn>", "namespace": "<namespace_name>", "name": "<table_name>", "format": "ICEBERG", "metadata": { "iceberg": { "schema": { "fields": [ {"name": "event_id", "type": "string","required": true}, {"name": "event_time", "type": "string"}, {"name": "event_type", "type": "string"} ] } } } }aws s3tables --endpoint http://<endpoint> create-table --cli-input-json file://<file_path>
6. バックグラウンドメンテナンス タスクの管理
OSS Tables は、ファイルのクリーンアップやコンパクションなど、Iceberg テーブルの自動バックグラウンドメンテナンスをサポートしています。AWS CLI を使用して、これらのメンテナンスタスクをクエリおよび設定できます。
テーブルメンテナンスジョブのステータスのクエリ
aws s3tables get-table-maintenance-job-status \
--table-bucket-arn="<table_bucket_arn>" \
--namespace="<namespace_name>" \
--name="<table_name>" バケットレベルのメンテナンスポリシー (ファイルのクリーンアップ) の設定
aws s3tables put-table-bucket-maintenance-configuration \
--table-bucket-arn "<table_bucket_arn>" \
--type icebergUnreferencedFileRemoval \
--value '{"status":"enabled","settings":{"icebergUnreferencedFileRemoval":{"unreferencedDays":4,"nonCurrentDays":10}}}' テーブルレベルのメンテナンスポリシー (小規模ファイルのコンパクション) の設定
aws s3tables put-table-maintenance-configuration \
--table-bucket-arn "<table_bucket_arn>" \
--type icebergCompaction \
--namespace "<namespace_name>" \
--name "<table_name>" \
--value '{"status":"enabled"}'ステップ 3: Trino カタログの設定
OSS Tables は Iceberg REST Catalog エンドポイントを提供します。Trino は、Iceberg コネクターを REST Catalog モードで使用して接続します。エンドポイントの形式は次のとおりです。
内部ネットワーク:
https://{region}-internal.oss-tables.aliyuncs.com/icebergパブリックネットワーク:
https://{region}.oss-tables.aliyuncs.com/iceberg
OSS Tables は、データプレーンアクセス用の S3 互換エンドポイントを提供します。Trino はこのエンドポイントを使用してテーブルデータの読み書きを行います。エンドポイントの形式は次のとおりです。
内部ネットワーク:
https://oss-{region}-internal.aliyuncs.comパブリックネットワーク:
https://oss-{region}.aliyuncs.com
カタログプロパティファイルの作成
Trino の etc/catalog/ ディレクトリに、プロパティファイル (たとえば、oss_tables.properties) を作成します:
connector.name=iceberg
iceberg.catalog.type=rest
iceberg.rest-catalog.uri=https://<region>-internal.oss-tables.aliyuncs.com/iceberg
iceberg.rest-catalog.warehouse=<Table Bucket ARN>
iceberg.rest-catalog.security=SIGV4
iceberg.rest-catalog.signing-name=osstables
iceberg.rest-catalog.view-endpoints-enabled=false
fs.hadoop.enabled=false
fs.native-s3.enabled=true
s3.endpoint=https://oss-<region>-internal.aliyuncs.com
s3.region=<region>
s3.aws-access-key=<AccessKey ID>
s3.aws-secret-key=<AccessKey Secret>
s3.path-style-access=trueパラメーター
パラメーター | 必須 | 説明 |
| はい | Iceberg コネクタを使用するには、 |
| はい | REST ベースのカタログを指定するには、 |
| はい | REST カタログのエンドポイント URL。形式は次のとおりです。
|
| はい | テーブルバケットの ARN です。形式は |
| はい | SigV4 署名認証を有効にするには、 |
| はい | OSS テーブルの SigV4 署名サービス名である |
| はい |
|
| はい | Hadoop ファイルシステムを無効にするには、 |
| はい | OSS のデータプレーンエンドポイント。形式は次のとおりです。
|
| はい | パス形式アクセスモードを使用するには、 |
ステップ 4: SQL を使用したデータ管理
Trino を設定して再起動した後、Trino CLI または JDBC クライアントを使用して接続し、標準 SQL で OSS Tables 内のデータを管理できます。
例: テーブルの作成
CREATE TABLE ${catalog}.${namespace}.orders (
order_id BIGINT,
customer VARCHAR,
amount DECIMAL(10,2),
order_date DATE,
created_at TIMESTAMP(6)
)
WITH (
format = 'PARQUET',
partitioning = ARRAY['day(order_date)'],
);例: データのクエリ
SELECT * FROM ${catalog}.${namespace}.orders limit 10;権限
RAM ユーザーまたは STS の一時的な認証情報を使用して OSS Tables にアクセスする場合、ID に必要な権限が付与されていることを確認する必要があります。
リソース
テーブルバケット ARN:
acs:osstables:<region>:<alibaba_cloud_account_id>:bucket/<bucket_name>テーブル ARN:
acs:osstables:<region>:<alibaba_cloud_account_id>:bucket/<bucket_name>/table/<table_id>
アクション
次の表に、OSS Tables でサポートされているアクションと、クロスアカウントアクセスが許可されるかどうかを示します。
カテゴリ | アクション | クロスアカウントアクセス |
テーブルバケットレベル |
| 不可 |
| 許可 | |
| 不可 | |
| 許可 | |
| 許可 | |
| 許可 | |
| 許可 | |
| 許可 | |
| 不可 | |
| 不可 | |
| 不可 | |
| 許可 | |
| 許可 | |
| 不可 | |
| 不可 | |
| 不可 | |
テーブルレベル |
| 許可 |
| 許可 | |
| 不可 | |
| 不可 | |
| 不可 | |
| 許可 | |
| 許可 | |
| 許可 | |
| 許可 | |
| 許可 | |
| 許可 | |
| 許可 | |
| 許可 | |
| 不可 | |
| 不可 | |
| 許可 |
Iceberg REST 操作に必要な権限
次の表に、各 Iceberg REST Catalog 操作で要求される OSS アクションを示します。
Iceberg REST 操作 | 要求される OSS アクション |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|