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

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


The following commit(s) were added to refs/heads/main by this push:
     new 343396720 [#4927] improvement(catalog): extract a common HMS module 
(#4928)
343396720 is described below

commit 3433967204d98e164285fb1be50bd20090b704e2
Author: mchades <[email protected]>
AuthorDate: Wed Sep 18 14:19:19 2024 +0800

    [#4927] improvement(catalog): extract a common HMS module (#4928)
    
    ### What changes were proposed in this pull request?
    
    extract a common HMS module
    
    ### Why are the changes needed?
    
    Fix: #4927
    
    ### Does this PR introduce _any_ user-facing change?
    
    no
    
    ### How was this patch tested?
    
    CI passed
---
 build.gradle.kts                                   |   4 +-
 catalogs/catalog-hive/build.gradle.kts             |  33 +---
 .../catalog/hive/HiveCatalogOperations.java        |  26 +---
 .../catalog/hive/HiveCatalogPropertiesMeta.java    |  27 +---
 .../apache/gravitino/catalog/hive/HiveSchema.java  |  21 +--
 .../apache/gravitino/catalog/hive/HiveTable.java   |  69 ++-------
 .../gravitino/catalog/hive/TestHiveCatalog.java    |   2 +-
 .../catalog/hive/TestHiveCatalogOperations.java    |  22 +--
 .../gravitino/catalog/hive/TestHiveSchema.java     |   2 +-
 .../gravitino/catalog/hive/TestHiveTable.java      |   2 +-
 .../catalog/hive/TestHiveTableOperations.java      |   2 +-
 .../hive/integration/test/CatalogHiveIT.java       |   2 +-
 .../hive/integration/test/ProxyCatalogHiveIT.java  |   2 +-
 .../build.gradle.kts                               | 170 ++++++---------------
 .../apache/gravitino}/hive/CachedClientPool.java   |  25 ++-
 .../gravitino/hive/ClientPropertiesMetadata.java   |  56 +++++++
 .../org/apache/gravitino}/hive/HiveClientPool.java |   6 +-
 .../hive/converter/HiveDataTypeConverter.java      |   2 +-
 .../hive/converter/HiveTableConverter.java         | 110 +++++++++++++
 .../gravitino}/hive/dyn/DynConstructors.java       |   2 +-
 .../org/apache/gravitino}/hive/dyn/DynFields.java  |   2 +-
 .../org/apache/gravitino}/hive/dyn/DynMethods.java |   2 +-
 .../gravitino}/hive/TestCachedClientPool.java      |  15 +-
 .../hive/converter/TestTypeConverter.java          |   4 +-
 .../apache/gravitino}/hive/dyn/TestDynFields.java  |   2 +-
 .../gravitino/hive/hms}/MiniHiveMetastore.java     |   8 +-
 .../hive/hms}/MiniHiveMetastoreService.java        |   2 +-
 .../apache/gravitino/hive/hms}/ScriptRunner.java   |   2 +-
 .../src/test/resources/hive-schema-3.1.0.derby.sql |   0
 gradle/libs.versions.toml                          |  10 ++
 settings.gradle.kts                                |   1 +
 spark-connector/v3.3/spark/build.gradle.kts        |   3 +
 spark-connector/v3.4/spark/build.gradle.kts        |   3 +
 spark-connector/v3.5/spark/build.gradle.kts        |   3 +
 34 files changed, 315 insertions(+), 327 deletions(-)

