From c18d9cd11294662392288052c5a2ec2fb9151eef Mon Sep 17 00:00:00 2001 From: fhan Date: Mon, 27 Apr 2026 17:59:44 +0800 Subject: [PATCH 1/4] [lake/hudi] Introduce fluss-lake-hudi module and HudiLakeStorage --- docker/quickstart-flink/prepare_build.sh | 1 + .../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 | 18 ++++++ fluss-lake/fluss-lake-hudi/pom.xml | 57 +++++++++++++++++++ .../fluss/lake/hudi/HudiLakeStorage.java | 50 ++++++++++++++++ .../lake/hudi/HudiLakeStoragePlugin.java | 38 +++++++++++++ .../src/main/resources/META-INF/NOTICE | 9 +++ ...e.fluss.lake.lakestorage.LakeStoragePlugin | 19 +++++++ .../src/test/resources/log4j2-test.properties | 26 +++++++++ .../org.junit.jupiter.api.extension.Extension | 19 +++++++ fluss-lake/pom.xml | 1 + pom.xml | 1 + 14 files changed, 254 insertions(+), 1 deletion(-) create mode 100644 fluss-lake/fluss-lake-hudi/pom.xml create mode 100644 fluss-lake/fluss-lake-hudi/src/main/java/org/apache/fluss/lake/hudi/HudiLakeStorage.java create mode 100644 fluss-lake/fluss-lake-hudi/src/main/java/org/apache/fluss/lake/hudi/HudiLakeStoragePlugin.java create mode 100644 fluss-lake/fluss-lake-hudi/src/main/resources/META-INF/NOTICE create mode 100644 fluss-lake/fluss-lake-hudi/src/main/resources/META-INF/services/org.apache.fluss.lake.lakestorage.LakeStoragePlugin create mode 100644 fluss-lake/fluss-lake-hudi/src/test/resources/log4j2-test.properties create mode 100644 fluss-lake/fluss-lake-hudi/src/test/resources/org.junit.jupiter.api.extension.Extension diff --git a/docker/quickstart-flink/prepare_build.sh b/docker/quickstart-flink/prepare_build.sh index f2fc2ee7d4..f439270f5d 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 a0dfea4693..1dc2843358 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 @@ 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 5c8a00dea5..63e08b8640 100644 --- a/fluss-dist/pom.xml +++ b/fluss-dist/pom.xml @@ -96,6 +96,13 @@ ${project.version} provided + + + org.apache.fluss + fluss-lake-hudi + ${project.version} + provided + org.apache.flink diff --git a/fluss-dist/src/main/assemblies/plugins.xml b/fluss-dist/src/main/assemblies/plugins.xml index 8eb05e8a07..02459902cc 100644 --- a/fluss-dist/src/main/assemblies/plugins.xml +++ b/fluss-dist/src/main/assemblies/plugins.xml @@ -98,6 +98,12 @@ plugins/lance/ fluss-lake-lance-${project.version}.jar + + ../fluss-lake/fluss-lake-hudi/target/fluss-lake-hudi-${project.version}.jar + plugins/hudi/ + fluss-lake-hudi-${project.version}.jar + 0644 + \ 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 53ac05701a..dbbd680b26 100644 --- a/fluss-flink/fluss-flink-common/pom.xml +++ b/fluss-flink/fluss-flink-common/pom.xml @@ -95,6 +95,24 @@ provided + + + org.apache.hudi + hudi-flink${flink.major.version}-bundle + ${hudi.version} + provided + + + org.slf4j + slf4j-reload4j + + + ch.qos.reload4j + reload4j + + + + diff --git a/fluss-lake/fluss-lake-hudi/pom.xml b/fluss-lake/fluss-lake-hudi/pom.xml new file mode 100644 index 0000000000..b95a701632 --- /dev/null +++ b/fluss-lake/fluss-lake-hudi/pom.xml @@ -0,0 +1,57 @@ + + + + + 4.0.0 + + org.apache.fluss + fluss-lake + 0.9-SNAPSHOT + + + fluss-lake-hudi + Fluss : Lake : Hudi + + jar + + + + + org.apache.fluss + fluss-common + ${project.version} + compile + + + log4j + log4j + + + org.slf4j + slf4j-api + + + org.apache.commons + commons-lang3 + + + + + + \ 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 0000000000..f486dc1abc --- /dev/null +++ b/fluss-lake/fluss-lake-hudi/src/main/java/org/apache/fluss/lake/hudi/HudiLakeStorage.java @@ -0,0 +1,50 @@ +/* + * 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; + +/** Implement of Hudi Lake Source. */ +public class HudiLakeStorage implements LakeStorage { + + protected final Configuration hudiConfig; + + public HudiLakeStorage(Configuration configuration) { + this.hudiConfig = configuration; + } + + @Override + public LakeTieringFactory createLakeTieringFactory() { + throw new UnsupportedOperationException("Not implemented"); + } + + @Override + public LakeCatalog createLakeCatalog() { + throw new UnsupportedOperationException("Not implemented"); + } + + @Override + public LakeSource createLakeSource(TablePath tablePath) { + throw new UnsupportedOperationException("Not implemented"); + } +} diff --git a/fluss-lake/fluss-lake-hudi/src/main/java/org/apache/fluss/lake/hudi/HudiLakeStoragePlugin.java b/fluss-lake/fluss-lake-hudi/src/main/java/org/apache/fluss/lake/hudi/HudiLakeStoragePlugin.java new file mode 100644 index 0000000000..2fe0e74405 --- /dev/null +++ b/fluss-lake/fluss-lake-hudi/src/main/java/org/apache/fluss/lake/hudi/HudiLakeStoragePlugin.java @@ -0,0 +1,38 @@ +/* + * 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.LakeStorage; +import org.apache.fluss.lake.lakestorage.LakeStoragePlugin; + +/** Implement of Hudi Lake Storage Plugin. */ +public class HudiLakeStoragePlugin implements LakeStoragePlugin { + + private static final String IDENTIFIER = "hudi"; + + @Override + public String identifier() { + return IDENTIFIER; + } + + @Override + 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 0000000000..c8d7902138 --- /dev/null +++ b/fluss-lake/fluss-lake-hudi/src/main/resources/META-INF/NOTICE @@ -0,0 +1,9 @@ +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) + +- org.apache.hudi:hudi-flink1.20-bundle:1.1.0 \ 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 0000000000..2932e74267 --- /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 0000000000..1bf2d6cd68 --- /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=INFO +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 0000000000..ca0e907f6d --- /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 1cd65133c6..1ee0dbb48f 100644 --- a/fluss-lake/pom.xml +++ b/fluss-lake/pom.xml @@ -79,6 +79,7 @@ fluss-lake-paimon fluss-lake-iceberg fluss-lake-lance + fluss-lake-hudi pom \ No newline at end of file diff --git a/pom.xml b/pom.xml index f0f0ef351d..dc5ec59d62 100644 --- a/pom.xml +++ b/pom.xml @@ -92,6 +92,7 @@ 15.0.0 1.3.1 1.10.1 + 1.1.0 1.3.0 From d084e4ffa4229fc36b5b706de1f9bdd80e7584a8 Mon Sep 17 00:00:00 2001 From: fhan Date: Sat, 9 May 2026 10:52:09 +0800 Subject: [PATCH 2/4] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- fluss-lake/fluss-lake-hudi/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fluss-lake/fluss-lake-hudi/pom.xml b/fluss-lake/fluss-lake-hudi/pom.xml index b95a701632..9a2c47ee5b 100644 --- a/fluss-lake/fluss-lake-hudi/pom.xml +++ b/fluss-lake/fluss-lake-hudi/pom.xml @@ -22,7 +22,7 @@ org.apache.fluss fluss-lake - 0.9-SNAPSHOT + 1.0-SNAPSHOT fluss-lake-hudi From e3c2d824b22b3901d4510e55449e7ba1a3c59753 Mon Sep 17 00:00:00 2001 From: fhan Date: Sat, 9 May 2026 11:41:27 +0800 Subject: [PATCH 3/4] [lake/hudi] Update log4j config,NOTICE,pom,exception descriptions according to AI reviewed suggestions. --- fluss-lake/fluss-lake-hudi/pom.xml | 18 ++---------------- .../fluss/lake/hudi/HudiLakeStorage.java | 19 +++++++++++++++---- .../lake/hudi/HudiLakeStoragePlugin.java | 2 +- .../src/main/resources/META-INF/NOTICE | 4 +--- .../src/test/resources/log4j2-test.properties | 2 +- 5 files changed, 20 insertions(+), 25 deletions(-) diff --git a/fluss-lake/fluss-lake-hudi/pom.xml b/fluss-lake/fluss-lake-hudi/pom.xml index b95a701632..ddf6b1329d 100644 --- a/fluss-lake/fluss-lake-hudi/pom.xml +++ b/fluss-lake/fluss-lake-hudi/pom.xml @@ -22,7 +22,7 @@ org.apache.fluss fluss-lake - 0.9-SNAPSHOT + 1.0-SNAPSHOT fluss-lake-hudi @@ -36,21 +36,7 @@ org.apache.fluss fluss-common ${project.version} - compile - - - log4j - log4j - - - org.slf4j - slf4j-api - - - org.apache.commons - commons-lang3 - - + provided 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 index f486dc1abc..9921cc0e4a 100644 --- 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 @@ -24,7 +24,7 @@ import org.apache.fluss.lake.writer.LakeTieringFactory; import org.apache.fluss.metadata.TablePath; -/** Implement of Hudi Lake Source. */ +/** Implementation of Hudi lake storage. */ public class HudiLakeStorage implements LakeStorage { protected final Configuration hudiConfig; @@ -35,16 +35,27 @@ public HudiLakeStorage(Configuration configuration) { @Override public LakeTieringFactory createLakeTieringFactory() { - throw new UnsupportedOperationException("Not implemented"); + 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("Not implemented"); + 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("Not implemented"); + 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-lake/fluss-lake-hudi/src/main/java/org/apache/fluss/lake/hudi/HudiLakeStoragePlugin.java b/fluss-lake/fluss-lake-hudi/src/main/java/org/apache/fluss/lake/hudi/HudiLakeStoragePlugin.java index 2fe0e74405..124aa0a546 100644 --- a/fluss-lake/fluss-lake-hudi/src/main/java/org/apache/fluss/lake/hudi/HudiLakeStoragePlugin.java +++ b/fluss-lake/fluss-lake-hudi/src/main/java/org/apache/fluss/lake/hudi/HudiLakeStoragePlugin.java @@ -21,7 +21,7 @@ import org.apache.fluss.lake.lakestorage.LakeStorage; import org.apache.fluss.lake.lakestorage.LakeStoragePlugin; -/** Implement of Hudi Lake Storage Plugin. */ +/** Hudi implementation of {@link LakeStoragePlugin}. */ public class HudiLakeStoragePlugin implements LakeStoragePlugin { private static final String IDENTIFIER = "hudi"; 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 index c8d7902138..91800d5c87 100644 --- a/fluss-lake/fluss-lake-hudi/src/main/resources/META-INF/NOTICE +++ b/fluss-lake/fluss-lake-hudi/src/main/resources/META-INF/NOTICE @@ -4,6 +4,4 @@ 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) - -- org.apache.hudi:hudi-flink1.20-bundle:1.1.0 \ No newline at end of file +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/test/resources/log4j2-test.properties b/fluss-lake/fluss-lake-hudi/src/test/resources/log4j2-test.properties index 1bf2d6cd68..2100a34e0b 100644 --- a/fluss-lake/fluss-lake-hudi/src/test/resources/log4j2-test.properties +++ b/fluss-lake/fluss-lake-hudi/src/test/resources/log4j2-test.properties @@ -17,7 +17,7 @@ # # Set root logger level to OFF to not flood build logs # set manually to INFO for debugging purposes -rootLogger.level=INFO +rootLogger.level=OFF rootLogger.appenderRef.test.ref=TestLogger appender.testlogger.name=TestLogger appender.testlogger.type=CONSOLE From 83028a8fad1201665466f9c78a5ea6bf8c27b0c4 Mon Sep 17 00:00:00 2001 From: fhan Date: Tue, 12 May 2026 18:18:00 +0800 Subject: [PATCH 4/4] [lake/hudi] rm hudi dependency in fluss-flink-common and optimize code style in HudiLakeStorage. --- fluss-flink/fluss-flink-common/pom.xml | 19 -------------- .../fluss/lake/hudi/HudiLakeStorage.java | 26 +++++++++---------- 2 files changed, 13 insertions(+), 32 deletions(-) diff --git a/fluss-flink/fluss-flink-common/pom.xml b/fluss-flink/fluss-flink-common/pom.xml index dbbd680b26..dab880b58b 100644 --- a/fluss-flink/fluss-flink-common/pom.xml +++ b/fluss-flink/fluss-flink-common/pom.xml @@ -95,25 +95,6 @@ provided - - - org.apache.hudi - hudi-flink${flink.major.version}-bundle - ${hudi.version} - provided - - - org.slf4j - slf4j-reload4j - - - ch.qos.reload4j - reload4j - - - - - org.apache.fluss 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 index 9921cc0e4a..f0865de0ea 100644 --- 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 @@ -24,10 +24,10 @@ import org.apache.fluss.lake.writer.LakeTieringFactory; import org.apache.fluss.metadata.TablePath; -/** Implementation of Hudi lake storage. */ +/** Hudi Implementation of {@link LakeStorage}. */ public class HudiLakeStorage implements LakeStorage { - protected final Configuration hudiConfig; + private final Configuration hudiConfig; public HudiLakeStorage(Configuration configuration) { this.hudiConfig = configuration; @@ -36,26 +36,26 @@ public HudiLakeStorage(Configuration 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."); + "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."); + "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."); + "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."); } }