pySpark и py4j: NoClassDefFoundError при обновлении фляги - PullRequest
0 голосов
/ 29 декабря 2018

Мы разработали библиотеку Scala для работы на искре под названием FV.Мы также создали обертки в python для его публичного API, используя py4j как в spark.Например, основной объект создается следующим образом:

self._java_obj = self._new_java_obj("com.example.FV", self.uid)

, а методы объекта вызываются следующим образом:

def add(self, r):
    self._java_obj.add(r)

При запуске pyspark с этим возникают проблемы.внешняя библиотека.Мы используем для запуска оболочки pyspark вот так:

pyspark --repositories <our-own-maven-release-repo> --packages <com.example.FV:latest.release>

Когда мы выпускаем новую версию и у нас есть некоторые изменения в Scala API, некоторые вещи начинают случайным образом прерываться для некоторых пользователей.Например, в версии 0.44 у нас был класс DateUtils (используется классом Utils , который используется классом FV в методе add ) который был сброшен в версии 0.45.Когда была выпущена версия 0.45, и пользователь вызвал метод add в Python API, мы получили

java.lang.NoClassDefFoundError: Could not initialize class DateUtils

По сути, Python API запускает метод add , который содержитссылка на класс DateUtils (v0.44), но когда он действительно собирается загрузить нужный класс, он не находит его, потому что загруженный jar - это v0.45 (как показывает журнал ivy, когдазапуск оболочки)

Вы хоть представляете, в чем может быть проблема?Может быть, py4j кеширует что-то, чтобы при обновлении классов мы получали эту ошибку?

...