[ 
https://issues.apache.org/jira/browse/HIVE-29145?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18024281#comment-18024281
 ] 

Butao Zhang commented on HIVE-29145:
------------------------------------

The original intention of the standalone-metastore-server module was to avoid 
dependencies on hive-exec as much as possible, meaning it should be decoupled 
from HS2-related dependencies. Therefore, the standalone HMS should never 
include hive-exec dependencies under any circumstances. However, note that in 
HIVE-29052, we introduced the hive-exec-core dependency into the standalone HMS 
to temporarily address some background automated tasks in the standalone HMS.

Currently, the non-standalone HMS still relies on hive-exec, and as you 
mentioned, the root cause of this issue is that the hive-exec fat jar contains 
many shaded classes (including com.codahale.metrics.Counter and the 
standalone-metastore-server module, but not the REST catalog server), leading 
to classloading issues in the REST catalog.

I'm not sure how to resolve this problem. Do we need to continue adding the 
REST catalog module to hive-exec to fix this? This would make hive-exec 
increasingly heavier, which doesn’t seem like an ideal solution either...

BTW, the easier way to fix this is that removing the 
`com.codahale.metrics.Counter`  usage from rest catalog code blocks. Or try to 
remove the shade `org.apache.hive.com.codahale.metrics.Counter` in 
hive-exec.jar.

