pyspark 代码在控制台中工作但在齐柏林飞艇中不工作
pyspark code working in console but not in zeppelin
我有一个带 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 notebook,使用相同版本的所有内容并执行一个单元格:
%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
选项添加到解释器参数中,但没有成功。
有什么想法吗??
我认为这是 z.load 对 Pyspark 查询的工作方式(或者更确切地说,不工作)的问题。
不要以这种方式加载依赖项,而是转到设置 -> 解释器,找到 pyspark 并在那里加载依赖项,然后重新启动解释器。这是 --jars
的 'Zeppelin version'
这是官方文档link - https://zeppelin.apache.org/docs/0.6.2/manual/dependencymanagement.html
我知道对于 Spark SQL z.deps 不起作用,所以这可能是同一个问题。
我有一个带 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 notebook,使用相同版本的所有内容并执行一个单元格:
%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
选项添加到解释器参数中,但没有成功。
有什么想法吗??
我认为这是 z.load 对 Pyspark 查询的工作方式(或者更确切地说,不工作)的问题。
不要以这种方式加载依赖项,而是转到设置 -> 解释器,找到 pyspark 并在那里加载依赖项,然后重新启动解释器。这是 --jars
这是官方文档link - https://zeppelin.apache.org/docs/0.6.2/manual/dependencymanagement.html
我知道对于 Spark SQL z.deps 不起作用,所以这可能是同一个问题。