carc-prathyush-shankar opened a new issue, #2978:
URL: https://github.com/apache/polaris/issues/2978
### Describe the bug
## Environment
- Polaris Version: 1.2.0
- Deployment method: Kubernetes (EKS)
- Client: StarRocks 3.5
- Storage: AWS S3
## Setup
Polaris is configured to federate to an existing Hive Metastore containing
Iceberg tables with `s3a://` storage paths.
## Problem
When querying tables through the external catalog, metadata operations work
(`SHOW DATABASES FROM polaris`), but data queries fail with
`ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not
found`.
## Example Table Definition
The tables in the federated Hive Metastore were created with `s3a://` paths:
```
CREATE TABLE `map_attribute` (
`sc_attribute_id` bigint(20) DEFAULT NULL,
`sc_frame` varchar(1048576) DEFAULT NULL
)
PROPERTIES ("owner" = "***", "write.spark.accept-any-schema" = "true",
"location" = "s3a://cake-cupcake/warehouse/blah.db/map_attribute");
```
## Stack Trace
```
2025-11-04 23:47:49,994 INFO [org.apa.pol.ser.exc.IcebergExceptionMapper]
[67fe3bec-de05-486b-a6c3-9b39d6ef2c16_0000000000000000149,POLARIS] [,,,]
(executor-thread-63) Handling runtimeException
java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem
not found
2025-11-04 23:47:49,995 ERROR [org.apa.pol.ser.exc.IcebergExceptionMapper]
[67fe3bec-de05-486b-a6c3-9b39d6ef2c16_0000000000000000149,POLARIS] [,,,]
(executor-thread-63) Unhandled exception returning INTERNAL_SERVER_ERROR:
java.lang.RuntimeException: java.lang.ClassNotFoundException: Class
org.apache.hadoop.fs.s3a.S3AFileSystem not found
at
org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2737)
at
org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:3569)
at
org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:3612)
at org.apache.hadoop.fs.FileSystem.access$300(FileSystem.java:172)
at
org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:3716)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:3667)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:557)
at org.apache.hadoop.fs.Path.getFileSystem(Path.java:366)
at org.apache.iceberg.hadoop.Util.getFs(Util.java:55)
at
org.apache.iceberg.hadoop.HadoopInputFile.fromLocation(HadoopInputFile.java:56)
at
org.apache.iceberg.hadoop.HadoopFileIO.newInputFile(HadoopFileIO.java:87)
at
org.apache.iceberg.TableMetadataParser.read(TableMetadataParser.java:294)
at
org.apache.iceberg.BaseMetastoreTableOperations.lambda$refreshFromMetadataLocation$0(BaseMetastoreTableOperations.java:180)
at
org.apache.iceberg.BaseMetastoreTableOperations.lambda$refreshFromMetadataLocation$1(BaseMetastoreTableOperations.java:199)
at
org.apache.iceberg.util.Tasks$Builder.runTaskWithRetry(Tasks.java:413)
at
org.apache.iceberg.util.Tasks$Builder.runSingleThreaded(Tasks.java:219)
at org.apache.iceberg.util.Tasks$Builder.run(Tasks.java:203)
at org.apache.iceberg.util.Tasks$Builder.run(Tasks.java:196)
at
org.apache.iceberg.BaseMetastoreTableOperations.refreshFromMetadataLocation(BaseMetastoreTableOperations.java:199)
at
org.apache.iceberg.BaseMetastoreTableOperations.refreshFromMetadataLocation(BaseMetastoreTableOperations.java:176)
at
org.apache.iceberg.BaseMetastoreTableOperations.refreshFromMetadataLocation(BaseMetastoreTableOperations.java:171)
at
org.apache.iceberg.hive.HiveTableOperations.doRefresh(HiveTableOperations.java:131)
at
org.apache.iceberg.BaseMetastoreTableOperations.refresh(BaseMetastoreTableOperations.java:88)
at
org.apache.iceberg.BaseMetastoreTableOperations.current(BaseMetastoreTableOperations.java:71)
at
org.apache.iceberg.BaseMetastoreCatalog.loadTable(BaseMetastoreCatalog.java:49)
at
org.apache.polaris.service.catalog.iceberg.IcebergCatalogHandler.loadTable(IcebergCatalogHandler.java:767)
at
org.apache.polaris.service.catalog.iceberg.IcebergCatalogAdapter.lambda$loadTable$8(IcebergCatalogAdapter.java:434)
at
org.apache.polaris.service.catalog.iceberg.IcebergCatalogAdapter.withCatalog(IcebergCatalogAdapter.java:201)
at
org.apache.polaris.service.catalog.iceberg.IcebergCatalogAdapter.loadTable(IcebergCatalogAdapter.java:429)
at
org.apache.polaris.service.catalog.iceberg.IcebergCatalogAdapter_Subclass.loadTable$$superforward(Unknown
Source)
at
org.apache.polaris.service.catalog.iceberg.IcebergRestCatalogEventServiceDelegator_Gj_WCptqTcdHu-fbZfgVkAwPXCI_Delegate_Subclass.loadTable(Unknown
Source)
at
org.apache.polaris.service.catalog.iceberg.IcebergRestCatalogEventServiceDelegator.loadTable(IcebergRestCatalogEventServiceDelegator.java:268)
at
org.apache.polaris.service.catalog.iceberg.IcebergCatalogAdapter_Subclass.loadTable(Unknown
Source)
at
org.apache.polaris.service.catalog.iceberg.IcebergCatalogAdapter_ClientProxy.loadTable(Unknown
Source)
at
org.apache.polaris.service.catalog.api.IcebergRestCatalogApi.loadTable(IcebergRestCatalogApi.java:565)
at
org.apache.polaris.service.catalog.api.IcebergRestCatalogApi_Subclass.loadTable$$superforward(Unknown
Source)
at
org.apache.polaris.service.catalog.api.IcebergRestCatalogApi_Subclass$$function$$13.apply(Unknown
Source)
at
io.quarkus.arc.impl.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:73)
at
io.quarkus.arc.impl.AroundInvokeInvocationContext$NextAroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:97)
at
io.smallrye.faulttolerance.FaultToleranceInterceptor.lambda$syncFlow$8(FaultToleranceInterceptor.java:364)
at io.smallrye.faulttolerance.core.Future.from(Future.java:85)
at
io.smallrye.faulttolerance.FaultToleranceInterceptor.lambda$syncFlow$9(FaultToleranceInterceptor.java:364)
at
io.smallrye.faulttolerance.core.FaultToleranceContext.call(FaultToleranceContext.java:20)
at io.smallrye.faulttolerance.core.Invocation.apply(Invocation.java:29)
at
io.smallrye.faulttolerance.core.metrics.MetricsCollector.apply(MetricsCollector.java:98)
at
io.smallrye.faulttolerance.FaultToleranceInterceptor.syncFlow(FaultToleranceInterceptor.java:367)
at
io.smallrye.faulttolerance.FaultToleranceInterceptor.intercept(FaultToleranceInterceptor.java:205)
at
io.smallrye.faulttolerance.FaultToleranceInterceptor_Bean.intercept(Unknown
Source)
at
io.quarkus.arc.impl.InterceptorInvocation.invoke(InterceptorInvocation.java:42)
at
io.quarkus.arc.impl.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:70)
at
io.quarkus.arc.impl.AroundInvokeInvocationContext$NextAroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:97)
at
io.quarkus.micrometer.runtime.MicrometerTimedInterceptor.timedMethod(MicrometerTimedInterceptor.java:79)
at
io.quarkus.micrometer.runtime.MicrometerTimedInterceptor_Bean.intercept(Unknown
Source)
at
io.quarkus.arc.impl.InterceptorInvocation.invoke(InterceptorInvocation.java:42)
at
io.quarkus.arc.impl.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:70)
at
io.quarkus.arc.impl.AroundInvokeInvocationContext$NextAroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:97)
at
io.quarkus.security.runtime.interceptor.SecurityHandler.handle(SecurityHandler.java:27)
at
io.quarkus.security.runtime.interceptor.RolesAllowedInterceptor.intercept(RolesAllowedInterceptor.java:29)
at
io.quarkus.security.runtime.interceptor.RolesAllowedInterceptor_Bean.intercept(Unknown
Source)
at
io.quarkus.arc.impl.InterceptorInvocation.invoke(InterceptorInvocation.java:42)
at
io.quarkus.arc.impl.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:70)
at
io.quarkus.arc.impl.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:62)
at
io.quarkus.resteasy.reactive.server.runtime.StandardSecurityCheckInterceptor.intercept(StandardSecurityCheckInterceptor.java:44)
at
io.quarkus.resteasy.reactive.server.runtime.StandardSecurityCheckInterceptor_RolesAllowedInterceptor_Bean.intercept(Unknown
Source)
at
io.quarkus.arc.impl.InterceptorInvocation.invoke(InterceptorInvocation.java:42)
at
io.quarkus.arc.impl.AroundInvokeInvocationContext.perform(AroundInvokeInvocationContext.java:30)
at
io.quarkus.arc.impl.InvocationContexts.performAroundInvoke(InvocationContexts.java:27)
at
org.apache.polaris.service.catalog.api.IcebergRestCatalogApi_Subclass.loadTable(Unknown
Source)
at
org.apache.polaris.service.catalog.api.IcebergRestCatalogApi$quarkusrestinvoker$loadTable_56b49d5a1874f2749e5229d18bb00aeb8fe7fdc8.invoke(Unknown
Source)
at
org.jboss.resteasy.reactive.server.handlers.InvocationHandler.handle(InvocationHandler.java:29)
at
io.quarkus.resteasy.reactive.server.runtime.QuarkusResteasyReactiveRequestContext.invokeHandler(QuarkusResteasyReactiveRequestContext.java:183)
at
org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.run(AbstractResteasyReactiveContext.java:147)
at
io.quarkus.vertx.core.runtime.VertxCoreRecorder$15.runWith(VertxCoreRecorder.java:645)
at
org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2651)
at
org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2630)
at
org.jboss.threads.EnhancedQueueExecutor.runThreadBody(EnhancedQueueExecutor.java:1622)
at
org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1589)
at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:11)
at
org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:11)
at
io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.ClassNotFoundException: Class
org.apache.hadoop.fs.s3a.S3AFileSystem not found
at
org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2641)
at
org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2735)
... 80 more
```
## Question
Is this expected behavior? Should S3-related dependencies be bundled with
Polaris for federated catalog support, or is there additional configuration
needed to enable S3A filesystem support?
### To Reproduce
1. Create external catalog in StarRocks that federates to Hive:
```
CREATE EXTERNAL CATALOG `polaris`
PROPERTIES ("iceberg.catalog.scope" = "PRINCIPAL_ROLE:ALL",
"iceberg.catalog.credential" = "****",
"iceberg.catalog.uri" = "https://****/api/catalog",
"iceberg.catalog.warehouse" = "****",
"iceberg.catalog.security" = "oauth2",
"type" = "iceberg",
"iceberg.catalog.type" = "rest"
);
```
2. Verify that metadata queries work: `SHOW DATABASES FROM polaris;`
4. Attempt to query a table: `SELECT * FROM polaris.database.table;`
### Actual Behavior
_No response_
### Expected Behavior
_No response_
### Additional context
_No response_
### System information
_No response_
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]