🧊

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