Trino无法连接Nessie问题排查求助
问题:Trino连接Nessie失败,抛出
java.net.ConnectException: undefined 现有环境:Spark/Iceberg/MinIO运行正常,Iceberg数据已正确写入MinIO和Nessie;使用Trino官方Helm Chart 0.18.0(对应Trino 432)连接Nessie时,执行GET http://localhost:19120/api/v1/trees/tree/main?fetch=MINIMAL失败,但该请求在浏览器/Insomnia中可正常执行,Trino GUI报错java.net.ConnectException: undefined。已测试Nessie 0.77.1(最新版)和0.71.0(与Trino 432 pom.xml指定版本匹配)。
Trino连接器配置
connector.name=iceberg iceberg.catalog.type=nessie iceberg.nessie-catalog.uri=http://localhost:19120/api/v1 iceberg.nessie-catalog.default-warehouse-dir=s3a://data/test hive.s3.aws-access-key=VUtRVIf0hg7szCp3k0Pz hive.s3.aws-secret-key=lHzYClEjh2AH5mEfRdPS720pMl3UZl7riR3uL4pL hive.s3.endpoint=http://127.0.0.1:9000 hive.s3.path-style-access=true hive.s3.ssl.enabled=false
Spark会话配置(Java)
SparkSession.builder() .appName("Test App") .master("local") .config("spark.ui.enabled", "false") .config("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") .config("fs.s3a.endpoint", "http://127.0.0.1:9000") .config("fs.s3a.access.key", "VUtRVIf0hg7szCp3k0Pz") .config("fs.s3a.secret.key", "lHzYClEjh2AH5mEfRdPS720pMl3UZl7riR3uL4pL") .config("fs.s3a.path.style.access", "true") .config("spark.sql.warehouse.dir", WAREHOUSE_PATH) .config("spark.jars.packages", "org.apache.iceberg:iceberg-spark-runtime-3.5_2.13:1.3.0,org.projectnessie.nessie-integrations:nessie-spark-extensions-3.5_2.13:0.77.1") .config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions,org.projectnessie.spark.extensions.NessieSparkSessionExtensions") .config("spark.sql.catalog.nessie", "org.apache.iceberg.spark.SparkCatalog") .config("spark.sql.catalog.nessie.catalog-impl", "org.apache.iceberg.nessie.NessieCatalog") .config("spark.sql.catalog.nessie.authentication.type", "NONE") .config("spark.sql.catalog.nessie.uri", "http://localhost:19120/api/v1") .config("spark.sql.catalog.nessie.ref", "main") .config("spark.sql.defaultCatalog", "nessie") .config("spark.sql.catalog.nessie.warehouse", "s3a://data/test") .getOrCreate();
Trino完整堆栈跟踪
io.trino.spi.TrinoException: Error listing schemas for catalog nessie: Failed to execute GET request against 'http://localhost:19120/api/v1/trees/tree/main?fetch=MINIMAL'. at io.trino.metadata.MetadataListing.handleListingException(MetadataListing.java:349) at io.trino.metadata.MetadataListing.listSchemas(MetadataListing.java:97) at io.trino.metadata.MetadataListing.listSchemas(MetadataListing.java:88) at io.trino.connector.informationschema.InformationSchemaPageSource.addSchemataRecords(InformationSchemaPageSource.java:322) at io.trino.connector.informationschema.InformationSchemaPageSource.buildPages(InformationSchemaPageSource.java:226) at io.trino.connector.informationschema.InformationSchemaPageSource.getNextPage(InformationSchemaPageSource.java:184) at io.trino.operator.TableScanOperator.getOutput(TableScanOperator.java:266) at io.trino.operator.Driver.processInternal(Driver.java:395) at io.trino.operator.Driver.lambda$process$8(Driver.java:298) at io.trino.operator.Driver.tryWithLock(Driver.java:694) at io.trino.operator.Driver.process(Driver.java:290) at io.trino.operator.Driver.processForDuration(Driver.java:261) at io.trino.execution.SqlTaskExecution$DriverSplitRunner.processFor(SqlTaskExecution.java:887) at io.trino.execution.executor.timesharing.PrioritizedSplitRunner.process(PrioritizedSplitRunner.java:187) at io.trino.execution.executor.timesharing.TimeSharingTaskExecutor$TaskRunner.run(TimeSharingTaskExecutor.java:565) at io.trino.$gen.Trino_432____20240219_102654_2.run(Unknown Source) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583) Caused by: org.projectnessie.client.http.HttpClientException: Failed to execute GET request against 'http://localhost:19120/api/v1/trees/tree/main?fetch=MINIMAL'. at org.projectnessie.client.http.impl.jdk11.JavaRequest.executeRequest(JavaRequest.java:128) at org.projectnessie.client.http.HttpRequest.get(HttpRequest.java:80) at org.projectnessie.client.rest.v1.RestV1TreeClient.getReferenceByName(RestV1TreeClient.java:83) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.projectnessie.client.rest.v1.RestV1Client$ExceptionRewriter.invoke(RestV1Client.java:78) at jdk.proxy4/jdk.proxy4.$Proxy236.getReferenceByName(Unknown Source) at org.projectnessie.client.rest.v1.HttpGetReference.get(HttpGetReference.java:34) at org.apache.iceberg.nessie.NessieIcebergClient.loadReference(NessieIcebergClient.java:114) at org.apache.iceberg.nessie.NessieIcebergClient.lambda$new$0(NessieIcebergClient.java:81) at org.apache.iceberg.relocated.com.google.common.base.Suppliers$NonSerializableMemoizingSupplier.get(Suppliers.java:181) at org.apache.iceberg.nessie.NessieIcebergClient.getRef(NessieIcebergClient.java:89) at org.apache.iceberg.nessie.NessieIcebergClient.withReference(NessieIcebergClient.java:501) at org.apache.iceberg.nessie.NessieIcebergClient.listNamespaces(NessieIcebergClient.java:207) at io.trino.plugin.iceberg.catalog.nessie.TrinoNessieCatalog.listNamespaces(TrinoNessieCatalog.java:104) at io.trino.plugin.iceberg.IcebergMetadata.listSchemaNames(IcebergMetadata.java:355) at io.trino.plugin.base.classloader.ClassLoaderSafeConnectorMetadata.listSchemaNames(ClassLoaderSafeConnectorMetadata.java:197) at io.trino.tracing.TracingConnectorMetadata.listSchemaNames(TracingConnectorMetadata.java:131) at io.trino.metadata.MetadataManager.listSchemaNames(MetadataManager.java:254) at io.trino.tracing.TracingMetadata.listSchemaNames(TracingMetadata.java:168) at io.trino.metadata.MetadataListing.doListSchemas(MetadataListing.java:103) at io.trino.metadata.MetadataListing.listSchemas(MetadataListing.java:94) ... 17 more Caused by: java.net.ConnectException: undefined at java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:951) at java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:133) at org.projectnessie.client.http.impl.jdk11.JavaHttpClient.lambda$newRequest$0(JavaHttpClient.java:68) at org.projectnessie.client.http.impl.jdk11.JavaRequest.executeRequest(JavaRequest.java:110) ... 38 more Caused by: java.net.ConnectException: undefined at java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1028) at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:227) at java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:280) at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$2(PlainHttpConnection.java:238) at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934) at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911) at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773) ... 3 more Caused by: java.nio.channels.ClosedChannelException: undefined at java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:202) at java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:786) at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:874) at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:210) at java.base/java.security.AccessController.doPrivileged(AccessController.java:571) at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:212) ... 9 more
解决方案
1. 修正Nessie和MinIO的访问地址(容器/集群环境核心问题)
由于Trino通过Helm部署在容器/K8s环境中,localhost和127.0.0.1指向Trino容器自身,无法访问外部的Nessie/MinIO服务:
- K8s集群环境:将URI替换为Nessie和MinIO的Service名称,比如
http://nessie-service:19120/api/v1、http://minio-service:9000 - 本地Docker环境:使用
host.docker.internal替代localhost,即http://host.docker.internal:19120/api/v1、http://host.docker.internal:9000 - 宿主机直接部署:确认Trino所在网络能访问宿主机IP,替换为宿主机实际IP,比如
http://192.168.1.100:19120/api/v1
2. 验证版本兼容性
确认Trino 432与Nessie 0.71.0的依赖匹配,检查Trino pod内的日志是否有版本不兼容的隐性报错;若使用Nessie 0.77.1,需确认Trino Iceberg插件是否支持该版本,必要时升级Trino到对应兼容版本
3. 检查网络连通性
- K8s环境:确认NetworkPolicy允许Trino服务访问Nessie和MinIO的端口(19120、9000)
- 防火墙/安全组:确保Nessie和MinIO的端口在Trino所在环境中可访问,无拦截规则
4. 补充Nessie认证配置(若需要)
若Nessie启用了认证,需在Trino连接器配置中添加:
iceberg.nessie-catalog.authentication.type=BASIC iceberg.nessie-catalog.auth.basic.username=your-user iceberg.nessie-catalog.auth.basic.password=your-pass
目前你的配置中Spark使用NONE认证,需保持Trino配置一致
内容的提问来源于stack exchange,提问作者PowerfullDeveloper
相关产品推荐
相关产品推荐

