5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Apache Icebergのクイックスタートやってみた

Posted at

Apache Icebergの公式ドキュメントにて、クイックスタートを発見!早速やってみました。

クイックスタートはSparkを使うものとHiveを使うものが用意されています。

今回は、Spark版を試しました。

環境構築

環境は、Docker Composeで構築します。

ドキュメントに記載のあるdocker-compose.ymlを作成します

docker-compose.yml
docker-compose.yml
version: "3"

services:
  spark-iceberg:
    image: tabulario/spark-iceberg
    container_name: spark-iceberg
    build: spark/
    networks:
      iceberg_net:
    depends_on:
      - rest
      - minio
    volumes:
      - ./warehouse:/home/iceberg/warehouse
      - ./notebooks:/home/iceberg/notebooks/notebooks
    environment:
      - AWS_ACCESS_KEY_ID=admin
      - AWS_SECRET_ACCESS_KEY=password
      - AWS_REGION=us-east-1
    ports:
      - 8888:8888
      - 8080:8080
      - 10000:10000
      - 10001:10001
  rest:
    image: apache/iceberg-rest-fixture
    container_name: iceberg-rest
    networks:
      iceberg_net:
    ports:
      - 8181:8181
    environment:
      - AWS_ACCESS_KEY_ID=admin
      - AWS_SECRET_ACCESS_KEY=password
      - AWS_REGION=us-east-1
      - CATALOG_WAREHOUSE=s3://warehouse/
      - CATALOG_IO__IMPL=org.apache.iceberg.aws.s3.S3FileIO
      - CATALOG_S3_ENDPOINT=http://minio:9000
  minio:
    image: minio/minio
    container_name: minio
    environment:
      - MINIO_ROOT_USER=admin
      - MINIO_ROOT_PASSWORD=password
      - MINIO_DOMAIN=minio
    networks:
      iceberg_net:
        aliases:
          - warehouse.minio
    ports:
      - 9001:9001
      - 9000:9000
    command: ["server", "/data", "--console-address", ":9001"]
  mc:
    depends_on:
      - minio
    image: minio/mc
    container_name: mc
    networks:
      iceberg_net:
    environment:
      - AWS_ACCESS_KEY_ID=admin
      - AWS_SECRET_ACCESS_KEY=password
      - AWS_REGION=us-east-1
    entrypoint: >
      /bin/sh -c "
      until (/usr/bin/mc config host add minio http://minio:9000 admin password) do echo '...waiting...' && sleep 1; done;
      /usr/bin/mc rm -r --force minio/warehouse;
      /usr/bin/mc mb minio/warehouse;
      /usr/bin/mc policy set public minio/warehouse;
      tail -f /dev/null
      "
networks:
  iceberg_net:

コンテナが3つ定義されています。

  • tabulario/spark-iceberg : Sparkがこれ?
  • apache/iceberg-rest-fixture : Icebergがこれ?
  • minio/minio : S3互換オブジェクトストレージのはず

起動します。

docker compose up

これで完了です。

アクセスしてみる

docker-compose.ymlに、PORTの設定があったのでまずは片っ端からアクセスしてみます。

  • spark-icebergコンテナ
    • ノートブック環境(8888)
    • Spark管理画面(8080)
  • minioコンテナ
    • Minio環境(9001)

      warehouseという空のバケットが作成されています。(mcコンテナが起動時に作成しています)

クイックスタートの手順を実行

ノートブックでクイックスタートの手順をやってみましょう。

SparkSQL、Spark-Shell、PySparkの3通り方法が記載されていますが、今回はSparkSQLを使用しました。

  1. Creating a table

    CREATE TABLE demo.nyc.taxis
    (
      vendor_id bigint,
      trip_id bigint,
      trip_distance float,
      fare_amount double,
      store_and_fwd_flag string
    )
    PARTITIONED BY (vendor_id);
    

    セルの先頭に%%sqlと書くとSQLと認識するようです。

    テーブル作成後、Minioの「warehouse/nyc/taxis/metadata」にファイルが作成されました。

    localhost_9001_ (2).png

    metadataファイル
    00000-7b48b19d-7693-43ed-8c0a-ed453826ce32.metadata.json
    {
      "format-version" : 2,
      "table-uuid" : "b077f2e1-7ba7-4c84-99d9-d91cac34fa72",
      "location" : "s3://warehouse/nyc/taxis",
      "last-sequence-number" : 0,
      "last-updated-ms" : 1736166858036,
      "last-column-id" : 5,
      "current-schema-id" : 0,
      "schemas" : [ {
        "type" : "struct",
        "schema-id" : 0,
        "fields" : [ {
          "id" : 1,
          "name" : "vendor_id",
          "required" : false,
          "type" : "long"
        }, {
          "id" : 2,
          "name" : "trip_id",
          "required" : false,
          "type" : "long"
        }, {
          "id" : 3,
          "name" : "trip_distance",
          "required" : false,
          "type" : "float"
        }, {
          "id" : 4,
          "name" : "fare_amount",
          "required" : false,
          "type" : "double"
        }, {
          "id" : 5,
          "name" : "store_and_fwd_flag",
          "required" : false,
          "type" : "string"
        } ]
      } ],
      "default-spec-id" : 0,
      "partition-specs" : [ {
        "spec-id" : 0,
        "fields" : [ {
          "name" : "vendor_id",
          "transform" : "identity",
          "source-id" : 1,
          "field-id" : 1000
        } ]
      } ],
      "last-partition-id" : 1000,
      "default-sort-order-id" : 0,
      "sort-orders" : [ {
        "order-id" : 0,
        "fields" : [ ]
      } ],
      "properties" : {
        "owner" : "root",
        "write.parquet.compression-codec" : "zstd"
      },
      "current-snapshot-id" : null,
      "refs" : { },
      "snapshots" : [ ],
      "statistics" : [ ],
      "partition-statistics" : [ ],
      "snapshot-log" : [ ],
      "metadata-log" : [ ]
    }
    
  2. Writing Data to a Table

    INSERT INTO demo.nyc.taxis
    VALUES (1, 1000371, 1.8, 15.32, 'N'), (2, 1000372, 2.5, 22.15, 'N'), (2, 1000373, 0.9, 9.01, 'N'), (1, 1000374, 8.4, 42.13, 'Y');
    

    Minio上にファイルが作成されます。

    メタデータ

    データ

    自動的にパーティションが作成される

    データはParquet形式で作成される

  3. Reading Data from a Table

    SELECT * FROM demo.nyc.taxis;
    

    登録したデータが取得できました

以上、触りだけですがクイックスタートをやってみました。

サンプルノートブックがたくさんあります

  • Iceberg - An Introduction to the Iceberg Java API
  • Iceberg - Berlin Buzzwords 2023
  • Iceberg - Getting Started
  • Iceberg - Integrated Audits Demo
  • Iceberg - Table Maintenance Spark Procedures
  • Iceberg - View Support
  • Iceberg - Write-Audit-Publish (WAP) with Branches
  • PyIceberg - Getting Started
  • PyIceberg - Write support
5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?