apache / apache/paimon

[Bug] Use Paimon Catalog in StarRocks to access data on OBS report error "UnsupportedSchemeException"

Open
#7,835 0 comments 0 reactions 0 assignees View on GitHub
bug
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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.