使用 Pyspark 运行 Python 脚本时出现 py4j.protocol.Py4JJavaError [重复]

Posted

技术标签:

【中文标题】使用 Pyspark 运行 Python 脚本时出现 py4j.protocol.Py4JJavaError [重复]【英文标题】:py4j.protocol.Py4JJavaError while running a Python script with Pyspark [duplicate] 【发布时间】:2018-10-14 18:03:39 【问题描述】:

所以,我是 Spark 和 PySpark 的新手。我正在尝试运行 Python 脚本从 mysql 数据库中读取数据,如下代码所示:

from pyspark.sql import SparkSession
from pyspark.sql import SQLContext


sc = SparkSession \
    .builder \
    .appName("Python Spark SQL basic example") \
    .config("spark.some.config.option", "some-value") \
    .getOrCreate()

def mysql_connection():

    sql = SQLContext(sc)

    dataframe = sql.read.format("jdbc").options(
        url="jdbc:mysql://localhost/evidencia",
        driver="com.mysql.cj.jdbc.Driver",
        dbtable="estados",
        user="root",
        password="").load()

    output = dataframe.collect()

    print ("_____________ OUTPUT _____________")
    print (output)

mysql_connection()

加载部分没问题,但是在数据帧上运行collect()或任何其他方法时,会显示以下错误:

Traceback(最近一次调用最后一次):文件 "/home/gustavo/Documentos/TCC/prototipo/connections/MysqlConnection.py", 第 27 行,在 mysql_connection() 文件“/home/gustavo/Documentos/TCC/prototipo/connections/MysqlConnection.py”, 第 22 行,在 mysql_connection 中 输出 = dataframe.collect() 文件“/usr/local/spark/python/lib/pyspark.zip/pyspark/sql/dataframe.py”, 第 466 行,在收集文件中 "/usr/local/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", 第 1257 行,在 call 文件中 “/usr/local/spark/python/lib/pyspark.zip/pyspark/sql/utils.py”,行 63,在装饰文件中 "/usr/local/spark/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py", 第 328 行,在 get_return_value py4j.protocol.Py4JJavaError: 一个错误 调用 o51.collectToPython 时发生。 : java.lang.IllegalArgumentException 在 org.apache.xbean.asm5.ClassReader.(Unknown Source) at org.apache.xbean.asm5.ClassReader.(Unknown Source) at org.apache.xbean.asm5.ClassReader.(Unknown Source) at org.apache.spark.util.ClosureCleaner$.getClassReader(ClosureCleaner.scala:46) 在 org.apache.spark.util.FieldAccessFinder$$anon$3$$anonfun$visitMethodInsn$2.apply(ClosureCleaner.scala:449) 在 org.apache.spark.util.FieldAccessFinder$$anon$3$$anonfun$visitMethodInsn$2.apply(ClosureCleaner.scala:432) 在 scala.collection.TraversableLike$WithFilter$$anonfun$foreach$1.apply(TraversableLike.scala:733) 在 scala.collection.mutable.HashMap$$anon$1$$anonfun$foreach$2.apply(HashMap.scala:103) 在 scala.collection.mutable.HashMap$$anon$1$$anonfun$foreach$2.apply(HashMap.scala:103) 在 scala.collection.mutable.HashTable$class.foreachEntry(HashTable.scala:230) 在 scala.collection.mutable.HashMap.foreachEntry(HashMap.scala:40) 在 scala.collection.mutable.HashMap$$anon$1.foreach(HashMap.scala:103) 在 scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:732) 在 org.apache.spark.util.FieldAccessFinder$$anon$3.visitMethodInsn(ClosureCleaner.scala:432) 在 org.apache.xbean.asm5.ClassReader.a(未知来源) org.apache.xbean.asm5.ClassReader.b(未知来源)在 org.apache.xbean.asm5.ClassReader.accept(未知来源)在 org.apache.xbean.asm5.ClassReader.accept(未知来源)在 org.apache.spark.util.ClosureCleaner$$anonfun$org$apache$spark$util$ClosureCleaner$$clean$14.apply(ClosureCleaner.scala:262) 在 org.apache.spark.util.ClosureCleaner$$anonfun$org$apache$spark$util$ClosureCleaner$$clean$14.apply(ClosureCleaner.scala:261) 在 scala.collection.immutable.List.foreach(List.scala:381) 在 org.apache.spark.util.ClosureCleaner$.org$apache$spark$util$ClosureCleaner$$clean(ClosureCleaner.scala:261) 在 org.apache.spark.util.ClosureCleaner$.clean(ClosureCleaner.scala:159) 在 org.apache.spark.SparkContext.clean(SparkContext.scala:2299) 在 org.apache.spark.SparkContext.runJob(SparkContext.scala:2073) 在 org.apache.spark.SparkContext.runJob(SparkContext.scala:2099) 在 org.apache.spark.rdd.RDD$$anonfun$collect$1.apply(RDD.scala:945) 在 org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151) 在 org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112) 在 org.apache.spark.rdd.RDD.withScope(RDD.scala:363) 在 org.apache.spark.rdd.RDD.collect(RDD.scala:944) 在 org.apache.spark.sql.execution.SparkPlan.executeCollect(SparkPlan.scala:297) 在 org.apache.spark.sql.Dataset$$anonfun$collectToPython$1.apply(Dataset.scala:3200) 在 org.apache.spark.sql.Dataset$$anonfun$collectToPython$1.apply(Dataset.scala:3197) 在 org.apache.spark.sql.Dataset$$anonfun$52.apply(Dataset.scala:3259) 在 org.apache.spark.sql.execution.SQLExecution$.withNewExecutionId(SQLExecution.scala:77) 在 org.apache.spark.sql.Dataset.withAction(Dataset.scala:3258) 在 org.apache.spark.sql.Dataset.collectToPython(Dataset.scala:3197) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native 方法)在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:564) 在 py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244) 在 py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357) 在 py4j.Gateway.invoke(Gateway.java:282) 在 py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132) 在 py4j.commands.CallCommand.execute(CallCommand.java:79) 在 py4j.GatewayConnection.run(GatewayConnection.java:238) 在 java.base/java.lang.Thread.run(Thread.java:844)

我已搜索此错误,但找不到解决方法。

我使用的是 Anaconda 虚拟环境,带有 Python 3.6.6 和 Spark 2.3.2

我使用以下命令运行脚本(使用 Ubuntu 18.04 BTW):

$SPARK_HOME/bin/spark-submit --jars /usr/share/java/mysql-connector-java-8.0.12.jar ~/Documentos/TCC/prototipo/connections/MysqlConnection.py

如果需要更多信息来理解问题,请向我提问:

谢谢。

【问题讨论】:

仅仅通过切换到 Java 8 我设法解决了这个问题。 【参考方案1】:

因此,显然是 Java 版本导致了问题。

我用的是openjdk-11.0.2,然后切换到java oracle 8,脚本运行正常。

【讨论】:

以上是关于使用 Pyspark 运行 Python 脚本时出现 py4j.protocol.Py4JJavaError [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pyspark 中运行 Python 脚本

AWS 设置以在 Apache pyspark env 上运行 python 脚本

pyspark:运行 python 脚本并在命令行上查看结果

如何安装 pyspark 以在独立脚本中使用?

运行pyspark时出错

将 PySpark 作为脚本运行