Slide 1

Slide 1 text

Hive Metastoreを通して学ぶ Iceberg REST Catalog 仕様から実装まで @okumin Apache Iceberg Meetup Japan #5 Databricks Office, Tokyo May 20, 2026

Slide 2

Slide 2 text

自己紹介 - Shohei Okumiya (@okumin) - Apache Hive PMC Member - Treasure Data -> Treasure AI所属

Slide 3

Slide 3 text

ZooKage - フルスペックなLakehouseをローカルで $ git clone --branch v0.5.0 https://github.com/zookage/zookage.git $ cd zookage $ ./bin/up

Slide 4

Slide 4 text

本日話す内容 - Apache Hiveとは - Icebergテーブルフォーマット復習 - Iceberg Catalogについて - 基本的な操作手順をHive CatalogとREST Catalogで比較 - 読み込みパス - 書き込みパス - REST Catalogの高度な機能の解説 - 認証・認可 - Credential Vending - Metrics Reporting - Server-Side Planning

Slide 5

Slide 5 text

Apache Hiveとは

Slide 6

Slide 6 text

“Distributed Data Warehouse at Massive Scale” - Hive Metastore: メタデータリポジトリ - HiveServer2: SQLゲートウェイ - Hive on Tez, Hive LLAP: 分散実行エンジン RDBMS HDFS Object Storage HiveServer2 Hive Metastore Hadoop Hive on Tez Kubernetes Hive LLAP Trino, Spark, Flink

Slide 7

Slide 7 text

今日話す部分 - Hive Metastore: メタデータリポジトリ - HiveServer2: SQLゲートウェイ - Hive on Tez, Hive LLAP: 分散実行エンジン RDBMS HDFS Object Storage HiveServer2 Hive Metastore Hadoop Hive on Tez Kubernetes Hive LLAP Trino, Spark, Flink

Slide 8

Slide 8 text

おさらい: Icebergテーブルフォーマット

Slide 9

Slide 9 text

Iceberg関連データ Iceberg Catalog 有効なMetadata Fileへのポインター Metadata File スキーマや有効なスナップショット一覧 Manifest List スナップショットに含まれるManifest File一覧 Manifest File Data File一覧 Data File 実レコードを含むParquetファイルなど 出典: Spec - Apache Iceberg™ https://iceberg.apache.org/spec/

Slide 10

Slide 10 text

今日の話を聞く上で大事なこと Icebergテーブルを読み書きする際は、カタログに保存されたメタデータへのポインター Catalog Metadata File (JSON) Amazon S3 Manifest List (Avro) Manifest File (Avro) Data File (Parquet)

Slide 11

Slide 11 text

今日の話を聞く上で大事なこと HDFSやオブジェクトストレージに保存されたメタデータ関連ファイル三種類 Catalog Metadata File (JSON) Amazon S3 Manifest List (Avro) Manifest File (Avro) Data File (Parquet)

Slide 12

Slide 12 text

今日の話を聞く上で大事なこと そして実レコードを保存した ParquetやORCファイルにアクセスする必要がある Catalog Metadata File (JSON) Amazon S3 Manifest List (Avro) Manifest File (Avro) Data File (Parquet)

Slide 13

Slide 13 text

Iceberg Catalogについて

Slide 14

Slide 14 text

カタログの種類 カタログが持つ機能 - テーブル名からメタデータファイルの位置を解決する - その対応を安全に更新できる Spark + Hadoop Catalog Spark + JDBC Catalog Spark + Hive Catalog Spark + REST Catalog HDFS, S3 PostgreSQL, MySQL Iceberg REST API Hive Metastore Hadoop FileSystem API JDBC Driver Hive Thrift Client Iceberg REST Client

Slide 15

Slide 15 text

Iceberg REST Catalog API実装 商用サービス - Databricks Unity Catalog - Cloudera Iceberg REST Catalog - Snowflake Open Catalog - AWS Glue - Amazon S3 Tables - Google Cloud's Lakehouse - Microsoft Fabric OneLake - Dremio Open Catalog OSS実装 - Unity Catalog - Apache Polaris - Apache Gravitino - Lakekeeper - Project Nessie

Slide 16

Slide 16 text

