类型错误:'JavaPackage'对象不可调用(spark._jvm)

13

我正在安装GeoSpark Python,安装完所有先决条件后,运行基本代码示例进行测试。

from pyspark.sql import SparkSession
from geo_pyspark.register import GeoSparkRegistrator


spark = SparkSession.builder.\
        getOrCreate()

GeoSparkRegistrator.registerAll(spark)

df = spark.sql("""SELECT st_GeomFromWKT('POINT(6.0 52.0)') as geom""")

df.show()

我尝试使用 python3 basic.pyspark-submit basic.py 运行它,两者都给我这个错误:

Traceback (most recent call last):
  File "/home/jessica/Downloads/geo_pyspark/basic.py", line 8, in <module>
    GeoSparkRegistrator.registerAll(spark)
  File "/home/jessica/Downloads/geo_pyspark/geo_pyspark/register/geo_registrator.py", line 22, in registerAll
    cls.register(spark)
  File "/home/jessica/Downloads/geo_pyspark/geo_pyspark/register/geo_registrator.py", line 27, in register
    spark._jvm. \
TypeError: 'JavaPackage' object is not callable

我正在使用Java 8、Python 3和Apache Spark 2.4,在我的电脑上正确设置了JAVA_HOME,并且运行的是Linux Mint 19。同时我也已经正确设置了SPARK_HOME

$ printenv SPARK_HOME
/home/jessica/spark/

我该怎么修复这个问题?

2个回答

9
地理Spark的Jars没有正确地注册到您的Spark会话中。有几种解决方法,从有点不方便到相当无缝。例如,如果您在调用spark-submit时指定了以下命令:
--jars jar1.jar,jar2.jar,jar3.jar 那么问题就会消失,如果您使用pyspark,也可以提供类似的命令。
如果像我一样,您真的不想每次启动时都这样做(将其设置为Jupyter中的.conf()会很烦人),那么您可以进入$SPARK_HOME/conf/spark-defaults.conf并设置:
spark-jars jar1.jar,jar2.jar,jar3.jar 这将在创建spark实例时加载。如果您以前没有使用过conf文件,它将作为spark-defaults.conf.template存在。
当然,当我说jar1.jar时...我真正意思是这样的:
/jars/geo_wrapper_2.11-0.3.0.jar,/jars/geospark-1.2.0.jar,/jars/geospark-sql_2.3-1.2.0.jar,/jars/geospark-viz_2.3-1.2.0.jar 但是,您需要从geo_pyspark包中获取正确的jar文件。
如果您正在使用EMR: 您需要将群集配置JSON设置为:
[
  {
    "classification":"spark-defaults", 
    "properties":{
      "spark.jars": "/jars/geo_wrapper_2.11-0.3.0.jar,/jars/geospark-1.2.0.jar,/jars/geospark-sql_2.3-1.2.0.jar,/jars/geospark-viz_2.3-1.2.0.jar"
      }, 
    "configurations":[]
  }
]

你还可以将 jar 包作为启动项上传。你可以使用 Maven 进行上传,但我只是将它们抛到了 S3 存储桶中:

#!/bin/bash
sudo mkdir /jars
sudo aws s3 cp s3://geospark-test-ds/bootstrap/geo_wrapper_2.11-0.3.0.jar /jars/
sudo aws s3 cp s3://geospark-test-ds/bootstrap/geospark-1.2.0.jar /jars/
sudo aws s3 cp s3://geospark-test-ds/bootstrap/geospark-sql_2.3-1.2.0.jar /jars/
sudo aws s3 cp s3://geospark-test-ds/bootstrap/geospark-viz_2.3-1.2.0.jar /jars/

如果您正在使用EMR笔记本电脑 您需要在笔记本电脑的顶部有一个魔术单元格:

%%configure -f
{
"jars": [
        "s3://geospark-test-ds/bootstrap/geo_wrapper_2.11-0.3.0.jar",
        "s3://geospark-test-ds/bootstrap/geospark-1.2.0.jar",
        "s3://geospark-test-ds/bootstrap/geospark-sql_2.3-1.2.0.jar",
        "s3://geospark-test-ds/bootstrap/geospark-viz_2.3-1.2.0.jar"
    ]
}

非常感谢!这里还有一个补充,如果有人正在集群上安装geospark包,则可以在指定spark.jars时使用位置/usr/local/lib/python3.6/site-packages/geospark/jars/2_4/<JAR_FILE>,因为这是EMR上用于Master和Core节点的位置。 - mj3c
我该在哪里下载geo_wrapper.jar文件? - Qi Yin
已经有一段时间了,但我记得我们是从geo_pyspark存储库中获取的,只要确保获取正确的版本:https://github.com/Imbruced/geo_pyspark/tree/master/geo_pyspark/jars - DataMacGyver
如果您在Databricks笔记本中遇到相同的问题,您可以通过集群配置的UI安装缺失的JAR包。 - rwitzel
1
顺便提一下,该错误表明安装了Python代码(因此Python导入工作正常),但未安装该Python代码使用的JAR文件。 - rwitzel

2

我在Windows 10机器上遇到了类似的SparkMeasure jars问题。

self.stagemetrics =
self.sc._jvm.ch.cern.sparkmeasure.StageMetrics(self.sparksession._jsparkSession)
TypeError: 'JavaPackage' object is not callable

所以我所做的是

  1. 通过Pyspark shell进入“SPARK_HOME”,并安装所需的jar包

    bin/pyspark --packages ch.cern.sparkmeasure:spark-measure_2.12:0.16

  2. 获取那个jar包 (ch.cern.sparkmeasure_spark-measure_2.12-0.16.jar),并将其复制到“SPARK_HOME”的Jars文件夹中

  3. 重新运行脚本,现在它可以正常工作,不再出现上述错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接