This is an automated email from the ASF dual-hosted git repository.
sivabalan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hudi.git
The following commit(s) were added to refs/heads/master by this push:
new 57c8113 [HUDI-2408] Deprecate FunctionalTestHarness to avoid init DFS
(#3628)
57c8113 is described below
commit 57c8113ee1941615a03f0efc2e3d46b634e940eb
Author: Raymond Xu <[email protected]>
AuthorDate: Thu Sep 9 08:29:04 2021 -0700
[HUDI-2408] Deprecate FunctionalTestHarness to avoid init DFS (#3628)
---
.../hudi/client/functional/TestHBaseIndex.java | 49 +++++++++---------
.../hudi/testutils/FunctionalTestHarness.java | 3 ++
.../hudi/utilities/HoodieSnapshotCopier.java | 2 +
.../hudi/utilities/HoodieSnapshotExporter.java | 2 -
.../TestAWSDatabaseMigrationServiceSource.java | 4 +-
.../functional/TestChainedTransformer.java | 4 +-
.../functional/TestHoodieSnapshotCopier.java | 2 +
.../functional/TestHoodieSnapshotExporter.java | 59 ++++++++++++----------
.../functional/TestJdbcbasedSchemaProvider.java | 4 +-
9 files changed, 68 insertions(+), 61 deletions(-)
diff --git
a/hudi-client/hudi-spark-client/src/test/java/org/apache/hudi/client/functional/TestHBaseIndex.java
b/hudi-client/hudi-spark-client/src/test/java/org/apache/hudi/client/functional/TestHBaseIndex.java
index efaad25..3ad7774 100644
---
a/hudi-client/hudi-spark-client/src/test/java/org/apache/hudi/client/functional/TestHBaseIndex.java
+++
b/hudi-client/hudi-spark-client/src/test/java/org/apache/hudi/client/functional/TestHBaseIndex.java
@@ -39,7 +39,7 @@ import org.apache.hudi.index.HoodieIndex;
import org.apache.hudi.index.hbase.SparkHoodieHBaseIndex;
import org.apache.hudi.table.HoodieSparkTable;
import org.apache.hudi.table.HoodieTable;
-import org.apache.hudi.testutils.FunctionalTestHarness;
+import org.apache.hudi.testutils.SparkClientFunctionalTestHarness;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
@@ -54,18 +54,22 @@ import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.spark.api.java.JavaRDD;
import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EnumSource;
+import java.io.IOException;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
-import java.util.HashMap;
import java.util.UUID;
import java.util.stream.Collectors;
@@ -88,7 +92,7 @@ import static org.mockito.Mockito.when;
*/
@TestMethodOrder(MethodOrderer.Alphanumeric.class)
@Tag("functional")
-public class TestHBaseIndex extends FunctionalTestHarness {
+public class TestHBaseIndex extends SparkClientFunctionalTestHarness {
private static final String TABLE_NAME = "test_table";
private static HBaseTestingUtility utility;
@@ -97,17 +101,8 @@ public class TestHBaseIndex extends FunctionalTestHarness {
private Configuration hadoopConf;
private HoodieTestDataGenerator dataGen;
private HoodieTableMetaClient metaClient;
-
- @AfterAll
- public static void clean() throws Exception {
- if (utility != null) {
- utility.deleteTable(TABLE_NAME);
- utility.shutdownMiniCluster();
- }
- if (spark != null) {
- spark.close();
- }
- }
+ private HoodieSparkEngineContext context;
+ private String basePath;
@BeforeAll
public static void init() throws Exception {
@@ -121,27 +116,31 @@ public class TestHBaseIndex extends FunctionalTestHarness
{
utility.createTable(TableName.valueOf(TABLE_NAME), Bytes.toBytes("_s"),2);
}
+ @AfterAll
+ public static void clean() throws Exception {
+ utility.shutdownMiniCluster();
+ }
+
@BeforeEach
public void setUp() throws Exception {
hadoopConf = jsc().hadoopConfiguration();
hadoopConf.addResource(utility.getConfiguration());
// reInit the context here to keep the hadoopConf the same with that in
this class
context = new HoodieSparkEngineContext(jsc());
- metaClient = getHoodieMetaClient(hadoopConf, basePath());
+ basePath = utility.getDataTestDirOnTestFS(TABLE_NAME).toString();
+ metaClient = getHoodieMetaClient(hadoopConf, basePath);
dataGen = new HoodieTestDataGenerator();
}
- @Test
- public void testSimpleTagLocationAndUpdateCOW() throws Exception {
- testSimpleTagLocationAndUpdate(HoodieTableType.COPY_ON_WRITE);
- }
-
- @Test void testSimpleTagLocationAndUpdateMOR() throws Exception {
- testSimpleTagLocationAndUpdate(HoodieTableType.MERGE_ON_READ);
+ @AfterEach
+ public void cleanUpTableData() throws IOException {
+ utility.cleanupDataTestDirOnTestFS(TABLE_NAME);
}
+ @ParameterizedTest
+ @EnumSource(HoodieTableType.class)
public void testSimpleTagLocationAndUpdate(HoodieTableType tableType) throws
Exception {
- metaClient = HoodieTestUtils.init(hadoopConf, basePath(), tableType);
+ metaClient = HoodieTestUtils.init(hadoopConf, basePath, tableType);
final String newCommitTime = "001";
final int numRecords = 10;
@@ -799,7 +798,7 @@ public class TestHBaseIndex extends FunctionalTestHarness {
}
private HoodieWriteConfig.Builder getConfigBuilder(int hbaseIndexBatchSize,
boolean updatePartitionPath, boolean rollbackSync) {
- return
HoodieWriteConfig.newBuilder().withPath(basePath()).withSchema(HoodieTestDataGenerator.TRIP_EXAMPLE_SCHEMA)
+ return
HoodieWriteConfig.newBuilder().withPath(basePath).withSchema(HoodieTestDataGenerator.TRIP_EXAMPLE_SCHEMA)
.withParallelism(1, 1).withDeleteParallelism(1)
.withCompactionConfig(HoodieCompactionConfig.newBuilder().compactionSmallFileSize(1024
* 1024)
.withInlineCompaction(false).build())
@@ -817,4 +816,4 @@ public class TestHBaseIndex extends FunctionalTestHarness {
.hbaseIndexGetBatchSize(hbaseIndexBatchSize).build())
.build());
}
-}
\ No newline at end of file
+}
diff --git
a/hudi-client/hudi-spark-client/src/test/java/org/apache/hudi/testutils/FunctionalTestHarness.java
b/hudi-client/hudi-spark-client/src/test/java/org/apache/hudi/testutils/FunctionalTestHarness.java
index cbf0a22..11c615a 100644
---
a/hudi-client/hudi-spark-client/src/test/java/org/apache/hudi/testutils/FunctionalTestHarness.java
+++
b/hudi-client/hudi-spark-client/src/test/java/org/apache/hudi/testutils/FunctionalTestHarness.java
@@ -53,6 +53,9 @@ import java.util.Properties;
import static org.apache.hudi.common.model.HoodieTableType.COPY_ON_WRITE;
import static
org.apache.hudi.common.testutils.HoodieTestUtils.RAW_TRIPS_TEST_NAME;
+/**
+ * @deprecated Deprecated. Use {@link SparkClientFunctionalTestHarness}
instead.
+ */
public class FunctionalTestHarness implements SparkProvider, DFSProvider,
HoodieMetaClientProvider, HoodieWriteClientProvider {
protected static transient SparkSession spark;
diff --git
a/hudi-utilities/src/main/java/org/apache/hudi/utilities/HoodieSnapshotCopier.java
b/hudi-utilities/src/main/java/org/apache/hudi/utilities/HoodieSnapshotCopier.java
index 20e19cf..860e0ad 100644
---
a/hudi-utilities/src/main/java/org/apache/hudi/utilities/HoodieSnapshotCopier.java
+++
b/hudi-utilities/src/main/java/org/apache/hudi/utilities/HoodieSnapshotCopier.java
@@ -54,6 +54,8 @@ import scala.Tuple2;
/**
* Hoodie snapshot copy job which copies latest files from all partitions to
another place, for snapshot backup.
+ *
+ * @deprecated Use {@link HoodieSnapshotExporter} instead.
*/
public class HoodieSnapshotCopier implements Serializable {
diff --git
a/hudi-utilities/src/main/java/org/apache/hudi/utilities/HoodieSnapshotExporter.java
b/hudi-utilities/src/main/java/org/apache/hudi/utilities/HoodieSnapshotExporter.java
index 42ab6ca..85f3d2d 100644
---
a/hudi-utilities/src/main/java/org/apache/hudi/utilities/HoodieSnapshotExporter.java
+++
b/hudi-utilities/src/main/java/org/apache/hudi/utilities/HoodieSnapshotExporter.java
@@ -68,8 +68,6 @@ import scala.collection.JavaConversions;
/**
* Export the latest records of Hudi dataset to a set of external files (e.g.,
plain parquet files).
- *
- * @experimental This export is an experimental tool. If you want to export
hudi to hudi, please use HoodieSnapshotCopier.
*/
public class HoodieSnapshotExporter {
diff --git
a/hudi-utilities/src/test/java/org/apache/hudi/utilities/functional/TestAWSDatabaseMigrationServiceSource.java
b/hudi-utilities/src/test/java/org/apache/hudi/utilities/functional/TestAWSDatabaseMigrationServiceSource.java
index 30efac4..cd6b89b 100644
---
a/hudi-utilities/src/test/java/org/apache/hudi/utilities/functional/TestAWSDatabaseMigrationServiceSource.java
+++
b/hudi-utilities/src/test/java/org/apache/hudi/utilities/functional/TestAWSDatabaseMigrationServiceSource.java
@@ -19,7 +19,7 @@
package org.apache.hudi.utilities.functional;
import org.apache.hudi.payload.AWSDmsAvroPayload;
-import org.apache.hudi.testutils.FunctionalTestHarness;
+import org.apache.hudi.testutils.SparkClientFunctionalTestHarness;
import org.apache.hudi.utilities.transform.AWSDmsTransformer;
import org.apache.avro.Schema;
@@ -38,7 +38,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
@Tag("functional")
-public class TestAWSDatabaseMigrationServiceSource extends
FunctionalTestHarness {
+public class TestAWSDatabaseMigrationServiceSource extends
SparkClientFunctionalTestHarness {
@Test
public void testPayload() throws IOException {
diff --git
a/hudi-utilities/src/test/java/org/apache/hudi/utilities/functional/TestChainedTransformer.java
b/hudi-utilities/src/test/java/org/apache/hudi/utilities/functional/TestChainedTransformer.java
index 095b12d..b493d43 100644
---
a/hudi-utilities/src/test/java/org/apache/hudi/utilities/functional/TestChainedTransformer.java
+++
b/hudi-utilities/src/test/java/org/apache/hudi/utilities/functional/TestChainedTransformer.java
@@ -19,7 +19,7 @@
package org.apache.hudi.utilities.functional;
-import org.apache.hudi.testutils.FunctionalTestHarness;
+import org.apache.hudi.testutils.SparkClientFunctionalTestHarness;
import org.apache.hudi.utilities.transform.ChainedTransformer;
import org.apache.hudi.utilities.transform.Transformer;
@@ -42,7 +42,7 @@ import static
org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
@Tag("functional")
-public class TestChainedTransformer extends FunctionalTestHarness {
+public class TestChainedTransformer extends SparkClientFunctionalTestHarness {
@Test
public void testChainedTransformation() {
diff --git
a/hudi-utilities/src/test/java/org/apache/hudi/utilities/functional/TestHoodieSnapshotCopier.java
b/hudi-utilities/src/test/java/org/apache/hudi/utilities/functional/TestHoodieSnapshotCopier.java
index f68f8c6..15f702a 100644
---
a/hudi-utilities/src/test/java/org/apache/hudi/utilities/functional/TestHoodieSnapshotCopier.java
+++
b/hudi-utilities/src/test/java/org/apache/hudi/utilities/functional/TestHoodieSnapshotCopier.java
@@ -29,6 +29,7 @@ import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
@@ -39,6 +40,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
+@Disabled("Disable due to flakiness and feature deprecation.")
@Tag("functional")
public class TestHoodieSnapshotCopier extends FunctionalTestHarness {
diff --git
a/hudi-utilities/src/test/java/org/apache/hudi/utilities/functional/TestHoodieSnapshotExporter.java
b/hudi-utilities/src/test/java/org/apache/hudi/utilities/functional/TestHoodieSnapshotExporter.java
index 133205c..c977b79 100644
---
a/hudi-utilities/src/test/java/org/apache/hudi/utilities/functional/TestHoodieSnapshotExporter.java
+++
b/hudi-utilities/src/test/java/org/apache/hudi/utilities/functional/TestHoodieSnapshotExporter.java
@@ -19,6 +19,7 @@
package org.apache.hudi.utilities.functional;
import org.apache.hudi.client.SparkRDDWriteClient;
+import org.apache.hudi.common.fs.FSUtils;
import org.apache.hudi.common.model.HoodieAvroPayload;
import org.apache.hudi.common.model.HoodieRecord;
import org.apache.hudi.common.model.HoodieTableType;
@@ -27,7 +28,7 @@ import
org.apache.hudi.common.testutils.HoodieTestDataGenerator;
import org.apache.hudi.config.HoodieIndexConfig;
import org.apache.hudi.config.HoodieWriteConfig;
import org.apache.hudi.index.HoodieIndex.IndexType;
-import org.apache.hudi.testutils.FunctionalTestHarness;
+import org.apache.hudi.testutils.SparkClientFunctionalTestHarness;
import org.apache.hudi.utilities.HoodieSnapshotExporter;
import org.apache.hudi.utilities.HoodieSnapshotExporter.Config;
import org.apache.hudi.utilities.HoodieSnapshotExporter.OutputFormatValidator;
@@ -35,6 +36,7 @@ import
org.apache.hudi.utilities.HoodieSnapshotExporter.Partitioner;
import org.apache.hudi.utilities.exception.HoodieSnapshotExporterException;
import org.apache.hadoop.fs.FileStatus;
+import org.apache.hadoop.fs.LocalFileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
@@ -54,6 +56,7 @@ import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import java.io.IOException;
+import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@@ -63,7 +66,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
@Tag("functional")
-public class TestHoodieSnapshotExporter extends FunctionalTestHarness {
+public class TestHoodieSnapshotExporter extends
SparkClientFunctionalTestHarness {
static final Logger LOG =
LogManager.getLogger(TestHoodieSnapshotExporter.class);
static final int NUM_RECORDS = 100;
@@ -72,13 +75,14 @@ public class TestHoodieSnapshotExporter extends
FunctionalTestHarness {
static final String TABLE_NAME = "testing";
String sourcePath;
String targetPath;
+ LocalFileSystem lfs;
@BeforeEach
public void init() throws Exception {
// Initialize test data dirs
- sourcePath = dfsBasePath() + "/source/";
- targetPath = dfsBasePath() + "/target/";
- dfs().mkdirs(new Path(sourcePath));
+ sourcePath = Paths.get(basePath(), "source").toString();
+ targetPath = Paths.get(basePath(), "target").toString();
+ lfs = (LocalFileSystem) FSUtils.getFs(basePath(),
jsc().hadoopConfiguration());
HoodieTableMetaClient.withPropertyBuilder()
.setTableType(HoodieTableType.COPY_ON_WRITE)
@@ -88,14 +92,14 @@ public class TestHoodieSnapshotExporter extends
FunctionalTestHarness {
// Prepare data as source Hudi dataset
HoodieWriteConfig cfg = getHoodieWriteConfig(sourcePath);
- SparkRDDWriteClient hdfsWriteClient = new SparkRDDWriteClient(context(),
cfg);
- hdfsWriteClient.startCommitWithTime(COMMIT_TIME);
+ SparkRDDWriteClient writeClient = getHoodieWriteClient(cfg);
+ writeClient.startCommitWithTime(COMMIT_TIME);
HoodieTestDataGenerator dataGen = new HoodieTestDataGenerator(new String[]
{PARTITION_PATH});
List<HoodieRecord> records = dataGen.generateInserts(COMMIT_TIME,
NUM_RECORDS);
JavaRDD<HoodieRecord> recordsRDD = jsc().parallelize(records, 1);
- hdfsWriteClient.bulkInsert(recordsRDD, COMMIT_TIME);
- hdfsWriteClient.close();
- RemoteIterator<LocatedFileStatus> itr = dfs().listFiles(new
Path(sourcePath), true);
+ writeClient.bulkInsert(recordsRDD, COMMIT_TIME);
+ writeClient.close();
+ RemoteIterator<LocatedFileStatus> itr = lfs.listFiles(new
Path(sourcePath), true);
while (itr.hasNext()) {
LOG.info(">>> Prepared test file: " + itr.next().getPath());
}
@@ -103,8 +107,7 @@ public class TestHoodieSnapshotExporter extends
FunctionalTestHarness {
@AfterEach
public void cleanUp() throws IOException {
- dfs().delete(new Path(sourcePath), true);
- dfs().delete(new Path(targetPath), true);
+ lfs.close();
}
private HoodieWriteConfig getHoodieWriteConfig(String basePath) {
@@ -138,18 +141,18 @@ public class TestHoodieSnapshotExporter extends
FunctionalTestHarness {
new HoodieSnapshotExporter().export(jsc(), cfg);
// Check results
- assertTrue(dfs().exists(new Path(targetPath + "/.hoodie/" + COMMIT_TIME
+ ".commit")));
- assertTrue(dfs().exists(new Path(targetPath + "/.hoodie/" + COMMIT_TIME
+ ".commit.requested")));
- assertTrue(dfs().exists(new Path(targetPath + "/.hoodie/" + COMMIT_TIME
+ ".inflight")));
- assertTrue(dfs().exists(new Path(targetPath +
"/.hoodie/hoodie.properties")));
+ assertTrue(lfs.exists(new Path(targetPath + "/.hoodie/" + COMMIT_TIME +
".commit")));
+ assertTrue(lfs.exists(new Path(targetPath + "/.hoodie/" + COMMIT_TIME +
".commit.requested")));
+ assertTrue(lfs.exists(new Path(targetPath + "/.hoodie/" + COMMIT_TIME +
".inflight")));
+ assertTrue(lfs.exists(new Path(targetPath +
"/.hoodie/hoodie.properties")));
String partition = targetPath + "/" + PARTITION_PATH;
- long numParquetFiles = Arrays.stream(dfs().listStatus(new
Path(partition)))
+ long numParquetFiles = Arrays.stream(lfs.listStatus(new Path(partition)))
.filter(fileStatus ->
fileStatus.getPath().toString().endsWith(".parquet"))
.count();
assertTrue(numParquetFiles >= 1, "There should exist at least 1 parquet
file.");
assertEquals(NUM_RECORDS,
sqlContext().read().parquet(partition).count());
- assertTrue(dfs().exists(new Path(partition +
"/.hoodie_partition_metadata")));
- assertTrue(dfs().exists(new Path(targetPath + "/_SUCCESS")));
+ assertTrue(lfs.exists(new Path(partition +
"/.hoodie_partition_metadata")));
+ assertTrue(lfs.exists(new Path(targetPath + "/_SUCCESS")));
}
}
@@ -169,7 +172,7 @@ public class TestHoodieSnapshotExporter extends
FunctionalTestHarness {
@Test
public void testExportWhenTargetPathExists() throws IOException {
// make target output path present
- dfs().mkdirs(new Path(targetPath));
+ lfs.mkdirs(new Path(targetPath));
// export
final Throwable thrown =
assertThrows(HoodieSnapshotExporterException.class, () -> {
@@ -181,12 +184,12 @@ public class TestHoodieSnapshotExporter extends
FunctionalTestHarness {
@Test
public void testExportDatasetWithNoCommit() throws IOException {
// delete commit files
- List<Path> commitFiles = Arrays.stream(dfs().listStatus(new
Path(sourcePath + "/.hoodie")))
+ List<Path> commitFiles = Arrays.stream(lfs.listStatus(new
Path(sourcePath + "/.hoodie")))
.map(FileStatus::getPath)
.filter(filePath -> filePath.getName().endsWith(".commit"))
.collect(Collectors.toList());
for (Path p : commitFiles) {
- dfs().delete(p, false);
+ lfs.delete(p, false);
}
// export
@@ -199,7 +202,7 @@ public class TestHoodieSnapshotExporter extends
FunctionalTestHarness {
@Test
public void testExportDatasetWithNoPartition() throws IOException {
// delete all source data
- dfs().delete(new Path(sourcePath + "/" + PARTITION_PATH), true);
+ lfs.delete(new Path(sourcePath + "/" + PARTITION_PATH), true);
// export
final Throwable thrown =
assertThrows(HoodieSnapshotExporterException.class, () -> {
@@ -221,7 +224,7 @@ public class TestHoodieSnapshotExporter extends
FunctionalTestHarness {
cfg.outputFormat = format;
new HoodieSnapshotExporter().export(jsc(), cfg);
assertEquals(NUM_RECORDS,
sqlContext().read().format(format).load(targetPath).count());
- assertTrue(dfs().exists(new Path(targetPath + "/_SUCCESS")));
+ assertTrue(lfs.exists(new Path(targetPath + "/_SUCCESS")));
}
}
@@ -259,8 +262,8 @@ public class TestHoodieSnapshotExporter extends
FunctionalTestHarness {
new HoodieSnapshotExporter().export(jsc(), cfg);
assertEquals(NUM_RECORDS,
sqlContext().read().format("json").load(targetPath).count());
- assertTrue(dfs().exists(new Path(targetPath + "/_SUCCESS")));
- assertTrue(dfs().listStatus(new Path(targetPath)).length > 1);
+ assertTrue(lfs.exists(new Path(targetPath + "/_SUCCESS")));
+ assertTrue(lfs.listStatus(new Path(targetPath)).length > 1);
}
@Test
@@ -269,8 +272,8 @@ public class TestHoodieSnapshotExporter extends
FunctionalTestHarness {
new HoodieSnapshotExporter().export(jsc(), cfg);
assertEquals(NUM_RECORDS,
sqlContext().read().format("json").load(targetPath).count());
- assertTrue(dfs().exists(new Path(targetPath + "/_SUCCESS")));
- assertTrue(dfs().exists(new Path(String.format("%s/%s=%s", targetPath,
UserDefinedPartitioner.PARTITION_NAME, PARTITION_PATH))));
+ assertTrue(lfs.exists(new Path(targetPath + "/_SUCCESS")));
+ assertTrue(lfs.exists(new Path(String.format("%s/%s=%s", targetPath,
UserDefinedPartitioner.PARTITION_NAME, PARTITION_PATH))));
}
}
}
diff --git
a/hudi-utilities/src/test/java/org/apache/hudi/utilities/functional/TestJdbcbasedSchemaProvider.java
b/hudi-utilities/src/test/java/org/apache/hudi/utilities/functional/TestJdbcbasedSchemaProvider.java
index fde26f5..7dd8af6 100644
---
a/hudi-utilities/src/test/java/org/apache/hudi/utilities/functional/TestJdbcbasedSchemaProvider.java
+++
b/hudi-utilities/src/test/java/org/apache/hudi/utilities/functional/TestJdbcbasedSchemaProvider.java
@@ -20,7 +20,7 @@ package org.apache.hudi.utilities.functional;
import org.apache.hudi.common.config.TypedProperties;
import org.apache.hudi.exception.HoodieException;
-import org.apache.hudi.testutils.FunctionalTestHarness;
+import org.apache.hudi.testutils.SparkClientFunctionalTestHarness;
import org.apache.hudi.utilities.UtilHelpers;
import org.apache.hudi.utilities.schema.JdbcbasedSchemaProvider;
import org.apache.hudi.utilities.testutils.UtilitiesTestBase;
@@ -41,7 +41,7 @@ import java.sql.SQLException;
import static org.junit.jupiter.api.Assertions.assertEquals;
@Tag("functional")
-public class TestJdbcbasedSchemaProvider extends FunctionalTestHarness {
+public class TestJdbcbasedSchemaProvider extends
SparkClientFunctionalTestHarness {
private static final Logger LOG =
LogManager.getLogger(TestJdbcbasedSchemaProvider.class);
private static final TypedProperties PROPS = new TypedProperties();