Apache Sedona в версии EMR > 6.9.0: объект JavaPackage не может быть вызван

Я пытаюсь запустить 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, который теперь устарел и не требуется в локальной версии, как указано выше.

stackoverflow.com/questions/77131685/… вам может помочь полный рабочий пример.
user238607 11.05.2024 08:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я считаю, что 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, как и на местном уровне.

Другие вопросы по теме