Hive Metastore参戦 OSS実装 - Unity Catalog - Apache Polaris - Apache Gravitino - Lakekeeper - Project Nessie - Apache Hive - Hive Metastore 商用サービス - Databricks Unity Catalog - Cloudera Iceberg REST Catalog - Snowflake Open Catalog - AWS Glue - Amazon S3 Tables - Google Cloud's Lakehouse - Microsoft Fabric OneLake - Dremio Open Catalog

Slide 17

Slide 17 text

Iceberg REST Catalog API backed by Hive Metastore - Iceberg REST APIリクエストをHive Catalogの操作に変換している - 各種セマンティクス(例: テーブル名大文字小文字の区別など)はHive Catalogと同じ - Hive MetastoreにAPIエンドポイントを足す or Iceberg REST API専用サーバをデプロイ Trino REST Catalog Hive Metastore Iceberg REST API Hive Catalog API Server Iceberg REST API Hive Metastore Thrift API Trino REST Catalog REST API RDBMS RDBMS Thrift RPC REST API Embedded Mode Standalone Mode (>= 4.3)

Slide 18

Slide 18 text

基本的な操作 - 読み書き

Slide 19

Slide 19 text

Hive CatalogとREST Catalogの比較: 読み込みパス こういう感じの単純なSELECTクエリをTrinoで実行すると? -- Schema CREATE TABLE test (name VARCHAR); -- Query SELECT * FROM test;

Slide 20

Slide 20 text

Hive Catalogの読み込みパス (1) Hive Metastore (Thrift) Metadata Pointer Metadata File (JSON) PostgreSQL Amazon S3 Trino Manifest List (Avro) Manifest File (Avro) Data File (Parquet) (1) GetTableRequest (Thrift) (2) SELECT Current Pointer (3) s3://path/to/000-metadata.json (4) Hive Table

Slide 21

Slide 21 text

Hive Catalogの読み込みパス (2) Hive Metastore (Thrift) Metadata Pointer Metadata File (JSON) PostgreSQL Amazon S3 Trino Manifest List (Avro) Manifest File (Avro) Data File (Parquet) (5) GET s3://path/to/000-metadata.json (6) Schema, List of snapshots (7) GET s3://path/to/snap-abc.avro (8) List of Manifest Files (9) GET s3://path/to/m0.avro (10) List of Data Files (11) GET s3://path/to/000.parquet (12) Records

Slide 22

Slide 22 text

REST Catalogの読み込みパス (1) Hive Metastore (REST) Metadata Pointer Metadata File (JSON) PostgreSQL Amazon S3 Trino Manifest List (Avro) Manifest File (Avro) Data File (Parquet) (1) Load Table (Iceberg REST) (2) SELECT Current Pointer (3) s3://path/to/000-metadata.json

Slide 23

Slide 23 text

REST Catalogの読み込みパス (2) Hive Metastore (REST) Metadata Pointer Metadata File (JSON) PostgreSQL Amazon S3 Trino Manifest List (Avro) Manifest File (Avro) Data File (Parquet) (6) Iceberg Table (4) GET s3://path/to/000-metadata.json (5) Schema, List of snapshots

Slide 24

Slide 24 text

REST Catalogの読み込みパス (3) Hive Metastore (REST) Metadata Pointer Metadata File (JSON) PostgreSQL Amazon S3 Trino Manifest List (Avro) Manifest File (Avro) Data File (Parquet) (7) GET s3://path/to/snap-abc.avro (8) List of Manifest Files (9) GET s3://path/to/m0.avro (10) List of Data Files (11) GET s3://path/to/000.parquet (12) Records

Slide 25

Slide 25 text

まとめ: 読み込みパス - Metadata Fileへのアクセスがカタログ経由に - Metadata Fileをキャッシュしたりも(HIVE-29035) Hive Catalog REST Catalog Hive Metastore (Thrift) Metadata Pointer Metadata File (JSON) PostgreSQL Amazon S3 Trino Manifest List (Avro) Manifest File (Avro) Data File (Parquet) Hive Metastore (REST) Metadata Pointer Metadata File (JSON) PostgreSQL Amazon S3 Trino Manifest List (Avro) Manifest File (Avro) Data File (Parquet)

Slide 26

Slide 26 text

