[Bug] Use Paimon Catalog in StarRocks to access data on OBS report error "UnsupportedSchemeException"
- Dominant language
- Java
- Stars
- 3.4k
- Forks
- 1.4k
- Avg merge
- 1d 11h
- Merged PRs (30d)
- 396
Description
### Search before asking
- [x] I searched in the [issues](https://github.com/apache/paimon/issues) and found nothing similar.
### Paimon version
1.2.0
1.2.0
org.apache.paimon
paimon-bundle
${paimon.version}
lz4-java
org.lz4
org.apache.paimon
paimon-s3
${paimon.version}
org.apache.paimon
paimon-oss
${paimon.version}
### Compute Engine
StarRocks 3.5.16
### Minimal reproduce step
## step1: create paimon catalog:
```sql
CREATE EXTERNAL CATALOG mrs_paimon
PROPERTIES
(
"type" = "paimon",
"paimon.catalog.type"="hive",
"paimon.catalog.warehouse"="obs://hwem-gri-oversea-m241-la-mrs-uat-mex2-oss/bdp/paimon/warehouse",
"hive.metastore.uris"="thrift://[10.205.200.146:9083](http://10.205.200.146:9083/),thrift://[10.205.200.64:9083](http://10.205.200.64:9083/)",
"aws.s3.enable_ssl" = "false",
"aws.s3.enable_path_style_access" = "true",
"aws.s3.endpoint" = "[obs.la-north-2.myhuaweicloud.com](http://obs.la-north-2.myhuaweicloud.com/)",
"aws.s3.access_key" = "xxxx",
"aws.s3.secret_key" = "xxxxxxx"
)
USE mrs_paimon;
SHOW DATABASES FROM mrs_paimon;
```
## 2. issue query report error
query as follows
```sql
SELECT * FROM `mrs_paimon`.`paimon_db`.`my_table` LIMIT 20
```
FE report error to mysql client:
```
Error 1064 (HY000): org.apache.paimon.fs.UnsupportedSchemeException:
Could not find a file io implementation for scheme 'obs' in the classpath.
Hadoop FileSystem also cannot access this path
'obs://hwem-gri-oversea-m241-la-mrs-uat-mex2-oss/bdp/paimon/warehouse'.
```
detail error info in fe.log
```
(starrocks-mysql-nio-pool-176|11849049) [StmtExecutor.execute():975] execute Exception, sql: SELECT * FROM `mrs_paimon`.`paimon_db`.`my_table` LIMIT 20, error: Getting analyzing error. Detail message: Unknown table 'paimon_db.my_table'.
WARN (starrocks-mysql-nio-pool-176|11849049) [StmtExecutor.logOptimizerTraceOnGenerateExecPlanFailure():697] Generate exec plan failed. Planner profile: query_id=c2661632-4d18-11f1-ad90-fa163e2e29f1, sql=SELECT * FROM `mrs_paimon`.`paimon_db`.`my_table` LIMIT 20, err=SemanticException: Getting analyzing error. Detail message: Unknown table 'paimon_db.my_table'., profile=Planner:
- -- Parser[1] 0
- -- Total[1] 35ms
- -- Analyzer[1] 35ms
- -- Lock[1] 0
- -- AnalyzeDatabase[1] 0
- -- AnalyzeTemporaryTable[1] 0
- -- AnalyzeTable[1] 35ms
Reason:
```
## 3. desc paimon table also report error
```
SHOW CATALOGS;
SHOW CREATE CATALOG mrs_paimon;
SET CATALOG mrs_paimon;
SHOW DATABASES;
USE paimon_db;
desc my_table;
```
```
2026-05-12 14:49:25.861+08:00 WARN (starrocks-mysql-nio-pool-1|171)
[StmtExecutor.logOptimizerTraceOnGenerateExecPlanFailure():697] Generate exec plan
Planner profile:
query_id=b73fcf55-4dce-11f1-a1d0-fa163e2e29fa, sql=desc my_table,
err=SemanticException: Getting analyzing error.
Detail message:
Unknown node path: /catalog/mrs_paimon/paimon_db/my_table/schema.
msg: table : my_table not exists., profile=Planner:
--- Parser[1] 1ms
--- Total[1] 37ms
Reason:
2026-05-12 14:49:25.860+08:00 ERROR (starrocks-mysql-nio-pool-1|171)
[PaimonMetadata.getTable():243] Paimon table paimon_db.my_table does not exist.
org.apache.paimon.Catalog$TableNotExistException: Table paimon_db.my_table does not exist.
at org.apache.paimon.hive.HiveCatalog.lambda$loadTableSchema$18(HiveCatalog.java:709)
at java.util.Optional.orElseThrow(Optional.java:403)
at org.apache.paimon.hive.HiveCatalog.loadTableSchema(HiveCatalog.java:709)
at org.apache.paimon.hive.HiveCatalog.loadTableMetadata(HiveCatalog.java:692)
at org.apache.paimon.hive.HiveCatalog.loadTableMetadata(HiveCatalog.java:686)
at org.apache.paimon.catalog.CatalogUtils.loadTable(CatalogUtils.java:200)
at org.apache.paimon.catalog.AbstractCatalog.getTable(AbstractCatalog.java:460)
at org.apache.paimon.catalog.CachingCatalog.getTable(CachingCatalog.java:242)
at com.starrocks.connector.paimon.PaimonMetadata.getTable(PaimonMetadata.java:241)
at com.starrocks.connector.CatalogConnectorMetadata.getTable(CatalogConnectorMetadata.java:148)
at com.starrocks.server.MetadataMgr.lambda$getTables$5(MetadataMgr.java:507)
at java.util.Optional.map(Optional.java:260)
at com.starrocks.server.MetadataMgr.getTable(MetadataMgr.java:507)
at com.starrocks.common.proc.ExternalTablesProcDir.lookup(ExternalTablesProcDir.java:60)
at com.starrocks.common.proc.ProcService.open(ProcService.java:112)
at com.starrocks.sql.analyzer.ShowStmtAnalyzer$ShowStmtAnalyzerVisitor.descExternalCatalogTable(ShowStmtAnalyzer.java:549)
at com.starrocks.sql.analyzer.ShowStmtAnalyzer$ShowStmtAnalyzerVisitor.visitDescTableStmt(ShowStmtAnalyzer.java:368)
at com.starrocks.sql.analyzer.ShowStmtAnalyzer$ShowStmtAnalyzerVisitor.visitDescTableStmt(ShowStmtAnalyzer.java:108)
at com.starrocks.sql.ast.DescribeStmt.accept(DescribeStmt.java:210)
at com.starrocks.sql.ast.AstVisitor.visit(AstVisitor.java:102)
at com.starrocks.sql.analyzer.ShowStmtAnalyzer$ShowStmtAnalyzerVisitor.analyze(ShowStmtAnalyzer.java:114)
at com.starrocks.sql.analyzer.ShowStmtAnalyzer.analyze(ShowStmtAnalyzer.java:105)
at com.starrocks.sql.analyzer.Analyzer$AnalyzerVisitor.visitShowStatement(Analyzer.java:432)
at com.starrocks.sql.analyzer.Analyzer$AnalyzerVisitor.visitDescTableStmt(Analyzer.java:190)
at com.starrocks.sql.ast.AstVisitor.visitDescTableStmt(AstVisitor.java:244)
at com.starrocks.sql.ast.DescribeStmt.accept(DescribeStmt.java:210)
at com.starrocks.sql.ast.AstVisitor.visit(AstVisitor.java:102)
at com.starrocks.sql.analyzer.Analyzer.analyze(Analyzer.java:187)
at com.starrocks.qe.StmtExecutor.generateExecPlan(StmtExecutor.java:612)
at com.starrocks.qe.StmtExecutor.execute(StmtExecutor.java:757)
at com.starrocks.qe.ConnectProcessor.executeQueryStatement(ConnectProcessor.java:547)
at com.starrocks.qe.ConnectProcessor.runWithParserStageRetry(ConnectProcessor.java:435)
at com.starrocks.qe.ConnectProcessor.handleQuery(ConnectProcessor.java:372)
at com.starrocks.qe.ConnectProcessor.dispatch(ConnectProcessor.java:758)
at com.starrocks.qe.ConnectProcessor.processOnce(ConnectProcessor.java:1148)
at com.starrocks.mysql.nio.ReadListener.lambda$handleEvent$0(ReadListener.java:71)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
...
```
## step4: Transform obs path into s3 path in catalog ddl, it also does not work.
```
CREATE EXTERNAL CATALOG mrs_paimon
PROPERTIES
(
"type" = "paimon",
"paimon.catalog.type" = "hive",
"paimon.catalog.warehouse" = "s3://hwem-gri-oversea-m241-la-mrs-uat-mex2-oss/bdp/paimon/warehouse",
"hive.metastore.uris" = "thrift://[10.205.200.146:9083](http://10.205.200.146:9083/),thrift://[10.205.200.64:9083](http://10.205.200.64:9083/)",
"aws.s3.enable_ssl" = "true",
"aws.s3.enable_path_style_access" = "true",
"aws.s3.endpoint" = "https://obs.la-north-2.myhuaweicloud.com/",
"aws.s3.region" = "la-north-2",
"aws.s3.access_key" = "xxxx",
"aws.s3.secret_key" = "xxxxxxx"
);
CREATE EXTERNAL CATALOG mrs_paimon
PROPERTIES
(
"type" = "paimon",
"paimon.catalog.type" = "hive",
"hive.metastore.uris" = "thrift://[10.205.200.146:9083](http://10.205.200.146:9083/),thrift://[10.205.200.64:9083](http://10.205.200.64:9083/)",
"paimon.catalog.warehouse" = "s3a://hwem-gri-oversea-m241-la-mrs-uat-mex2-oss/bdp/paimon/warehouse",
"aws.s3.enable_ssl" = "true",
"aws.s3.enable_path_style_access" = "true",
"aws.s3.endpoint" = "[obs.la-north-2.myhuaweicloud.com](http://obs.la-north-2.myhuaweicloud.com/)",
"aws.s3.access_key" = "xxx",
"aws.s3.secret_key" = "xxx"
);
```
## step5: copy paimon-obs-1.2.0.jar into starrocks FE according to community experiences, it also does not work. error as follows
```
2026-05-13 10:50:52.341+08:00 WARN (starrocks-mysql-nio-pool-2|708) [StmtExecutor.execute():998] execute Exception, sql: SHOW DATABASES FROM `mrs_paimon`
java.lang.NoClassDefFoundError: Could not initialize class okhttp3.internal.concurrent.TaskRunner
at okhttp3.ConnectionPool.(ConnectionPool.kt:41) ~[okhttp-4.10.0.jar:?]
at okhttp3.ConnectionPool.(ConnectionPool.kt:47) ~[okhttp-4.10.0.jar:?]
at okhttp3.OkHttpClient$Builder.(OkHttpClient.kt:471) ~[okhttp-4.10.0.jar:?]
at com.obs.services.internal.utils.RestUtils.initHttpClientBuilder(RestUtils.java:333) ~[?:?]
at com.obs.services.internal.RestStorageService.initHttpClient(RestStorageService.java:177) ~[?:?]
at com.obs.services.ObsClient.init(ObsClient.java:108) ~[?:?]
at com.obs.services.ObsClient.(ObsClient.java:233) ~[?:?]
at org.apache.hadoop.fs.obs.DefaultOBSClientFactory.createObsClientWithoutCredentialsProvider(DefaultOBSClientFactory.java:289) ~[?:?]
at org.apache.hadoop.fs.obs.DefaultOBSClientFactory.createHuaweiObsClient(DefaultOBSClientFactory.java:240) ~[?:?]
at org.apache.hadoop.fs.obs.DefaultOBSClientFactory.createObsClient(DefaultOBSClientFactory.java:359) ~[?:?]
at org.apache.hadoop.fs.obs.OBSFileSystem.initialize(OBSFileSystem.java:286) ~[?:?]
at org.apache.paimon.obs.OBSFileIO.lambda$createFileSystem$0(OBSFileIO.java:133) ~[?:?]
at org.apache.paimon.obs.OBSFileIO.lambda$createFileSystem$1(OBSFileIO.java:141) ~[?:?]
at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708) ~[?:?]
at org.apache.paimon.obs.OBSFileIO.createFileSystem(OBSFileIO.java:140) ~[?:?]
at org.apache.paimon.obs.HadoopCompliantFileIO.getFileSystem(HadoopCompliantFileIO.java:113) ~[?:?]
at org.apache.paimon.obs.HadoopCompliantFileIO.exists(HadoopCompliantFileIO.java:83) ~[?:?]
at org.apache.paimon.fs.PluginFileIO.lambda$exists$4(PluginFileIO.java:67) ~[paimon-bundle-1.2.0-cve-patched.jar:?]
at org.apache.paimon.fs.PluginFileIO.wrap(PluginFileIO.java:104) ~[paimon-bundle-1.2.0-cve-patched.jar:?]
at org.apache.paimon.fs.PluginFileIO.exists(PluginFileIO.java:67) ~[paimon-bundle-1.2.0-cve-patched.jar:?]
at org.apache.paimon.fs.FileIO.checkOrMkdirs(FileIO.java:285) ~[paimon-bundle-1.2.0-cve-patched.jar:?]
at org.apache.paimon.hive.HiveCatalog.createHiveCatalog(HiveCatalog.java:1686) ~[paimon-bundle-1.2.0-cve-patched.jar:?]
at org.apache.paimon.hive.HiveCatalogFactory.create(HiveCatalogFactory.java:37) ~[paimon-bundle-1.2.0-cve-patched.jar:?]
at org.apache.paimon.catalog.CatalogFactory.createUnwrappedCatalog(CatalogFactory.java:84) ~[paimon-bundle-1.2.0-cve-patched.jar:?]
at org.apache.paimon.catalog.CatalogFactory.createCatalog(CatalogFactory.java:71) ~[paimon-bundle-1.2.0-cve-patched.jar:?]
at org.apache.paimon.catalog.CatalogFactory.createCatalog(CatalogFactory.java:67) ~[paimon-bundle-1.2.0-cve-patched.jar:?]
at com.starrocks.connector.paimon.PaimonConnector.getPaimonNativeCatalog(PaimonConnector.java:152) ~[starrocks-fe.jar:?]
at com.starrocks.connector.paimon.PaimonConnector.getMetadata(PaimonConnector.java:161) ~[starrocks-fe.jar:?]
at com.starrocks.connector.LazyConnector.getMetadata(LazyConnector.java:42) ~[starrocks-fe.jar:?]
at com.starrocks.connector.CatalogConnector.getMetadata(CatalogConnector.java:45) ~[starrocks-fe.jar:?]
at com.starrocks.server.MetadataMgr$QueryMetadatas.getConnectorMetadata(MetadataMgr.java:119) ~[starrocks-fe.jar:?]
at com.starrocks.server.MetadataMgr.getOptionalMetadata(MetadataMgr.java:204) ~[starrocks-fe.jar:?]
at com.starrocks.server.MetadataMgr.getOptionalMetadata(MetadataMgr.java:181) ~[starrocks-fe.jar:?]
at com.starrocks.server.MetadataMgr.listDbNames(MetadataMgr.java:223) ~[starrocks-fe.jar:?]
at com.starrocks.qe.ShowExecutor$ShowExecutorVisitor.visitShowDatabasesStatement(ShowExecutor.java:465) ~[starrocks-fe.jar:?]
at com.starrocks.qe.ShowExecutor$ShowExecutorVisitor.visitShowDatabasesStatement(ShowExecutor.java:321) ~[starrocks-fe.jar:?]
at com.starrocks.sql.ast.ShowDbStmt.accept(ShowDbStmt.java:99) ~[starrocks-fe.jar:?]
at com.starrocks.sql.ast.AstVisitor.visit(AstVisitor.java:102) ~[starrocks-fe.jar:?]
at com.starrocks.qe.ShowExecutor.execute(ShowExecutor.java:318) ~[starrocks-fe.jar:?]
at com.starrocks.qe.StmtExecutor.handleShow(StmtExecutor.java:2233) ~[starrocks-fe.jar:?]
at com.starrocks.qe.StmtExecutor.execute(StmtExecutor.java:905) ~[starrocks-fe.jar:?]
at com.starrocks.qe.ConnectProcessor.executeQueryAttempt(ConnectProcessor.java:547) ~[starrocks-fe.jar:?]
at com.starrocks.qe.ConnectProcessor.runWithParserStageRetry(ConnectProcessor.java:435) ~[starrocks-fe.jar:?]
at com.starrocks.qe.ConnectProcessor.handleQuery(ConnectProcessor.java:372) ~[starrocks-fe.jar:?]
at com.starrocks.qe.ConnectProcessor.dispatch(ConnectProcessor.java:758) ~[starrocks-fe.jar:?]
at com.starrocks.qe.ConnectProcessor.processOnce(ConnectProcessor.java:1148) ~[starrocks-fe.jar:?]
at com.starrocks.mysql.nio.ReadListener.lambda$handleEvent$0(ReadListener.java:71) ~[starrocks-fe.jar:?]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[?:?]
at java.lang.Thread.run(Thread.java:840) ~[?:?]
Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.NoSuchFieldError: Companion [in thread "starrocks-mysql-nio-pool-2"]
at okhttp3.internal.Util.(Util.kt:70) ~[okhttp-4.10.0.jar:?]
at okhttp3.internal.concurrent.TaskRunner.(TaskRunner.kt:309) ~[okhttp-4.10.0.jar:?]
... 50 more
```
### What doesn't meet your expectations?
Paimon catalog StarRocks can access paimon data on OBS.
### Anything else?
Use access OBS via Parallel Filesystem instead of object storage, is it the root cause?
### Are you willing to submit a PR?
- [ ] I'm willing to submit a PR!
Contributor guide
No contributing guide indexed for this repository
Research direction
Start with the OBS file I/O path shown in the stack trace, including org.apache.paimon.obs.OBSFileIO, HadoopCompliantFileIO, HiveCatalog, and StarRocks' PaimonConnector. Reproduce the failure with SHOW DATABASES or a table query using the OBS warehouse, then verify that the catalog can access the path without UnsupportedSchemeException or dependency initialization errors.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java
- Domain
- data-engineering, databases
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 42/100