pySpark和py4j:升级jar时出现NoClassDefFoundError

时间:2018-12-29 10:48:15

标签: apache-spark pyspark classloader py4j

我们开发了一个Scala库以在名为FV的spark上运行。我们还使用py4j在火花中为python的公共API构建了包装器。例如,主要对象是这样实例化的

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

和对象上的方法都以此方式调用

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

使用此外部库运行pyspark时,我们遇到一个令人讨厌的问题。我们习惯像这样运行pyspark shell

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版发布并且用户在python API中调用方法 add 时,我们得到了

java.lang.NoClassDefFoundError: Could not initialize class DateUtils

基本上,python API正在运行方法 add ,该方法包含对类 DateUtils (v0.44)的引用,但实际上是在加载所需的类时它找不到它,因为加载的jar是v0.45(如启动外壳时的常春藤日志所示)

您对问题可能有什么想法吗?也许py4j会缓存一些东西,以便在升级类时出现此错误?

0 个答案:

没有答案