【发布时间】: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)
【问题讨论】:
-
收到
SSLHandshakeException和No 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