> HMS Iceberg Rest server can not work properly.
> ----------------------------------------------
>
>                 Key: HIVE-29145
>                 URL: https://issues.apache.org/jira/browse/HIVE-29145
>             Project: Hive
>          Issue Type: Bug
>          Components: Iceberg integration
>    Affects Versions: 4.1.0
>            Reporter: Butao Zhang
>            Priority: Major
>
>  
> {*}NOTE{*}: *The Iceberg REST Catalog server works properly if it is lanched 
> by [standalone 
> HMS|https://dlcdn.apache.org/hive/hive-standalone-metastore-4.1.0/hive-standalone-metastore-4.1.0-bin.tar.gz],
>  but it can not work if it is lanched by [common 
> HMS|https://dlcdn.apache.org/hive/hive-4.1.0/apache-hive-4.1.0-bin.tar.gz].*
>  
> I tested the HMS iceberg rest catalog against Spark:
> 1. HMS configuration
> {code:java}
>   <property>
>     <name>hive.metastore.catalog.servlet.port</name>
>     <value>9088</value>
>     <description>iceberg rest catalog port</description>
>   </property>
>   <property>
>     <name>hive.metastore.catalog.servlet.auth</name>
>     <value>none</value>
>     <description></description>
>   </property>
>   <property>
>     <name>hive.metastore.properties.servlet.auth</name>
>     <value>simple</value>
>     <description></description>
>   </property>
> {code}
> 2. Prepare Spark env:
> Download spark package spark-3.5.6-bin-hadoop3.tgz, and put 
> [spark-iceberg|https://search.maven.org/remotecontent?filepath=org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.9.2/iceberg-spark-runtime-3.5_2.12-1.9.2.jar]
>  runtime jar into spark jar directory.
> 3. Test spark + HMS iceberg rest catalog
> {code:java}
> ./spark-3.5.6-bin-hadoop3/bin/spark-sql \
> --master local \
> --deploy-mode client \
> --conf 
> spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
>  \
> --conf spark.sql.catalog.rest=org.apache.iceberg.spark.SparkCatalog \
> --conf spark.sql.catalog.rest.type=rest \
> --conf spark.sql.catalog.rest.uri=http://127.0.0.1:9088/iceberg/
> spark-sql (default)> use rest;
> {code}
> 4. You will find error log both in spark side and HMS server side:
>  * Spark error log
> {code:java}
> Server error: null: {
> "servlet":"org.apache.iceberg.rest.HMSCatalogServlet-7e848aea",
> "cause0":"java.lang.NoSuchMethodError: &apos;com.codahale.metrics.Counter 
> org.apache.hadoop.hive.metastore.metrics.Metrics.getOrCreateCounter(java.lang.String)&apos;",
> "message":"java.lang.NoSuchMethodError: &apos;com.codahale.metrics.Counter 
> org.apache.hadoop.hive.metastore.metrics.Metrics.getOrCreateCounter(java.lang.String)&apos;",
> "url":"/iceberg/v1/config",
> "status":"500"
> }
> org.apache.iceberg.exceptions.ServiceFailureException: Server error: null: {
> "servlet":"org.apache.iceberg.rest.HMSCatalogServlet-7e848aea",
> "cause0":"java.lang.NoSuchMethodError: &apos;com.codahale.metrics.Counter 
> org.apache.hadoop.hive.metastore.metrics.Metrics.getOrCreateCounter(java.lang.String)&apos;",
> "message":"java.lang.NoSuchMethodError: &apos;com.codahale.metrics.Counter 
> org.apache.hadoop.hive.metastore.metrics.Metrics.getOrCreateCounter(java.lang.String)&apos;",
> "url":"/iceberg/v1/config",
> "status":"500"
> }
>         at 
> org.apache.iceberg.rest.ErrorHandlers$DefaultErrorHandler.accept(ErrorHandlers.java:241)
>         at 
> org.apache.iceberg.rest.ErrorHandlers$DefaultErrorHandler.accept(ErrorHandlers.java:212)
>         at 
> org.apache.iceberg.rest.HTTPClient.throwFailure(HTTPClient.java:215)
>         at org.apache.iceberg.rest.HTTPClient.execute(HTTPClient.java:299)
>         at org.apache.iceberg.rest.BaseHTTPClient.get(BaseHTTPClient.java:77)
>         at 
> org.apache.iceberg.rest.RESTSessionCatalog.fetchConfig(RESTSessionCatalog.java:1021)
>         at 
> org.apache.iceberg.rest.RESTSessionCatalog.initialize(RESTSessionCatalog.java:202)
>         at org.apache.iceberg.rest.RESTCatalog.initialize(RESTCatalog.java:82)
>         at org.apache.iceberg.CatalogUtil.loadCatalog(CatalogUtil.java:277)
>         at 
> org.apache.iceberg.CatalogUtil.buildIcebergCatalog(CatalogUtil.java:331)
>         at 
> org.apache.iceberg.spark.SparkCatalog.buildIcebergCatalog(SparkCatalog.java:153)
>         at 
> org.apache.iceberg.spark.SparkCatalog.initialize(SparkCatalog.java:752)
>         at 
> org.apache.spark.sql.connector.catalog.Catalogs$.load(Catalogs.scala:65)
>         at 
> org.apache.spark.sql.connector.catalog.CatalogManager.$anonfun$catalog$1(CatalogManager.scala:54)
>         at scala.collection.mutable.HashMap.getOrElseUpdate(HashMap.scala:86)
> {code}
>  * HMS server error log
> {code:java}
> 2025-08-14T15:55:47,203  WARN [qtp1558127130-51] server.HttpChannel: 
> /iceberg/v1/config
> java.lang.NoSuchMethodError: 'com.codahale.metrics.Counter 
> org.apache.hadoop.hive.metastore.metrics.Metrics.getOrCreateCounter(java.lang.String)'
>         at 
> org.apache.iceberg.rest.HMSCatalogAdapter.handleRequest(HMSCatalogAdapter.java:538)
>  ~[hive-standalone-metastore-rest-catalog-4.1.0.jar:4.1.0]
>         at 
> org.apache.iceberg.rest.HMSCatalogAdapter.execute(HMSCatalogAdapter.java:632) 
> ~[hive-standalone-metastore-rest-catalog-4.1.0.jar:4.1.0]
>         at 
> org.apache.iceberg.rest.HMSCatalogServlet.service(HMSCatalogServlet.java:80) 
> ~[hive-standalone-metastore-rest-catalog-4.1.0.jar:4.1.0]
>         at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
> ~[javax.servlet-api-3.1.0.jar:3.1.0]
>         at 
> org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799) 
> ~[jetty-servlet-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at 
> org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:554) 
> ~[jetty-servlet-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at 
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) 
> ~[jetty-server-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at 
> org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:772)
>  ~[jetty-server-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at 
> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
>  ~[jetty-server-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at 
> org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235)
>  ~[jetty-server-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at 
> org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1440)
>  ~[jetty-server-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at 
> org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
>  ~[jetty-server-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at 
> org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:505) 
> ~[jetty-servlet-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at 
> org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
>  ~[jetty-server-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at 
> org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1355)
>  ~[jetty-server-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at 
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 
> ~[jetty-server-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at 
> org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:191)
>  ~[jetty-server-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at 
> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
>  ~[jetty-server-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at org.eclipse.jetty.server.Server.handle(Server.java:516) 
> ~[jetty-server-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at 
> org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487) 
> ~[jetty-server-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at 
> org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732) 
> ~[jetty-server-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479) 
> ~[jetty-server-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at 
> org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277) 
> ~[jetty-server-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at 
> org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
>  ~[jetty-io-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) 
> ~[jetty-io-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at 
> org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104) 
> ~[jetty-io-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at 
> org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
>  ~[jetty-util-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at 
> org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
>  ~[jetty-util-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at 
> org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
>  ~[jetty-util-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at 
> org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:137)
>  ~[jetty-util-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at 
> org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
>  [jetty-util-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at 
> org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
>  [jetty-util-9.4.57.v20241219.jar:9.4.57.v20241219]
>         at java.base/java.lang.Thread.run(Thread.java:833) [?:?]
> {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to