SeaweedFSとの統合
SeaweedFS は、S3互換オブジェクトAPIとApache Iceberg REST Catalogの両方を同一の weed プロセスから公開する分散ストレージシステムです。Parquetデータと Iceberg メタデータは1つの実行ファイルによって提供され、1つのS3認証ペアによって認証されます。
このページでは、SeaweedFSをDorisベースのIceberg lakehouseに変換する最小限の設定を示します。同じエンドツーエンドのパスは、SeaweedFSリポジトリの TestDorisIcebergCatalog 統合テストで実行されており、SeaweedFSミニクラスターを起動し、それに対してDoris Icebergカタログを登録し、PyIcebergで行を書き込み、apache/doris:doris-all-in-one-2.1.0 からそれらを読み戻します。
Iceberg lakehouseにSeaweedFSを使用する理由
今日の典型的なlakehouseスタックは3つの層を繋ぎ合わせています:
- オブジェクトストレージ(S3または互換)
- スタンドアロンのIcebergカタログ(Hive Metastore、Glue、Polaris、Lakekeeper、Nessie、...)
- クエリエンジン(Doris、Spark、Trino、...)
SeaweedFSは最初の2つを1つのプロセスに統合します。同じ weed 実行ファイルは以下の両方です:
- parquetファイルを保持するS3互換オブジェクトストア
- テーブルメタデータを保持するIceberg REST Catalog
そのため、Dorisは2つのシステムではなく1つのシステムと通信します。実用的な影響:
- より少ない可動部品。 Hive Metastore、Glue、別個のカタログをバックアップするPostgres、プロビジョニングするSTSロールが不要です。
- よりシンプルなデプロイメント。 1つの実行ファイル、1つのIAM設定、DorisのIceberg RESTクライアントとS3リーダーによって共有される1つのS3認証ペア。
- ローカルまたはオンプレミス対応。 パス内のいずれもクラウドネイティブサービスを必要としません。同じセットアップがラップトップ、単一VM、またはKubernetesクラスターで動作します。
- メタデータパスでの低レイテンシ。 カタログ状態はデータを提供するのと同じSeaweedFS filerに存在するため、namespaceとテーブルルックアップは別のサービス境界をまたぎません。
- ディスク上でのS3ネイティブ。 テーブルはS3バケット内の標準Icebergディレクトリとして保存されます。任意のS3クライアント(rclone、
aws s3、Spark、Trino、Dremio、RisingWave)がDorisと並行してそれらを読み取りまたは複製できます。
アーキテクチャ的には:
Doris
|
v
Iceberg tables
|
v
SeaweedFS (S3 storage + REST catalog)
小規模チームや社内プラットフォームにとって、これは独立したメタストアサービスに依存せずにレイクハウスを構築するクリーンな方法です。
1. SeaweedFSを開始する
github.com/seaweedfs/seaweedfsからweedをビルドまたはインストールします。
アクセスキーにS3への完全なアクセス権限を付与するIAM設定を作成します。同じキーはIceberg RESTエンドポイントのOAuth2クライアントとしても使用されます:
{
"identities": [
{
"name": "doris",
"credentials": [
{
"accessKey": "AKIAIOSFODNN7EXAMPLE",
"secretKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
}
],
"actions": ["Admin"]
}
]
}
Iceberg REST エンドポイントと事前作成されたテーブルバケットを使用して、シングルプロセスクラスターを開始します:
weed mini \
-ip $(hostname -I | awk '{print $1}') \
-dir /var/lib/seaweedfs \
-s3.config /etc/seaweedfs/iam_config.json \
-tableBucket iceberg-tables
weed miniは、master、volume、filer、S3、およびIceberg RESTカタログを1つのプロセスで実行します。デフォルトポート:
| Component | Port | Override flag |
|---|---|---|
| Master HTTP | 9333 | -master.port |
| Filer HTTP | 8888 | -filer.port |
| S3 | 8333 | -s3.port |
| Iceberg REST | 8181 | -s3.port.iceberg |
-tableBucket iceberg-tablesは起動時にS3 Tablesバケットを作成します。これはDorisが書き込むIceberg対応バケットタイプです。
カタログに到達可能であることを確認するには:
curl -s http://SEAWEED_HOST:8181/v1/config | jq .
2. DorisでIcebergカタログを登録する
CREATE CATALOG seaweedfs PROPERTIES (
"type" = "iceberg",
"iceberg.catalog.type" = "rest",
"uri" = "http://SEAWEED_HOST:8181",
"warehouse" = "s3://iceberg-tables",
"credential" = "AKIAIOSFODNN7EXAMPLE:wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
"s3.endpoint" = "http://SEAWEED_HOST:8333",
"s3.access_key" = "AKIAIOSFODNN7EXAMPLE",
"s3.secret_key" = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
"s3.region" = "us-west-2",
"use_path_style" = "true"
);
注記:
credential = "<access_key>:<secret_key>"は、DorisのIceberg RESTクライアントによってOAuth2クライアント認証情報として転送されます。SeaweedFSは、S3エンドポイントを保護するのと同じIAM設定に対してこれらを検証します。s3.*プロパティは、Doris独自のparquetリーダーとライターによって使用されます。これらは同じweedプロセス(同じホスト、同じキーペア)を指しています。use_path_style = "true"は、SeaweedFSがデフォルトでpath-style形式でS3を提供するため、必須です。- 統合テストではこれらの正確なプロパティを使用します。正規形式については、
createDorisIcebergCatalogを参照してください。
カタログが登録される前にDoris外部で(例えばPyIcebergで)名前空間やテーブルを作成した場合は、メタデータキャッシュをリフレッシュしてください:
REFRESH CATALOG seaweedfs;
3. カタログを使用する
USE seaweedfs;
CREATE DATABASE IF NOT EXISTS demo;
USE seaweedfs.demo;
CREATE TABLE iceberg_smoke (
id BIGINT,
label STRING
);
INSERT INTO iceberg_smoke VALUES (1, 'one'), (2, 'two'), (3, 'three');
SELECT id, label FROM iceberg_smoke ORDER BY id;
期待される出力:
+----+-------+
| id | label |
+----+-------+
| 1 | one |
| 2 | two |
| 3 | three |
+----+-------+
これは SeaweedFS 統合テストが実行するのと同じパスです:Iceberg REST カタログを通じて作成された namespace とテーブル、PyIceberg を介して追加された行、そして標準的な S3 と Iceberg メタデータフローを通じて Doris によって提供される読み取りです。
本番環境での注意事項
- 本番環境のクラスタでは、
weed miniをweed master、weed volume、weed filer、およびweed s3 -iceberg.port=8181に置き換えてください(または SeaweedFS Helm チャートを使用してください)。Doris 側の設定は同一です — ホストとポートのみが変更されます。 - OAuth2 クレデンシャルは S3 アクセスキーです。Doris のカタログアクセスをローテーションするには、それを保持する IAM アイデンティティをローテーションします。これは任意の S3 ユーザーをローテーションするのと同じ方法です。
- Iceberg テーブルのメンテナンス(コンパクション、スナップショットの期限切れ、孤立したファイルの削除、マニフェストの書き換え)は SeaweedFS に組み込まれており、同じバケットに対して実行されます。詳細については SeaweedFS Iceberg Catalog wiki を参照してください。