使用雪花火花连接器

时间:2020-04-26 15:13:12

标签: python apache-spark pyspark snowflake-cloud-data-platform

我有一个3节点的火花群集。并尝试使用雪花火花连接器和jdbc驱动程序访问雪花

jdbc:雪花jdbc-3.12.4.jar spark-connector:spark-snowflake_2.11-2.7.0-spark_2.4.jar

这是我的代码:

sfOptions = {
  "sfURL" : "{}.snowflakecomputing.com".format(ACCOUNT_NAME),
  "sfUser" : "{}@fmr.com".format(USER_ID),
  "sfAccount" : "{}".format(ACCOUNT_ID),
  "sfRole" : "{}".format(DEFAULT_ROLE),
  "sfAuthenticator" : "oauth",
  "sfToken" : "{}".format(oauth_token),
  "sfDatabase" : "{}".format(DATABASE),
  "sfSchema" : "{}".format(SCHEMA),
  "sfWarehouse" : "{}".format(WAREHOUSE)
}

SNOWFLAKE_SOURCE_NAME = "net.snowflake.spark.snowflake"
....
conf = (SparkConf()
    .setMaster("spark://<master-url>")
    .setAppName("Spark-Snowflake-Connector")
    )


spark = (SparkSession.builder.config(conf=conf)
    .enableHiveSupport()
    .getOrCreate())
spark._jvm.net.snowflake.spark.snowflake.SnowflakeConnectorUtils.enablePushdownSession(spark._jvm.org.apache.spark.sql.SparkSession.builder().getOrCreate())


sdf = spark.read.format(SNOWFLAKE_SOURCE_NAME) \
   .options(**sfOptions) \
   .option("query",  "select * from TIME_AGE") \
   .load()
sdf.show()

我的通话在sdf.show()上失败,但以下情况除外。有什么建议吗?

20/04/26 09:54:55信息DAScheduler:作业0失败:showString在 NativeMethodAccessorImpl.java:0,花了5.494100 s的Traceback(大部分 最近通话结束):文件“ /fedata/a393831/snowflake/spark-driver.py”, 114行,在 sdf.show()文件“ /apps/shared/spark/python/lib/pyspark.zip/pyspark/sql/dataframe.py”, 显示文件中的第378行 “ /apps/shared/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py”, 第1257行,在通话文件中 “ /apps/shared/spark/python/lib/pyspark.zip/pyspark/sql/utils.py”,第 63,在装饰文件中 “ /apps/shared/spark/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py”, 第328行,位于get_return_value py4j.protocol.Py4JJavaError:错误 发生在调用o68.showString时。 : org.apache.spark.SparkException:由于阶段失败,作业中止了: 阶段0.0中的任务0失败4次,最近一次失败:任务0.3丢失 在阶段0.0(TID 3,10.240.62.46,执行者0): java.lang.NullPointerException在 net.snowflake.client.core.SFArrowResultSet.getObject(SFArrowResultSet.java:570) 在 net.snowflake.client.jdbc.SnowflakeResultSetV1.getObject(SnowflakeResultSetV1.java:336) 在 net.snowflake.spark.snowflake.io.ResultIterator $$ anonfun $ 2.apply(SnowflakeResultSetRDD.scala:115) 在 net.snowflake.spark.snowflake.io.ResultIterator $$ anonfun $ 2.apply(SnowflakeResultSetRDD.scala:114) 在 scala.collection.TraversableLike $$ anonfun $ map $ 1.apply(TraversableLike.scala:234) 在 scala.collection.TraversableLike $$ anonfun $ map $ 1.apply(TraversableLike.scala:234) 在scala.collection.immutable.Range.foreach(Range.scala:160)在 scala.collection.TraversableLike $ class.map(TraversableLike.scala:234) 在scala.collection.AbstractTraversable.map(Traversable.scala:104) 在 net.snowflake.spark.snowflake.io.ResultIterator.next(SnowflakeResultSetRDD.scala:114) 在scala.collection.Iterator $$ anon $ 11.next(Iterator.scala:410)在 org.apache.spark.sql.execution.SparkPlan $$ anonfun $ 2.apply(SparkPlan.scala:256) 在 org.apache.spark.sql.execution.SparkPlan $$ anonfun $ 2.apply(SparkPlan.scala:247) 在 org.apache.spark.rdd.RDD $$ anonfun $ mapPartitionsInternal $ 1 $$ anonfun $ apply $ 24.apply(RDD.scala:836) 在 org.apache.spark.rdd.RDD $$ anonfun $ mapPartitionsInternal $ 1 $$ anonfun $ apply $ 24.apply(RDD.scala:836) 在 org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:52) 在org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:324) 在org.apache.spark.rdd.RDD.iterator(RDD.scala:288)处 org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:90)在 org.apache.spark.scheduler.Task.run(Task.scala:121)在 org.apache.spark.executor.Executor $ TaskRunner $$ anonfun $ 10.apply(Executor.scala:408) 在org.apache.spark.util.Utils $ .tryWithSafeFinally(Utils.scala:1360)

2 个答案:

答案 0 :(得分:1)

似乎与Spark Connector spark-snowflake_2.11-2.7.0-spark_2.4.jar一起使用时Snowflake JDBC 3.12.4 jar版本存在问题。能否尝试使用3.12.3版本的Snowflake JDBC驱动程序。可以与上述Spark Connector版本配合使用。

答案 1 :(得分:0)

我对相同的连接器和驱动程序配置有相同的问题。我的查询只是在计算SF样本表上的行数-雪花_sample_data.tpch_sf1.lineitem。

"sfDatabase" -> "snowflake_sample_data",
"sfSchema" -> "tpch_sf1",
"query" -> "select count(*) from lineitem"

所以我刚尝试了3.12.0版的jdbc驱动程序,它可以工作。因此,似乎在新驱动程序版本中出现了退步。