diff --git a/build.gradle.kts b/build.gradle.kts
index 1737902af..e18b5c56c 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -743,7 +743,7 @@ tasks {
       if (!it.name.startsWith("catalog") &&
         !it.name.startsWith("authorization") &&
         !it.name.startsWith("client") && !it.name.startsWith("filesystem") && 
!it.name.startsWith("spark") && !it.name.startsWith("iceberg") && it.name != 
"trino-connector" &&
-        it.name != "integration-test" && it.name != "bundled-catalog" && 
!it.name.startsWith("flink")
+        it.name != "integration-test" && it.name != "hive-metastore-common" && 
!it.name.startsWith("flink")
       ) {
         from(it.configurations.runtimeClasspath)
         into("distribution/package/libs")
@@ -762,7 +762,7 @@ tasks {
         !it.name.startsWith("integration-test") &&
         !it.name.startsWith("flink") &&
         !it.name.startsWith("trino-connector") &&
-        it.name != "bundled-catalog"
+        it.name != "hive-metastore-common"
       ) {
         dependsOn("${it.name}:build")
         from("${it.name}/build/libs")
diff --git a/catalogs/catalog-hive/build.gradle.kts 
b/catalogs/catalog-hive/build.gradle.kts
index 84474878e..82b213a2a 100644
--- a/catalogs/catalog-hive/build.gradle.kts
+++ b/catalogs/catalog-hive/build.gradle.kts
@@ -36,44 +36,19 @@ dependencies {
   implementation(project(":catalogs:catalog-common")) {
     exclude("*")
   }
+  implementation(project(":catalogs:hive-metastore-common"))
   implementation(project(":core")) {
     exclude("*")
   }
 
-  implementation(libs.caffeine)
   implementation(libs.commons.collections3)
   implementation(libs.commons.configuration1)
   implementation(libs.htrace.core4)
+  implementation(libs.commons.io)
   implementation(libs.guava)
   implementation(libs.hadoop2.auth) {
     exclude("*")
   }
-  implementation(libs.hive2.exec) {
-    artifact {
-      classifier = "core"
-    }
-    exclude("com.google.code.findbugs", "jsr305")
-    exclude("com.google.protobuf")
-    exclude("org.apache.avro")
-    exclude("org.apache.ant")
-    exclude("org.apache.calcite")
-    exclude("org.apache.calcite.avatica")
-    exclude("org.apache.curator")
-    exclude("org.apache.derby")
-    exclude("org.apache.hadoop", "hadoop-yarn-server-resourcemanager")
-    exclude("org.apache.hive", "hive-llap-tez")
-    exclude("org.apache.hive", "hive-vector-code-gen")
-    exclude("org.apache.ivy")
-    exclude("org.apache.logging.log4j")
-    exclude("org.apache.zookeeper")
-    exclude("org.codehaus.groovy", "groovy-all")
-    exclude("org.datanucleus", "datanucleus-core")
-    exclude("org.eclipse.jetty.aggregate", "jetty-all")
-    exclude("org.eclipse.jetty.orbit", "javax.servlet")
-    exclude("org.openjdk.jol")
-    exclude("org.pentaho")
-    exclude("org.slf4j")
-  }
   implementation(libs.woodstox.core)
   implementation(libs.hive2.metastore) {
     exclude("ant")
@@ -115,6 +90,7 @@ dependencies {
   annotationProcessor(libs.immutables.value)
   annotationProcessor(libs.lombok)
 
+  testImplementation(project(":catalogs:hive-metastore-common", 
"testArtifacts"))
   testImplementation(project(":common"))
   testImplementation(project(":clients:client-java"))
   testImplementation(project(":integration-test-common", "testArtifacts"))
@@ -125,6 +101,9 @@ dependencies {
   testImplementation(libs.bundles.jersey)
   testImplementation(libs.bundles.log4j)
   testImplementation(libs.hadoop2.hdfs)
+  testImplementation(libs.hadoop2.mapreduce.client.core) {
+    exclude("*")
+  }
   testImplementation(libs.hive2.common) {
     exclude("org.eclipse.jetty.aggregate", "jetty-all")
     exclude("org.eclipse.jetty.orbit", "javax.servlet")
diff --git 
a/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/HiveCatalogOperations.java
 
b/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/HiveCatalogOperations.java
index 1f7495bd8..6de028f41 100644
--- 
a/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/HiveCatalogOperations.java
+++ 
b/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/HiveCatalogOperations.java
@@ -18,8 +18,6 @@
  */
 package org.apache.gravitino.catalog.hive;
 
-import static 
org.apache.gravitino.catalog.hive.HiveCatalogPropertiesMeta.CLIENT_POOL_CACHE_EVICTION_INTERVAL_MS;
-import static 
org.apache.gravitino.catalog.hive.HiveCatalogPropertiesMeta.CLIENT_POOL_SIZE;
 import static 
org.apache.gravitino.catalog.hive.HiveCatalogPropertiesMeta.LIST_ALL_TABLES;
 import static 
org.apache.gravitino.catalog.hive.HiveCatalogPropertiesMeta.METASTORE_URIS;
 import static 
org.apache.gravitino.catalog.hive.HiveCatalogPropertiesMeta.PRINCIPAL;
@@ -28,8 +26,8 @@ import static 
org.apache.gravitino.catalog.hive.HiveTable.SUPPORT_TABLE_TYPES;
 import static org.apache.gravitino.catalog.hive.HiveTable.TABLE_TYPE_PROP;
 import static 
org.apache.gravitino.catalog.hive.HiveTablePropertiesMetadata.COMMENT;
 import static 
org.apache.gravitino.catalog.hive.HiveTablePropertiesMetadata.TABLE_TYPE;
-import static 
org.apache.gravitino.catalog.hive.converter.HiveDataTypeConverter.CONVERTER;
 import static org.apache.gravitino.connector.BaseCatalog.CATALOG_BYPASS_PREFIX;
+import static 
org.apache.gravitino.hive.converter.HiveDataTypeConverter.CONVERTER;
 import static org.apache.hadoop.hive.metastore.TableType.EXTERNAL_TABLE;
 
 import com.google.common.annotations.VisibleForTesting;
@@ -71,6 +69,7 @@ import org.apache.gravitino.exceptions.NoSuchTableException;
 import org.apache.gravitino.exceptions.NonEmptySchemaException;
 import org.apache.gravitino.exceptions.SchemaAlreadyExistsException;
 import org.apache.gravitino.exceptions.TableAlreadyExistsException;
+import org.apache.gravitino.hive.CachedClientPool;
 import org.apache.gravitino.meta.AuditInfo;
 import org.apache.gravitino.rel.Column;
 import org.apache.gravitino.rel.Table;
@@ -167,8 +166,7 @@ public class HiveCatalogOperations implements 
CatalogOperations, SupportsSchemas
 
     initKerberosIfNecessary(conf, hadoopConf);
 
-    this.clientPool =
-        new CachedClientPool(getClientPoolSize(conf), hiveConf, 
getCacheEvictionInterval(conf));
+    this.clientPool = new CachedClientPool(hiveConf, conf);
 
     this.listAllTables = enableListAllTables(conf);
   }
@@ -282,19 +280,6 @@ public class HiveCatalogOperations implements 
CatalogOperations, SupportsSchemas
     }
   }
 
-  @VisibleForTesting
-  int getClientPoolSize(Map<String, String> conf) {
-    return (int)
-        propertiesMetadata.catalogPropertiesMetadata().getOrDefault(conf, 
CLIENT_POOL_SIZE);
-  }
-
-  long getCacheEvictionInterval(Map<String, String> conf) {
-    return (long)
-        propertiesMetadata
-            .catalogPropertiesMetadata()
-            .getOrDefault(conf, CLIENT_POOL_CACHE_EVICTION_INTERVAL_MS);
-  }
-
   boolean enableListAllTables(Map<String, String> conf) {
     return (boolean)
         propertiesMetadata.catalogPropertiesMetadata().getOrDefault(conf, 
LIST_ALL_TABLES);
@@ -372,7 +357,6 @@ public class HiveCatalogOperations implements 
CatalogOperations, SupportsSchemas
               .withName(ident.name())
               .withComment(comment)
               .withProperties(properties)
-              .withConf(hiveConf)
               .withAuditInfo(
                   AuditInfo.builder()
                       
.withCreator(UserGroupInformation.getCurrentUser().getUserName())
@@ -413,7 +397,7 @@ public class HiveCatalogOperations implements 
CatalogOperations, SupportsSchemas
   public HiveSchema loadSchema(NameIdentifier ident) throws 
NoSuchSchemaException {
     try {
       Database database = clientPool.run(client -> 
client.getDatabase(ident.name()));
-      HiveSchema hiveSchema = HiveSchema.fromHiveDB(database, hiveConf);
+      HiveSchema hiveSchema = HiveSchema.fromHiveDB(database);
 
       LOG.info("Loaded Hive schema (database) {} from Hive Metastore ", 
ident.name());
       return hiveSchema;
@@ -477,7 +461,7 @@ public class HiveCatalogOperations implements 
CatalogOperations, SupportsSchemas
           });
 
       LOG.info("Altered Hive schema (database) {} in Hive Metastore", 
ident.name());
-      return HiveSchema.fromHiveDB(alteredDatabase, hiveConf);
+      return HiveSchema.fromHiveDB(alteredDatabase);
 
     } catch (NoSuchObjectException e) {
       throw new NoSuchSchemaException(
diff --git 
a/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/HiveCatalogPropertiesMeta.java
 
b/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/HiveCatalogPropertiesMeta.java
index 46d9cc80b..dc532e601 100644
--- 
a/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/HiveCatalogPropertiesMeta.java
+++ 
b/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/HiveCatalogPropertiesMeta.java
@@ -21,24 +21,19 @@ package org.apache.gravitino.catalog.hive;
 
 import com.google.common.collect.ImmutableMap;
 import java.util.Map;
-import java.util.concurrent.TimeUnit;
 import org.apache.gravitino.connector.AuthorizationPropertiesMeta;
 import org.apache.gravitino.connector.BaseCatalogPropertiesMetadata;
 import org.apache.gravitino.connector.PropertyEntry;
+import org.apache.gravitino.hive.ClientPropertiesMetadata;
 
 public class HiveCatalogPropertiesMeta extends BaseCatalogPropertiesMetadata {
 
   public static final String CLIENT_POOL_SIZE = HiveConstants.CLIENT_POOL_SIZE;
-  public static final int DEFAULT_CLIENT_POOL_SIZE = 1;
-
   public static final String METASTORE_URIS = HiveConstants.METASTORE_URIS;
 
   public static final String CLIENT_POOL_CACHE_EVICTION_INTERVAL_MS =
       HiveConstants.CLIENT_POOL_CACHE_EVICTION_INTERVAL_MS;
 
-  public static final long DEFAULT_CLIENT_POOL_CACHE_EVICTION_INTERVAL_MS =
-      TimeUnit.MINUTES.toMillis(5);
-
   public static final String IMPERSONATION_ENABLE = 
HiveConstants.IMPERSONATION_ENABLE;
 
   public static final boolean DEFAULT_IMPERSONATION_ENABLE = false;
@@ -55,6 +50,9 @@ public class HiveCatalogPropertiesMeta extends 
BaseCatalogPropertiesMetadata {
 
   public static final boolean DEFAULT_LIST_ALL_TABLES = false;
 
+  private static final ClientPropertiesMetadata CLIENT_PROPERTIES_METADATA =
+      new ClientPropertiesMetadata();
+
   private static final Map<String, PropertyEntry<?>> 
HIVE_CATALOG_PROPERTY_ENTRIES =
       ImmutableMap.<String, PropertyEntry<?>>builder()
           .put(
@@ -64,22 +62,6 @@ public class HiveCatalogPropertiesMeta extends 
BaseCatalogPropertiesMetadata {
                   "The Hive metastore URIs",
                   false /* immutable */,
                   false /* hidden */))
-          .put(
-              CLIENT_POOL_SIZE,
-              PropertyEntry.integerOptionalPropertyEntry(
-                  CLIENT_POOL_SIZE,
-                  "The maximum number of Hive metastore clients in the pool 
for Gravitino",
-                  false /* immutable */,
-                  DEFAULT_CLIENT_POOL_SIZE,
-                  false /* hidden */))
-          .put(
-              CLIENT_POOL_CACHE_EVICTION_INTERVAL_MS,
-              PropertyEntry.longOptionalPropertyEntry(
-                  CLIENT_POOL_CACHE_EVICTION_INTERVAL_MS,
-                  "The cache pool eviction interval",
-                  false /* immutable */,
-                  DEFAULT_CLIENT_POOL_CACHE_EVICTION_INTERVAL_MS,
-                  false /* hidden */))
           .put(
               IMPERSONATION_ENABLE,
               PropertyEntry.booleanPropertyEntry(
@@ -129,6 +111,7 @@ public class HiveCatalogPropertiesMeta extends 
BaseCatalogPropertiesMetadata {
                   false /* hidden */,
                   false /* reserved */))
           
.putAll(AuthorizationPropertiesMeta.RANGER_AUTHORIZATION_PROPERTY_ENTRIES)
+          .putAll(CLIENT_PROPERTIES_METADATA.propertyEntries())
           .build();
 
   @Override
diff --git 
a/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/HiveSchema.java
 
b/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/HiveSchema.java
index 30c51038f..29acce046 100644
--- 
a/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/HiveSchema.java
+++ 
b/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/HiveSchema.java
@@ -24,25 +24,21 @@ import java.util.Optional;
 import lombok.ToString;
 import org.apache.gravitino.connector.BaseSchema;
 import org.apache.gravitino.meta.AuditInfo;
-import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hive.metastore.api.Database;
 import org.apache.hadoop.hive.metastore.api.PrincipalType;
 
 /** Represents an Apache Hive Schema (Database) entity in the Hive Metastore 
catalog. */
 @ToString
 public class HiveSchema extends BaseSchema {
-  private Configuration conf;
-
   private HiveSchema() {}
 
   /**
    * Creates a new HiveSchema instance from a Database and a Builder.
    *
    * @param db The Database representing the HiveSchema.
-   * @param hiveConf The HiveConf used to construct the HiveSchema.
    * @return A new HiveSchema instance.
    */
-  public static HiveSchema fromHiveDB(Database db, Configuration hiveConf) {
+  public static HiveSchema fromHiveDB(Database db) {
     Map<String, String> properties = buildSchemaProperties(db);
 
     // Get audit info from Hive's Database object. Because Hive's database 
doesn't store create
@@ -55,7 +51,6 @@ public class HiveSchema extends BaseSchema {
         .withComment(db.getDescription())
         .withProperties(properties)
         .withAuditInfo(auditInfoBuilder.build())
-        .withConf(hiveConf)
         .build();
   }
 
@@ -98,19 +93,6 @@ public class HiveSchema extends BaseSchema {
   /** A builder class for constructing HiveSchema instances. */
   public static class Builder extends BaseSchemaBuilder<Builder, HiveSchema> {
 
-    protected Configuration conf;
-
-    /**
-     * Sets the Configuration to be used for building the HiveSchema.
-     *
-     * @param conf The Configuration.
-     * @return The Builder instance.
-     */
-    public Builder withConf(Configuration conf) {
-      this.conf = conf;
-      return this;
-    }
-
     /** Creates a new instance of {@link Builder}. */
     private Builder() {}
 
@@ -126,7 +108,6 @@ public class HiveSchema extends BaseSchema {
       hiveSchema.comment = comment;
       hiveSchema.properties = properties;
       hiveSchema.auditInfo = auditInfo;
-      hiveSchema.conf = conf;
 
       return hiveSchema;
     }
diff --git 
a/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/HiveTable.java
 
b/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/HiveTable.java
index 2108390c8..f815c406a 100644
--- 
a/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/HiveTable.java
+++ 
b/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/HiveTable.java
@@ -18,34 +18,30 @@
  */
 package org.apache.gravitino.catalog.hive;
 
-import static 
org.apache.gravitino.rel.expressions.transforms.Transforms.identity;
-
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
-import java.time.Instant;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 import lombok.ToString;
 import org.apache.commons.lang3.ArrayUtils;
-import org.apache.gravitino.catalog.hive.converter.HiveDataTypeConverter;
 import org.apache.gravitino.connector.BaseTable;
 import org.apache.gravitino.connector.PropertiesMetadata;
 import org.apache.gravitino.connector.TableOperations;
+import org.apache.gravitino.hive.CachedClientPool;
+import org.apache.gravitino.hive.converter.HiveDataTypeConverter;
+import org.apache.gravitino.hive.converter.HiveTableConverter;
 import org.apache.gravitino.meta.AuditInfo;
 import org.apache.gravitino.rel.Column;
 import org.apache.gravitino.rel.SupportsPartitions;
-import org.apache.gravitino.rel.expressions.Expression;
 import org.apache.gravitino.rel.expressions.NamedReference;
 import org.apache.gravitino.rel.expressions.distributions.Distribution;
 import org.apache.gravitino.rel.expressions.distributions.Distributions;
 import org.apache.gravitino.rel.expressions.sorts.SortDirection;
 import org.apache.gravitino.rel.expressions.sorts.SortOrder;
-import org.apache.gravitino.rel.expressions.sorts.SortOrders;
 import org.apache.gravitino.rel.expressions.transforms.Transform;
 import org.apache.gravitino.rel.expressions.transforms.Transforms;
 import org.apache.hadoop.hive.metastore.api.FieldSchema;
@@ -76,55 +72,15 @@ public class HiveTable extends BaseTable {
    * @return A new HiveTable instance Builder.
    */
   public static HiveTable.Builder fromHiveTable(Table table) {
-    // Get audit info from Hive's Table object. Because Hive's table doesn't 
store last modifier
-    // and last modified time, we only get creator and create time from Hive's 
table.
-    AuditInfo.Builder auditInfoBuilder = AuditInfo.builder();
-    
Optional.ofNullable(table.getOwner()).ifPresent(auditInfoBuilder::withCreator);
-    if (table.isSetCreateTime()) {
-      
auditInfoBuilder.withCreateTime(Instant.ofEpochSecond(table.getCreateTime()));
-    }
+    AuditInfo auditInfo = HiveTableConverter.getAuditInfo(table);
 
-    StorageDescriptor sd = table.getSd();
-    Distribution distribution = Distributions.NONE;
-    if (sd.getBucketCols() != null && !sd.getBucketCols().isEmpty()) {
-      // Hive table use hash strategy as bucketing strategy
-      distribution =
-          Distributions.hash(
-              sd.getNumBuckets(),
-              
sd.getBucketCols().stream().map(NamedReference::field).toArray(Expression[]::new));
-    }
+    Distribution distribution = HiveTableConverter.getDistribution(table);
 
-    SortOrder[] sortOrders = new SortOrder[0];
-    if (sd.getSortCols() != null && !sd.getSortCols().isEmpty()) {
-      sortOrders =
-          sd.getSortCols().stream()
-              .map(
-                  f ->
-                      SortOrders.of(
-                          NamedReference.field(f.getCol()),
-                          f.getOrder() == 1 ? SortDirection.ASCENDING : 
SortDirection.DESCENDING))
-              .toArray(SortOrder[]::new);
-    }
+    SortOrder[] sortOrders = HiveTableConverter.getSortOrders(table);
+
+    Column[] columns = HiveTableConverter.getColumns(table, 
HiveColumn.builder());
 
-    Column[] columns =
-        Stream.concat(
-                sd.getCols().stream()
-                    .map(
-                        f ->
-                            HiveColumn.builder()
-                                .withName(f.getName())
-                                
.withType(HiveDataTypeConverter.CONVERTER.toGravitino(f.getType()))
-                                .withComment(f.getComment())
-                                .build()),
-                table.getPartitionKeys().stream()
-                    .map(
-                        p ->
-                            HiveColumn.builder()
-                                .withName(p.getName())
-                                
.withType(HiveDataTypeConverter.CONVERTER.toGravitino(p.getType()))
-                                .withComment(p.getComment())
-                                .build()))
-            .toArray(Column[]::new);
+    Transform[] partitioning = HiveTableConverter.getPartitioning(table);
 
     return HiveTable.builder()
         .withName(table.getTableName())
@@ -133,11 +89,8 @@ public class HiveTable extends BaseTable {
         .withColumns(columns)
         .withDistribution(distribution)
         .withSortOrders(sortOrders)
-        .withAuditInfo(auditInfoBuilder.build())
-        .withPartitioning(
-            table.getPartitionKeys().stream()
-                .map(p -> identity(p.getName()))
-                .toArray(Transform[]::new))
+        .withAuditInfo(auditInfo)
+        .withPartitioning(partitioning)
         .withSchemaName(table.getDbName())
         .withStorageDescriptor(table.getSd());
   }
diff --git 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/TestHiveCatalog.java
 
b/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/TestHiveCatalog.java
index b500087ed..cb1d8c777 100644
--- 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/TestHiveCatalog.java
+++ 
b/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/TestHiveCatalog.java
@@ -29,9 +29,9 @@ import java.util.List;
 import java.util.Map;
 import org.apache.gravitino.Namespace;
 import org.apache.gravitino.catalog.PropertiesMetadataHelpers;
-import org.apache.gravitino.catalog.hive.miniHMS.MiniHiveMetastoreService;
 import org.apache.gravitino.connector.HasPropertyMetadata;
 import org.apache.gravitino.connector.PropertiesMetadata;
+import org.apache.gravitino.hive.hms.MiniHiveMetastoreService;
 import org.apache.gravitino.meta.AuditInfo;
 import org.apache.gravitino.meta.CatalogEntity;
 import org.apache.hadoop.hive.metastore.IMetaStoreClient;
diff --git 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/TestHiveCatalogOperations.java
 
b/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/TestHiveCatalogOperations.java
index 7735d34bd..bc488e20b 100644
--- 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/TestHiveCatalogOperations.java
+++ 
b/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/TestHiveCatalogOperations.java
@@ -46,33 +46,13 @@ import 
org.apache.gravitino.connector.AuthorizationPropertiesMeta;
 import org.apache.gravitino.connector.BaseCatalog;
 import org.apache.gravitino.connector.PropertyEntry;
 import org.apache.gravitino.exceptions.ConnectionFailedException;
+import org.apache.gravitino.hive.CachedClientPool;
 import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
 import org.apache.thrift.TException;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 class TestHiveCatalogOperations {
-
-  @Test
-  void testGetClientPoolSize() {
-    Map<String, String> maps = Maps.newHashMap();
-    maps.put(CLIENT_POOL_SIZE, "10");
-    HiveCatalogOperations op = new HiveCatalogOperations();
-    op.initialize(maps, null, HIVE_PROPERTIES_METADATA);
-    Assertions.assertEquals(10, op.getClientPoolSize(maps));
-
-    maps.clear();
-    maps.put(CLIENT_POOL_SIZE + "_wrong_mark", "10");
-    op = new HiveCatalogOperations();
-    op.initialize(maps, null, HIVE_PROPERTIES_METADATA);
-    Assertions.assertNotEquals(10, op.getClientPoolSize(maps));
-
-    maps.put(CLIENT_POOL_SIZE, "1");
-    op = new HiveCatalogOperations();
-    op.initialize(maps, null, HIVE_PROPERTIES_METADATA);
-    Assertions.assertEquals(1, op.getClientPoolSize(maps));
-  }
-
   @Test
   void testInitialize() {
     Map<String, String> properties = Maps.newHashMap();
diff --git 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/TestHiveSchema.java
 
b/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/TestHiveSchema.java
index 13cefce0e..d3bfb1e3c 100644
--- 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/TestHiveSchema.java
+++ 
b/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/TestHiveSchema.java
@@ -29,8 +29,8 @@ import org.apache.gravitino.NameIdentifier;
 import org.apache.gravitino.Namespace;
 import org.apache.gravitino.Schema;
 import org.apache.gravitino.SchemaChange;
-import org.apache.gravitino.catalog.hive.miniHMS.MiniHiveMetastoreService;
 import org.apache.gravitino.exceptions.SchemaAlreadyExistsException;
+import org.apache.gravitino.hive.hms.MiniHiveMetastoreService;
 import org.apache.gravitino.meta.AuditInfo;
 import org.apache.gravitino.meta.CatalogEntity;
 import org.apache.hadoop.hive.conf.HiveConf;
diff --git 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/TestHiveTable.java
 
b/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/TestHiveTable.java
index 3c0be1f20..9b9e0c8a8 100644
--- 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/TestHiveTable.java
+++ 
b/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/TestHiveTable.java
@@ -32,9 +32,9 @@ import java.util.Locale;
 import java.util.Map;
 import org.apache.gravitino.NameIdentifier;
 import org.apache.gravitino.Namespace;
-import org.apache.gravitino.catalog.hive.miniHMS.MiniHiveMetastoreService;
 import org.apache.gravitino.exceptions.NoSuchSchemaException;
 import org.apache.gravitino.exceptions.TableAlreadyExistsException;
+import org.apache.gravitino.hive.hms.MiniHiveMetastoreService;
 import org.apache.gravitino.meta.AuditInfo;
 import org.apache.gravitino.meta.CatalogEntity;
 import org.apache.gravitino.rel.Column;
diff --git 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/TestHiveTableOperations.java
 
b/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/TestHiveTableOperations.java
index bb5768469..3ef26b557 100644
--- 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/TestHiveTableOperations.java
+++ 
b/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/TestHiveTableOperations.java
@@ -31,8 +31,8 @@ import java.time.LocalDate;
 import java.util.Arrays;
 import java.util.Map;
 import org.apache.gravitino.NameIdentifier;
-import org.apache.gravitino.catalog.hive.miniHMS.MiniHiveMetastoreService;
 import org.apache.gravitino.exceptions.NoSuchPartitionException;
+import org.apache.gravitino.hive.hms.MiniHiveMetastoreService;
 import org.apache.gravitino.rel.Column;
 import org.apache.gravitino.rel.SupportsPartitions;
 import org.apache.gravitino.rel.expressions.literals.Literal;
diff --git 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/integration/test/CatalogHiveIT.java
 
b/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/integration/test/CatalogHiveIT.java
index 68e3b4e96..c9ef0db1f 100644
--- 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/integration/test/CatalogHiveIT.java
+++ 
b/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/integration/test/CatalogHiveIT.java
@@ -59,7 +59,6 @@ import org.apache.gravitino.SchemaChange;
 import org.apache.gravitino.SupportsSchemas;
 import org.apache.gravitino.auth.AuthConstants;
 import org.apache.gravitino.catalog.hive.HiveCatalogOperations;
-import org.apache.gravitino.catalog.hive.HiveClientPool;
 import org.apache.gravitino.catalog.hive.HiveSchemaPropertiesMetadata;
 import org.apache.gravitino.catalog.hive.HiveStorageConstants;
 import org.apache.gravitino.catalog.hive.HiveTablePropertiesMetadata;
@@ -70,6 +69,7 @@ import org.apache.gravitino.exceptions.NoSuchCatalogException;
 import org.apache.gravitino.exceptions.NoSuchMetalakeException;
 import org.apache.gravitino.exceptions.NoSuchSchemaException;
 import org.apache.gravitino.exceptions.NoSuchTableException;
+import org.apache.gravitino.hive.HiveClientPool;
 import org.apache.gravitino.integration.test.container.ContainerSuite;
 import org.apache.gravitino.integration.test.container.HiveContainer;
 import org.apache.gravitino.integration.test.util.AbstractIT;
diff --git 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/integration/test/ProxyCatalogHiveIT.java
 
b/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/integration/test/ProxyCatalogHiveIT.java
index a8a003fcf..73139a05d 100644
--- 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/integration/test/ProxyCatalogHiveIT.java
+++ 
b/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/integration/test/ProxyCatalogHiveIT.java
@@ -33,10 +33,10 @@ import org.apache.gravitino.Configs;
 import org.apache.gravitino.NameIdentifier;
 import org.apache.gravitino.SupportsSchemas;
 import org.apache.gravitino.auth.AuthenticatorType;
-import org.apache.gravitino.catalog.hive.HiveClientPool;
 import org.apache.gravitino.client.GravitinoAdminClient;
 import org.apache.gravitino.client.GravitinoMetalake;
 import org.apache.gravitino.dto.rel.partitioning.Partitioning;
+import org.apache.gravitino.hive.HiveClientPool;
 import org.apache.gravitino.integration.test.container.ContainerSuite;
 import org.apache.gravitino.integration.test.container.HiveContainer;
 import org.apache.gravitino.integration.test.util.AbstractIT;
diff --git a/catalogs/catalog-hive/build.gradle.kts 
b/catalogs/hive-metastore-common/build.gradle.kts
similarity index 50%
copy from catalogs/catalog-hive/build.gradle.kts
copy to catalogs/hive-metastore-common/build.gradle.kts
index 84474878e..0f023acb3 100644
--- a/catalogs/catalog-hive/build.gradle.kts
+++ b/catalogs/hive-metastore-common/build.gradle.kts
@@ -16,23 +16,18 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-description = "catalog-hive"
 
 plugins {
-  `maven-publish`
   id("java")
   id("idea")
+  alias(libs.plugins.shadow)
 }
 
-val scalaVersion: String = project.properties["scalaVersion"] as? String ?: 
extra["defaultScalaVersion"].toString()
-val sparkVersion: String = libs.versions.spark34.get()
-val icebergVersion: String = libs.versions.iceberg.get()
-val scalaCollectionCompatVersion: String = 
libs.versions.scala.collection.compat.get()
-
 dependencies {
   implementation(project(":api")) {
     exclude("*")
   }
+
   implementation(project(":catalogs:catalog-common")) {
     exclude("*")
   }
@@ -41,40 +36,7 @@ dependencies {
   }
 
   implementation(libs.caffeine)
-  implementation(libs.commons.collections3)
-  implementation(libs.commons.configuration1)
-  implementation(libs.htrace.core4)
   implementation(libs.guava)
-  implementation(libs.hadoop2.auth) {
-    exclude("*")
-  }
-  implementation(libs.hive2.exec) {
-    artifact {
-      classifier = "core"
-    }
-    exclude("com.google.code.findbugs", "jsr305")
-    exclude("com.google.protobuf")
-    exclude("org.apache.avro")
-    exclude("org.apache.ant")
-    exclude("org.apache.calcite")
-    exclude("org.apache.calcite.avatica")
-    exclude("org.apache.curator")
-    exclude("org.apache.derby")
-    exclude("org.apache.hadoop", "hadoop-yarn-server-resourcemanager")
-    exclude("org.apache.hive", "hive-llap-tez")
-    exclude("org.apache.hive", "hive-vector-code-gen")
-    exclude("org.apache.ivy")
-    exclude("org.apache.logging.log4j")
-    exclude("org.apache.zookeeper")
-    exclude("org.codehaus.groovy", "groovy-all")
-    exclude("org.datanucleus", "datanucleus-core")
-    exclude("org.eclipse.jetty.aggregate", "jetty-all")
-    exclude("org.eclipse.jetty.orbit", "javax.servlet")
-    exclude("org.openjdk.jol")
-    exclude("org.pentaho")
-    exclude("org.slf4j")
-  }
-  implementation(libs.woodstox.core)
   implementation(libs.hive2.metastore) {
     exclude("ant")
     exclude("co.cask.tephra")
@@ -100,111 +62,71 @@ dependencies {
     exclude("org.openjdk.jol")
     exclude("org.slf4j")
   }
-
   implementation(libs.hadoop2.common) {
     exclude("*")
   }
-  implementation(libs.hadoop2.mapreduce.client.core) {
-    exclude("*")
-  }
   implementation(libs.slf4j.api)
 
   compileOnly(libs.immutables.value)
-  compileOnly(libs.lombok)
 
   annotationProcessor(libs.immutables.value)
-  annotationProcessor(libs.lombok)
-
-  testImplementation(project(":common"))
-  testImplementation(project(":clients:client-java"))
-  testImplementation(project(":integration-test-common", "testArtifacts"))
-  testImplementation(project(":server"))
-  testImplementation(project(":server-common"))
 
-  testImplementation(libs.bundles.jetty)
-  testImplementation(libs.bundles.jersey)
   testImplementation(libs.bundles.log4j)
-  testImplementation(libs.hadoop2.hdfs)
-  testImplementation(libs.hive2.common) {
-    exclude("org.eclipse.jetty.aggregate", "jetty-all")
-    exclude("org.eclipse.jetty.orbit", "javax.servlet")
+  testImplementation(libs.commons.collections3)
+  testImplementation(libs.commons.configuration1)
+  testImplementation(libs.datanucleus.core)
+  testImplementation(libs.datanucleus.api.jdo)
+  testImplementation(libs.datanucleus.rdbms)
+  testImplementation(libs.datanucleus.jdo)
+  testImplementation(libs.derby)
+  testImplementation(libs.hadoop2.auth) {
+    exclude("*")
   }
-  testImplementation(libs.junit.jupiter.api)
-  testImplementation(libs.mockito.core)
-  testImplementation(libs.mysql.driver)
-  testImplementation(libs.postgresql.driver)
-
-  
testImplementation("org.apache.spark:spark-hive_$scalaVersion:$sparkVersion") {
-    exclude("org.apache.hadoop")
+  testImplementation(libs.hadoop2.mapreduce.client.core) {
+    exclude("*")
   }
-  
testImplementation("org.scala-lang.modules:scala-collection-compat_$scalaVersion:$scalaCollectionCompatVersion")
-  testImplementation("org.apache.spark:spark-sql_$scalaVersion:$sparkVersion") 
{
+  testImplementation(libs.htrace.core4)
+  testImplementation(libs.hive2.exec) {
+    artifact {
+      classifier = "core"
+    }
+    exclude("com.google.code.findbugs", "jsr305")
+    exclude("com.google.protobuf")
     exclude("org.apache.avro")
-    exclude("org.apache.hadoop")
+    exclude("org.apache.ant")
+    exclude("org.apache.calcite")
+    exclude("org.apache.calcite.avatica")
+    exclude("org.apache.curator")
+    exclude("org.apache.derby")
+    exclude("org.apache.hadoop", "hadoop-yarn-server-resourcemanager")
+    exclude("org.apache.hive", "hive-llap-tez")
+    exclude("org.apache.hive", "hive-vector-code-gen")
+    exclude("org.apache.ivy")
+    exclude("org.apache.logging.log4j")
     exclude("org.apache.zookeeper")
-    exclude("io.dropwizard.metrics")
-    exclude("org.rocksdb")
+    exclude("org.codehaus.groovy", "groovy-all")
+    exclude("org.datanucleus", "datanucleus-core")
+    exclude("org.eclipse.jetty.aggregate", "jetty-all")
+    exclude("org.eclipse.jetty.orbit", "javax.servlet")
+    exclude("org.openjdk.jol")
+    exclude("org.pentaho")
+    exclude("org.slf4j")
   }
-  testImplementation(libs.slf4j.api)
-  testImplementation(libs.testcontainers)
-  testImplementation(libs.testcontainers.mysql)
+  testImplementation(libs.junit.jupiter.api)
+  testImplementation(libs.woodstox.core)
 
   testRuntimeOnly(libs.junit.jupiter.engine)
 }
 
-tasks {
-  val runtimeJars by registering(Copy::class) {
-    from(configurations.runtimeClasspath)
-    into("build/libs")
-  }
-
-  val copyCatalogLibs by registering(Copy::class) {
-    dependsOn("jar", "runtimeJars")
-    from("build/libs") {
-      exclude("guava-*.jar")
-      exclude("log4j-*.jar")
-      exclude("slf4j-*.jar")
-    }
-    into("$rootDir/distribution/package/catalogs/hive/libs")
-  }
-
-  val copyCatalogConfig by registering(Copy::class) {
-    from("src/main/resources")
-    into("$rootDir/distribution/package/catalogs/hive/conf")
-
-    include("hive.conf")
-    include("hive-site.xml.template")
-
-    rename { original ->
-      if (original.endsWith(".template")) {
-        original.replace(".template", "")
-      } else {
-        original
-      }
-    }
-
-    exclude { details ->
-      details.file.isDirectory()
-    }
-
-    fileMode = 0b111101101
-  }
-
-  register("copyLibAndConfig", Copy::class) {
-    dependsOn(copyCatalogConfig, copyCatalogLibs)
-  }
+val testJar by tasks.registering(Jar::class) {
+  archiveClassifier.set("tests")
+  from(sourceSets["test"].output)
 }
 
-tasks.test {
-  val skipITs = project.hasProperty("skipITs")
-  if (skipITs) {
-    // Exclude integration tests
-    exclude("**/integration/test/**")
-  } else {
-    dependsOn(tasks.jar)
-  }
+configurations {
+  create("testArtifacts")
 }
 
-tasks.getByName("generateMetadataFileForMavenJavaPublication") {
-  dependsOn("runtimeJars")
+artifacts {
+  add("testArtifacts", testJar)
 }
diff --git 
a/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/CachedClientPool.java
 
b/catalogs/hive-metastore-common/src/main/java/org/apache/gravitino/hive/CachedClientPool.java
similarity index 86%
rename from 
catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/CachedClientPool.java
rename to 
catalogs/hive-metastore-common/src/main/java/org/apache/gravitino/hive/CachedClientPool.java
index 8b5bde6b0..3c7b5182b 100644
--- 
a/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/CachedClientPool.java
+++ 
b/catalogs/hive-metastore-common/src/main/java/org/apache/gravitino/hive/CachedClientPool.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.gravitino.catalog.hive;
+package org.apache.gravitino.hive;
 
 import com.github.benmanes.caffeine.cache.Cache;
 import com.github.benmanes.caffeine.cache.Caffeine;
@@ -27,10 +27,12 @@ import 
com.google.common.util.concurrent.ThreadFactoryBuilder;
 import java.io.IOException;
 import java.io.UncheckedIOException;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.TimeUnit;
 import javax.annotation.Nullable;
+import org.apache.gravitino.catalog.hive.HiveConstants;
 import org.apache.gravitino.utils.ClientPool;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hive.metastore.IMetaStoreClient;
@@ -49,6 +51,8 @@ import org.immutables.value.Value;
  * <p>A ClientPool that caches the underlying HiveClientPool instances.
  */
 public class CachedClientPool implements ClientPool<IMetaStoreClient, 
TException> {
+  private static final ClientPropertiesMetadata PROPERTIES_METADATA =
+      new ClientPropertiesMetadata();
 
   private final Cache<Key, HiveClientPool> clientPoolCache;
 
@@ -56,8 +60,15 @@ public class CachedClientPool implements 
ClientPool<IMetaStoreClient, TException
   private final int clientPoolSize;
   private final ScheduledThreadPoolExecutor scheduler;
 
-  CachedClientPool(int clientPoolSize, Configuration conf, long 
evictionInterval) {
-    this.conf = conf;
+  public CachedClientPool(Configuration hiveConf, Map<String, String> 
properties) {
+    int clientPoolSize =
+        (int) PROPERTIES_METADATA.getOrDefault(properties, 
HiveConstants.CLIENT_POOL_SIZE);
+    long evictionInterval =
+        (long)
+            PROPERTIES_METADATA.getOrDefault(
+                properties, 
HiveConstants.CLIENT_POOL_CACHE_EVICTION_INTERVAL_MS);
+
+    this.conf = hiveConf;
     this.clientPoolSize = clientPoolSize;
     // Since Caffeine does not ensure that removalListener will be involved 
after expiration
     // We use a scheduler with one thread to clean up expired clients.
@@ -71,13 +82,13 @@ public class CachedClientPool implements 
ClientPool<IMetaStoreClient, TException
   }
 
   @VisibleForTesting
-  HiveClientPool clientPool() {
+  public HiveClientPool clientPool() {
     Key key = extractKey();
     return clientPoolCache.get(key, k -> new HiveClientPool(clientPoolSize, 
conf));
   }
 
   @VisibleForTesting
-  Cache<Key, HiveClientPool> clientPoolCache() {
+  public Cache<Key, HiveClientPool> clientPoolCache() {
     return clientPoolCache;
   }
 
@@ -94,7 +105,7 @@ public class CachedClientPool implements 
ClientPool<IMetaStoreClient, TException
   }
 
   @VisibleForTesting
-  static Key extractKey() {
+  public static Key extractKey() {
     List<Object> elements = Lists.newArrayList();
     try {
       elements.add(UserGroupInformation.getCurrentUser().getUserName());
@@ -106,7 +117,7 @@ public class CachedClientPool implements 
ClientPool<IMetaStoreClient, TException
   }
 
   @Value.Immutable
-  abstract static class Key {
+  public abstract static class Key {
 
     abstract List<Object> elements();
 
diff --git 
a/catalogs/hive-metastore-common/src/main/java/org/apache/gravitino/hive/ClientPropertiesMetadata.java
 
b/catalogs/hive-metastore-common/src/main/java/org/apache/gravitino/hive/ClientPropertiesMetadata.java
new file mode 100644
index 000000000..63b103569
--- /dev/null
+++ 
b/catalogs/hive-metastore-common/src/main/java/org/apache/gravitino/hive/ClientPropertiesMetadata.java
@@ -0,0 +1,56 @@
+/*
+ * 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.gravitino.hive;
+
+import com.google.common.collect.ImmutableMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import org.apache.gravitino.catalog.hive.HiveConstants;
+import org.apache.gravitino.connector.PropertiesMetadata;
+import org.apache.gravitino.connector.PropertyEntry;
+
+public class ClientPropertiesMetadata implements PropertiesMetadata {
+  private static final int DEFAULT_CLIENT_POOL_SIZE = 1;
+  private static final long DEFAULT_CLIENT_POOL_CACHE_EVICTION_INTERVAL_MS =
+      TimeUnit.MINUTES.toMillis(5);
+  private static final Map<String, PropertyEntry<?>> PROPERTY_ENTRIES =
+      ImmutableMap.<String, PropertyEntry<?>>builder()
+          .put(
+              HiveConstants.CLIENT_POOL_SIZE,
+              PropertyEntry.integerOptionalPropertyEntry(
+                  HiveConstants.CLIENT_POOL_SIZE,
+                  "The maximum number of Hive metastore clients in the pool 
for Gravitino",
+                  false /* immutable */,
+                  DEFAULT_CLIENT_POOL_SIZE,
+                  false /* hidden */))
+          .put(
+              HiveConstants.CLIENT_POOL_CACHE_EVICTION_INTERVAL_MS,
+              PropertyEntry.longOptionalPropertyEntry(
+                  HiveConstants.CLIENT_POOL_CACHE_EVICTION_INTERVAL_MS,
+                  "The cache pool eviction interval",
+                  false /* immutable */,
+                  DEFAULT_CLIENT_POOL_CACHE_EVICTION_INTERVAL_MS,
+                  false /* hidden */))
+          .build();
+
+  @Override
+  public Map<String, PropertyEntry<?>> propertyEntries() {
+    return PROPERTY_ENTRIES;
+  }
+}
diff --git 
a/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/HiveClientPool.java
 
b/catalogs/hive-metastore-common/src/main/java/org/apache/gravitino/hive/HiveClientPool.java
similarity index 96%
rename from 
catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/HiveClientPool.java
rename to 
catalogs/hive-metastore-common/src/main/java/org/apache/gravitino/hive/HiveClientPool.java
index 9d2cc21ec..902cb05c8 100644
--- 
a/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/HiveClientPool.java
+++ 
b/catalogs/hive-metastore-common/src/main/java/org/apache/gravitino/hive/HiveClientPool.java
@@ -16,11 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.gravitino.catalog.hive;
+package org.apache.gravitino.hive;
 
 import com.google.common.annotations.VisibleForTesting;
-import org.apache.gravitino.catalog.hive.dyn.DynMethods;
-import org.apache.gravitino.catalog.hive.dyn.DynMethods.StaticMethod;
+import org.apache.gravitino.hive.dyn.DynMethods;
+import org.apache.gravitino.hive.dyn.DynMethods.StaticMethod;
 import org.apache.gravitino.utils.ClientPoolImpl;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hive.conf.HiveConf;
diff --git 
a/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/converter/HiveDataTypeConverter.java
 
b/catalogs/hive-metastore-common/src/main/java/org/apache/gravitino/hive/converter/HiveDataTypeConverter.java
similarity index 99%
rename from 
catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/converter/HiveDataTypeConverter.java
rename to 
catalogs/hive-metastore-common/src/main/java/org/apache/gravitino/hive/converter/HiveDataTypeConverter.java
index 7dedd4908..80c899ad2 100644
--- 
a/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/converter/HiveDataTypeConverter.java
+++ 
b/catalogs/hive-metastore-common/src/main/java/org/apache/gravitino/hive/converter/HiveDataTypeConverter.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.gravitino.catalog.hive.converter;
+package org.apache.gravitino.hive.converter;
 
 import static org.apache.hadoop.hive.serde.serdeConstants.BIGINT_TYPE_NAME;
 import static org.apache.hadoop.hive.serde.serdeConstants.BINARY_TYPE_NAME;
diff --git 
a/catalogs/hive-metastore-common/src/main/java/org/apache/gravitino/hive/converter/HiveTableConverter.java
 
b/catalogs/hive-metastore-common/src/main/java/org/apache/gravitino/hive/converter/HiveTableConverter.java
new file mode 100644
index 000000000..757d8df28
--- /dev/null
+++ 
b/catalogs/hive-metastore-common/src/main/java/org/apache/gravitino/hive/converter/HiveTableConverter.java
@@ -0,0 +1,110 @@
+/*
+ * 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.gravitino.hive.converter;
+
+import static 
org.apache.gravitino.rel.expressions.transforms.Transforms.identity;
+
+import java.time.Instant;
+import java.util.Optional;
+import java.util.stream.Stream;
+import org.apache.gravitino.connector.BaseColumn;
+import org.apache.gravitino.meta.AuditInfo;
+import org.apache.gravitino.rel.Column;
+import org.apache.gravitino.rel.expressions.Expression;
+import org.apache.gravitino.rel.expressions.NamedReference;
+import org.apache.gravitino.rel.expressions.distributions.Distribution;
+import org.apache.gravitino.rel.expressions.distributions.Distributions;
+import org.apache.gravitino.rel.expressions.sorts.SortDirection;
+import org.apache.gravitino.rel.expressions.sorts.SortOrder;
+import org.apache.gravitino.rel.expressions.sorts.SortOrders;
+import org.apache.gravitino.rel.expressions.transforms.Transform;
+import org.apache.hadoop.hive.metastore.api.StorageDescriptor;
+import org.apache.hadoop.hive.metastore.api.Table;
+
+public class HiveTableConverter {
+  public static AuditInfo getAuditInfo(Table table) {
+    // Get audit info from Hive's Table object. Because Hive's table doesn't 
store last modifier
+    // and last modified time, we only get creator and create time from Hive's 
table.
+    AuditInfo.Builder auditInfoBuilder = AuditInfo.builder();
+    
Optional.ofNullable(table.getOwner()).ifPresent(auditInfoBuilder::withCreator);
+    if (table.isSetCreateTime()) {
+      
auditInfoBuilder.withCreateTime(Instant.ofEpochSecond(table.getCreateTime()));
+    }
+    return auditInfoBuilder.build();
+  }
+
+  public static Distribution getDistribution(Table table) {
+    StorageDescriptor sd = table.getSd();
+    Distribution distribution = Distributions.NONE;
+    if (sd.getBucketCols() != null && !sd.getBucketCols().isEmpty()) {
+      // Hive table use hash strategy as bucketing strategy
+      distribution =
+          Distributions.hash(
+              sd.getNumBuckets(),
+              
sd.getBucketCols().stream().map(NamedReference::field).toArray(Expression[]::new));
+    }
+    return distribution;
+  }
+
+  public static SortOrder[] getSortOrders(Table table) {
+    SortOrder[] sortOrders = new SortOrder[0];
+    StorageDescriptor sd = table.getSd();
+    if (sd.getSortCols() != null && !sd.getSortCols().isEmpty()) {
+      sortOrders =
+          sd.getSortCols().stream()
+              .map(
+                  f ->
+                      SortOrders.of(
+                          NamedReference.field(f.getCol()),
+                          f.getOrder() == 1 ? SortDirection.ASCENDING : 
SortDirection.DESCENDING))
+              .toArray(SortOrder[]::new);
+    }
+    return sortOrders;
+  }
+
+  public static Transform[] getPartitioning(Table table) {
+    return table.getPartitionKeys().stream()
+        .map(p -> identity(p.getName()))
+        .toArray(Transform[]::new);
+  }
+
+  public static <
+          BUILDER extends BaseColumn.BaseColumnBuilder<BUILDER, COLUMN>, 
COLUMN extends BaseColumn>
+      Column[] getColumns(Table table, BUILDER columnBuilder) {
+    StorageDescriptor sd = table.getSd();
+    return Stream.concat(
+            sd.getCols().stream()
+                .map(
+                    f ->
+                        columnBuilder
+                            .withName(f.getName())
+                            
.withType(HiveDataTypeConverter.CONVERTER.toGravitino(f.getType()))
+                            .withComment(f.getComment())
+                            .build()),
+            table.getPartitionKeys().stream()
+                .map(
+                    p ->
+                        columnBuilder
+                            .withName(p.getName())
+                            
.withType(HiveDataTypeConverter.CONVERTER.toGravitino(p.getType()))
+                            .withComment(p.getComment())
+                            .build()))
+        .toArray(Column[]::new);
+  }
+}
diff --git 
a/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/dyn/DynConstructors.java
 
b/catalogs/hive-metastore-common/src/main/java/org/apache/gravitino/hive/dyn/DynConstructors.java
similarity index 99%
rename from 
catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/dyn/DynConstructors.java
rename to 
catalogs/hive-metastore-common/src/main/java/org/apache/gravitino/hive/dyn/DynConstructors.java
index 2a7a20008..cc09830aa 100644
--- 
a/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/dyn/DynConstructors.java
+++ 
b/catalogs/hive-metastore-common/src/main/java/org/apache/gravitino/hive/dyn/DynConstructors.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.gravitino.catalog.hive.dyn;
+package org.apache.gravitino.hive.dyn;
 
 import com.google.common.base.Preconditions;
 import com.google.common.base.Throwables;
diff --git 
a/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/dyn/DynFields.java
 
b/catalogs/hive-metastore-common/src/main/java/org/apache/gravitino/hive/dyn/DynFields.java
similarity index 99%
rename from 
catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/dyn/DynFields.java
rename to 
catalogs/hive-metastore-common/src/main/java/org/apache/gravitino/hive/dyn/DynFields.java
index 77a72cd6d..0f850d356 100644
--- 
a/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/dyn/DynFields.java
+++ 
b/catalogs/hive-metastore-common/src/main/java/org/apache/gravitino/hive/dyn/DynFields.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.gravitino.catalog.hive.dyn;
+package org.apache.gravitino.hive.dyn;
 
 import com.google.common.base.Joiner;
 import com.google.common.base.MoreObjects;
diff --git 
a/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/dyn/DynMethods.java
 
b/catalogs/hive-metastore-common/src/main/java/org/apache/gravitino/hive/dyn/DynMethods.java
similarity index 99%
rename from 
catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/dyn/DynMethods.java
rename to 
catalogs/hive-metastore-common/src/main/java/org/apache/gravitino/hive/dyn/DynMethods.java
index bb8d01b98..9551d231d 100644
--- 
a/catalogs/catalog-hive/src/main/java/org/apache/gravitino/catalog/hive/dyn/DynMethods.java
+++ 
b/catalogs/hive-metastore-common/src/main/java/org/apache/gravitino/hive/dyn/DynMethods.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.gravitino.catalog.hive.dyn;
+package org.apache.gravitino.hive.dyn;
 
 import com.google.common.base.Preconditions;
 import com.google.common.base.Throwables;
diff --git 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/TestCachedClientPool.java
 
b/catalogs/hive-metastore-common/src/test/java/org/apache/gravitino/hive/TestCachedClientPool.java
similarity index 84%
rename from 
catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/TestCachedClientPool.java
rename to 
catalogs/hive-metastore-common/src/test/java/org/apache/gravitino/hive/TestCachedClientPool.java
index bdf5551f8..822cff920 100644
--- 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/TestCachedClientPool.java
+++ 
b/catalogs/hive-metastore-common/src/test/java/org/apache/gravitino/hive/TestCachedClientPool.java
@@ -17,11 +17,14 @@
  * under the License.
  */
 
-package org.apache.gravitino.catalog.hive;
+package org.apache.gravitino.hive;
 
+import com.google.common.collect.ImmutableMap;
 import java.security.PrivilegedAction;
+import java.util.Map;
 import java.util.concurrent.TimeUnit;
-import org.apache.gravitino.catalog.hive.miniHMS.MiniHiveMetastoreService;
+import org.apache.gravitino.catalog.hive.HiveConstants;
+import org.apache.gravitino.hive.hms.MiniHiveMetastoreService;
 import org.apache.hadoop.security.UserGroupInformation;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
@@ -31,7 +34,13 @@ import org.junit.jupiter.api.Test;
 public class TestCachedClientPool extends MiniHiveMetastoreService {
   @Test
   public void testClientPoolCleaner() throws InterruptedException {
-    CachedClientPool clientPool = new CachedClientPool(1, hiveConf, 5000);
+    Map<String, String> props =
+        ImmutableMap.of(
+            HiveConstants.CLIENT_POOL_SIZE,
+            "1",
+            HiveConstants.CLIENT_POOL_CACHE_EVICTION_INTERVAL_MS,
+            "5000");
+    CachedClientPool clientPool = new 
CachedClientPool(MiniHiveMetastoreService.hiveConf, props);
     HiveClientPool clientPool1 = clientPool.clientPool();
     HiveClientPool cachedClientPool =
         
clientPool.clientPoolCache().getIfPresent(CachedClientPool.extractKey());
diff --git 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/converter/TestTypeConverter.java
 
b/catalogs/hive-metastore-common/src/test/java/org/apache/gravitino/hive/converter/TestTypeConverter.java
similarity index 97%
rename from 
catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/converter/TestTypeConverter.java
rename to 
catalogs/hive-metastore-common/src/test/java/org/apache/gravitino/hive/converter/TestTypeConverter.java
index 20ec5d8c9..0b32b0c6e 100644
--- 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/converter/TestTypeConverter.java
+++ 
b/catalogs/hive-metastore-common/src/test/java/org/apache/gravitino/hive/converter/TestTypeConverter.java
@@ -16,9 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.gravitino.catalog.hive.converter;
+package org.apache.gravitino.hive.converter;
 
-import static 
org.apache.gravitino.catalog.hive.converter.HiveDataTypeConverter.CONVERTER;
+import static 
org.apache.gravitino.hive.converter.HiveDataTypeConverter.CONVERTER;
 import static org.apache.hadoop.hive.serde.serdeConstants.BIGINT_TYPE_NAME;
 import static org.apache.hadoop.hive.serde.serdeConstants.BINARY_TYPE_NAME;
 import static org.apache.hadoop.hive.serde.serdeConstants.BOOLEAN_TYPE_NAME;
diff --git 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/dyn/TestDynFields.java
 
b/catalogs/hive-metastore-common/src/test/java/org/apache/gravitino/hive/dyn/TestDynFields.java
similarity index 99%
rename from 
catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/dyn/TestDynFields.java
rename to 
catalogs/hive-metastore-common/src/test/java/org/apache/gravitino/hive/dyn/TestDynFields.java
index 8c8cc1f0f..31493d8f1 100644
--- 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/dyn/TestDynFields.java
+++ 
b/catalogs/hive-metastore-common/src/test/java/org/apache/gravitino/hive/dyn/TestDynFields.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.gravitino.catalog.hive.dyn;
+package org.apache.gravitino.hive.dyn;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.fail;
diff --git 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/miniHMS/MiniHiveMetastore.java
 
b/catalogs/hive-metastore-common/src/test/java/org/apache/gravitino/hive/hms/MiniHiveMetastore.java
similarity index 98%
rename from 
catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/miniHMS/MiniHiveMetastore.java
rename to 
catalogs/hive-metastore-common/src/test/java/org/apache/gravitino/hive/hms/MiniHiveMetastore.java
index 28b15f817..7ff4996f0 100644
--- 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/miniHMS/MiniHiveMetastore.java
+++ 
b/catalogs/hive-metastore-common/src/test/java/org/apache/gravitino/hive/hms/MiniHiveMetastore.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.gravitino.catalog.hive.miniHMS;
+package org.apache.gravitino.hive.hms;
 
 import static java.nio.file.Files.createTempDirectory;
 import static java.nio.file.attribute.PosixFilePermissions.asFileAttribute;
@@ -33,9 +33,9 @@ import java.sql.DriverManager;
 import java.sql.SQLException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import org.apache.gravitino.catalog.hive.HiveClientPool;
-import org.apache.gravitino.catalog.hive.dyn.DynConstructors;
-import org.apache.gravitino.catalog.hive.dyn.DynMethods;
+import org.apache.gravitino.hive.HiveClientPool;
+import org.apache.gravitino.hive.dyn.DynConstructors;
+import org.apache.gravitino.hive.dyn.DynMethods;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
diff --git 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/miniHMS/MiniHiveMetastoreService.java
 
b/catalogs/hive-metastore-common/src/test/java/org/apache/gravitino/hive/hms/MiniHiveMetastoreService.java
similarity index 98%
rename from 
catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/miniHMS/MiniHiveMetastoreService.java
rename to 
catalogs/hive-metastore-common/src/test/java/org/apache/gravitino/hive/hms/MiniHiveMetastoreService.java
index d2028fa3f..20c9dce4f 100644
--- 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/miniHMS/MiniHiveMetastoreService.java
+++ 
b/catalogs/hive-metastore-common/src/test/java/org/apache/gravitino/hive/hms/MiniHiveMetastoreService.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.gravitino.catalog.hive.miniHMS;
+package org.apache.gravitino.hive.hms;
 
 import com.google.common.collect.Maps;
 import java.util.Collections;
diff --git 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/miniHMS/ScriptRunner.java
 
b/catalogs/hive-metastore-common/src/test/java/org/apache/gravitino/hive/hms/ScriptRunner.java
similarity index 99%
rename from 
catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/miniHMS/ScriptRunner.java
rename to 
catalogs/hive-metastore-common/src/test/java/org/apache/gravitino/hive/hms/ScriptRunner.java
index 319732e33..c0a94c8c8 100644
--- 
a/catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/miniHMS/ScriptRunner.java
+++ 
b/catalogs/hive-metastore-common/src/test/java/org/apache/gravitino/hive/hms/ScriptRunner.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.gravitino.catalog.hive.miniHMS;
+package org.apache.gravitino.hive.hms;
 
 import java.io.BufferedWriter;
 import java.io.IOException;
diff --git 
a/catalogs/catalog-hive/src/test/resources/hive-schema-3.1.0.derby.sql 
b/catalogs/hive-metastore-common/src/test/resources/hive-schema-3.1.0.derby.sql
similarity index 100%
rename from catalogs/catalog-hive/src/test/resources/hive-schema-3.1.0.derby.sql
rename to 
catalogs/hive-metastore-common/src/test/resources/hive-schema-3.1.0.derby.sql
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index af0b1becb..6790962cf 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -97,6 +97,11 @@ mail = "1.4.1"
 rome = "1.0"
 jettison = "1.1"
 thrift = "0.12.0"
+derby = "10.14.2.0"
+datanucleus-core = "4.1.17"
+datanucleus-api-jdo = "4.2.4"
+datanucleus-rdbms = "4.1.19"
+datanucleus-jdo = "3.2.0-m3"
 
 [libraries]
 protobuf-java = { group = "com.google.protobuf", name = "protobuf-java", 
version.ref = "protoc" }
@@ -205,6 +210,11 @@ curator-test = { group = "org.apache.curator", name = 
"curator-test", version.re
 cglib = { group = "cglib", name = "cglib", version.ref = "cglib"}
 woodstox-core = { group = "com.fasterxml.woodstox", name = "woodstox-core", 
version.ref = "woodstox-core"}
 thrift = { group = "org.apache.thrift", name = "libthrift", version.ref = 
"thrift"}
+derby = { group = "org.apache.derby", name = "derby", version.ref = "derby"}
+datanucleus-core = { group = "org.datanucleus", name = "datanucleus-core", 
version.ref = "datanucleus-core" }
+datanucleus-api-jdo = { group = "org.datanucleus", name = 
"datanucleus-api-jdo", version.ref = "datanucleus-api-jdo" }
+datanucleus-rdbms = { group = "org.datanucleus", name = "datanucleus-rdbms", 
version.ref = "datanucleus-rdbms" }
+datanucleus-jdo = { group = "org.datanucleus", name = "javax.jdo", version.ref 
= "datanucleus-jdo" }
 
 ranger-intg = { group = "org.apache.ranger", name = "ranger-intg", version.ref 
= "ranger" }
 javax-jaxb-api = { group = "javax.xml.bind", name = "jaxb-api", version.ref = 
"javax-jaxb-api" }
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 679e36aee..dc49f4867 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -28,6 +28,7 @@ val scalaVersion: String = 
gradle.startParameter.projectProperties["scalaVersion
 include("api", "common", "core", "meta", "server", "server-common")
 include("catalogs:catalog-common")
 include("catalogs:catalog-hive")
+include("catalogs:hive-metastore-common")
 include("catalogs:catalog-lakehouse-iceberg")
 include("catalogs:catalog-lakehouse-paimon")
 include("catalogs:catalog-lakehouse-hudi")
diff --git a/spark-connector/v3.3/spark/build.gradle.kts 
b/spark-connector/v3.3/spark/build.gradle.kts
index e209da552..2a8ed3f97 100644
--- a/spark-connector/v3.3/spark/build.gradle.kts
+++ b/spark-connector/v3.3/spark/build.gradle.kts
@@ -48,6 +48,9 @@ dependencies {
     exclude("org.apache.logging.log4j")
     exclude("org.slf4j")
   }
+  testImplementation(project(":catalogs:hive-metastore-common")) {
+    exclude("*")
+  }
   testImplementation(project(":clients:client-java")) {
     exclude("org.apache.logging.log4j")
     exclude("org.slf4j")
diff --git a/spark-connector/v3.4/spark/build.gradle.kts 
b/spark-connector/v3.4/spark/build.gradle.kts
index 73993747f..bf51bc869 100644
--- a/spark-connector/v3.4/spark/build.gradle.kts
+++ b/spark-connector/v3.4/spark/build.gradle.kts
@@ -49,6 +49,9 @@ dependencies {
     exclude("org.apache.logging.log4j")
     exclude("org.slf4j")
   }
+  testImplementation(project(":catalogs:hive-metastore-common")) {
+    exclude("*")
+  }
   testImplementation(project(":clients:client-java")) {
     exclude("org.apache.logging.log4j")
     exclude("org.slf4j")
diff --git a/spark-connector/v3.5/spark/build.gradle.kts 
b/spark-connector/v3.5/spark/build.gradle.kts
index dbe5e5625..170a4cc63 100644
--- a/spark-connector/v3.5/spark/build.gradle.kts
+++ b/spark-connector/v3.5/spark/build.gradle.kts
@@ -49,6 +49,9 @@ dependencies {
   testImplementation(project(":api")) {
     exclude("org.apache.logging.log4j")
   }
+  testImplementation(project(":catalogs:hive-metastore-common")) {
+    exclude("*")
+  }
   testImplementation(project(":clients:client-java")) {
     exclude("org.apache.logging.log4j")
     exclude("org.slf4j")

Reply via email to