Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
b05787e
Update quickstart demo to use RustFS
leekeiabstraction Feb 3, 2026
fafafa9
Update quickstart demo to use RustFS
leekeiabstraction Feb 3, 2026
bbba0ff
Fix link to filesystem page
leekeiabstraction Feb 3, 2026
a96e3dc
Remove unnecessary mounts
leekeiabstraction Feb 5, 2026
ebd3733
Automatically create RustFs bucket as part of docker-compose
leekeiabstraction Feb 5, 2026
fb5a5df
Base iceberg quickstart
leekeiabstraction Feb 6, 2026
97bbe13
Running coordinator server
leekeiabstraction Feb 6, 2026
9115985
Running coordinator server with hadoop dep
leekeiabstraction Feb 6, 2026
07717ae
Working iceberg example!
leekeiabstraction Feb 6, 2026
b1482f8
Add step to inspect tiered storage
leekeiabstraction Feb 6, 2026
4958d85
Re-instate accidentally committed removed checks
leekeiabstraction Feb 7, 2026
5726038
Working paimon and iceberg examples
leekeiabstraction Feb 8, 2026
016dc2f
Remove unused volumes and minimise redundant configs from iceberg exa…
leekeiabstraction Feb 8, 2026
04d1e66
Remove unused volumes from paimon example
leekeiabstraction Feb 8, 2026
caeb623
Remove unnecessary env var from coordinator server in iceberg example
leekeiabstraction Feb 8, 2026
499eb98
Remove debug flag
leekeiabstraction Feb 8, 2026
5e1cf77
Remove workaround of disabling kv.snapshot.interval
leekeiabstraction Feb 8, 2026
b2f61b0
Reinstate disabling kv.snapshot.interval
leekeiabstraction Feb 8, 2026
2f73a8a
Address comments
leekeiabstraction Feb 9, 2026
5b5a510
Use jdbc catalog for iceberg quickstart
leekeiabstraction Feb 10, 2026
58b659b
move rustfs introduction below the docker-compose file
wuchong Feb 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions docker/quickstart-flink/prepare_build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ download_jar() {
log_info "Downloading $description..."

# Download the file
if ! wget -O "$dest_file" "$url"; then
if ! curl -fL -o "$dest_file" "$url"; then
log_error "Failed to download $description from $url"
return 1
fi
Expand Down Expand Up @@ -258,4 +258,4 @@ show_summary() {
}

# Run main function
main "$@"
main "$@"
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1139,4 +1139,4 @@
</pluginManagement>
</build>

</project>
</project>
96 changes: 85 additions & 11 deletions website/docs/quickstart/flink.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,34 +33,66 @@ mkdir fluss-quickstart-flink
cd fluss-quickstart-flink
```

2. Create a `lib` directory and download the required jar files. You can adjust the Flink version as needed. Please make sure to download the compatible versions of [fluss-flink connector jar](/downloads) and [flink-connector-faker](https://github.com/knaufk/flink-faker/releases)
2. Create a `lib` directory and download the required jar files. You can adjust the Flink version as needed. Please make sure to download the compatible versions of [fluss-flink connector jar](/downloads), [fluss-fs-s3 jar](/downloads), and [flink-connector-faker](https://github.com/knaufk/flink-faker/releases)

```shell
export FLINK_VERSION="1.20"
```

```shell
mkdir lib
wget -O lib/flink-faker-0.5.3.jar https://github.com/knaufk/flink-faker/releases/download/v0.5.3/flink-faker-0.5.3.jar
wget -O "lib/fluss-flink-${FLINK_VERSION}-$FLUSS_DOCKER_VERSION$.jar" "https://repo1.maven.org/maven2/org/apache/fluss/fluss-flink-${FLINK_VERSION}/$FLUSS_DOCKER_VERSION$/fluss-flink-${FLINK_VERSION}-$FLUSS_DOCKER_VERSION$.jar"
curl -fL -o lib/flink-faker-0.5.3.jar https://github.com/knaufk/flink-faker/releases/download/v0.5.3/flink-faker-0.5.3.jar
curl -fL -o "lib/fluss-flink-${FLINK_VERSION}-$FLUSS_DOCKER_VERSION$.jar" "https://repo1.maven.org/maven2/org/apache/fluss/fluss-flink-${FLINK_VERSION}/$FLUSS_DOCKER_VERSION$/fluss-flink-${FLINK_VERSION}-$FLUSS_DOCKER_VERSION$.jar"
curl -fL -o "lib/fluss-fs-s3-$FLUSS_DOCKER_VERSION$.jar" "https://repo1.maven.org/maven2/org/apache/fluss/fluss-fs-s3/$FLUSS_DOCKER_VERSION$/fluss-fs-s3-$FLUSS_DOCKER_VERSION$.jar"
```

3. Create a `docker-compose.yml` file with the following content:

```yaml
services:
#begin RustFS (S3-compatible storage)
rustfs:
image: rustfs/rustfs:latest
ports:
- "9000:9000"
- "9001:9001"
environment:
- RUSTFS_ACCESS_KEY=rustfsadmin
- RUSTFS_SECRET_KEY=rustfsadmin
- RUSTFS_CONSOLE_ENABLE=true
volumes:
- rustfs-data:/data
command: /data
rustfs-init:
image: minio/mc
depends_on:
- rustfs
entrypoint: >
/bin/sh -c "
until mc alias set rustfs http://rustfs:9000 rustfsadmin rustfsadmin; do
echo 'Waiting for RustFS...';
sleep 1;
done;
mc mb --ignore-existing rustfs/fluss;
"
#end
#begin Fluss cluster
coordinator-server:
image: apache/fluss:$FLUSS_DOCKER_VERSION$
command: coordinatorServer
depends_on:
- zookeeper
- rustfs-init
environment:
- |
FLUSS_PROPERTIES=
zookeeper.address: zookeeper:2181
bind.listeners: FLUSS://coordinator-server:9123
remote.data.dir: /tmp/fluss/remote-data
remote.data.dir: s3://fluss/remote-data
s3.endpoint: http://rustfs:9000
s3.access-key: rustfsadmin
s3.secret-key: rustfsadmin
s3.path-style-access: true
tablet-server:
image: apache/fluss:$FLUSS_DOCKER_VERSION$
command: tabletServer
Expand All @@ -72,8 +104,12 @@ services:
zookeeper.address: zookeeper:2181
bind.listeners: FLUSS://tablet-server:9123
data.dir: /tmp/fluss/data
remote.data.dir: /tmp/fluss/remote-data
kv.snapshot.interval: 0s
remote.data.dir: s3://fluss/remote-data
s3.endpoint: http://rustfs:9000
s3.access-key: rustfsadmin
s3.secret-key: rustfsadmin
s3.path-style-access: true
kv.snapshot.interval: 60s
zookeeper:
restart: always
image: zookeeper:3.9.2
Expand Down Expand Up @@ -112,33 +148,43 @@ services:
- |
FLINK_PROPERTIES=
jobmanager.rpc.address: jobmanager
rest.address: jobmanager
rest.address: jobmanager
entrypoint: ["sh", "-c", "cp -v /tmp/lib/*.jar /opt/flink/lib && exec /docker-entrypoint.sh bin/sql-client.sh"]
volumes:
- ./lib:/tmp/lib
#end

volumes:
rustfs-data:
```

The Docker Compose environment consists of the following containers:
- **RustFS:** an S3-compatible object storage for tiered storage. You can access the RustFS console at http://localhost:9001 with credentials `rustfsadmin/rustfsadmin`. An init container (`rustfs-init`) automatically creates the `fluss` bucket on startup.
- **Fluss Cluster:** a Fluss `CoordinatorServer`, a Fluss `TabletServer` and a `ZooKeeper` server.
- Snapshot interval `kv.snapshot.interval` is configured as 60 seconds. You may want to configure this differently for production systems
- Credentials are configured directly with `s3.access-key` and `s3.secret-key`. Production systems should use CredentialsProvider chain specific to cloud environments.
- **Flink Cluster**: a Flink `JobManager`, a Flink `TaskManager`, and a Flink SQL client container to execute queries.

3. To start all containers, run:
:::tip
[RustFS](https://github.com/rustfs/rustfs) is used as replacement for S3 in this quickstart example, for your production setup you may want to configure this to use cloud file system. See [here](/maintenance/filesystems/overview.md) for information on how to setup cloud file systems
:::

4. To start all containers, run:
```shell
docker compose up -d
```
This command automatically starts all the containers defined in the Docker Compose configuration in detached mode.

Run
Run
```shell
docker compose ps
```
to check whether all containers are running properly.

You can also visit http://localhost:8083/ to see if Flink is running normally.
5. Verify the setup. You can visit http://localhost:8083/ to see if Flink is running normally. The S3 bucket for Fluss tiered storage is automatically created by the `rustfs-init` service. You can access the RustFS console at http://localhost:9001 with credentials `rustfsadmin/rustfsadmin` to view the `fluss` bucket.

:::note
- If you want to additionally use an observability stack, follow one of the provided quickstart guides [here](maintenance/observability/quickstart.md) and then continue with this guide.
- If you want to additionally use an observability stack, follow one of the provided quickstart guides [here](/docs/maintenance/observability/quickstart.md) and then continue with this guide.
- All the following commands involving `docker compose` should be executed in the created working directory that contains the `docker-compose.yml` file.
:::

Expand Down Expand Up @@ -399,6 +445,34 @@ The following SQL query should return an empty result.
SELECT * FROM fluss_customer WHERE `cust_key` = 1;
```

### Quitting Sql Client

The following command allows you to quit Flink SQL Client.
```sql title="Flink SQL"
quit;
```

### Remote Storage

Finally, you can use the following command to view the Primary Key Table snapshot files stored on RustFS:

```shell
docker run --rm --net=host \
-e MC_HOST_rustfs=http://rustfsadmin:rustfsadmin@localhost:9000 \
minio/mc ls --recursive rustfs/fluss/
```

Sample output:
```shell
[2026-02-03 20:28:59 UTC] 26KiB STANDARD remote-data/kv/fluss/enriched_orders-3/0/shared/4f675202-e560-4b8e-9af4-08e9769b4797
[2026-02-03 20:27:59 UTC] 11KiB STANDARD remote-data/kv/fluss/enriched_orders-3/0/shared/87447c34-81d0-4be5-b4c8-abcea5ce68e9
[2026-02-03 20:28:59 UTC] 0B STANDARD remote-data/kv/fluss/enriched_orders-3/0/snap-0/
[2026-02-03 20:28:59 UTC] 1.1KiB STANDARD remote-data/kv/fluss/enriched_orders-3/0/snap-1/_METADATA
[2026-02-03 20:28:59 UTC] 211B STANDARD remote-data/kv/fluss/enriched_orders-3/0/snap-1/aaffa8fc-ddb3-4754-938a-45e28df6d975
[2026-02-03 20:28:59 UTC] 16B STANDARD remote-data/kv/fluss/enriched_orders-3/0/snap-1/d3c18e43-11ee-4e39-912d-087ca01de0e8
[2026-02-03 20:28:59 UTC] 6.2KiB STANDARD remote-data/kv/fluss/enriched_orders-3/0/snap-1/ea2f2097-aa9a-4c2a-9e72-530218cd551c
```

## Clean up
After finishing the tutorial, run `exit` to exit Flink SQL CLI Container and then run
```shell
Expand Down
Loading