在我基于Python的Spark任务'main.py'中,我引用了一个protobuf生成的类'a_pb2.py' . 如果我将所有文件放在根目录中,如

/
- main.py
- a_pb2.py

并将a_pb2.py压缩为'proto.zip',然后运行

spark-submit --py-files=proto.zip main.py

一切都按预期运行 .

但是,如果我将protobuf类移动到一个包,组织我的文件,如

/
- main.py
- /protofiles
  - __init__.py
  - a_pb2.py

和zip / protofiles进入'proto.zip',然后运行

spark-submit --py-files=proto.zip main.py

火花任务失败,说它不能在a_pb2内挑选类帐户

引起:org.apache.spark.api.python.PythonException:Traceback(最近一次调用最后一次):文件“/usr/local/Cellar/apache-spark/2.2.1/libexec/python/lib/pyspark.zip /pyspark/worker.py“,第177行,在主进程()文件”/usr/local/Cellar/apache-spark/2.2.1/libexec/python/lib/pyspark.zip/pyspark/worker.py“,第172行,在进程中serializer.dump_stream(func(split_index,iterator),outfile)文件“/usr/local/Cellar/apache-spark/2.2.1/libexec/python/lib/pyspark.zip/pyspark/serializers.py “,第272行,在dump_stream bytes = self.serializer.dumps(vs)文件”/usr/local/Cellar/apache-spark/2.2.1/libexec/python/lib/pyspark.zip/pyspark/serializers.py“ ,第451行,在转储中返回pickle.dumps(obj,protocol)_pickle.PicklingError:不能pickle类'a_pb2.Account':导入模块'a_pb2'失败

我假设这个类序列化正在发生,以将依赖项分发给工作节点 . 但是这个序列化也不会在最初的情况下发生,如果这个类是不可用的,它也会失败吗?毋庸置疑,我很困惑,并且不熟悉spark如何处理依赖包模块与模块的细微差别 .

任何建议赞赏!