TypeError:'JavaPackage'对象不可调用(spark._jvm)

时间:2019-10-29 13:17:45

标签: java python apache-spark java-package geospark

我正在设置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 Mint19。我的SPARK_HOME也设置了:

$ printenv SPARK_HOME
/home/jessica/spark/

我该如何解决?

2 个答案:

答案 0 :(得分:2)

geoSpark的Jars未在您的Spark Session中正确注册。有几种解决方法,从不方便到非常无缝。例如,如果您在调用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软件包中获取正确的软件包。

如果您使用的是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"
    ]
}

答案 1 :(得分:0)

我在Windows 10计算机上看到了SparkMeasure jar的类似问题

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-软件包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. 重新运行脚本,现在它可以正常运行,而不会出现上述错误。