【问题标题】:Py4JJavaError An error occurred while calling o37.load. : net.snowflake.client.jdbc.SnowflakeSQLException: JDBC driver encountered communication errorPy4JJavaError 调用 o37.load 时出错。 : net.snowflake.client.jdbc.SnowflakeSQLException: JDBC驱动遇到通信错误
【发布时间】:2021-12-10 07:53:32
【问题描述】:

我正在尝试连接(PySpark + Snowflake)不断收到错误。

我正在使用 PySpark 3.1,JDBC 和 Spark_Snowflake jar 文件也放置在 Classpath 中。不知道为什么我会收到以下错误。

代码:

from pyspark import SparkConf, SparkContext
from pyspark.sql import SQLContext
from pyspark.sql.types import *
from pyspark import SparkConf, SparkContext
sc = SparkContext("local", "Test App")
spark = SQLContext(sc)
spark_conf = SparkConf().setMaster('local').setAppName('Testing Spark SF')
sfOptions = {
  "sfURL" : "<account_identifier>.snowflakecomputing.com",
  "sfUser" : "<user_name>",
  "sfPassword" : "<password>",
  "sfDatabase" : "<database>",
  "sfSchema" : "<schema>",
  "sfWarehouse" : "<warehouse>"
}

SNOWFLAKE_SOURCE_NAME = "net.snowflake.spark.snowflake"

df = spark.read.format(SNOWFLAKE_SOURCE_NAME) \
  .options(**sfOptions) \
  .option("query",  "select 1 as my_num union all select 2 as my_num") \
  .load()

df.show()

错误:

Py4JJavaError:调用 o37.load 时出错。 : net.snowflake.client.jdbc.SnowflakeSQLException:JDBC 驱动程序 遇到通讯错误。消息:遇到异常 HTTP 请求:sun.security.validator.ValidatorException:不可信 找到证书。在 net.snowflake.client.jdbc.RestRequest.execute(RestRequest.java:284) 在 net.snowflake.client.core.HttpUtil.executeRequestInternal(HttpUtil.java:639) 在 net.snowflake.client.core.HttpUtil.executeRequest(HttpUtil.java:584) 在 net.snowflake.client.core.HttpUtil.executeGeneralRequest(HttpUtil.java:551) 在 net.snowflake.client.core.SessionUtil.newSession(SessionUtil.java:587) 在 net.snowflake.client.core.SessionUtil.openSession(SessionUtil.java:285) 在 net.snowflake.client.core.SFSession.open(SFSession.java:446) 在 net.snowflake.client.jdbc.DefaultSFConnectionHandler.initialize(DefaultSFConnectionHandler.java:104) 在 net.snowflake.client.jdbc.DefaultSFConnectionHandler.initializeConnection(DefaultSFConnectionHandler.java:79) 在 net.snowflake.client.jdbc.SnowflakeConnectionV1.initConnectionWithImpl(SnowflakeConnectionV1.java:116) 在 net.snowflake.client.jdbc.SnowflakeConnectionV1.(SnowflakeConnectionV1.java:96) 在 net.snowflake.client.jdbc.SnowflakeDriver.connect(SnowflakeDriver.java:172) 在 java.sql.DriverManager.getConnection(DriverManager.java:664) 在 java.sql.DriverManager.getConnection(DriverManager.java:208) 在 net.snowflake.spark.snowflake.JDBCWrapper.getConnector(SnowflakeJDBCWrapper.scala:209) 在 net.snowflake.spark.snowflake.SnowflakeRelation.$anonfun$schema$1(SnowflakeRelation.scala:60) 在 net.snowflake.spark.snowflake.SnowflakeRelation$$Lambda$866/22415031.apply(未知 来源)在 scala.Option.getOrElse(Option.scala:189) 在 net.snowflake.spark.snowflake.SnowflakeRelation.schema$lzycompute(SnowflakeRelation.scala:57) 在 net.snowflake.spark.snowflake.SnowflakeRelation.schema(SnowflakeRelation.scala:56) 在 org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:449) 在 org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:325) 在 org.apache.spark.sql.DataFrameReader.$anonfun$load$3(DataFrameReader.scala:307) 在 org.apache.spark.sql.DataFrameReader$$Lambda$858/5135046.apply(未知 来源)在 scala.Option.getOrElse(Option.scala:189) 在 org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:307) 在 org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:225) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244) 在 py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357) 在 py4j.Gateway.invoke(Gateway.java:282) 在 py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132) 在 py4j.commands.CallCommand.execute(CallCommand.java:79) 在 py4j.GatewayConnection.run(GatewayConnection.java:238) 在 java.lang.Thread.run(Thread.java:745) 原因: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:没有受信任的证书 发现于 sun.security.ssl.Alerts.getSSLException(Alerts.java:198) 在 sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1958) 在 sun.security.ssl.Handshaker.fatalSE(Handshaker.java:322) 在 sun.security.ssl.Handshaker.fatalSE(Handshaker.java:316) 在 sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1526) 在 sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:215) 在 sun.security.ssl.Handshaker.processLoop(Handshaker.java:1024) 在 sun.security.ssl.Handshaker.process_record(Handshaker.java:954) 在 sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1065) 在 sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1384) 在 sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1412) 在 sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1396) 在 net.snowflake.client.jdbc.internal.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:436)

【问题讨论】:

  • 收到SSLHandshakeExceptionNo trusted certificate found后,很明显您遇到了SSL证书问题。
  • 我该如何解决这个问题。@VladSiv
  • 尝试在您的sfOptions 中添加"sfSSL": "on"。不确定是否会解决它,但请尝试一下。
  • 添加了@VladSiv,但错误仍然相同:javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: 找不到受信任的证书
  • 中间有代理吗?这通常发生在中间有代理时(尤其是进行 SSL 检查的代理,Snowflake 不支持)。最简单的测试方法是根据SYSTEM$WHITELIST返回的URL运行SnowCD

标签: apache-spark jdbc pyspark snowflake-cloud-data-platform snowflake-connector


【解决方案1】:

很明显,您的 SSL 证书有问题。您可以暂时覆盖它。

sfOptions = {
   ...
   "sfSSL" : "false",
}

但是,您可以检查是否通过代理访问 Snowflake。 您需要导入代理的证书并将其包含在您的 cacerts 中。 正在运行的 java 版本的 cacerts 的默认位置。您可以在 lib/security 下的 java 主目录中找到它。

keytool -import -trustcacerts -alias cert_ssl -file proxy.cer -noprompt -storepass changeit -keystore cacerts

【讨论】:

    猜你喜欢
    • 2019-05-26
    • 2016-08-03
    • 2020-02-10
    • 1970-01-01
    • 2020-08-06
    • 2021-11-15
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多