我正在尝试在 AWS EMR 上运行 Apache Sedona 1.5.3 for Spark 3.4。
按照说明后,我收到错误,
File "/usr/local/lib64/python3.7/site-packages/sedona/sql/dataframe_api.py", line 156, in validated_function
return f(*args, **kwargs)
File "/usr/local/lib64/python3.7/site-packages/sedona/sql/st_constructors.py", line 125, in ST_GeomFromWKT
return _call_constructor_function("ST_GeomFromWKT", args)
File "/usr/local/lib64/python3.7/site-packages/sedona/sql/dataframe_api.py", line 65, in call_sedona_function
jc = jfunc(*args)
TypeError: 'JavaPackage' object is not callable
一般表示jar包找不到或无法使用,或者是版本错误。
上面链接的说明针对 Spark 3.3.0 的 EMR 6.9.0 进行了测试;我正在尝试 6.14,试图达到 Spark 3.4。 但是,说明确实指出:
如果您使用的是 Spark 3.4+ 和 Scala 2.12,请使用
。请关注Spark版本postfix和Scala版本postfix。sedona-spark-shaded-3.4_2.12
所以看来 Spark 3.4 应该没问题。 (这里没有回复,我会尝试恢复到3.3.0。)
在 Spark 配置中,我指定了,
"spark.yarn.dist.jars": "/jars/sedona-spark-shaded-3.4_2.12-1.5.3.jar,/jars/geotools-wrapper-1.5.3-28.2.jar",
"spark.serializer": "org.apache.spark.serializer.KryoSerializer",
"spark.kryo.registrator": "org.apache.sedona.core.serde.SedonaKryoRegistrator",
"spark.sql.extensions": "org.apache.sedona.viz.sql.SedonaVizExtensions,org.apache.sedona.sql.SedonaSqlExtensions"
我认为这是正确的版本。 我可能会感到困惑,因为 Spark 3.3.0 的说明使用
sedona-spark-shaded-3.0_2.12-1.5.3.jar
。 也许我不明白3.0/3.4指的是什么。 但根据塞多纳开发人员的this回答,我认为我的设置是正确的。
我的 bootstrap 下载 jar 并 pip 安装定向包。 最后,我
ls -lh
确认他们在那里。 我还将它们写入用户目录,以使用 hadoop 而不是 root 所有者来尝试它们(见下文):
-rw-r--r-- 1 root root 29M May 10 15:49 /jars/geotools-wrapper-1.5.3-28.2.jar
-rw-r--r-- 1 root root 21M May 10 15:49 /jars/sedona-spark-shaded-3.4_2.12-1.5.3.jar
-rw-rw-r-- 1 hadoop hadoop 29M May 10 15:49 /home/hadoop/custom/geotools-wrapper-1.5.3-28.2.jar
-rw-rw-r-- 1 hadoop hadoop 21M May 10 15:49 /home/hadoop/custom/sedona-spark-shaded-3.4_2.12-1.5.3.jar
在 pyspark 脚本中,我记录了
sedona.version
以确认它是 1.5.3,并记录了 spark.sparkContext._conf.getAll()
以确认它包含
('spark.yarn.dist.jars', 'file:/jars/sedona-spark-shaded-3.4_2.12-1.5.3.jar,file:/jars/geotools-wrapper-1.5.3-28.2.jar'
由于
/jars
是为root用户而不是hadoop
编写的,我还将jar加载到/home/hadoop/
中的本地目录。在 Sedona 的早期版本中,我使用 spark.driver.extraClassPath
和 spark.executor.extraClassPath
来指定下载的 jar。 最后,我尝试只使用--jars
,尽管这篇文章说
EC2 上的 EMR 会忽略 Spark.jars 属性,因为它使用 Yarn 来部署 jar。参见这些方法都不起作用:它们都给出了相同的
'JavaPackage' object is not callable
错误。半相关测试。
packages = [
"org.apache.sedona:sedona-spark-3.4_2.12:1.5.3",
"org.datasyslab:geotools-wrapper:1.5.3-28.2",
]
conf = (
SedonaContext.builder()
.config("spark.jars.packages", ",".join(packages))
[...]
.config(
"spark.jars.repositories",
"https://artifacts.unidata.ucar.edu/repository/unidata-all",
)
.getOrCreate()
)
spark = SedonaContext.create(conf)
一切运行良好。 请注意未加阴影的罐子,在这种情况下,如directed:
如果您在 IDE 或本地 Jupyter 笔记本中运行 Sedona,请使用此外,在 EMR 版本中,我没有创建 Spark,因此我只能假设 SedonaContext“有效”。 我删除了
unshaded
jar。
SedonaRegistrator.registerAll(spark)
调用,该调用现已弃用,并且在上面的本地版本中不需要。
SedonaRegistrator
,而不是简单地删除它。 这样你就可以跑了
sedona_conf = SedonaContext.builder().getOrCreate()
spark = SedonaContext.create(sedona_conf)
test=spark.sql("SELECT ST_Point(double(1.2345), 2.3456)")
test.show()
在您的 EMR 工作中,就像在本地一样。