You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 10:29:51