luoyuxia commented on code in PR #2699:
URL: https://github.com/apache/fluss/pull/2699#discussion_r3523170753
##########
website/docs/streaming-lakehouse/integrate-data-lakes/_category_.json:
##########
@@ -1,4 +0,0 @@
-{
Review Comment:
This PR renames existing docs paths, but does not preserve redirects for the
old URLs.
For example:
- `/docs/maintenance/filesystems/s3`
- `/docs/maintenance/filesystems/hdfs`
- `/docs/streaming-lakehouse/integrate-data-lakes/formats/paimon`
- `/docs/streaming-lakehouse/integrate-data-lakes/catalogs/lakekeeper`
These are published documentation URLs and will become 404 after the rename.
The current `createRedirects` logic only creates version aliases for routes
that still exist; it does not create redirects for deleted old routes.
Please add explicit redirects for all renamed leaf pages.
##########
website/build_versioned_docs.sh:
##########
@@ -122,6 +122,14 @@ for branch in $branches; do
# Copy the website/docs directory to the target directory
$CP_CMD "$version_dir/" || { echo "Failed to copy for branch:
$clean_branch_name"; continue; }
echo "Copied documentation for branch '$clean_branch_name' to
'$version_dir'"
+
+ # Fix absolute links in versioned docs (convert
/docs/maintenance/filesystems/hdfs.md to relative path)
+
lakehouse_file="$version_dir/maintenance/tiered-storage/lakehouse-storage.md"
+ if [ -f "$lakehouse_file" ]; then
+ sed -i.bak
's|/docs/maintenance/filesystems/hdfs\.md|../../filesystems/hdfs|g'
"$lakehouse_file"
Review Comment:
The replacement path here looks wrong.
`lakehouse_file` is under
`version-$version/maintenance/tiered-storage/lakehouse-storage.md`, so
replacing `/docs/maintenance/filesystems/hdfs.md` with `../../filesystems/hdfs`
resolves to `version-$version/filesystems/hdfs`.
For release branches, the copied old filesystem docs are still under
`version-$version/maintenance/filesystems/hdfs.md`, so this should be
`../filesystems/hdfs` instead.
##########
website/docs/install-deploy/deploying-streaming-lakehouse.md:
##########
@@ -0,0 +1,237 @@
+---
+title: "Deploying Streaming Lakehouse"
+sidebar_position: 6
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+# Deploying Streaming Lakehouse
+
+This guide covers how to deploy a Fluss cluster with Streaming Lakehouse
capabilities. For conceptual overview, see [Lakehouse
Overview](../streaming-lakehouse/overview.md).
+
+## Prerequisites
+
+1. A running Fluss cluster (see [Deploying Distributed
Cluster](deploying-distributed-cluster.md))
+2. A running Flink cluster (for the Tiering Service)
+3. Access to a data lake storage system (S3, HDFS, OSS, etc.)
+
+## Cluster Configuration
+
+You can enable Lakehouse storage through:
+1. **Static configuration**: Configure in `server.yaml` before starting the
cluster
+2. **Dynamic configuration**: Enable at runtime using the
`set_cluster_configs` procedure
+
+### Method 1: Static Configuration
+
+Configure lakehouse settings in `server.yaml` on all Fluss servers
(CoordinatorServer and TabletServer).
Review Comment:
For “Method 1: Static Configuration”, could we add a short explanation of
the configuration convention before the Paimon/Iceberg/Lance examples?
Right now users can copy the examples, but it is not clear how to derive the
keys when using Hive/REST/Glue/JDBC catalogs.
Suggested points:
- `datalake.enabled: true` explicitly enables lakehouse capability for the
cluster.
- `datalake.format` selects the default lake format.
- Format-specific options use the `datalake.<format>.*` prefix.
- Fluss strips the `datalake.<format>.` prefix and passes the remaining keys
to the corresponding lake catalog/client. For example,
`datalake.paimon.metastore` becomes `metastore`, and `datalake.iceberg.type`
becomes `type`.
- Only configure options for the selected `datalake.format`.
- The tiering service also needs the same `datalake.*` options because it is
an independent Flink job.
##########
website/docs/install-deploy/deploying-streaming-lakehouse.md:
##########
@@ -0,0 +1,237 @@
+---
+title: "Deploying Streaming Lakehouse"
+sidebar_position: 6
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+# Deploying Streaming Lakehouse
+
+This guide covers how to deploy a Fluss cluster with Streaming Lakehouse
capabilities. For conceptual overview, see [Lakehouse
Overview](../streaming-lakehouse/overview.md).
+
+## Prerequisites
+
+1. A running Fluss cluster (see [Deploying Distributed
Cluster](deploying-distributed-cluster.md))
+2. A running Flink cluster (for the Tiering Service)
+3. Access to a data lake storage system (S3, HDFS, OSS, etc.)
+
+## Cluster Configuration
+
+You can enable Lakehouse storage through:
+1. **Static configuration**: Configure in `server.yaml` before starting the
cluster
+2. **Dynamic configuration**: Enable at runtime using the
`set_cluster_configs` procedure
+
+### Method 1: Static Configuration
+
+Configure lakehouse settings in `server.yaml` on all Fluss servers
(CoordinatorServer and TabletServer).
+
+<Tabs groupId="datalake-format">
+<TabItem value="paimon" label="Paimon" default>
+
+```yaml title="server.yaml"
+datalake.format: paimon
+datalake.paimon.metastore: filesystem
+datalake.paimon.warehouse: /path/to/paimon/warehouse
+```
+
+For Hive catalog:
+```yaml title="server.yaml"
+datalake.format: paimon
+datalake.paimon.metastore: hive
+datalake.paimon.uri: thrift://<hive-metastore-host>:<port>
+datalake.paimon.warehouse: hdfs:///path/to/warehouse
+```
+
+</TabItem>
+<TabItem value="iceberg" label="Iceberg">
+
+```yaml title="server.yaml"
+datalake.format: iceberg
+datalake.iceberg.catalog-impl: org.apache.iceberg.jdbc.JdbcCatalog
+datalake.iceberg.name: fluss_catalog
+datalake.iceberg.uri: jdbc:postgresql://postgres-host:5432/iceberg
+datalake.iceberg.jdbc.user: iceberg
+datalake.iceberg.jdbc.password: iceberg
+datalake.iceberg.warehouse: s3://bucket/iceberg
+datalake.iceberg.io-impl: org.apache.iceberg.aws.s3.S3FileIO
+```
+
+</TabItem>
+<TabItem value="lance" label="Lance">
+
+```yaml title="server.yaml"
+datalake.format: lance
+datalake.lance.warehouse: s3://bucket/lance
+```
+
+</TabItem>
+</Tabs>
+
+### Method 2: Dynamic Configuration
+
+Enable lakehouse settings at runtime using Flink SQL:
+
+```sql title="Flink SQL"
+USE fluss_catalog;
+
+CALL sys.set_cluster_configs(
+ config_pairs => 'datalake.format', 'paimon',
+ 'datalake.paimon.metastore', 'filesystem',
+ 'datalake.paimon.warehouse', '/path/to/warehouse'
+);
+```
+
+See [set_cluster_configs](../engine-flink/procedures.md#set_cluster_configs)
for more details.
+
+## Adding Required JARs
+
+### Fluss Server JARs
+
+Add JARs to `${FLUSS_HOME}/plugins/<format>/` based on your configuration:
Review Comment:
This dependency table weakens some download/configuration guidance that
existed in the old docs.
Suggested changes:
- For `Paimon with S3/OSS`, link to the Paimon download/filesystem JAR docs
and mention that users should choose `paimon-s3` / `paimon-oss` matching their
Paimon version.
- For `Paimon Hive catalog`, keep the old link to Flink Hive connector
bundled Hive jar docs.
- For `Iceberg with S3`, link to Iceberg AWS integration or Maven artifacts,
and mention `iceberg-aws` / `iceberg-aws-bundle` should match the Iceberg
version.
- For `Hadoop client JARs`, avoid only using the generic name. The old
Iceberg docs gave three options: use `HADOOP_CLASSPATH`, download
`hadoop-apache-3.3.5-2.jar`, or download a full Hadoop package. Please keep
these entry points or link back to the Iceberg Hadoop Dependencies section.
- `For HDFS, see the HDFS setup guide.` feels misplaced here. HDFS is a
storage backend dependency, not a lake format dependency. I’d remove it from
this table section.
##########
website/docs/streaming-lakehouse/tiering-service.md:
##########
@@ -0,0 +1,79 @@
+---
+title: "Tiering Service"
+sidebar_position: 2
+---
+
+# Tiering Service
+
+The Tiering Service continuously compacts real-time data from Fluss (stored in
Arrow format) into data lake formats (Parquet) for cost-efficient long-term
storage and analytics.
Review Comment:
`data lake formats (Parquet)` is not quite accurate.
Paimon/Iceberg/Lance are lake/table formats. Parquet is only an underlying
file format for some cases; Paimon can also use ORC, and Lance should not be
described as simply Parquet.
Could we make this more general, for example:
"The Tiering Service continuously compacts real-time data from Fluss into
the configured lake format for cost-efficient long-term storage and analytics."
##########
website/docs/streaming-lakehouse/tiering-service.md:
##########
@@ -0,0 +1,79 @@
+---
+title: "Tiering Service"
+sidebar_position: 2
+---
+
+# Tiering Service
+
+The Tiering Service continuously compacts real-time data from Fluss (stored in
Arrow format) into data lake formats (Parquet) for cost-efficient long-term
storage and analytics.
+
+## Overview
+
+The Tiering Service is implemented as an Apache Flink job that:
+- Reads records from Fluss tables with lakehouse storage enabled
+- Writes data to the configured data lake format (Paimon, Iceberg, or Lance)
+- Maintains exactly-once semantics between Fluss and the data lake
+- Operates incrementally, syncing only missing data segments
+
+For deployment instructions, see [Deploying Streaming
Lakehouse](../install-deploy/deploying-streaming-lakehouse.md).
+
+## Architecture
+
+The Tiering Service consists of three Flink operators:
+
+| Operator | Description |
+|----------|-------------|
+| **TieringSource** | Reads records from Fluss and writes to the data lake via
LakeWriter |
+| **TieringCommitter** | Commits batches and advances offsets in both Fluss
and lake |
+| **No-Op Sink** | Dummy sink required by Flink's topology |
+
+### How It Works
+
+1. **Enumerator** sends heartbeat to Fluss CoordinatorService, receives table
metadata
+2. **SplitGenerator** calculates data delta between Fluss offsets and lake
snapshot offsets
+3. **Splits** are created for missing data ranges and assigned to readers
+4. **Readers** fetch records from Fluss tablet servers, write via LakeWriter
+5. **Committer** performs two-phase commit: first to lake, then updates Fluss
coordinator
+6. Cycle repeats based on `table.datalake.freshness` interval
+
+### Split Types
+
+| Table Type | Split Type | Description |
+|------------|------------|-------------|
+| Log Table (append-only) | TieringLogSplit | Defines starting and stopping
offsets for a contiguous range |
+| Primary Key Table | TieringSnapshotSplit | References snapshot ID and log
offset for CDC replay |
+
+## Configuration Options
+
+### Tiering Service Options
+
+| Option | Type | Default | Description |
+|--------|------|---------|-------------|
+| `lake.tiering.auto-expire-snapshot` | Boolean | false | Auto-trigger
snapshot expiration on commit |
+
+### Table-Level Options
+
+| Option | Type | Default | Description |
+|--------|------|---------|-------------|
+| `table.datalake.enabled` | Boolean | false | Enable lakehouse storage for
this table |
+| `table.datalake.freshness` | Duration | 3min | Maximum lag between Fluss and
lake data |
+| `table.datalake.auto-compaction` | Boolean | false | Auto-trigger compaction
in the data lake |
+| `table.datalake.auto-expire-snapshot` | Boolean | false | Auto-expire
snapshots in the data lake |
+
+## Scaling
+
+The Tiering Service is stateless and can be scaled by adjusting Flink
parallelism:
+
+```shell
+${FLINK_HOME}/bin/flink run \
+ -Dparallelism.default=6 \
+ /path/to/fluss-flink-tiering-$FLUSS_VERSION$.jar \
+ --fluss.bootstrap.servers localhost:9123 \
+ ...
+```
+
+Multiple tiering service jobs can run simultaneously. They are coordinated by
the Fluss cluster to ensure exactly-once semantics and automatic load balancing.
+
+## Monitoring
+
+Key metrics for monitoring the Tiering Service are available through Flink's
metrics system. See [Monitoring
Metrics](../maintenance/observability/monitor-metrics.md) for details on
lakehouse tiering metrics.
Review Comment:
The “Monitoring Metrics” link should point directly to the tiering service
metrics section.
From this page, the link should be:
`../maintenance/observability/monitor-metrics.md#tiering-service-metrics`
This will route to
`/docs/maintenance/observability/monitor-metrics/#tiering-service-metrics`.
##########
website/docs/streaming-lakehouse/tiering-service.md:
##########
@@ -0,0 +1,79 @@
+---
+title: "Tiering Service"
+sidebar_position: 2
+---
+
+# Tiering Service
+
+The Tiering Service continuously compacts real-time data from Fluss (stored in
Arrow format) into data lake formats (Parquet) for cost-efficient long-term
storage and analytics.
+
+## Overview
+
+The Tiering Service is implemented as an Apache Flink job that:
+- Reads records from Fluss tables with lakehouse storage enabled
+- Writes data to the configured data lake format (Paimon, Iceberg, or Lance)
+- Maintains exactly-once semantics between Fluss and the data lake
+- Operates incrementally, syncing only missing data segments
+
+For deployment instructions, see [Deploying Streaming
Lakehouse](../install-deploy/deploying-streaming-lakehouse.md).
+
+## Architecture
+
+The Tiering Service consists of three Flink operators:
+
+| Operator | Description |
+|----------|-------------|
+| **TieringSource** | Reads records from Fluss and writes to the data lake via
LakeWriter |
+| **TieringCommitter** | Commits batches and advances offsets in both Fluss
and lake |
+| **No-Op Sink** | Dummy sink required by Flink's topology |
+
+### How It Works
+
+1. **Enumerator** sends heartbeat to Fluss CoordinatorService, receives table
metadata
+2. **SplitGenerator** calculates data delta between Fluss offsets and lake
snapshot offsets
+3. **Splits** are created for missing data ranges and assigned to readers
+4. **Readers** fetch records from Fluss tablet servers, write via LakeWriter
+5. **Committer** performs two-phase commit: first to lake, then updates Fluss
coordinator
+6. Cycle repeats based on `table.datalake.freshness` interval
+
+### Split Types
+
+| Table Type | Split Type | Description |
+|------------|------------|-------------|
+| Log Table (append-only) | TieringLogSplit | Defines starting and stopping
offsets for a contiguous range |
+| Primary Key Table | TieringSnapshotSplit | References snapshot ID and log
offset for CDC replay |
+
+## Configuration Options
+
+### Tiering Service Options
+
+| Option | Type | Default | Description |
+|--------|------|---------|-------------|
+| `lake.tiering.auto-expire-snapshot` | Boolean | false | Auto-trigger
snapshot expiration on commit |
Review Comment:
Could we add a short explanation for how Tiering Service Options are
configured?
Right now the table lists `lake.tiering.auto-expire-snapshot`, but users
cannot tell where to set it.
The tiering job arguments are split into three groups:
- `--fluss.*`: Fluss client config, for example `--fluss.bootstrap.servers`
- `--datalake.<format>.*`: lake catalog/storage config; Fluss strips the
`datalake.<format>.` prefix before passing it to the lake connector
- `--lake.tiering.*`: tiering service job-level config, for example
`--lake.tiering.auto-expire-snapshot true`
It would help to add an example:
```shell
${FLINK_HOME}/bin/flink run \
-Dparallelism.default=3 \
/path/to/fluss-flink-tiering-$FLUSS_VERSION$.jar \
--fluss.bootstrap.servers localhost:9123 \
--datalake.format paimon \
--datalake.paimon.metastore filesystem \
--datalake.paimon.warehouse /tmp/paimon \
--lake.tiering.auto-expire-snapshot true
```
Also worth clarifying:
- `table.datalake.*` is configured per table when creating/altering tables.
- `lake.tiering.*` is configured when starting the tiering service job.
--
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]