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")