无法使用 Pyspark 从 EMR 集群连接到雪花

Posted

技术标签:

【中文标题】无法使用 Pyspark 从 EMR 集群连接到雪花【英文标题】:Not able to connect to Snowflake from EMR Cluster using Pyspark 【发布时间】:2020-04-10 04:10:16 【问题描述】:

我正在尝试使用 pyspark 从 EMR 集群连接到 Snowflake。

我在 spark-submit 中使用这两个 jar。

雪花-jdbc-3.5.2.jar spark-snowflake_2.11-2.7.0-spark_2.4.jar

但由于连接超时错误而失败。 我为 EMR 集群配置了正确的代理。来自同一个 EC2(EMR 主控) 我可以使用snowsql 和 python 连接器连接到 Snowflake。

我不确定为什么 pyspark 会超时。

【问题讨论】:

你能分享你关注的代码 sn-p 吗?有时由于代理问题,它可能无法连接。比如 http_proxy , https_proxy , HTTP_PROXY HTTPS_PROXY no_proxy 设置需要在这种情况下使用 SNOWFLAKE_SOURCE_NAME = "net.snowflake.spark.snowflake" sfOptions = "sfURL": "XXX", "sfAccount": "XX", "sfUser": "XX", "sfPassword": “xx”、“sfDatabase”:“xx”、“sfSchema”:“xx”、“sfWarehouse”:“xx” 查询 = “从 testdb.test1.t1 中选择 *” df = spark.read.format(SNOWFLAKE_SOURCE_NAME) .options(**sfOptions).option("query", query).load() 我可以使用来自同一个 ec2 实例的 snowsql 和 python 连接器连接到雪花。 你检查过上面提到的 co proxy 吗?剩下的一切看起来都不错,您还需要使用 biz_pstage_work 作为 sprak 连接到 sf 的架构 你能在这里发布错误堆栈跟踪吗?以下是我尝试通过 EMR shell 运行时的命令。(一些旧版本的 jar ) spark-submit --packages net.snowflake:snowflake-jdbc:3.8.0,net.snowflake:spark-snowflake_2.11:2.4.14 -spark_2.4 SparkConnPython.py pyspark --packages net.snowflake:snowflake-jdbc:3.8.0,net.snowflake:spark-snowflake_2.11:2.4.14-spark_2.4 【参考方案1】:

您可以使用我们的 SnowCD 工具来检查连接诊断。这与网络问题有关。 https://docs.snowflake.com/en/user-guide/snowcd.html

以下是我尝试通过 EMR shell 运行时的命令。

pyspark --packages net.snowflake:snowflake-jdbc:3.6.27,net.snowflake:spark-snowflake_2.12:2.4.14-spark_2.4

spark-submit --packages net.snowflake:snowflake-jdbc:3.8.0,net.snowflake:spark-snowflake_2.11:2.4.14-spark_2.4 SparkConnPythonWithCert.py

Spark-shell --packages net.snowflake:snowflake-jdbc:3.8.0,net.snowflake:spark-snowflake_2.11:2.4.14-spark_2.4

【讨论】:

以上是关于无法使用 Pyspark 从 EMR 集群连接到雪花的主要内容,如果未能解决你的问题,请参考以下文章

Jupyter + EMR + Spark - 从本地机器上的 Jupyter notebook 连接到 EMR 集群

从 EMR spark 连接到 EMR presto - 连接失败

无法访问 EMR 集群 jupyter notebook 中的 pyspark

为啥我们在启用 Kerberos 的 EMR 集群上使用直线连接到 Hive 时使用 Hive 服务主体?

从 Docker 容器将 PySpark 连接到 Kafka

使用 dask labextensions 连接到远程集群