Hive CatalogとREST Catalogの比較: 書き込みパス こういう感じの単純なINSERTクエリをTrinoで実行すると? 注: 書き込みの過程で元のテーブル状態を確認するために行われる Load Tableは省略 -- For simplicity SET SESSION .merge_manifests_on_write = false; -- Query INSERT INTO test (name) VALUES ('Alice');

Slide 27

Slide 27 text

Hive Catalogの書き込みパス (1) Hive Metastore (Thrift) Metadata Pointer Metadata File (JSON) PostgreSQL Amazon S3 Trino Manifest List (Avro) Manifest File (Avro) Data File (Parquet) (8) 200 OK (7) PUT s3://path/to/new-metadata.json (6) 200 OK (5) PUT s3://path/to/snap-xyz.avro (4) 200 OK (3) PUT s3://path/to/new.avro (2) 200 OK (1) PUT s3://path/to/new.parquet

Slide 28

Slide 28 text

Hive Catalogの書き込みパス (2) Hive Metastore (Thrift) Metadata Pointer Metadata File (JSON) PostgreSQL Amazon S3 Trino Manifest List (Avro) Manifest File (Avro) Data File (Parquet) (9) LockRequest (Thrift) (10) Acquire Lock (11) Lock Acquired (12) LockResponse

Slide 29

Slide 29 text

Hive Catalogの書き込みパス (3) Hive Metastore (Thrift) Metadata Pointer Metadata File (JSON) PostgreSQL Amazon S3 Trino Manifest List (Avro) Manifest File (Avro) Data File (Parquet) (13) GetTableRequest (Thrift) (14) SELECT Current Pointer (15) Current Pointer (16) Hive Table ロック前後でポインターが変化してい たらリトライ or Abort

Slide 30

Slide 30 text

Hive Catalogの書き込みパス (4) Hive Metastore (Thrift) Metadata Pointer Metadata File (JSON) PostgreSQL Amazon S3 Trino Manifest List (Avro) Manifest File (Avro) Data File (Parquet) (17) AlterTableRequest (Thrift) (18) Updater Pointer

Slide 31

Slide 31 text

REST Catalogの書き込みパス (1) Hive Metastore (REST) Metadata Pointer Metadata File (JSON) PostgreSQL Amazon S3 Trino Manifest List (Avro) Manifest File (Avro) Data File (Parquet) (6) 200 OK (5) PUT s3://path/to/snap-xyz.avro (4) 200 OK (3) PUT s3://path/to/new.avro (2) 200 OK (1) PUT s3://path/to/new.parquet

Slide 32

Slide 32 text

REST Catalogの書き込みパス (2) Hive Metastore (REST) Metadata Pointer Metadata File (JSON) PostgreSQL Amazon S3 Trino Manifest List (Avro) Manifest File (Avro) Data File (Parquet) (7) Update Table w/ diff (9) 200 OK (8) PUT s3://path/to/new-metadata.json

Slide 33

Slide 33 text

REST Catalogの書き込みパス (3) Hive Metastore (REST) Metadata Pointer Metadata File (JSON) PostgreSQL Amazon S3 Trino Manifest List (Avro) Manifest File (Avro) Data File (Parquet) (11) Lock acquired (10) Acquire Lock

Slide 34

Slide 34 text

REST Catalogの書き込みパス (4) Hive Metastore (REST) Metadata Pointer Metadata File (JSON) PostgreSQL Amazon S3 Trino Manifest List (Avro) Manifest File (Avro) Data File (Parquet) (13) Current Pointer (12) SELECT Current Pointer ロック前後でポインターが変化してい たらリトライ or Abort

Slide 35

Slide 35 text

REST Catalogの書き込みパス (5) Hive Metastore (REST) Metadata Pointer Metadata File (JSON) PostgreSQL Amazon S3 Trino Manifest List (Avro) Manifest File (Avro) Data File (Parquet) (14) Update Pointer

Slide 36

Slide 36 text

書き込みパスまとめ ロックの取り方などを抽象化できる Hive Catalog REST Catalog Hive Metastore (REST) Metadata Pointer Metadata File (JSON) PostgreSQL Amazon S3 Trino Manifest List (Avro) Manifest File (Avro) Data File (Parquet) Hive Metastore (Thrift) Metadata Pointer Metadata File (JSON) PostgreSQL Amazon S3 Trino Manifest List (Avro) Manifest File (Avro) Data File (Parquet)

Slide 37

Slide 37 text

