🧊
Iceberg REST catalog : Apache Gravitino
Iceberg REST catalog を試す Quick run です。
Catalog server
メタデータを保持する JDBC や実データを保持する S3 を用意したりするものだけれど、手始めにはこれらをざっくりと省略して、Apache Gravitino のイメージで開始するのが簡単。
起動オプションについては、環境変数から gravitino の設定ファイルの項目にマッピングされている。
docker run --rm -p9001:9001 \
-eGRAVITINO_CREDENTIAL_PROVIDERS=s3-secret-key \
-eGRAVITINO_S3_ACCESS_KEY=s3-access-key-id \
-eGRAVITINO_S3_SECRET_KEY=s3-secret-access-key \
-v /tmp:/tmp \
apache/gravitino-iceberg-rest:0.8.0-incubating
何も指定しない場合は、jdbc:sqlite::memory:
と /tmp
で保存される。この /tmp
はクライアント側でも同じようにアクセスされるので、マウントしておく。NFS でデータを保存する環境には向いているかもしれない。あるいは k8s であれば ReadWriteMany な PVC とか。
credential_providers は何か設定しないと、テーブル書き込み時に引っかかるところが出てくる。次のどれかになるけれど、s3-secret-key
あたりが簡単だろう。サーバで指定したのと同じものをクライアントで指定する shared secret となる。
- adls-token
- azure-account-key
- gcs-token
- oss-secret-key
- oss-token
- s3-secret-key
- s3-token
pyiceberg で確認
.pyiceberg.yaml
でカタログ接続情報を記述する。先ほどのパラメータと内容を合わせる。
.pyiceberg.yaml
catalog:
default:
uri: http://localhost:9001/iceberg
s3.access-key-id: s3-access-key-id
s3.secret-access-key: s3-secret-access-key
python interactive shell では次のようにしてアクセスできる。この環境では先ほどの /tmp
が見えている。
>>> import pyiceberg.catalog
>>> import pyarrow as pa
>>> from pyiceberg.schema import Schema
>>> from pyiceberg.types import NestedField, StringType
>>> x = pyiceberg.catalog.load_catalog("default")
>>> s = Schema(NestedField(field_id=1, name="a", field_type=StringType()))
>>> t = x.create_table("foo.bar", schema=s)
>>> t.append(pa.Table.from_pylist([{"a":f"hogehoge{x}"} for x in range(1000)]))
>>> t.transaction().commit_transaction()
bar(
1: a: optional string
),
partition by: [],
sort order: [],
snapshot: Operation.APPEND: id=4704690918694563824, schema_id=0
>>> t.scan().to_arrow()
pyarrow.Table
a: large_string
----
a: [["hogehoge0","hogehoge1","hogehoge2","hogehoge3","hogehoge4",...,"hogehoge995","hogehoge996","hogehoge997","hogehoge998","hogehoge999"]]
/tmp
以下をみると次のようにファイルができている。
foo/bar/data/00000-0-c74d5160-51c4-4f62-9a23-37f983cc03ac.parquet
foo/bar/metadata/00000-c2154144-b61e-4f6f-9073-3dff48c58de2.metadata.json
foo/bar/metadata/00001-f1515863-526c-4d39-8e8c-50eb4a97c473.metadata.json
foo/bar/metadata/.00000-c2154144-b61e-4f6f-9073-3dff48c58de2.metadata.json.crc
foo/bar/metadata/.00001-f1515863-526c-4d39-8e8c-50eb4a97c473.metadata.json.crc
foo/bar/metadata/snap-4704690918694563824-0-c74d5160-51c4-4f62-9a23-37f983cc03ac.avro
foo/bar/metadata/c74d5160-51c4-4f62-9a23-37f983cc03ac-m0.avro
Discussion