Мы разработали библиотеку 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 кеширует что-то, чтобы при обновлении классов мы получали эту ошибку?