pyhanlp在pyspark和pyflink中调用提示TypeError: can't pickle _jpype.PyJPClass objects

如题,我的系统是CentOS7,python3.6.8,pyhanlp版本0.1.63;
我在pyspark中map函数使用或者pyflink的udf中使用时都会报错TypeError: can’t pickle _jpype.PyJPClass objects,具体error提示如下,求教下是哪里需要处理下吗;同样的代码调用jieba没有问题的;

Traceback (most recent call last):
  File "/usr/lib64/python3.6/pickle.py", line 269, in _getattribute
    obj = getattr(obj, subpath)
AttributeError: module 'jpype._jclass' has no attribute 'com'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib64/python3.6/pickle.py", line 918, in save_global
    obj2, parent = _getattribute(module, name)
  File "/usr/lib64/python3.6/pickle.py", line 272, in _getattribute
    .format(name, obj))
AttributeError: Can't get attribute 'com.hankcs.hanlp.HanLP' on <module 'jpype._jclass' from '/usr/local/lib64/python3.6/site-packages/jpype/_jclass.py'>

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/root/wyl/soft/spark-2.4.5-bin-hadoop2.7/python/pyspark/cloudpickle.py", line 635, in save_global
    return Pickler.save_global(self, obj, name=name)
  File "/usr/lib64/python3.6/pickle.py", line 922, in save_global
    (obj, module_name, name))
_pickle.PicklingError: Can't pickle <class 'jpype._jclass.com.hankcs.hanlp.HanLP'>: it's not found as jpype._jclass.com.hankcs.hanlp.HanLP

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib64/python3.6/pickle.py", line 269, in _getattribute
    obj = getattr(obj, subpath)
AttributeError: module 'jpype._jclass' has no attribute 'java'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib64/python3.6/pickle.py", line 918, in save_global
    obj2, parent = _getattribute(module, name)
  File "/usr/lib64/python3.6/pickle.py", line 272, in _getattribute
    .format(name, obj))
AttributeError: Can't get attribute 'java.lang.Object' on <module 'jpype._jclass' from '/usr/local/lib64/python3.6/site-packages/jpype/_jclass.py'>

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/root/wyl/soft/spark-2.4.5-bin-hadoop2.7/python/pyspark/cloudpickle.py", line 635, in save_global
    return Pickler.save_global(self, obj, name=name)
  File "/usr/lib64/python3.6/pickle.py", line 922, in save_global
    (obj, module_name, name))
