[docs] Add Real-Time User Profile quickstart tutorial#2669
[docs] Add Real-Time User Profile quickstart tutorial#2669Prajwal-banakar wants to merge 8 commits intoapache:mainfrom
Conversation
|
Hi @wuchong PTAL! |
wuchong
left a comment
There was a problem hiding this comment.
Hi @Prajwal-banakar, thank you for your contribution! However, quickstart documentation typically needs to be fully reproducible—readers should be able to follow it step by step and achieve the same results, just like in our existing quickstarts:
https://fluss.apache.org/docs/quickstart/flink/ and https://fluss.apache.org/docs/quickstart/lakehouse/.
Could you please enhance the guide by adding the environment setup (e.g., using Docker Compose), clear instructions on how to run the queries, and guidance on how to visualize or verify the results? This will greatly improve usability and consistency with our documentation standards.
|
Hi @Prajwal-banakar thanks for the pr. I have the same suggestion as @wuchong . We need to make the example fully reproducible. For example, to ingest the raw data for the source datastream, we can provide a csv file as sample data, just like this example: https://github.com/aliyun/alibabacloud-hologres-connectors/blob/master/hologres-connector-examples/hologres-connector-flink-examples/src/main/java/com/alibaba/hologres/connector/flink/example/FlinkRoaringBitmapAggJob.java |
|
Hi @Prajwal-banakar, please ensure the quickstart can run successfully. Additionally, the image appears to be AI-generated. I don’t object to AI-generated content in principle, but please make sure the text in the image contains no garbled characters and all content makes sense. |
|
Hi @wuchong verified the guide locally it is working ! and fixed the diagram format, |
| d.uid, | ||
| -- Convert INT to BYTES for rbm64. | ||
| -- Note: In a real production job, you might use a UDF to ensure correct bitmap initialization. | ||
| CAST(CAST(d.uid AS STRING) AS BYTES), |
There was a problem hiding this comment.
I believe we need the to_rbm and from_rbm Flink UDFs to process the data correctly. Without these functions, the results would be meaningless and users would not understand the purpose of this feature.
However, shipping Flink UDFs falls outside the scope of the Fluss project. I will coordinate with members of the Flink community to contribute these UDFs and identify an appropriate location to open source and publish the UDF JARs. Once available, we can reference these functions in our documentation and examples.
That said, the Lunar New Year holiday is approaching in China, so we likely will not be able to start this work until March. Until then, we may need to suspend this PR. Thank you for your quick updating.
There was a problem hiding this comment.
I believe we need the
to_rbmandfrom_rbmFlink UDFs to process the data correctly. Without these functions, the results would be meaningless and users would not understand the purpose of this feature.
Exactly. we need such functions as RB_CARDINALITY and RB_OR_AGG for aggregating the result bitmap.
|
Hi @wuchong, @xx789633, |
|
Hi @wuchong @xx789633 i've created a temporary repo for flink udfs as we discussed in slack and updated the quick start guide, it is working smoothly. The repo is available at : https://github.com/Prajwal-banakar/flink-roaringbitmap
|
|
Hi @Prajwal-banakar , |
|
Hi @platinumhamburg, thank you for the kind words! I will move the RoaringBitmap UDFs to that repo and i'll open a PR their shortly. I also have an active [DISCUSS] thread on the mailing list proposing Native Bitmap Integration for Fluss https://lists.apache.org/thread/z9dwyg81cs3bt7yssb4n3vg17o767r5s and it is open for your input, so I am happy to contribute UDFs there as well and collaborate on expanding the library. I will update this PR once the JAR is published from the official repo. |
|
Hi @platinumhamburg, I tried to fork https://github.com/flink-extended/flink-roaringbitmap |
Hi @Prajwal-banakar, sorry about that—the reason you couldn’t fork earlier was that the repository was empty. It’s now ready to go. Also, could we add an rb_or_agg function in the initial implementation? This would help us include a roll-up query example in the quick start guide. |
|
Hello @Prajwal-banakar.. Thank you for this, it's really nice work. However I have the two following comments:
|
|
Hi @polyzos, thank you for the review! Regarding point 1: The rbm64 aggregation type is already officially supported in Fluss 0.9 (FIP-21). The companion UDFs (rb_build_agg, rb_cardinality) are now publishing in the official flink-extended/flink-roaringbitmap repo, which was set up by @wuchong and @platinumhamburg specifically to support this quickstart. So the dependency is intentional and endorsed by the maintainers. Regarding point 2: Completely agree. I'll replace the diagram with a clean one made in Excalidraw. |
|
@Prajwal-banakar correct and apologies I should have been more precise. What I was thinking is to have the quickstart work with Fluss specific features in the quickstart to keep the complexity to the bare minimum for new users - i.e how they can use the auto-increment column along with the aggregation merge engine. Then create an "extended" version in a blog post for those looking for more.. This approach will help as I mentioned:
This is just a suggestion, both approaches I think are valuable and I'm happy with both.. Just cautious for new users., that's all. |
|
Hi @polyzos, that makes complete sense and I appreciate the clarification! I agree with this approach:
I'll simplify this PR to the basic quickstart version and work on the blog post separately. @wuchong @platinumhamburg does this approach work for you as well? |
|
Hi @wuchong @polyzos @platinumhamburg, Quick update: the external RoaringBitmap UDF library has now been officially released as That said, I agree with the latest direction for this PR keeping the Fluss quickstart focused on a minimal, Fluss-native path will make it much easier for new users to follow. I’ll update this PR accordingly by simplifying it to focus on the auto-increment column + aggregation merge engine workflow, and @polyzos is working on a blog/deep-dive covering the extended bitmap use case. Please let me know if there’s any specific structure or example you’d prefer for the simplified quickstart. |
|
@Prajwal-banakar looking forward to the update.. you can also take a look here |
| uid INT, | ||
| PRIMARY KEY (email) NOT ENFORCED | ||
| ) WITH ( | ||
| 'connector' = 'fluss', |
There was a problem hiding this comment.
since we are already in the catalog with dont need to specify the connector for every CREATE TABLE statement
| ) WITH ( | ||
| 'connector' = 'fluss', | ||
| 'auto-increment.fields' = 'uid', | ||
| 'bucket.num' = '1' |
There was a problem hiding this comment.
bucket.num = 1 is the default for every table, so again we can remove this for every CREATE TABLE statement.
|
can we also change the name from |
|
Hi @polyzos, I’ve updated the PR and verified locally it is working fine. |

Purpose
Linked issue: close #2659
The purpose of this change is to add a new quickstart tutorial, "Real-Time User Profile," to the Apache Fluss documentation. This tutorial demonstrates a realistic, production-grade business scenario by combining the Auto-Increment Column and Aggregation Merge Engine features. It specifically addresses the need for guidance on mapping high-cardinality string identifiers to compact integers for efficient real-time analytics.
Brief change log
This pull request introduces a comprehensive tutorial located at website/docs/quickstartUuser-Profile.md. Key changes include:
Realistic Use Case: Developed a scenario focused on identity mapping (Email to UID) and real-time metric aggregation (Total Clicks and Unique Visitors).
Feature Integration: Showcases the synergy between FIP-16 (Auto-Increment) for dictionary management and FIP-21 (Aggregation Merge Engine) for storage-level pre-aggregation.
Technical Optimization: Implemented the maintainer's recommendation to use INT for the generated uid column to maximize storage efficiency and performance for RoaringBitmap (rbm64) operations.
Reliability Section: Added documentation on Undo Recovery to explain how Fluss ensures exactly-once accuracy for aggregations during Flink failovers.
Visual Guidance: Included an architectural diagram to illustrate the data flow from raw event ingestion to the final pre-aggregated profile storage.
Tests
Documentation Build: Verified that the documentation builds correctly using the local Docusaurus environment and that the new page is correctly linked in the sidebar.
SQL Verification: Manually verified the Flink SQL syntax against the Apache Fluss 0.9 connector specifications.
API and Format
This change is documentation-only and does not affect the Java API or the underlying storage format.
Documentation
Yes, this change introduces a new documentation feature (a new quickstart tutorial) aimed at guiding users through the adoption of Fluss's advanced streaming storage capabilities.