pyspark 代码在控制台中工作,但不在 zeppelin 中
Posted
技术标签:
【中文标题】pyspark 代码在控制台中工作,但不在 zeppelin 中【英文标题】:pyspark code working in console but not in zeppelin 【发布时间】:2020-03-14 17:01:26 【问题描述】:我有一个带有 Spark 2.4.4 和 python 2.7.16 的 EMR (emr-5.28.0)。
如果我 ssh 到集群并像这样执行 pyspark:
pyspark --jars /home/hadoop/jar/spark-redshift_2.11-2.0.1.jar,/home/hadoop/jar/spark-avro_2.11-4.0.0.jar,/home/hadoop/jar/minimal-json-0.9.5.jar,/usr/share/aws/redshift/jdbc/RedshiftJDBC.jar --packages org.apache.spark:spark-avro_2.11:2.4.4
并执行以下代码:
url = "jdbc:redshift://my.cluster:5439/my_db?user=my_user&password=my_password"
query = "select * from schema.table where trunc(timestamp)='2019-09-10'"
df = sqlContext.read.format('com.databricks.spark.redshift')\
.option("url", url)\
.option("tempdir", "s3a://bucket/tmp_folder")\
.option("query", query)\
.option("aws_iam_role", "arn_iam_role")\
.load()
一切正常,我可以使用那个 df。 但是,如果我在同一个 EMR 中打开一个 Zeppelin 笔记本,使用相同版本的所有内容并执行一个单元格:
%dep
z.load("/home/hadoop/jar/spark-redshift_2.11-2.0.1.jar")
z.load("/home/hadoop/jar/spark-avro_2.11-4.0.0.jar")
z.load("/home/hadoop/jar/minimal-json-0.9.5.jar")
z.load("/usr/share/aws/redshift/jdbc/RedshiftJDBC.jar")
z.load("org.apache.spark:spark-avro_2.11:2.4.4")
并且在下一个单元格中的同一段代码(以 %pyspark
开头),当我尝试执行 df.count() 时,我收到以下错误:
java.lang.ClassCastException: cannot assign instance of scala.collection.immutable.List$SerializationProxy to field org.apache.spark.rdd.RDD.org$apache$spark$rdd$RDD$$dependencies_ of type scala.collection.Seq in instance of org.apache.spark.rdd.MapPartitionsRDD
我多次尝试重新启动解释器,并尝试将我在 ssh 时在控制台中使用的 --jar
选项添加到解释器参数中,但没有运气。
有什么想法吗??
【问题讨论】:
您能否在 Zeppelin 和边缘节点上提供您的 PYSPARK_PYTHON 版本? 我没有设置 PYSPARK_PYTHON 变量(在 zeppelin 或边缘节点中都没有),所以它使用默认的 python,即 2.7.16。我应该配置这个吗? 【参考方案1】:我认为这是 z.load 对 Pyspark 查询的工作方式(或者更确切地说,不起作用)的问题。
不要以这种方式加载依赖项,而是转到设置 -> 解释器,找到 pyspark 并在那里加载依赖项,然后重新启动解释器。这是--jars
的“Zeppelin 版本”
这是指向此的官方文档链接 - https://zeppelin.apache.org/docs/0.6.2/manual/dependencymanagement.html
我知道对于 Spark SQL,z.deps 不起作用,所以这可能是同一个问题。
【讨论】:
这解决了 jar 加载问题,谢谢。现在我有:class "com.amazonaws.auth.EnvironmentVariableCredentialsProvider"'s signer information does not match signer information of other classes in the same package
如果你以前看过这个,我会感谢一些指导:)
查看你使用的版本以上是关于pyspark 代码在控制台中工作,但不在 zeppelin 中的主要内容,如果未能解决你的问题,请参考以下文章
Squeel 在 Rails 控制台中工作,但不在控制器中。错误:nil:NilClass 的未定义方法“方法”
带有 Angular 和 Express 的 CORS - 在 Postman 中工作,但不在浏览器中