fresh-borzoni commented on code in PR #3424:
URL: https://github.com/apache/fluss/pull/3424#discussion_r3570117890


##########
website/docs/streaming-lakehouse/integrate-data-lakes/catalogs/hive.md:
##########
@@ -0,0 +1,452 @@
+---
+title: Hive Metastore
+sidebar_position: 3
+---
+
+# Hive Metastore
+
+## Introduction
+
+The **Hive Metastore (HMS)** is a central metadata repository commonly used in 
Apache Hadoop and other big data ecosystems to store schema and metadata 
information for tables. Apache Iceberg provides native integration with Hive 
Metastore, storing Iceberg table names and metadata locations directly within 
HMS.
+
+This guide explains how to configure Fluss to use Hive Metastore as its 
Iceberg catalog. For general Iceberg integration details (table mapping, data 
types, limitations), see [Iceberg](../formats/iceberg.md).
+
+## How It Works
+
+When Fluss is configured with Hive Metastore as its Iceberg catalog:
+
+1. **Data ingestion**: Applications write data to Fluss tables using the Fluss 
client (Java/Python), Flink SQL, or any Kafka-compatible producer. Fluss stores 
this data in its real-time log.
+2. **Tiering to Iceberg**: A separate Flink job (the [tiering 
service](maintenance/tiered-storage/lakehouse-storage.md#start-the-datalake-tiering-service))
 periodically reads accumulated data from Fluss, converts it to Parquet format, 
writes the files to HDFS (or S3/OSS), and commits an Iceberg snapshot to the 
Hive Metastore.
+3. **Query via Spark/Trino/Flink**: Any Iceberg-compatible engine configured 
with Hive catalog can discover and query the tiered tables through HMS.
+
+```mermaid
+flowchart LR
+    subgraph Sources["Data Sources"]
+        A1[App - Fluss Client]
+        A2[Flink CDC Job]
+    end
+
+    subgraph Fluss["Fluss Cluster"]
+        B1[Coordinator]
+        B2[TabletServer]
+        B3[ZooKeeper]
+    end
+
+    subgraph Hadoop["Hadoop / On-Prem"]
+        C1[Hive Metastore]
+        C2[HDFS / S3 / OSS]
+        C3[Spark / Trino / StarRocks]
+    end
+
+    A1 -->|write| B2
+    A2 -->|write| B2
+    B1 -->|register tables| C1
+
+    subgraph Tiering["Flink Tiering Job"]
+        D1[Reads Fluss log]
+        D2[Writes Parquet]
+        D3[Commits Iceberg snapshot]
+    end
+
+    B2 -->|read log| D1
+    D2 -->|Parquet files| C2
+    D3 -->|snapshot metadata| C1
+    C1 -->|discover tables| C3
+    C2 -->|read data| C3
+```
+
+> **Note**: The tiering service is a Flink job that bridges Fluss's real-time 
log to Iceberg tables in Hive Metastore. Flink is also commonly used for data 
ingestion (via SQL), but applications can write directly to Fluss using the 
client library.
+
+## Prerequisites
+
+### Java Version
+
+Fluss 0.9.x requires **Java 17 or later** for the Tablet Server.
+
+### Running Hive Metastore
+
+Ensure you have a running Hive Metastore service (version **2.x or 3.x**). By 
default, HMS listens on thrift port `9083` (e.g., 
`thrift://<metastore-host>:9083`).
+
+:::warning Hive Metastore Version Compatibility
+Iceberg 1.10.1 compiles its Hive catalog client against **Hive 2.3.10**. This 
client is compatible with HMS **2.x and 3.x** servers. HMS **4.x** uses an 
incompatible thrift protocol and will fail with `TApplicationException: Invalid 
method name: 'get_table'`. Use HMS 3.x or earlier.
+:::
+
+### Prepare Required JARs
+
+Iceberg's Hive catalog class (`HiveCatalog`) is distributed separately from 
`iceberg-core` and requires the Hive metastore client, Hadoop, and several 
transitive dependencies. You must supply all of them.
+
+#### For Fluss Servers (Coordinator & Tablet Servers)
+
+Download and place the following JARs in the `${FLUSS_HOME}/plugins/iceberg/` 
directory:
+
+| # | JAR | Size | Purpose |
+|---|-----|------|---------|
+| 1 | 
[iceberg-hive-metastore-1.10.1.jar](https://repo1.maven.org/maven2/org/apache/iceberg/iceberg-hive-metastore/1.10.1/iceberg-hive-metastore-1.10.1.jar)
 | 92 KB | Contains `HiveCatalog` class |
+| 2 | 
[hive-exec-2.3.10.jar](https://repo1.maven.org/maven2/org/apache/hive/hive-exec/2.3.10/hive-exec-2.3.10.jar)
 | 46 MB | Uber JAR: bundles `HiveConf`, `HiveMetaStoreClient`, Thrift, Guava |
+| 3 | 
[hadoop-client-api-3.3.6.jar](https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-client-api/3.3.6/hadoop-client-api-3.3.6.jar)
 | 20 MB | Hadoop public API (`Configuration`, `FileSystem`) |
+| 4 | 
[hadoop-client-runtime-3.3.6.jar](https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-client-runtime/3.3.6/hadoop-client-runtime-3.3.6.jar)
 | 30 MB | Hadoop runtime implementations |
+| 5 | 
[commons-logging-1.2.jar](https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar)
 | 62 KB | Logging facade required by Hadoop and Hive |
+| 6 | 
[jackson-core-2.15.2.jar](https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.15.2/jackson-core-2.15.2.jar)
 | 571 KB | JSON processing |
+| 7 | 
[jackson-databind-2.15.2.jar](https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.15.2/jackson-databind-2.15.2.jar)
 | 1.5 MB | JSON data binding |
+| 8 | 
[jackson-annotations-2.15.2.jar](https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.15.2/jackson-annotations-2.15.2.jar)
 | 75 KB | JSON annotations |
+
+> **NOTE**: The Fluss binary distribution already includes 
`fluss-lake-iceberg-$FLUSS_VERSION$.jar` in `plugins/iceberg/`. You do not need 
to download it separately — only add the 8 JARs above.
+
+> **TIP**: `hive-exec-2.3.10.jar` is a shaded uber JAR that bundles the Hive 
metastore client, `HiveConf`, Apache Thrift, libfb303, and Guava. Using the 
full `hive-exec` (not the `-core` variant) avoids needing to track down each 
transitive dependency individually. Despite its size, it is the simplest way to 
satisfy all Hive client requirements.
+
+#### For the Flink Tiering Service
+
+Place the following JARs in `${FLINK_HOME}/lib`:
+
+1. **All 8 JARs listed above** (iceberg-hive-metastore, hive-exec, 
hadoop-client-api, hadoop-client-runtime, commons-logging, jackson-core, 
jackson-databind, jackson-annotations)
+2. **Fluss Flink Connector**: 
[fluss-flink-1.20-$FLUSS_VERSION$.jar]($FLUSS_MAVEN_REPO_URL$/org/apache/fluss/fluss-flink-1.20/$FLUSS_VERSION$/fluss-flink-1.20-$FLUSS_VERSION$.jar)
 (pick the version matching your Flink runtime)
+3. **Fluss Lake Iceberg**: 
[fluss-lake-iceberg-$FLUSS_VERSION$.jar]($FLUSS_MAVEN_REPO_URL$/org/apache/fluss/fluss-lake-iceberg/$FLUSS_VERSION$/fluss-lake-iceberg-$FLUSS_VERSION$.jar)
+4. **Fluss Flink Tiering**: 
[fluss-flink-tiering-$FLUSS_VERSION$.jar]($FLUSS_MAVEN_REPO_URL$/org/apache/fluss/fluss-flink-tiering/$FLUSS_VERSION$/fluss-flink-tiering-$FLUSS_VERSION$.jar)
 — the tiering job JAR itself
+
+### Hadoop Classpath Configuration (HDFS Only)
+
+If your warehouse is on **HDFS**, both Fluss and Flink must be able to resolve 
HDFS paths. This requires Hadoop configuration files on the classpath.
+
+**Option 1: Export Hadoop Classpath (Recommended)**
+
+```bash
+export HADOOP_CLASSPATH=`hadoop classpath`
+```
+
+**Option 2: Copy Hadoop XML Configs**
+
+Copy `core-site.xml` and `hdfs-site.xml` to the configuration directories of 
both Fluss (`${FLUSS_HOME}/conf/`) and Flink (`${FLINK_HOME}/conf/`).
+
+> **NOTE**: If your warehouse uses a local filesystem path (for testing) or 
S3/OSS (with the appropriate Fluss filesystem plugin), you do not need 
`HADOOP_CLASSPATH`.
+
+## Configure Fluss with Hive Metastore
+
+### Cluster Configuration
+
+Add the following to your `server.yaml`:
+
+```yaml
+datalake.format: iceberg
+datalake.iceberg.type: hive
+datalake.iceberg.uri: thrift://<hive-metastore-host>:9083
+datalake.iceberg.warehouse: hdfs://<namenode-host>:9000/user/hive/warehouse
+```
+
+Fluss strips the `datalake.iceberg.` prefix and passes the remaining 
properties directly to Iceberg's Hive catalog. The properties above become 
`type=hive`, `uri=thrift://...`, and `warehouse=hdfs://...` when initializing 
the catalog.
+
+:::note
+If your Hive warehouse is on cloud object storage, set 
`datalake.iceberg.warehouse` to the corresponding URI (e.g., 
`s3://<your-bucket>/warehouse`) and configure the required filesystem plugin. 
See [AWS Glue](glue.md) for S3 credential setup.
+:::
+
+### Start Tiering Service
+
+Follow the [Iceberg tiering service 
setup](../formats/iceberg.md#start-tiering-service-to-iceberg) instructions to 
prepare the environment. Launch the Flink tiering job:
+
+```bash
+${FLINK_HOME}/bin/flink run /path/to/fluss-flink-tiering-$FLUSS_VERSION$.jar \
+    --fluss.bootstrap.servers <coordinator-host>:9123 \
+    --datalake.format iceberg \
+    --datalake.iceberg.type hive \
+    --datalake.iceberg.uri thrift://<hive-metastore-host>:9083 \
+    --datalake.iceberg.warehouse 
hdfs://<namenode-host>:9000/user/hive/warehouse
+```
+
+## Quick Start (Docker Compose)
+
+This section provides a complete docker-compose setup that runs the entire 
Hive Metastore integration end-to-end. It starts HMS, ZooKeeper, Fluss, Flink, 
creates a table, inserts data, tiers it to Iceberg via HMS, and reads it back. 
No cloud account or Hadoop cluster needed — everything runs locally.
+
+**Prerequisites**: Docker and Docker Compose installed.
+
+Create a `docker-compose.yml`:
+
+```yaml
+services:
+  # Hive Metastore (Thrift on port 9083, embedded Derby)
+  metastore:
+    image: apache/hive:3.1.3
+    environment:
+      SERVICE_NAME: metastore
+    ports:
+      - "9083:9083"
+    healthcheck:
+      test: ["CMD-SHELL", "bash -c 'echo > /dev/tcp/localhost/9083' 
2>/dev/null"]
+      interval: 10s
+      timeout: 10s
+      retries: 15
+      start_period: 90s
+
+  zookeeper:
+    image: zookeeper:3.8.4
+    healthcheck:
+      test: ["CMD", "zkServer.sh", "status"]
+      interval: 5s
+      timeout: 5s
+      retries: 5
+
+  # Downloads plugin JARs into a shared volume
+  init-plugins:
+    image: amazoncorretto:17
+    entrypoint: ["/bin/bash", "-c"]
+    command:
+      - |
+        set -e
+        yum install -y curl 2>/dev/null
+        mkdir -p /plugins/iceberg
+        curl -sSfL -o /plugins/iceberg/iceberg-hive-metastore-1.10.1.jar \
+          
https://repo1.maven.org/maven2/org/apache/iceberg/iceberg-hive-metastore/1.10.1/iceberg-hive-metastore-1.10.1.jar
+        curl -sSfL -o /plugins/iceberg/hive-exec-2.3.10.jar \
+          
https://repo1.maven.org/maven2/org/apache/hive/hive-exec/2.3.10/hive-exec-2.3.10.jar
+        curl -sSfL -o /plugins/iceberg/hadoop-client-api-3.3.6.jar \
+          
https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-client-api/3.3.6/hadoop-client-api-3.3.6.jar
+        curl -sSfL -o /plugins/iceberg/hadoop-client-runtime-3.3.6.jar \
+          
https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-client-runtime/3.3.6/hadoop-client-runtime-3.3.6.jar
+        curl -sSfL -o /plugins/iceberg/commons-logging-1.2.jar \
+          
https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar
+        curl -sSfL -o /plugins/iceberg/jackson-core-2.15.2.jar \
+          
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.15.2/jackson-core-2.15.2.jar
+        curl -sSfL -o /plugins/iceberg/jackson-databind-2.15.2.jar \
+          
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.15.2/jackson-databind-2.15.2.jar
+        curl -sSfL -o /plugins/iceberg/jackson-annotations-2.15.2.jar \
+          
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.15.2/jackson-annotations-2.15.2.jar
+        echo 'Plugins ready:' && ls -la /plugins/iceberg/
+    volumes:
+      - fluss-plugins:/plugins
+
+  coordinator:
+    image: apache/fluss:0.9.0-incubating
+    command: coordinatorServer
+    depends_on:
+      zookeeper: { condition: service_healthy }
+      metastore: { condition: service_healthy }
+      init-plugins: { condition: service_completed_successfully }
+    environment:
+      - |
+        FLUSS_PROPERTIES=
+        zookeeper.address: zookeeper:2181
+        coordinator.host: coordinator
+        coordinator.port: 9123
+        remote.data.dir: /tmp/fluss/remote-data
+        datalake.format: iceberg
+        datalake.iceberg.type: hive
+        datalake.iceberg.uri: thrift://metastore:9083
+        datalake.iceberg.warehouse: /tmp/fluss/warehouse
+    volumes:
+      - fluss-data:/tmp/fluss
+      - fluss-plugins:/opt/fluss/plugins
+    healthcheck:
+      test: ["CMD-SHELL", "bash -c 'echo > /dev/tcp/coordinator/9123' 
2>/dev/null"]
+      interval: 10s
+      timeout: 5s
+      retries: 12
+      start_period: 30s
+
+  tablet-server:
+    image: apache/fluss:0.9.0-incubating

Review Comment:
   ditto



##########
website/docs/streaming-lakehouse/integrate-data-lakes/catalogs/glue.md:
##########
@@ -0,0 +1,422 @@
+---
+title: AWS Glue
+sidebar_position: 2
+---
+
+# AWS Glue
+
+## Introduction
+
+[AWS Glue](https://aws.amazon.com/glue/) is a serverless data integration 
service that includes a central metadata repository known as the AWS Glue Data 
Catalog. The Glue Data Catalog is compatible with Apache Iceberg, making it a 
convenient option for managing Iceberg table metadata on AWS.
+
+This guide explains how to configure Fluss to use AWS Glue as its Iceberg 
catalog. For general Iceberg integration details (table mapping, data types, 
limitations), see [Iceberg](../formats/iceberg.md).
+
+## How It Works
+
+When Fluss is configured with AWS Glue as its Iceberg catalog:
+
+1. **Data ingestion**: Applications write data to Fluss tables using the Fluss 
client (Java/Python) or Flink SQL. Fluss stores this data in its real-time log.
+2. **Tiering to Iceberg**: A separate Flink job (the tiering service) 
periodically reads accumulated data from Fluss, converts it to Parquet format, 
writes the files to S3, and commits an Iceberg snapshot to the Glue Data 
Catalog.
+3. **Query via Athena/Spark/Trino**: Any Iceberg-compatible engine can 
discover and query the tiered tables through AWS Glue — no additional 
configuration needed.
+
+```mermaid
+flowchart LR
+    subgraph Sources["Data Sources"]
+        A1[App - Fluss Client]
+        A2[Flink CDC Job]
+    end
+
+    subgraph Fluss["Fluss Cluster"]
+        B1[Coordinator]
+        B2[TabletServer]
+        B3[ZooKeeper]
+    end
+
+    subgraph AWS["AWS"]
+        C1[Glue Data Catalog]
+        C2[S3 Bucket]
+        C3[Athena / Spark / Trino]
+    end
+
+    A1 -->|write| B2
+    A2 -->|write| B2
+    B1 -->|register tables| C1
+
+    subgraph Tiering["Flink Tiering Job"]
+        D1[Reads Fluss log]
+        D2[Writes Parquet to S3]
+        D3[Commits Iceberg snapshot]
+    end
+
+    B2 -->|read log| D1
+    D2 -->|Parquet files| C2
+    D3 -->|snapshot metadata| C1
+    C1 -->|discover tables| C3
+    C2 -->|read data| C3
+```
+
+> **Note**: Flink is used here for the tiering service (Fluss → 
Iceberg/S3/Glue) and optionally for data ingestion via SQL. Applications can 
also write directly to Fluss using the client library (Java, Python). The 
tiering service is what bridges Fluss's real-time log to the Glue Data Catalog.
+
+## Prerequisites
+
+### Java Version
+
+Fluss 0.9.x requires **Java 17 or later** for the Tablet Server. Java 11 will 
fail with `NoSuchMethodError: MappedByteBuffer.duplicate()`.
+
+### AWS IAM Permissions
+
+The processes running Fluss servers and the Flink tiering service must have 
IAM permissions for both Glue and S3. Below is a minimal IAM policy:
+
+```json
+{
+  "Version": "2012-10-17",
+  "Statement": [
+    {
+      "Effect": "Allow",
+      "Action": [
+        "glue:CreateDatabase",
+        "glue:GetDatabase",
+        "glue:GetDatabases",
+        "glue:DeleteDatabase",
+        "glue:CreateTable",
+        "glue:GetTable",
+        "glue:GetTables",
+        "glue:UpdateTable",
+        "glue:DeleteTable"
+      ],
+      "Resource": [
+        "arn:aws:glue:<region>:<account-id>:catalog",
+        "arn:aws:glue:<region>:<account-id>:database/*",
+        "arn:aws:glue:<region>:<account-id>:table/*"
+      ]
+    },
+    {
+      "Effect": "Allow",
+      "Action": [
+        "s3:GetObject",
+        "s3:PutObject",
+        "s3:DeleteObject",
+        "s3:ListBucket"
+      ],
+      "Resource": [
+        "arn:aws:s3:::<your-bucket>",
+        "arn:aws:s3:::<your-bucket>/*"
+      ]
+    }
+  ]
+}
+```
+
+> **NOTE**: If your account uses **AWS Lake Formation**, the IAM role must 
also have Lake Formation permissions (Create Table, Describe, Alter, Insert, 
Select, Delete, Drop) on the target database. Standard IAM `glue:*` permissions 
alone are not sufficient when Lake Formation governance is enabled.
+
+### Prepare Required JARs
+
+Fluss bundles `iceberg-core` but does **not** bundle the Glue catalog 
implementation or the AWS SDK. You must supply additional JARs.
+
+#### For Fluss Servers (Coordinator & Tablet Servers)
+
+Place the following JARs in the `${FLUSS_HOME}/plugins/iceberg/` directory:
+
+- **Iceberg AWS Bundle**: 
[iceberg-aws-bundle-1.10.1.jar](https://repo1.maven.org/maven2/org/apache/iceberg/iceberg-aws-bundle/1.10.1/iceberg-aws-bundle-1.10.1.jar)
+- **Iceberg AWS**: 
[iceberg-aws-1.10.1.jar](https://repo1.maven.org/maven2/org/apache/iceberg/iceberg-aws/1.10.1/iceberg-aws-1.10.1.jar)
+- **Failsafe**: 
[failsafe-3.3.2.jar](https://repo1.maven.org/maven2/dev/failsafe/failsafe/3.3.2/failsafe-3.3.2.jar)
 — required by `iceberg-aws` for Glue API retry logic
+
+Both Iceberg JARs are required. The bundle provides AWS SDK v2 dependencies, 
while `iceberg-aws` provides the `GlueCatalog` class that Iceberg loads via 
reflection. The plugin classloader cannot find `GlueCatalog` from the bundle 
alone. The `failsafe` library is a transitive dependency of `iceberg-aws` that 
is not bundled.
+
+> **NOTE**: You need **all three** JARs. Using only the bundle will result in 
`ClassNotFoundException: org.apache.iceberg.aws.glue.GlueCatalog`. Missing 
`failsafe` will cause `NoClassDefFoundError: dev/failsafe/FailsafeException`.
+
+Additionally, you need the Fluss S3 filesystem plugin for remote storage 
access. Place 
[fluss-fs-s3-$FLUSS_VERSION$.jar]($FLUSS_MAVEN_REPO_URL$/org/apache/fluss/fluss-fs-s3/$FLUSS_VERSION$/fluss-fs-s3-$FLUSS_VERSION$.jar)
 in `${FLUSS_HOME}/plugins/s3/`. See [S3 
Dependencies](../../../maintenance/filesystems/s3.md#dependencies) for details.
+
+> **TIP**: The Fluss binary distribution already includes 
`fluss-lake-iceberg-$FLUSS_VERSION$.jar` in `plugins/iceberg/`. You do not need 
to download it separately — only add the three JARs above (iceberg-aws-bundle, 
iceberg-aws, failsafe).
+
+#### For the Flink Tiering Service
+
+Place the following JARs in `${FLINK_HOME}/lib`:
+
+1. **Iceberg AWS Bundle**: `iceberg-aws-bundle-1.10.1.jar` (same as above)
+2. **Iceberg AWS**: `iceberg-aws-1.10.1.jar` (same as above — provides 
`GlueCatalog` class)
+3. **Failsafe**: `failsafe-3.3.2.jar` (same as above — Glue retry logic)
+4. **Fluss Flink Connector**: 
[fluss-flink-1.20-$FLUSS_VERSION$.jar]($FLUSS_MAVEN_REPO_URL$/org/apache/fluss/fluss-flink-1.20/$FLUSS_VERSION$/fluss-flink-1.20-$FLUSS_VERSION$.jar)
 (pick the version matching your Flink runtime)
+5. **Fluss Lake Iceberg**: 
[fluss-lake-iceberg-$FLUSS_VERSION$.jar]($FLUSS_MAVEN_REPO_URL$/org/apache/fluss/fluss-lake-iceberg/$FLUSS_VERSION$/fluss-lake-iceberg-$FLUSS_VERSION$.jar)
+6. **Fluss Flink Tiering**: 
[fluss-flink-tiering-$FLUSS_VERSION$.jar]($FLUSS_MAVEN_REPO_URL$/org/apache/fluss/fluss-flink-tiering/$FLUSS_VERSION$/fluss-flink-tiering-$FLUSS_VERSION$.jar)
 — the tiering job JAR itself
+7. **Fluss S3 Filesystem**: 
[fluss-fs-s3-$FLUSS_VERSION$.jar]($FLUSS_MAVEN_REPO_URL$/org/apache/fluss/fluss-fs-s3/$FLUSS_VERSION$/fluss-fs-s3-$FLUSS_VERSION$.jar)
 (if S3 is used as Fluss remote storage)
+8. **Hadoop Client**: 
[hadoop-client-api-3.3.6.jar](https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-client-api/3.3.6/hadoop-client-api-3.3.6.jar)
 and 
[hadoop-client-runtime-3.3.6.jar](https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-client-runtime/3.3.6/hadoop-client-runtime-3.3.6.jar)
 — required by the Iceberg Parquet writer
+
+> **NOTE**: Despite the Glue catalog itself not requiring Hadoop, the 
**tiering service** needs Hadoop classes 
(`org.apache.hadoop.conf.Configuration`) for writing Parquet files via Iceberg. 
Use the `hadoop-client-api` and `hadoop-client-runtime` JARs (not the full 
Hadoop distribution or `flink-shaded-hadoop-2-uber`) to avoid classpath 
conflicts with Flink's bundled Avro version. Using the uber JAR causes 
`NoSuchMethodError: LogicalTypes.timestampNanos()`.
+
+> **WARNING**: Do **not** add S3 credentials to Flink's configuration file 
(`config.yaml` or `flink-conf.yaml`) by appending key-value pairs — this can 
break Flink's memory configuration parser. The credential provider chain 
configured in Fluss's `server.yaml` handles S3 access for the tiering service 
automatically.
+
+## Configure Fluss with AWS Glue
+
+### Cluster Configuration
+
+Add the following to your `server.yaml`:
+
+```yaml
+datalake.format: iceberg
+datalake.iceberg.type: glue
+datalake.iceberg.warehouse: s3://<your-bucket>/<warehouse-path>
+```
+
+Fluss strips the `datalake.iceberg.` prefix and passes the remaining 
properties directly to Iceberg's Glue catalog. The properties above become 
`type=glue` and `warehouse=s3://...` when initializing the catalog.
+
+You can pass any [Iceberg AWS catalog 
property](https://iceberg.apache.org/docs/1.10.1/aws/#glue-catalog) using the 
same prefix. Common additional properties:
+
+```yaml
+# Specify the AWS region (required if not using default region from 
credentials chain)
+datalake.iceberg.client.region: us-east-1
+
+# Use S3FileIO explicitly (Glue catalog defaults to this when warehouse is 
s3://)
+datalake.iceberg.io-impl: org.apache.iceberg.aws.s3.S3FileIO
+
+# Optional: restrict catalog to a specific Glue database prefix
+datalake.iceberg.glue.catalog-id: <aws-account-id>
+```
+
+#### Authentication
+
+**Glue Catalog**: The Iceberg AWS SDK uses the [default credentials provider 
chain](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/credentials-chain.html)
 automatically. If running on AWS (EKS, ECS, EC2) with an attached IAM role, no 
credential configuration is needed for the Glue catalog connection.
+
+**S3 Filesystem Plugin**: The Fluss S3 filesystem plugin (used for 
`remote.data.dir`) requires explicit credential provider configuration. Add the 
following to `server.yaml`:
+
+```yaml
+# Tell Hadoop S3A which credential providers to use (in order of preference)
+fs.s3a.aws.credentials.provider: <provider-class-list>
+```
+
+Choose the provider chain for your environment:
+
+| Environment | Provider Chain |
+|-------------|---------------|
+| **ECS Fargate** | 
`com.amazonaws.auth.ContainerCredentialsProvider,com.amazonaws.auth.EnvironmentVariableCredentialsProvider,com.amazonaws.auth.InstanceProfileCredentialsProvider`
 |
+| **EKS (IRSA)** | 
`com.amazonaws.auth.WebIdentityTokenCredentialsProvider,com.amazonaws.auth.EnvironmentVariableCredentialsProvider,com.amazonaws.auth.InstanceProfileCredentialsProvider`
 |
+| **EC2 (instance profile)** | 
`com.amazonaws.auth.InstanceProfileCredentialsProvider` |
+
+Example for ECS Fargate:
+
+```yaml
+fs.s3a.aws.credentials.provider: 
com.amazonaws.auth.ContainerCredentialsProvider,com.amazonaws.auth.EnvironmentVariableCredentialsProvider,com.amazonaws.auth.InstanceProfileCredentialsProvider
+```
+
+The credential provider chain handles automatic credential refresh — no static 
keys or manual token rotation needed.
+
+> **NOTE**: For non-standard AWS regions (GovCloud, China), you must also set 
the S3 endpoint explicitly. Hadoop S3A defaults to `s3.amazonaws.com` which 
does not work for these partitions:
+> ```yaml
+> fs.s3a.endpoint: s3.us-gov-west-1.amazonaws.com   # GovCloud
+> fs.s3a.endpoint: s3.cn-north-1.amazonaws.com.cn   # China
+> ```
+
+> **NOTE**: You may see a non-fatal warning: `"Session credentials from the 
configured AWS credentials provider are not supported for Fluss S3 client-token 
generation."` This is expected — the delegation token subsystem cannot generate 
tokens from session credentials, but the actual S3 file operations work 
correctly via the provider chain.
+
+**Static Credentials (Testing Only)**:
+
+For local development or testing environments where no IAM role is available:
+
+```yaml
+s3.access.key: <your-access-key>
+s3.secret.key: <your-secret-key>
+s3.endpoint: s3.<your-region>.amazonaws.com
+```
+
+### Start Tiering Service
+
+Follow the [Iceberg tiering service setup](../formats/iceberg.md) to prepare 
the required JARs. Launch the Flink tiering job with Glue parameters:
+
+```bash
+${FLINK_HOME}/bin/flink run /path/to/fluss-flink-tiering-$FLUSS_VERSION$.jar \
+    --fluss.bootstrap.servers <coordinator-host>:9123 \
+    --datalake.format iceberg \
+    --datalake.iceberg.type glue \
+    --datalake.iceberg.warehouse s3://<your-bucket>/<warehouse-path> \
+    --datalake.iceberg.client.region <your-aws-region> \
+    --datalake.iceberg.io-impl org.apache.iceberg.aws.s3.S3FileIO
+```
+
+## Quick Start (Full Bootstrap)
+
+This section shows the complete setup from a blank Linux machine to data 
queryable in Athena. Adapt paths and versions for your environment.
+
+```bash
+# ─── 1. Install prerequisites ───
+# Java 17+ required (Amazon Corretto, OpenJDK, etc.)
+java -version  # Must show 17+
+
+# ─── 2. Install ZooKeeper ───
+wget -q 
https://archive.apache.org/dist/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz
+tar -xzf apache-zookeeper-3.8.4-bin.tar.gz -C /opt/zookeeper 
--strip-components=1
+cat > /opt/zookeeper/conf/zoo.cfg <<EOF
+tickTime=2000
+dataDir=/var/lib/zookeeper
+clientPort=2181
+EOF
+
+# ─── 3. Install Fluss ───
+wget -q 
https://dlcdn.apache.org/incubator/fluss/fluss-0.9.1-incubating/fluss-0.9.1-incubating-bin.tgz
+tar -xzf fluss-0.9.1-incubating-bin.tgz -C /opt/fluss --strip-components=1
+
+# ─── 4. Add Glue JARs to Fluss plugins/iceberg/ ───
+wget -O /opt/fluss/plugins/iceberg/iceberg-aws-bundle-1.10.1.jar \
+  
https://repo1.maven.org/maven2/org/apache/iceberg/iceberg-aws-bundle/1.10.1/iceberg-aws-bundle-1.10.1.jar
+wget -O /opt/fluss/plugins/iceberg/iceberg-aws-1.10.1.jar \
+  
https://repo1.maven.org/maven2/org/apache/iceberg/iceberg-aws/1.10.1/iceberg-aws-1.10.1.jar
+wget -O /opt/fluss/plugins/iceberg/failsafe-3.3.2.jar \
+  https://repo1.maven.org/maven2/dev/failsafe/failsafe/3.3.2/failsafe-3.3.2.jar
+
+# ─── 5. Write server.yaml ───
+cat > /opt/fluss/conf/server.yaml <<EOF
+zookeeper.address: localhost:2181
+coordinator.host: localhost
+coordinator.port: 9123
+tablet-server.host: localhost
+tablet-server.id: 0
+tablet-server.port: 9124
+data.dir: /var/lib/fluss/data
+remote.data.dir: s3://YOUR-BUCKET/fluss-data
+
+datalake.format: iceberg
+datalake.iceberg.type: glue
+datalake.iceberg.warehouse: s3://YOUR-BUCKET/iceberg-warehouse
+datalake.iceberg.client.region: YOUR-REGION
+datalake.iceberg.io-impl: org.apache.iceberg.aws.s3.S3FileIO
+
+# S3 credentials — use the provider chain for your environment
+# ECS Fargate:
+fs.s3a.aws.credentials.provider: 
com.amazonaws.auth.ContainerCredentialsProvider,com.amazonaws.auth.EnvironmentVariableCredentialsProvider,com.amazonaws.auth.InstanceProfileCredentialsProvider
+# EKS (IRSA): use WebIdentityTokenCredentialsProvider instead of 
ContainerCredentialsProvider
+# EC2: use InstanceProfileCredentialsProvider alone
+
+# Required for non-standard regions (GovCloud, China):
+# fs.s3a.endpoint: s3.YOUR-REGION.amazonaws.com
+EOF
+
+# ─── 6. Start services ───
+/opt/zookeeper/bin/zkServer.sh start
+sleep 3
+/opt/fluss/bin/coordinator-server.sh start
+sleep 5
+/opt/fluss/bin/tablet-server.sh start
+sleep 5
+
+# ─── 7. Install Flink + tiering JARs ───
+wget -q 
https://archive.apache.org/dist/flink/flink-1.20.1/flink-1.20.1-bin-scala_2.12.tgz
+tar -xzf flink-1.20.1-bin-scala_2.12.tgz -C /opt/flink --strip-components=1
+
+# Copy/download all required JARs to Flink lib
+cp /opt/fluss/plugins/iceberg/iceberg-aws-bundle-1.10.1.jar /opt/flink/lib/
+cp /opt/fluss/plugins/iceberg/iceberg-aws-1.10.1.jar /opt/flink/lib/
+cp /opt/fluss/plugins/iceberg/failsafe-3.3.2.jar /opt/flink/lib/
+wget -O /opt/flink/lib/fluss-flink-1.20-0.9.1-incubating.jar \
+  
https://repo1.maven.org/maven2/org/apache/fluss/fluss-flink-1.20/0.9.1-incubating/fluss-flink-1.20-0.9.1-incubating.jar
+wget -O /opt/flink/lib/fluss-lake-iceberg-0.9.1-incubating.jar \
+  
https://repo1.maven.org/maven2/org/apache/fluss/fluss-lake-iceberg/0.9.1-incubating/fluss-lake-iceberg-0.9.1-incubating.jar
+wget -O /opt/flink/lib/fluss-flink-tiering-0.9.1-incubating.jar \
+  
https://repo1.maven.org/maven2/org/apache/fluss/fluss-flink-tiering/0.9.1-incubating/fluss-flink-tiering-0.9.1-incubating.jar
+wget -O /opt/flink/lib/hadoop-client-api-3.3.6.jar \
+  
https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-client-api/3.3.6/hadoop-client-api-3.3.6.jar
+wget -O /opt/flink/lib/hadoop-client-runtime-3.3.6.jar \
+  
https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-client-runtime/3.3.6/hadoop-client-runtime-3.3.6.jar
+
+# Start Flink
+/opt/flink/bin/start-cluster.sh
+sleep 5
+
+# ─── 8. Create table + insert data (single Flink SQL session) ───
+cat > /tmp/setup.sql <<EOF
+CREATE CATALOG fluss_catalog WITH ('type' = 'fluss', 'bootstrap.servers' = 
'localhost:9123');
+USE CATALOG fluss_catalog;
+CREATE DATABASE IF NOT EXISTS my_database;
+USE my_database;
+CREATE TABLE test_table (id BIGINT, name STRING, PRIMARY KEY (id) NOT ENFORCED)
+  WITH ('table.datalake.enabled' = 'true', 'table.datalake.freshness' = '30s');
+INSERT INTO test_table VALUES (1, 'hello'), (2, 'world');
+EOF
+/opt/flink/bin/sql-client.sh -f /tmp/setup.sql
+
+# ─── 9. Start tiering service ───
+/opt/flink/bin/flink run -d 
/opt/flink/lib/fluss-flink-tiering-0.9.1-incubating.jar \
+  --fluss.bootstrap.servers localhost:9123 \
+  --datalake.format iceberg \
+  --datalake.iceberg.type glue \
+  --datalake.iceberg.warehouse s3://YOUR-BUCKET/iceberg-warehouse \
+  --datalake.iceberg.client.region YOUR-REGION \
+  --datalake.iceberg.io-impl org.apache.iceberg.aws.s3.S3FileIO
+
+# ─── 10. Query in Athena ───
+# Wait ~30s for tiering to flush, then:
+#   SELECT * FROM my_database.test_table;
+```
+
+## Usage Example
+
+### Create a Datalake-Enabled Table
+
+Connect to Fluss via Flink SQL and create a table with data lake tiering 
enabled:
+
+```sql title="Flink SQL"
+CREATE CATALOG fluss_catalog WITH (
+    'type' = 'fluss',
+    'bootstrap.servers' = '<coordinator-host>:9123'
+);
+
+USE CATALOG fluss_catalog;
+CREATE DATABASE IF NOT EXISTS my_database;
+USE my_database;
+
+CREATE TABLE customer_orders (
+    `order_id` BIGINT,
+    `customer_name` STRING,
+    `total_amount` DECIMAL(15, 2),
+    `order_date` STRING,
+    PRIMARY KEY (`order_id`) NOT ENFORCED
+) WITH (
+    'table.datalake.enabled' = 'true',
+    'table.datalake.freshness' = '30s'
+);
+```
+
+Fluss will register the database in ZooKeeper and create a corresponding 
Iceberg table in the Glue Data Catalog (using the same database name). Once 
data is ingested and the tiering service commits, Parquet files appear in the 
S3 warehouse path.
+
+> **NOTE**: The database must be created in the Fluss catalog first — Fluss 
maintains its own database registry in ZooKeeper. The database name in Fluss 
maps 1:1 to the Glue database name during tiering.
+
+### Query Data with Athena
+
+AWS Athena uses the Glue Data Catalog by default, so tiered tables are 
immediately queryable:
+
+```sql title="Athena SQL"
+SELECT * FROM my_database.customer_orders LIMIT 10;
+```
+
+### Query Data with Flink (Union Read)
+
+```sql title="Flink SQL"
+SET 'execution.runtime-mode' = 'batch';
+
+-- Union read: combines fresh data in Fluss with historical data in Iceberg
+SELECT COUNT(*) FROM customer_orders;

Review Comment:
   I don't think we can do union read on Iceberg PK tables, it's a known 
limitation.



##########
website/docs/streaming-lakehouse/integrate-data-lakes/catalogs/hive.md:
##########
@@ -0,0 +1,452 @@
+---
+title: Hive Metastore
+sidebar_position: 3
+---
+
+# Hive Metastore
+
+## Introduction
+
+The **Hive Metastore (HMS)** is a central metadata repository commonly used in 
Apache Hadoop and other big data ecosystems to store schema and metadata 
information for tables. Apache Iceberg provides native integration with Hive 
Metastore, storing Iceberg table names and metadata locations directly within 
HMS.
+
+This guide explains how to configure Fluss to use Hive Metastore as its 
Iceberg catalog. For general Iceberg integration details (table mapping, data 
types, limitations), see [Iceberg](../formats/iceberg.md).
+
+## How It Works
+
+When Fluss is configured with Hive Metastore as its Iceberg catalog:
+
+1. **Data ingestion**: Applications write data to Fluss tables using the Fluss 
client (Java/Python), Flink SQL, or any Kafka-compatible producer. Fluss stores 
this data in its real-time log.
+2. **Tiering to Iceberg**: A separate Flink job (the [tiering 
service](maintenance/tiered-storage/lakehouse-storage.md#start-the-datalake-tiering-service))
 periodically reads accumulated data from Fluss, converts it to Parquet format, 
writes the files to HDFS (or S3/OSS), and commits an Iceberg snapshot to the 
Hive Metastore.
+3. **Query via Spark/Trino/Flink**: Any Iceberg-compatible engine configured 
with Hive catalog can discover and query the tiered tables through HMS.
+
+```mermaid
+flowchart LR
+    subgraph Sources["Data Sources"]
+        A1[App - Fluss Client]
+        A2[Flink CDC Job]
+    end
+
+    subgraph Fluss["Fluss Cluster"]
+        B1[Coordinator]
+        B2[TabletServer]
+        B3[ZooKeeper]
+    end
+
+    subgraph Hadoop["Hadoop / On-Prem"]
+        C1[Hive Metastore]
+        C2[HDFS / S3 / OSS]
+        C3[Spark / Trino / StarRocks]
+    end
+
+    A1 -->|write| B2
+    A2 -->|write| B2
+    B1 -->|register tables| C1
+
+    subgraph Tiering["Flink Tiering Job"]
+        D1[Reads Fluss log]
+        D2[Writes Parquet]
+        D3[Commits Iceberg snapshot]
+    end
+
+    B2 -->|read log| D1
+    D2 -->|Parquet files| C2
+    D3 -->|snapshot metadata| C1
+    C1 -->|discover tables| C3
+    C2 -->|read data| C3
+```
+
+> **Note**: The tiering service is a Flink job that bridges Fluss's real-time 
log to Iceberg tables in Hive Metastore. Flink is also commonly used for data 
ingestion (via SQL), but applications can write directly to Fluss using the 
client library.
+
+## Prerequisites
+
+### Java Version
+
+Fluss 0.9.x requires **Java 17 or later** for the Tablet Server.
+
+### Running Hive Metastore
+
+Ensure you have a running Hive Metastore service (version **2.x or 3.x**). By 
default, HMS listens on thrift port `9083` (e.g., 
`thrift://<metastore-host>:9083`).
+
+:::warning Hive Metastore Version Compatibility
+Iceberg 1.10.1 compiles its Hive catalog client against **Hive 2.3.10**. This 
client is compatible with HMS **2.x and 3.x** servers. HMS **4.x** uses an 
incompatible thrift protocol and will fail with `TApplicationException: Invalid 
method name: 'get_table'`. Use HMS 3.x or earlier.
+:::
+
+### Prepare Required JARs
+
+Iceberg's Hive catalog class (`HiveCatalog`) is distributed separately from 
`iceberg-core` and requires the Hive metastore client, Hadoop, and several 
transitive dependencies. You must supply all of them.
+
+#### For Fluss Servers (Coordinator & Tablet Servers)
+
+Download and place the following JARs in the `${FLUSS_HOME}/plugins/iceberg/` 
directory:
+
+| # | JAR | Size | Purpose |
+|---|-----|------|---------|
+| 1 | 
[iceberg-hive-metastore-1.10.1.jar](https://repo1.maven.org/maven2/org/apache/iceberg/iceberg-hive-metastore/1.10.1/iceberg-hive-metastore-1.10.1.jar)
 | 92 KB | Contains `HiveCatalog` class |
+| 2 | 
[hive-exec-2.3.10.jar](https://repo1.maven.org/maven2/org/apache/hive/hive-exec/2.3.10/hive-exec-2.3.10.jar)
 | 46 MB | Uber JAR: bundles `HiveConf`, `HiveMetaStoreClient`, Thrift, Guava |
+| 3 | 
[hadoop-client-api-3.3.6.jar](https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-client-api/3.3.6/hadoop-client-api-3.3.6.jar)
 | 20 MB | Hadoop public API (`Configuration`, `FileSystem`) |
+| 4 | 
[hadoop-client-runtime-3.3.6.jar](https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-client-runtime/3.3.6/hadoop-client-runtime-3.3.6.jar)
 | 30 MB | Hadoop runtime implementations |
+| 5 | 
[commons-logging-1.2.jar](https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar)
 | 62 KB | Logging facade required by Hadoop and Hive |
+| 6 | 
[jackson-core-2.15.2.jar](https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.15.2/jackson-core-2.15.2.jar)
 | 571 KB | JSON processing |
+| 7 | 
[jackson-databind-2.15.2.jar](https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.15.2/jackson-databind-2.15.2.jar)
 | 1.5 MB | JSON data binding |
+| 8 | 
[jackson-annotations-2.15.2.jar](https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.15.2/jackson-annotations-2.15.2.jar)
 | 75 KB | JSON annotations |
+
+> **NOTE**: The Fluss binary distribution already includes 
`fluss-lake-iceberg-$FLUSS_VERSION$.jar` in `plugins/iceberg/`. You do not need 
to download it separately — only add the 8 JARs above.
+
+> **TIP**: `hive-exec-2.3.10.jar` is a shaded uber JAR that bundles the Hive 
metastore client, `HiveConf`, Apache Thrift, libfb303, and Guava. Using the 
full `hive-exec` (not the `-core` variant) avoids needing to track down each 
transitive dependency individually. Despite its size, it is the simplest way to 
satisfy all Hive client requirements.
+
+#### For the Flink Tiering Service
+
+Place the following JARs in `${FLINK_HOME}/lib`:
+
+1. **All 8 JARs listed above** (iceberg-hive-metastore, hive-exec, 
hadoop-client-api, hadoop-client-runtime, commons-logging, jackson-core, 
jackson-databind, jackson-annotations)
+2. **Fluss Flink Connector**: 
[fluss-flink-1.20-$FLUSS_VERSION$.jar]($FLUSS_MAVEN_REPO_URL$/org/apache/fluss/fluss-flink-1.20/$FLUSS_VERSION$/fluss-flink-1.20-$FLUSS_VERSION$.jar)
 (pick the version matching your Flink runtime)
+3. **Fluss Lake Iceberg**: 
[fluss-lake-iceberg-$FLUSS_VERSION$.jar]($FLUSS_MAVEN_REPO_URL$/org/apache/fluss/fluss-lake-iceberg/$FLUSS_VERSION$/fluss-lake-iceberg-$FLUSS_VERSION$.jar)
+4. **Fluss Flink Tiering**: 
[fluss-flink-tiering-$FLUSS_VERSION$.jar]($FLUSS_MAVEN_REPO_URL$/org/apache/fluss/fluss-flink-tiering/$FLUSS_VERSION$/fluss-flink-tiering-$FLUSS_VERSION$.jar)
 — the tiering job JAR itself
+
+### Hadoop Classpath Configuration (HDFS Only)
+
+If your warehouse is on **HDFS**, both Fluss and Flink must be able to resolve 
HDFS paths. This requires Hadoop configuration files on the classpath.
+
+**Option 1: Export Hadoop Classpath (Recommended)**
+
+```bash
+export HADOOP_CLASSPATH=`hadoop classpath`
+```
+
+**Option 2: Copy Hadoop XML Configs**
+
+Copy `core-site.xml` and `hdfs-site.xml` to the configuration directories of 
both Fluss (`${FLUSS_HOME}/conf/`) and Flink (`${FLINK_HOME}/conf/`).
+
+> **NOTE**: If your warehouse uses a local filesystem path (for testing) or 
S3/OSS (with the appropriate Fluss filesystem plugin), you do not need 
`HADOOP_CLASSPATH`.
+
+## Configure Fluss with Hive Metastore
+
+### Cluster Configuration
+
+Add the following to your `server.yaml`:
+
+```yaml
+datalake.format: iceberg
+datalake.iceberg.type: hive
+datalake.iceberg.uri: thrift://<hive-metastore-host>:9083
+datalake.iceberg.warehouse: hdfs://<namenode-host>:9000/user/hive/warehouse
+```
+
+Fluss strips the `datalake.iceberg.` prefix and passes the remaining 
properties directly to Iceberg's Hive catalog. The properties above become 
`type=hive`, `uri=thrift://...`, and `warehouse=hdfs://...` when initializing 
the catalog.
+
+:::note
+If your Hive warehouse is on cloud object storage, set 
`datalake.iceberg.warehouse` to the corresponding URI (e.g., 
`s3://<your-bucket>/warehouse`) and configure the required filesystem plugin. 
See [AWS Glue](glue.md) for S3 credential setup.
+:::
+
+### Start Tiering Service
+
+Follow the [Iceberg tiering service 
setup](../formats/iceberg.md#start-tiering-service-to-iceberg) instructions to 
prepare the environment. Launch the Flink tiering job:
+
+```bash
+${FLINK_HOME}/bin/flink run /path/to/fluss-flink-tiering-$FLUSS_VERSION$.jar \
+    --fluss.bootstrap.servers <coordinator-host>:9123 \
+    --datalake.format iceberg \
+    --datalake.iceberg.type hive \
+    --datalake.iceberg.uri thrift://<hive-metastore-host>:9083 \
+    --datalake.iceberg.warehouse 
hdfs://<namenode-host>:9000/user/hive/warehouse
+```
+
+## Quick Start (Docker Compose)
+
+This section provides a complete docker-compose setup that runs the entire 
Hive Metastore integration end-to-end. It starts HMS, ZooKeeper, Fluss, Flink, 
creates a table, inserts data, tiers it to Iceberg via HMS, and reads it back. 
No cloud account or Hadoop cluster needed — everything runs locally.
+
+**Prerequisites**: Docker and Docker Compose installed.
+
+Create a `docker-compose.yml`:
+
+```yaml
+services:
+  # Hive Metastore (Thrift on port 9083, embedded Derby)
+  metastore:
+    image: apache/hive:3.1.3
+    environment:
+      SERVICE_NAME: metastore
+    ports:
+      - "9083:9083"
+    healthcheck:
+      test: ["CMD-SHELL", "bash -c 'echo > /dev/tcp/localhost/9083' 
2>/dev/null"]
+      interval: 10s
+      timeout: 10s
+      retries: 15
+      start_period: 90s
+
+  zookeeper:
+    image: zookeeper:3.8.4
+    healthcheck:
+      test: ["CMD", "zkServer.sh", "status"]
+      interval: 5s
+      timeout: 5s
+      retries: 5
+
+  # Downloads plugin JARs into a shared volume
+  init-plugins:
+    image: amazoncorretto:17
+    entrypoint: ["/bin/bash", "-c"]
+    command:
+      - |
+        set -e
+        yum install -y curl 2>/dev/null
+        mkdir -p /plugins/iceberg
+        curl -sSfL -o /plugins/iceberg/iceberg-hive-metastore-1.10.1.jar \
+          
https://repo1.maven.org/maven2/org/apache/iceberg/iceberg-hive-metastore/1.10.1/iceberg-hive-metastore-1.10.1.jar
+        curl -sSfL -o /plugins/iceberg/hive-exec-2.3.10.jar \
+          
https://repo1.maven.org/maven2/org/apache/hive/hive-exec/2.3.10/hive-exec-2.3.10.jar
+        curl -sSfL -o /plugins/iceberg/hadoop-client-api-3.3.6.jar \
+          
https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-client-api/3.3.6/hadoop-client-api-3.3.6.jar
+        curl -sSfL -o /plugins/iceberg/hadoop-client-runtime-3.3.6.jar \
+          
https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-client-runtime/3.3.6/hadoop-client-runtime-3.3.6.jar
+        curl -sSfL -o /plugins/iceberg/commons-logging-1.2.jar \
+          
https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar
+        curl -sSfL -o /plugins/iceberg/jackson-core-2.15.2.jar \
+          
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.15.2/jackson-core-2.15.2.jar
+        curl -sSfL -o /plugins/iceberg/jackson-databind-2.15.2.jar \
+          
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.15.2/jackson-databind-2.15.2.jar
+        curl -sSfL -o /plugins/iceberg/jackson-annotations-2.15.2.jar \
+          
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.15.2/jackson-annotations-2.15.2.jar
+        echo 'Plugins ready:' && ls -la /plugins/iceberg/
+    volumes:
+      - fluss-plugins:/plugins
+
+  coordinator:
+    image: apache/fluss:0.9.0-incubating
+    command: coordinatorServer
+    depends_on:
+      zookeeper: { condition: service_healthy }
+      metastore: { condition: service_healthy }
+      init-plugins: { condition: service_completed_successfully }
+    environment:
+      - |
+        FLUSS_PROPERTIES=
+        zookeeper.address: zookeeper:2181
+        coordinator.host: coordinator
+        coordinator.port: 9123
+        remote.data.dir: /tmp/fluss/remote-data
+        datalake.format: iceberg
+        datalake.iceberg.type: hive
+        datalake.iceberg.uri: thrift://metastore:9083
+        datalake.iceberg.warehouse: /tmp/fluss/warehouse
+    volumes:
+      - fluss-data:/tmp/fluss
+      - fluss-plugins:/opt/fluss/plugins
+    healthcheck:
+      test: ["CMD-SHELL", "bash -c 'echo > /dev/tcp/coordinator/9123' 
2>/dev/null"]
+      interval: 10s
+      timeout: 5s
+      retries: 12
+      start_period: 30s
+
+  tablet-server:
+    image: apache/fluss:0.9.0-incubating
+    command: tabletServer
+    depends_on:
+      coordinator: { condition: service_healthy }
+    environment:
+      - |
+        FLUSS_PROPERTIES=
+        zookeeper.address: zookeeper:2181
+        tablet-server.host: tablet-server
+        tablet-server.id: 0
+        tablet-server.port: 9124
+        data.dir: /tmp/fluss/data
+        remote.data.dir: /tmp/fluss/remote-data
+        datalake.format: iceberg
+        datalake.iceberg.type: hive
+        datalake.iceberg.uri: thrift://metastore:9083
+        datalake.iceberg.warehouse: /tmp/fluss/warehouse
+    volumes:
+      - fluss-data:/tmp/fluss
+      - fluss-plugins:/opt/fluss/plugins
+    healthcheck:
+      test: ["CMD-SHELL", "bash -c 'echo > /dev/tcp/tablet-server/9124' 
2>/dev/null"]
+      interval: 10s
+      timeout: 5s
+      retries: 12
+      start_period: 30s
+
+  # Flink: creates table, inserts data, starts tiering, reads back
+  flink:
+    image: amazoncorretto:17
+    depends_on:
+      tablet-server: { condition: service_healthy }
+      metastore: { condition: service_healthy }
+    entrypoint: ["/bin/bash", "-c"]
+    command:
+      - |
+        set -e
+        yum install -y wget tar gzip procps findutils 2>&1 | tail -3
+
+        echo '=== Installing Flink 1.20.1 ==='
+        mkdir -p /opt/flink
+        wget -q 
https://archive.apache.org/dist/flink/flink-1.20.1/flink-1.20.1-bin-scala_2.12.tgz
 -O /tmp/flink.tgz
+        tar -xzf /tmp/flink.tgz -C /opt/flink --strip-components=1 && rm 
/tmp/flink.tgz
+
+        echo '=== Downloading Flink JARs ==='
+        wget -q -O /opt/flink/lib/fluss-flink-1.20-0.9.1-incubating.jar 
https://repo1.maven.org/maven2/org/apache/fluss/fluss-flink-1.20/0.9.1-incubating/fluss-flink-1.20-0.9.1-incubating.jar
+        wget -q -O /opt/flink/lib/fluss-lake-iceberg-0.9.1-incubating.jar 
https://repo1.maven.org/maven2/org/apache/fluss/fluss-lake-iceberg/0.9.1-incubating/fluss-lake-iceberg-0.9.1-incubating.jar
+        wget -q -O /opt/flink/lib/fluss-flink-tiering-0.9.1-incubating.jar 
https://repo1.maven.org/maven2/org/apache/fluss/fluss-flink-tiering/0.9.1-incubating/fluss-flink-tiering-0.9.1-incubating.jar
+        wget -q -O /opt/flink/lib/iceberg-hive-metastore-1.10.1.jar 
https://repo1.maven.org/maven2/org/apache/iceberg/iceberg-hive-metastore/1.10.1/iceberg-hive-metastore-1.10.1.jar
+        wget -q -O /opt/flink/lib/hive-exec-2.3.10.jar 
https://repo1.maven.org/maven2/org/apache/hive/hive-exec/2.3.10/hive-exec-2.3.10.jar
+        wget -q -O /opt/flink/lib/hadoop-client-api-3.3.6.jar 
https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-client-api/3.3.6/hadoop-client-api-3.3.6.jar
+        wget -q -O /opt/flink/lib/hadoop-client-runtime-3.3.6.jar 
https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-client-runtime/3.3.6/hadoop-client-runtime-3.3.6.jar
+        wget -q -O /opt/flink/lib/commons-logging-1.2.jar 
https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar
+        wget -q -O /opt/flink/lib/jackson-core-2.15.2.jar 
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.15.2/jackson-core-2.15.2.jar
+        wget -q -O /opt/flink/lib/jackson-databind-2.15.2.jar 
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.15.2/jackson-databind-2.15.2.jar
+        wget -q -O /opt/flink/lib/jackson-annotations-2.15.2.jar 
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.15.2/jackson-annotations-2.15.2.jar
+
+        echo '=== Starting Flink ==='
+        /opt/flink/bin/start-cluster.sh && sleep 10
+
+        echo '=== Creating table + inserting data ==='
+        cat > /tmp/setup.sql << 'SQLEOF'
+        CREATE CATALOG fluss_catalog WITH ('type' = 'fluss', 
'bootstrap.servers' = 'coordinator:9123');
+        USE CATALOG fluss_catalog;
+        CREATE DATABASE IF NOT EXISTS hive_test_db;
+        USE hive_test_db;
+        CREATE TABLE hive_validation (
+            `event_id` BIGINT,
+            `event_type` STRING,
+            `severity` STRING,
+            `event_date` STRING,
+            PRIMARY KEY (`event_id`) NOT ENFORCED
+        ) WITH (
+            'table.datalake.enabled' = 'true',
+            'table.datalake.freshness' = '30s'
+        );
+        INSERT INTO hive_validation VALUES (1, 'login', 'INFO', '2024-01-01'), 
(2, 'error', 'CRITICAL', '2024-01-02'), (3, 'logout', 'INFO', '2024-01-03');
+        SQLEOF
+        sed -i 's/^        //' /tmp/setup.sql
+        /opt/flink/bin/sql-client.sh -f /tmp/setup.sql
+
+        echo '=== Starting tiering service ==='
+        /opt/flink/bin/flink run -d 
/opt/flink/lib/fluss-flink-tiering-0.9.1-incubating.jar \
+          --fluss.bootstrap.servers coordinator:9123 \
+          --datalake.format iceberg \
+          --datalake.iceberg.type hive \
+          --datalake.iceberg.uri thrift://metastore:9083 \
+          --datalake.iceberg.warehouse /tmp/fluss/warehouse
+
+        echo '=== Waiting 60s for tiering to flush ==='
+        sleep 60
+
+        echo '=== Reading data back ==='
+        cat > /tmp/read.sql << 'SQLEOF'
+        CREATE CATALOG fluss_catalog WITH ('type' = 'fluss', 
'bootstrap.servers' = 'coordinator:9123');
+        USE CATALOG fluss_catalog;
+        USE hive_test_db;
+        SET 'sql-client.execution.result-mode' = 'TABLEAU';
+        SET 'execution.runtime-mode' = 'streaming';
+        SELECT * FROM hive_validation LIMIT 3;
+        SQLEOF
+        sed -i 's/^        //' /tmp/read.sql
+        /opt/flink/bin/sql-client.sh -f /tmp/read.sql
+
+        echo '=== DONE ==='
+        sleep 3600
+    volumes:
+      - fluss-data:/tmp/fluss
+
+volumes:
+  fluss-data:
+  fluss-plugins:
+```
+
+Run it:
+
+```bash
+docker compose up
+```
+
+Watch the `flink` container logs. After about 3–4 minutes (JAR downloads + 
tiering flush), you should see:
+
+```
++----+----------+------------+----------+------------+
+| op | event_id | event_type | severity | event_date |
++----+----------+------------+----------+------------+
+| +I |        1 |      login |     INFO | 2024-01-01 |
+| +I |        2 |      error | CRITICAL | 2024-01-02 |
+| +I |        3 |     logout |     INFO | 2024-01-03 |
++----+----------+------------+----------+------------+
+Received a total of 3 rows
+```
+
+Clean up when done:
+
+```bash
+docker compose down -v
+```
+
+## Usage Example
+
+### Create a Datalake-Enabled Table
+
+Connect to Fluss via Flink SQL and create a table with data lake tiering 
enabled:
+
+```sql title="Flink SQL"
+CREATE CATALOG fluss_catalog WITH (
+    'type' = 'fluss',
+    'bootstrap.servers' = '<coordinator-host>:9123'
+);
+
+USE CATALOG fluss_catalog;
+CREATE DATABASE IF NOT EXISTS my_database;
+USE my_database;
+
+CREATE TABLE daily_events (
+    `event_id` BIGINT,
+    `event_type` STRING,
+    `severity` STRING,
+    `event_date` STRING,
+    PRIMARY KEY (`event_id`) NOT ENFORCED
+) WITH (
+    'table.datalake.enabled' = 'true',
+    'table.datalake.freshness' = '30s'
+);
+```
+
+Fluss will create a corresponding Iceberg table in the Hive Metastore under 
the database matching your Fluss namespace. Once data is ingested and the 
tiering service commits a snapshot, Parquet files appear in the warehouse path 
and the table becomes queryable via HMS.
+
+> **NOTE**: The database must be created in the Fluss catalog first — Fluss 
maintains its own database registry in ZooKeeper. The database name in Fluss 
maps 1:1 to the HMS database name during tiering.
+
+### Query Data with Spark
+
+Since HMS manages the metadata, you can register HMS as an Iceberg catalog in 
Apache Spark and query the tiered table immediately:
+
+```sql title="Spark SQL"
+-- Query the tiered Iceberg table from Hive Metastore catalog
+SELECT * FROM hive_catalog.my_database.daily_events;
+```
+
+### Query Data with Flink (Union Read)
+
+```sql title="Flink SQL"
+-- Union read: combines fresh data in Fluss with historical data in Iceberg
+SET 'execution.runtime-mode' = 'streaming';
+SELECT * FROM daily_events;

Review Comment:
   ditto



##########
website/docs/streaming-lakehouse/integrate-data-lakes/catalogs/hive.md:
##########
@@ -0,0 +1,452 @@
+---
+title: Hive Metastore
+sidebar_position: 3
+---
+
+# Hive Metastore
+
+## Introduction
+
+The **Hive Metastore (HMS)** is a central metadata repository commonly used in 
Apache Hadoop and other big data ecosystems to store schema and metadata 
information for tables. Apache Iceberg provides native integration with Hive 
Metastore, storing Iceberg table names and metadata locations directly within 
HMS.
+
+This guide explains how to configure Fluss to use Hive Metastore as its 
Iceberg catalog. For general Iceberg integration details (table mapping, data 
types, limitations), see [Iceberg](../formats/iceberg.md).
+
+## How It Works
+
+When Fluss is configured with Hive Metastore as its Iceberg catalog:
+
+1. **Data ingestion**: Applications write data to Fluss tables using the Fluss 
client (Java/Python), Flink SQL, or any Kafka-compatible producer. Fluss stores 
this data in its real-time log.
+2. **Tiering to Iceberg**: A separate Flink job (the [tiering 
service](maintenance/tiered-storage/lakehouse-storage.md#start-the-datalake-tiering-service))
 periodically reads accumulated data from Fluss, converts it to Parquet format, 
writes the files to HDFS (or S3/OSS), and commits an Iceberg snapshot to the 
Hive Metastore.
+3. **Query via Spark/Trino/Flink**: Any Iceberg-compatible engine configured 
with Hive catalog can discover and query the tiered tables through HMS.
+
+```mermaid
+flowchart LR
+    subgraph Sources["Data Sources"]
+        A1[App - Fluss Client]
+        A2[Flink CDC Job]
+    end
+
+    subgraph Fluss["Fluss Cluster"]
+        B1[Coordinator]
+        B2[TabletServer]
+        B3[ZooKeeper]
+    end
+
+    subgraph Hadoop["Hadoop / On-Prem"]
+        C1[Hive Metastore]
+        C2[HDFS / S3 / OSS]
+        C3[Spark / Trino / StarRocks]
+    end
+
+    A1 -->|write| B2
+    A2 -->|write| B2
+    B1 -->|register tables| C1
+
+    subgraph Tiering["Flink Tiering Job"]
+        D1[Reads Fluss log]
+        D2[Writes Parquet]
+        D3[Commits Iceberg snapshot]
+    end
+
+    B2 -->|read log| D1
+    D2 -->|Parquet files| C2
+    D3 -->|snapshot metadata| C1
+    C1 -->|discover tables| C3
+    C2 -->|read data| C3
+```
+
+> **Note**: The tiering service is a Flink job that bridges Fluss's real-time 
log to Iceberg tables in Hive Metastore. Flink is also commonly used for data 
ingestion (via SQL), but applications can write directly to Fluss using the 
client library.
+
+## Prerequisites
+
+### Java Version
+
+Fluss 0.9.x requires **Java 17 or later** for the Tablet Server.
+
+### Running Hive Metastore
+
+Ensure you have a running Hive Metastore service (version **2.x or 3.x**). By 
default, HMS listens on thrift port `9083` (e.g., 
`thrift://<metastore-host>:9083`).
+
+:::warning Hive Metastore Version Compatibility
+Iceberg 1.10.1 compiles its Hive catalog client against **Hive 2.3.10**. This 
client is compatible with HMS **2.x and 3.x** servers. HMS **4.x** uses an 
incompatible thrift protocol and will fail with `TApplicationException: Invalid 
method name: 'get_table'`. Use HMS 3.x or earlier.
+:::
+
+### Prepare Required JARs
+
+Iceberg's Hive catalog class (`HiveCatalog`) is distributed separately from 
`iceberg-core` and requires the Hive metastore client, Hadoop, and several 
transitive dependencies. You must supply all of them.
+
+#### For Fluss Servers (Coordinator & Tablet Servers)
+
+Download and place the following JARs in the `${FLUSS_HOME}/plugins/iceberg/` 
directory:
+
+| # | JAR | Size | Purpose |
+|---|-----|------|---------|
+| 1 | 
[iceberg-hive-metastore-1.10.1.jar](https://repo1.maven.org/maven2/org/apache/iceberg/iceberg-hive-metastore/1.10.1/iceberg-hive-metastore-1.10.1.jar)
 | 92 KB | Contains `HiveCatalog` class |
+| 2 | 
[hive-exec-2.3.10.jar](https://repo1.maven.org/maven2/org/apache/hive/hive-exec/2.3.10/hive-exec-2.3.10.jar)
 | 46 MB | Uber JAR: bundles `HiveConf`, `HiveMetaStoreClient`, Thrift, Guava |
+| 3 | 
[hadoop-client-api-3.3.6.jar](https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-client-api/3.3.6/hadoop-client-api-3.3.6.jar)
 | 20 MB | Hadoop public API (`Configuration`, `FileSystem`) |
+| 4 | 
[hadoop-client-runtime-3.3.6.jar](https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-client-runtime/3.3.6/hadoop-client-runtime-3.3.6.jar)
 | 30 MB | Hadoop runtime implementations |
+| 5 | 
[commons-logging-1.2.jar](https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar)
 | 62 KB | Logging facade required by Hadoop and Hive |
+| 6 | 
[jackson-core-2.15.2.jar](https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.15.2/jackson-core-2.15.2.jar)
 | 571 KB | JSON processing |
+| 7 | 
[jackson-databind-2.15.2.jar](https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.15.2/jackson-databind-2.15.2.jar)
 | 1.5 MB | JSON data binding |
+| 8 | 
[jackson-annotations-2.15.2.jar](https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.15.2/jackson-annotations-2.15.2.jar)
 | 75 KB | JSON annotations |
+
+> **NOTE**: The Fluss binary distribution already includes 
`fluss-lake-iceberg-$FLUSS_VERSION$.jar` in `plugins/iceberg/`. You do not need 
to download it separately — only add the 8 JARs above.
+
+> **TIP**: `hive-exec-2.3.10.jar` is a shaded uber JAR that bundles the Hive 
metastore client, `HiveConf`, Apache Thrift, libfb303, and Guava. Using the 
full `hive-exec` (not the `-core` variant) avoids needing to track down each 
transitive dependency individually. Despite its size, it is the simplest way to 
satisfy all Hive client requirements.
+
+#### For the Flink Tiering Service
+
+Place the following JARs in `${FLINK_HOME}/lib`:
+
+1. **All 8 JARs listed above** (iceberg-hive-metastore, hive-exec, 
hadoop-client-api, hadoop-client-runtime, commons-logging, jackson-core, 
jackson-databind, jackson-annotations)
+2. **Fluss Flink Connector**: 
[fluss-flink-1.20-$FLUSS_VERSION$.jar]($FLUSS_MAVEN_REPO_URL$/org/apache/fluss/fluss-flink-1.20/$FLUSS_VERSION$/fluss-flink-1.20-$FLUSS_VERSION$.jar)
 (pick the version matching your Flink runtime)
+3. **Fluss Lake Iceberg**: 
[fluss-lake-iceberg-$FLUSS_VERSION$.jar]($FLUSS_MAVEN_REPO_URL$/org/apache/fluss/fluss-lake-iceberg/$FLUSS_VERSION$/fluss-lake-iceberg-$FLUSS_VERSION$.jar)
+4. **Fluss Flink Tiering**: 
[fluss-flink-tiering-$FLUSS_VERSION$.jar]($FLUSS_MAVEN_REPO_URL$/org/apache/fluss/fluss-flink-tiering/$FLUSS_VERSION$/fluss-flink-tiering-$FLUSS_VERSION$.jar)
 — the tiering job JAR itself
+
+### Hadoop Classpath Configuration (HDFS Only)
+
+If your warehouse is on **HDFS**, both Fluss and Flink must be able to resolve 
HDFS paths. This requires Hadoop configuration files on the classpath.
+
+**Option 1: Export Hadoop Classpath (Recommended)**
+
+```bash
+export HADOOP_CLASSPATH=`hadoop classpath`
+```
+
+**Option 2: Copy Hadoop XML Configs**
+
+Copy `core-site.xml` and `hdfs-site.xml` to the configuration directories of 
both Fluss (`${FLUSS_HOME}/conf/`) and Flink (`${FLINK_HOME}/conf/`).
+
+> **NOTE**: If your warehouse uses a local filesystem path (for testing) or 
S3/OSS (with the appropriate Fluss filesystem plugin), you do not need 
`HADOOP_CLASSPATH`.
+
+## Configure Fluss with Hive Metastore
+
+### Cluster Configuration
+
+Add the following to your `server.yaml`:
+
+```yaml
+datalake.format: iceberg
+datalake.iceberg.type: hive
+datalake.iceberg.uri: thrift://<hive-metastore-host>:9083
+datalake.iceberg.warehouse: hdfs://<namenode-host>:9000/user/hive/warehouse
+```
+
+Fluss strips the `datalake.iceberg.` prefix and passes the remaining 
properties directly to Iceberg's Hive catalog. The properties above become 
`type=hive`, `uri=thrift://...`, and `warehouse=hdfs://...` when initializing 
the catalog.
+
+:::note
+If your Hive warehouse is on cloud object storage, set 
`datalake.iceberg.warehouse` to the corresponding URI (e.g., 
`s3://<your-bucket>/warehouse`) and configure the required filesystem plugin. 
See [AWS Glue](glue.md) for S3 credential setup.
+:::
+
+### Start Tiering Service
+
+Follow the [Iceberg tiering service 
setup](../formats/iceberg.md#start-tiering-service-to-iceberg) instructions to 
prepare the environment. Launch the Flink tiering job:
+
+```bash
+${FLINK_HOME}/bin/flink run /path/to/fluss-flink-tiering-$FLUSS_VERSION$.jar \
+    --fluss.bootstrap.servers <coordinator-host>:9123 \
+    --datalake.format iceberg \
+    --datalake.iceberg.type hive \
+    --datalake.iceberg.uri thrift://<hive-metastore-host>:9083 \
+    --datalake.iceberg.warehouse 
hdfs://<namenode-host>:9000/user/hive/warehouse
+```
+
+## Quick Start (Docker Compose)
+
+This section provides a complete docker-compose setup that runs the entire 
Hive Metastore integration end-to-end. It starts HMS, ZooKeeper, Fluss, Flink, 
creates a table, inserts data, tiers it to Iceberg via HMS, and reads it back. 
No cloud account or Hadoop cluster needed — everything runs locally.
+
+**Prerequisites**: Docker and Docker Compose installed.
+
+Create a `docker-compose.yml`:
+
+```yaml
+services:
+  # Hive Metastore (Thrift on port 9083, embedded Derby)
+  metastore:
+    image: apache/hive:3.1.3
+    environment:
+      SERVICE_NAME: metastore
+    ports:
+      - "9083:9083"
+    healthcheck:
+      test: ["CMD-SHELL", "bash -c 'echo > /dev/tcp/localhost/9083' 
2>/dev/null"]
+      interval: 10s
+      timeout: 10s
+      retries: 15
+      start_period: 90s
+
+  zookeeper:
+    image: zookeeper:3.8.4
+    healthcheck:
+      test: ["CMD", "zkServer.sh", "status"]
+      interval: 5s
+      timeout: 5s
+      retries: 5
+
+  # Downloads plugin JARs into a shared volume
+  init-plugins:
+    image: amazoncorretto:17
+    entrypoint: ["/bin/bash", "-c"]
+    command:
+      - |
+        set -e
+        yum install -y curl 2>/dev/null
+        mkdir -p /plugins/iceberg
+        curl -sSfL -o /plugins/iceberg/iceberg-hive-metastore-1.10.1.jar \
+          
https://repo1.maven.org/maven2/org/apache/iceberg/iceberg-hive-metastore/1.10.1/iceberg-hive-metastore-1.10.1.jar
+        curl -sSfL -o /plugins/iceberg/hive-exec-2.3.10.jar \
+          
https://repo1.maven.org/maven2/org/apache/hive/hive-exec/2.3.10/hive-exec-2.3.10.jar
+        curl -sSfL -o /plugins/iceberg/hadoop-client-api-3.3.6.jar \
+          
https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-client-api/3.3.6/hadoop-client-api-3.3.6.jar
+        curl -sSfL -o /plugins/iceberg/hadoop-client-runtime-3.3.6.jar \
+          
https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-client-runtime/3.3.6/hadoop-client-runtime-3.3.6.jar
+        curl -sSfL -o /plugins/iceberg/commons-logging-1.2.jar \
+          
https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar
+        curl -sSfL -o /plugins/iceberg/jackson-core-2.15.2.jar \
+          
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.15.2/jackson-core-2.15.2.jar
+        curl -sSfL -o /plugins/iceberg/jackson-databind-2.15.2.jar \
+          
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.15.2/jackson-databind-2.15.2.jar
+        curl -sSfL -o /plugins/iceberg/jackson-annotations-2.15.2.jar \
+          
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.15.2/jackson-annotations-2.15.2.jar
+        echo 'Plugins ready:' && ls -la /plugins/iceberg/
+    volumes:
+      - fluss-plugins:/plugins
+
+  coordinator:
+    image: apache/fluss:0.9.0-incubating

Review Comment:
   why 0.9.0?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to