Я пытаюсь запустить Apache Sedona 1.5.3 для Spark 3.4 на AWS EMR.
Выполнив инструкции , я получаю сообщение об ошибке:
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 не может быть найден или использован или имеет неверную версию.
Инструкции, приведенные выше, были протестированы для EMR 6.9.0 для Spark 3.3.0; Я пробую 6.14, чтобы попытаться добраться до Spark 3.4. Однако в инструкции отмечается:
Если вы используете Spark 3.4+ и Scala 2.12, используйте
sedona-spark-shaded-3.4_2.12
. Обратите внимание на постфикс версии Spark и постфикс версии Scala.
Так что, похоже, со 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"
которые я считаю правильными версиями. Я могу запутаться, так как в инструкции для спарка 3.3.0 используется sedona-spark-shaded-3.0_2.12-1.5.3.jar
. Возможно, я не понимаю, что означают 3.0/3.4. Но, основываясь на этом ответе разработчиков Sedona, я думаю, что устанавливаю это правильно.
Мой загрузчик загружает jar-файлы, а pip устанавливает нужные пакеты. В конце концов, мне нужно убедиться, что они там. Я также записал их в каталог пользователя, чтобы попробовать использовать 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 я ввел ls -lh
, чтобы подтвердить, что это версия 1.5.3, и sedona.version
, чтобы подтвердить, что она включает
('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'
Поскольку spark.sparkContext._conf.getAll()
писал для пользователя root, а не /jars
, я также загрузил jar-файлы в локальный каталог в hadoop
. В предыдущих версиях Sedona я использовал /home/hadoop/
и spark.driver.extraClassPath
для указания загруженных jar-файлов. Наконец, я попробовал просто использовать spark.executor.extraClassPath
, хотя в в этом посте говорилось
Свойство spark.jars игнорируется для EMR в EC2, поскольку для развертывания jar-файлов используется Yarn. Смотрите СЕДОНА-183
Ничто из этого не сработало: все они выдавали одну и ту же ошибку --jars
.
Локальные тесты с
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)
все работает нормально. Обратите внимание на незатененную банку в этом контексте, как указано :
Если вы запускаете Sedona в IDE или локальном блокноте Jupyter, используйте jar
'JavaPackage' object is not callable
.
Далее, в версии EMR я не создаю Spark, поэтому мне остается предположить, что SedonaContext «работает». Я удалил вызов unshaded
, который теперь устарел и не требуется в локальной версии, как указано выше.
Я считаю, что 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, как и на местном уровне.