【发布时间】: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。我应该配置这个吗?
标签: apache-spark pyspark amazon-redshift amazon-emr apache-zeppelin