_pickle.PicklingError: Can't pickle <class 'jpype._jclass.java.lang.Object'>: it's not found as jpype._jclass.java.lang.Object

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/root/wyl/soft/spark-2.4.5-bin-hadoop2.7/python/pyspark/serializers.py", line 597, in dumps
    return cloudpickle.dumps(obj, 2)
  File "/root/wyl/soft/spark-2.4.5-bin-hadoop2.7/python/pyspark/cloudpickle.py", line 863, in dumps
    cp.dump(obj)
  File "/root/wyl/soft/spark-2.4.5-bin-hadoop2.7/python/pyspark/cloudpickle.py", line 260, in dump
    return Pickler.dump(self, obj)
  File "/usr/lib64/python3.6/pickle.py", line 409, in dump
    self.save(obj)
  File "/usr/lib64/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib64/python3.6/pickle.py", line 751, in save_tuple
    save(element)
  File "/usr/lib64/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/root/wyl/soft/spark-2.4.5-bin-hadoop2.7/python/pyspark/cloudpickle.py", line 406, in save_function
    self.save_function_tuple(obj)
  File "/root/wyl/soft/spark-2.4.5-bin-hadoop2.7/python/pyspark/cloudpickle.py", line 549, in save_function_tuple
    save(state)
  File "/usr/lib64/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib64/python3.6/pickle.py", line 821, in save_dict
    self._batch_setitems(obj.items())
  File "/usr/lib64/python3.6/pickle.py", line 847, in _batch_setitems
    save(v)
  File "/usr/lib64/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib64/python3.6/pickle.py", line 781, in save_list
    self._batch_appends(obj)
  File "/usr/lib64/python3.6/pickle.py", line 805, in _batch_appends
    save(x)
  File "/usr/lib64/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/root/wyl/soft/spark-2.4.5-bin-hadoop2.7/python/pyspark/cloudpickle.py", line 406, in save_function
    self.save_function_tuple(obj)
  File "/root/wyl/soft/spark-2.4.5-bin-hadoop2.7/python/pyspark/cloudpickle.py", line 549, in save_function_tuple
    save(state)
  File "/usr/lib64/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib64/python3.6/pickle.py", line 821, in save_dict
    self._batch_setitems(obj.items())
  File "/usr/lib64/python3.6/pickle.py", line 847, in _batch_setitems
    save(v)
  File "/usr/lib64/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib64/python3.6/pickle.py", line 781, in save_list
    self._batch_appends(obj)
  File "/usr/lib64/python3.6/pickle.py", line 805, in _batch_appends
    save(x)
  File "/usr/lib64/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/root/wyl/soft/spark-2.4.5-bin-hadoop2.7/python/pyspark/cloudpickle.py", line 406, in save_function
    self.save_function_tuple(obj)
  File "/root/wyl/soft/spark-2.4.5-bin-hadoop2.7/python/pyspark/cloudpickle.py", line 549, in save_function_tuple
    save(state)
  File "/usr/lib64/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib64/python3.6/pickle.py", line 821, in save_dict
    self._batch_setitems(obj.items())
  File "/usr/lib64/python3.6/pickle.py", line 847, in _batch_setitems
    save(v)
  File "/usr/lib64/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib64/python3.6/pickle.py", line 781, in save_list
    self._batch_appends(obj)
  File "/usr/lib64/python3.6/pickle.py", line 808, in _batch_appends
    save(tmp[0])
  File "/usr/lib64/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/root/wyl/soft/spark-2.4.5-bin-hadoop2.7/python/pyspark/cloudpickle.py", line 400, in save_function
    self.save_function_tuple(obj)
  File "/root/wyl/soft/spark-2.4.5-bin-hadoop2.7/python/pyspark/cloudpickle.py", line 549, in save_function_tuple
    save(state)
  File "/usr/lib64/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib64/python3.6/pickle.py", line 821, in save_dict
    self._batch_setitems(obj.items())
  File "/usr/lib64/python3.6/pickle.py", line 847, in _batch_setitems
    save(v)
  File "/usr/lib64/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib64/python3.6/pickle.py", line 821, in save_dict
    self._batch_setitems(obj.items())
  File "/usr/lib64/python3.6/pickle.py", line 847, in _batch_setitems
    save(v)
  File "/usr/lib64/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/root/wyl/soft/spark-2.4.5-bin-hadoop2.7/python/pyspark/cloudpickle.py", line 400, in save_function
    self.save_function_tuple(obj)
  File "/root/wyl/soft/spark-2.4.5-bin-hadoop2.7/python/pyspark/cloudpickle.py", line 549, in save_function_tuple
    save(state)
  File "/usr/lib64/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib64/python3.6/pickle.py", line 821, in save_dict
    self._batch_setitems(obj.items())
  File "/usr/lib64/python3.6/pickle.py", line 847, in _batch_setitems
    save(v)
  File "/usr/lib64/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib64/python3.6/pickle.py", line 821, in save_dict
    self._batch_setitems(obj.items())
  File "/usr/lib64/python3.6/pickle.py", line 852, in _batch_setitems
    save(v)
  File "/usr/lib64/python3.6/pickle.py", line 521, in save
    self.save_reduce(obj=obj, *rv)
  File "/usr/lib64/python3.6/pickle.py", line 634, in save_reduce
    save(state)
  File "/usr/lib64/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib64/python3.6/pickle.py", line 821, in save_dict
    self._batch_setitems(obj.items())
  File "/usr/lib64/python3.6/pickle.py", line 847, in _batch_setitems
    save(v)
  File "/usr/lib64/python3.6/pickle.py", line 490, in save
    self.save_global(obj)
  File "/root/wyl/soft/spark-2.4.5-bin-hadoop2.7/python/pyspark/cloudpickle.py", line 644, in save_global
    return self.save_dynamic_class(obj)
  File "/root/wyl/soft/spark-2.4.5-bin-hadoop2.7/python/pyspark/cloudpickle.py", line 487, in save_dynamic_class
    self.save_reduce(tp, (obj.__name__, obj.__bases__, type_kwargs), obj=obj)
  File "/usr/lib64/python3.6/pickle.py", line 610, in save_reduce
    save(args)
  File "/usr/lib64/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib64/python3.6/pickle.py", line 736, in save_tuple
    save(element)
  File "/usr/lib64/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib64/python3.6/pickle.py", line 736, in save_tuple
    save(element)
  File "/usr/lib64/python3.6/pickle.py", line 490, in save
    self.save_global(obj)
  File "/root/wyl/soft/spark-2.4.5-bin-hadoop2.7/python/pyspark/cloudpickle.py", line 644, in save_global
    return self.save_dynamic_class(obj)
  File "/root/wyl/soft/spark-2.4.5-bin-hadoop2.7/python/pyspark/cloudpickle.py", line 491, in save_dynamic_class
    save(clsdict)
  File "/usr/lib64/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib64/python3.6/pickle.py", line 821, in save_dict
    self._batch_setitems(obj.items())
  File "/usr/lib64/python3.6/pickle.py", line 847, in _batch_setitems
    save(v)
  File "/usr/lib64/python3.6/pickle.py", line 496, in save
    rv = reduce(self.proto)
TypeError: can't pickle _jpype.PyJPClass objects

你可能需要在每个node中重新获取HanLP类:HanLP = SafeJClass('com.hankcs.hanlp.HanLP')