This is an automated email from the ASF dual-hosted git repository.

luoyuxia pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fluss.git


The following commit(s) were added to refs/heads/main by this push:
     new 170e95f90 [lake/hudi] Introduce fluss-lake-hudi module and 
HudiLakeStorage (#3256)
170e95f90 is described below

commit 170e95f9039c54eb7255a84f761b609a77c7e594
Author: fhan <[email protected]>
AuthorDate: Wed May 13 20:57:03 2026 +0800

    [lake/hudi] Introduce fluss-lake-hudi module and HudiLakeStorage (#3256)
---
 docker/quickstart-flink/prepare_build.sh           |  1 +
 .../org/apache/fluss/metadata/DataLakeFormat.java  |  3 +-
 fluss-dist/pom.xml                                 |  7 +++
 fluss-dist/src/main/assemblies/plugins.xml         |  6 +++
 fluss-flink/fluss-flink-common/pom.xml             |  1 -
 fluss-lake/fluss-lake-hudi/pom.xml                 | 43 +++++++++++++++
 .../apache/fluss/lake/hudi/HudiLakeStorage.java    | 61 ++++++++++++++++++++++
 .../fluss/lake/hudi/HudiLakeStoragePlugin.java     | 24 +++++----
 .../src/main/resources/META-INF/NOTICE             |  7 +++
 ...apache.fluss.lake.lakestorage.LakeStoragePlugin | 19 +++++++
 .../src/test/resources/log4j2-test.properties      | 26 +++++++++
 .../org.junit.jupiter.api.extension.Extension      | 19 +++++++
 fluss-lake/pom.xml                                 |  1 +
 fluss-test-coverage/pom.xml                        |  2 +
 pom.xml                                            |  1 +
 15 files changed, 208 insertions(+), 13 deletions(-)

diff --git a/docker/quickstart-flink/prepare_build.sh 
b/docker/quickstart-flink/prepare_build.sh
index f2fc2ee7d..f439270f5 100755
--- a/docker/quickstart-flink/prepare_build.sh
+++ b/docker/quickstart-flink/prepare_build.sh
@@ -115,6 +115,7 @@ check_prerequisites() {
         "$PROJECT_ROOT/fluss-filesystems/fluss-fs-s3/target"
         "$PROJECT_ROOT/fluss-lake/fluss-lake-paimon/target"
         "$PROJECT_ROOT/fluss-lake/fluss-lake-iceberg/target"
+        "$PROJECT_ROOT/fluss-lake/fluss-lake-hudi/target"
         "$PROJECT_ROOT/fluss-flink/fluss-flink-tiering/target"
     )
 
diff --git 
a/fluss-common/src/main/java/org/apache/fluss/metadata/DataLakeFormat.java 
b/fluss-common/src/main/java/org/apache/fluss/metadata/DataLakeFormat.java
index a0dfea469..1dc284335 100644
--- a/fluss-common/src/main/java/org/apache/fluss/metadata/DataLakeFormat.java
+++ b/fluss-common/src/main/java/org/apache/fluss/metadata/DataLakeFormat.java
@@ -21,7 +21,8 @@ package org.apache.fluss.metadata;
 public enum DataLakeFormat {
     PAIMON("paimon"),
     LANCE("lance"),
-    ICEBERG("iceberg");
+    ICEBERG("iceberg"),
+    HUDI("hudi");
 
     private final String value;
 
diff --git a/fluss-dist/pom.xml b/fluss-dist/pom.xml
index 5c8a00dea..63e08b864 100644
--- a/fluss-dist/pom.xml
+++ b/fluss-dist/pom.xml
@@ -96,6 +96,13 @@
             <version>${project.version}</version>
             <scope>provided</scope>
         </dependency>
+        
+        <dependency>
+            <groupId>org.apache.fluss</groupId>
+            <artifactId>fluss-lake-hudi</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+        </dependency>
       
         <dependency>
             <groupId>org.apache.flink</groupId>
diff --git a/fluss-dist/src/main/assemblies/plugins.xml 
b/fluss-dist/src/main/assemblies/plugins.xml
index 8eb05e8a0..02459902c 100644
--- a/fluss-dist/src/main/assemblies/plugins.xml
+++ b/fluss-dist/src/main/assemblies/plugins.xml
@@ -98,6 +98,12 @@
             <outputDirectory>plugins/lance/</outputDirectory>
             <destName>fluss-lake-lance-${project.version}.jar</destName>
         </file>
+        <file>
+            
<source>../fluss-lake/fluss-lake-hudi/target/fluss-lake-hudi-${project.version}.jar</source>
+            <outputDirectory>plugins/hudi/</outputDirectory>
+            <destName>fluss-lake-hudi-${project.version}.jar</destName>
+            <fileMode>0644</fileMode>
+        </file>
   </files>
 
 </assembly>
\ No newline at end of file
diff --git a/fluss-flink/fluss-flink-common/pom.xml 
b/fluss-flink/fluss-flink-common/pom.xml
index 53ac05701..dab880b58 100644
--- a/fluss-flink/fluss-flink-common/pom.xml
+++ b/fluss-flink/fluss-flink-common/pom.xml
@@ -95,7 +95,6 @@
             <scope>provided</scope>
         </dependency>
 
-
         <!-- test dependency -->
         <dependency>
             <groupId>org.apache.fluss</groupId>
diff --git a/fluss-lake/fluss-lake-hudi/pom.xml 
b/fluss-lake/fluss-lake-hudi/pom.xml
new file mode 100644
index 000000000..ddf6b1329
--- /dev/null
+++ b/fluss-lake/fluss-lake-hudi/pom.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+      http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0";
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.fluss</groupId>
+        <artifactId>fluss-lake</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>fluss-lake-hudi</artifactId>
+    <name>Fluss : Lake : Hudi</name>
+
+    <packaging>jar</packaging>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.fluss</groupId>
+            <artifactId>fluss-common</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git 
a/fluss-lake/fluss-lake-hudi/src/main/java/org/apache/fluss/lake/hudi/HudiLakeStorage.java
 
b/fluss-lake/fluss-lake-hudi/src/main/java/org/apache/fluss/lake/hudi/HudiLakeStorage.java
new file mode 100644
index 000000000..f0865de0e
--- /dev/null
+++ 
b/fluss-lake/fluss-lake-hudi/src/main/java/org/apache/fluss/lake/hudi/HudiLakeStorage.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.fluss.lake.hudi;
+
+import org.apache.fluss.config.Configuration;
+import org.apache.fluss.lake.lakestorage.LakeCatalog;
+import org.apache.fluss.lake.lakestorage.LakeStorage;
+import org.apache.fluss.lake.source.LakeSource;
+import org.apache.fluss.lake.writer.LakeTieringFactory;
+import org.apache.fluss.metadata.TablePath;
+
+/** Hudi Implementation of {@link LakeStorage}. */
+public class HudiLakeStorage implements LakeStorage {
+
+    private final Configuration hudiConfig;
+
+    public HudiLakeStorage(Configuration configuration) {
+        this.hudiConfig = configuration;
+    }
+
+    @Override
+    public LakeTieringFactory<?, ?> createLakeTieringFactory() {
+        throw new UnsupportedOperationException(
+                "HudiLakeStorage is currently a scaffold and does not support 
creating a "
+                        + "LakeTieringFactory yet. Verify that Hudi lake 
storage was selected "
+                        + "intentionally and that the required Hudi 
support/module is available.");
+    }
+
+    @Override
+    public LakeCatalog createLakeCatalog() {
+        throw new UnsupportedOperationException(
+                "HudiLakeStorage is currently a scaffold and does not support 
creating a "
+                        + "LakeCatalog yet. Verify that Hudi lake storage was 
selected "
+                        + "intentionally and that the required Hudi 
support/module is available.");
+    }
+
+    @Override
+    public LakeSource<?> createLakeSource(TablePath tablePath) {
+        throw new UnsupportedOperationException(
+                "HudiLakeStorage is currently a scaffold and does not support 
creating a "
+                        + "LakeSource for table '"
+                        + tablePath
+                        + "' yet. Verify that Hudi lake storage was selected 
intentionally "
+                        + "and that the required Hudi support/module is 
available.");
+    }
+}
diff --git 
a/fluss-common/src/main/java/org/apache/fluss/metadata/DataLakeFormat.java 
b/fluss-lake/fluss-lake-hudi/src/main/java/org/apache/fluss/lake/hudi/HudiLakeStoragePlugin.java
similarity index 59%
copy from 
fluss-common/src/main/java/org/apache/fluss/metadata/DataLakeFormat.java
copy to 
fluss-lake/fluss-lake-hudi/src/main/java/org/apache/fluss/lake/hudi/HudiLakeStoragePlugin.java
index a0dfea469..124aa0a54 100644
--- a/fluss-common/src/main/java/org/apache/fluss/metadata/DataLakeFormat.java
+++ 
b/fluss-lake/fluss-lake-hudi/src/main/java/org/apache/fluss/lake/hudi/HudiLakeStoragePlugin.java
@@ -15,22 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.fluss.metadata;
+package org.apache.fluss.lake.hudi;
 
-/** An enum for datalake format. */
-public enum DataLakeFormat {
-    PAIMON("paimon"),
-    LANCE("lance"),
-    ICEBERG("iceberg");
+import org.apache.fluss.config.Configuration;
+import org.apache.fluss.lake.lakestorage.LakeStorage;
+import org.apache.fluss.lake.lakestorage.LakeStoragePlugin;
 
-    private final String value;
+/** Hudi implementation of {@link LakeStoragePlugin}. */
+public class HudiLakeStoragePlugin implements LakeStoragePlugin {
 
-    DataLakeFormat(String value) {
-        this.value = value;
+    private static final String IDENTIFIER = "hudi";
+
+    @Override
+    public String identifier() {
+        return IDENTIFIER;
     }
 
     @Override
-    public String toString() {
-        return value;
+    public LakeStorage createLakeStorage(Configuration configuration) {
+        return new HudiLakeStorage(configuration);
     }
 }
diff --git a/fluss-lake/fluss-lake-hudi/src/main/resources/META-INF/NOTICE 
b/fluss-lake/fluss-lake-hudi/src/main/resources/META-INF/NOTICE
new file mode 100644
index 000000000..91800d5c8
--- /dev/null
+++ b/fluss-lake/fluss-lake-hudi/src/main/resources/META-INF/NOTICE
@@ -0,0 +1,7 @@
+fluss-lake-hudi
+Copyright 2025-2026 The Apache Software Foundation
+
+This project includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+This project bundles the following dependencies under the Apache Software 
License 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)
\ No newline at end of file
diff --git 
a/fluss-lake/fluss-lake-hudi/src/main/resources/META-INF/services/org.apache.fluss.lake.lakestorage.LakeStoragePlugin
 
b/fluss-lake/fluss-lake-hudi/src/main/resources/META-INF/services/org.apache.fluss.lake.lakestorage.LakeStoragePlugin
new file mode 100644
index 000000000..2932e7426
--- /dev/null
+++ 
b/fluss-lake/fluss-lake-hudi/src/main/resources/META-INF/services/org.apache.fluss.lake.lakestorage.LakeStoragePlugin
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+org.apache.fluss.lake.hudi.HudiLakeStoragePlugin
\ No newline at end of file
diff --git 
a/fluss-lake/fluss-lake-hudi/src/test/resources/log4j2-test.properties 
b/fluss-lake/fluss-lake-hudi/src/test/resources/log4j2-test.properties
new file mode 100644
index 000000000..2100a34e0
--- /dev/null
+++ b/fluss-lake/fluss-lake-hudi/src/test/resources/log4j2-test.properties
@@ -0,0 +1,26 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Set root logger level to OFF to not flood build logs
+# set manually to INFO for debugging purposes
+rootLogger.level=OFF
+rootLogger.appenderRef.test.ref=TestLogger
+appender.testlogger.name=TestLogger
+appender.testlogger.type=CONSOLE
+appender.testlogger.target=SYSTEM_ERR
+appender.testlogger.layout.type=PatternLayout
+appender.testlogger.layout.pattern=%-4r [%t] %-5p %c %x - %m%n
\ No newline at end of file
diff --git 
a/fluss-lake/fluss-lake-hudi/src/test/resources/org.junit.jupiter.api.extension.Extension
 
b/fluss-lake/fluss-lake-hudi/src/test/resources/org.junit.jupiter.api.extension.Extension
new file mode 100644
index 000000000..ca0e907f6
--- /dev/null
+++ 
b/fluss-lake/fluss-lake-hudi/src/test/resources/org.junit.jupiter.api.extension.Extension
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+org.apache.fluss.testutils.common.TestLoggerExtension
\ No newline at end of file
diff --git a/fluss-lake/pom.xml b/fluss-lake/pom.xml
index 1cd65133c..1ee0dbb48 100644
--- a/fluss-lake/pom.xml
+++ b/fluss-lake/pom.xml
@@ -79,6 +79,7 @@
         <module>fluss-lake-paimon</module>
         <module>fluss-lake-iceberg</module>
         <module>fluss-lake-lance</module>
+        <module>fluss-lake-hudi</module>
     </modules>
     <packaging>pom</packaging>
 </project>
\ No newline at end of file
diff --git a/fluss-test-coverage/pom.xml b/fluss-test-coverage/pom.xml
index 9746076c4..1df67094f 100644
--- a/fluss-test-coverage/pom.xml
+++ b/fluss-test-coverage/pom.xml
@@ -448,6 +448,8 @@
                                         
<exclude>org.apache.fluss.lake.iceberg.*</exclude>
                                         
<exclude>org.apache.fluss.row.encode.iceberg.*</exclude>
                                         
<exclude>org.apache.fluss.bucketing.IcebergBucketingFunction</exclude>
+                                        <!-- temporarily exclude hudi -->
+                                        
<exclude>org.apache.fluss.lake.hudi.*</exclude>
                                         <!-- start exclude for flink tiering 
service -->
                                         
<exclude>org.apache.fluss.flink.tiering.source.TieringSourceOptions</exclude>
                                         
<exclude>org.apache.fluss.flink.tiering.source.TieringSource.Builder</exclude>
diff --git a/pom.xml b/pom.xml
index f0f0ef351..dc5ec59d6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -92,6 +92,7 @@
         <arrow.version>15.0.0</arrow.version>
         <paimon.version>1.3.1</paimon.version>
         <iceberg.version>1.10.1</iceberg.version>
+        <hudi.version>1.1.0</hudi.version>
         <roaringbitmap.version>1.3.0</roaringbitmap.version>
 
         <!-- spark & scala -->

Reply via email to