高度な機能の紹介

Slide 38

Slide 38 text

認証・認可 - ユーザー名の解決・エンドポイントレベルの認可 - OAuth 2: HIVE-29020にてサポート - AWS SigV4 - Bearer Token - テーブルレベルアクセスコントロール - Apache Ranger - AWS Lake Formation Catalog Server Policy Store Identity Provider She is Alice Alice can update Table X and Y

Slide 39

Slide 39 text

OAuth 2.0 + Authorization Plugin ● Iceberg REST Catalogエンドポイントを保護対象リソースとして認可 ● OAuth 2のClaim Setを元にユーザー名の解決 ● Apache Rangerなどを用いてユーザー名からテーブルレベルの読み書き権限を確認 Authorization Server E.g., Keycloak Hive Metastore Trino (1) Request Access Token Ranger Policy Store (2) Access Token (3) Request w/ Access Token (4) Token Introspection (5) Claim Set w/ ID source (7) Response JWTトークンの場合(4)と (5)は省略可 Ranger Plugin Sync (6) Check Privileges

Slide 40

Slide 40 text

Credential Vending - ストレージへアクセスするための認証情報をカタログが返す機能 - HIVE-29228にて実装中 Iceberg Client Catalog Server Storage Table Metadata with Credentials Read, Write, Delete Files

Slide 41

Slide 41 text

Credential Vendingがない場合 Hive Metastore w/ 🔑 Metadata File (JSON) Manifest List (Avro) Manifest File (Avro) Data File (Parquet) Amazon S3 Trino w/ 🔑 Hive Metastoreに /user/hive/warehouse全体の 読み書き権限 クライアントにも /user/hive/warehouse全体の 読み書き権限

Slide 42

Slide 42 text

Credential Vendingがある場合 Hive Metastore Metadata File (JSON) Manifest List (Avro) Manifest File (Avro) Data File (Parquet) Amazon S3 Trino カタログが払い出したクレデンシャルを 使用 AWS STS (1) LoadTable (2) Assume Role (3) Temporary Credentials 🔑 (4) Iceberg Table w/ Temporary Credentials 🔑 (5) Access S3 w/ Temporary Credentials 🔑 リクエストされたテーブルに対して許可 された操作(GET, PUT, DELETE)の みを実行することができるクレデンシャ ル

Slide 43

Slide 43 text

Metrics Reporting - メトリクスをクライアントから受信するAPI - スキャン後にテーブル名、スキャン条件、スキャンしたファイルの数 - コミット後にテーブル名、作成・削除したファイル数やレコード数 - REST Catalogを用いると、メトリクスの取り扱いをサーバで一元管理できる Iceberg Client 1 Catalog Server Iceberg Client 2 Iceberg Client 3 ???

Slide 44

Slide 44 text

Metrics Reporting - HIVE-29593(>= 4.3): 任意の送り先をプラガブルに実装・選択 Trino Hive Metastore Kafka Iceberg Datadog Spark Flink

Slide 45

Slide 45 text

Server-Side Planning - データファイルの解決をREST Catalog側でやる - 仕様は策定済み - クライアント実装がApache Iceberg 1.11.0で入った -> Hive Metastoreでも実装予 定? Iceberg Client Catalog Server Snapshot ID, Projection, Predicate, etc. List of Data Files

Slide 46

Slide 46 text

おさらい: Load Tableを用いる場合のインタラクション Hive Metastore Metadata File (JSON) Manifest List (Avro) Manifest File (Avro) Data File (Parquet) Amazon S3 Trino Metadata Pointer PostgreSQL

Slide 47

Slide 47 text

Server-Side Planningを使うと Hive Metastore Metadata File (JSON) Manifest List (Avro) Manifest File (Avro) Data File (Parquet) Amazon S3 Trino Metadata Pointer PostgreSQL (1) Submit Scan Planning w/ Scan Conditions (2) Scan Metadata (3) Locations of Data Files (4) Read Data Files

Slide 48

Slide 48 text

今日のまとめ - Iceberg REST Catalogがとても流行っている - Hive MetastoreもIceberg REST APIを絶賛実装中 - REST Catalogの登場により高度な機能が導入しやすくなった - Special Thanks - レビューしてくれたTreasure AIの同僚達 - Keisuke Suzuki, Masafumi Koba