spark-submit - не может выбрать класс в пакете, но может выбрать "тот же" класс в корневой папке
В моей задаче Spark на основе Python "main.py" я ссылаюсь на сгенерированный протобуф класс "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
задача spark завершается неудачно, говоря, что она не может выбрать класс Account в a_pb2
Вызывается: org.apache.spark.api.python.PythonException: обратная связь (последний вызов был последним): файл "/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: Невозможно выбрать класс 'a_pb2.Account': сбой импорта модуля 'a_pb2'
Я предполагаю, что сериализация этого класса происходит для распределения зависимостей по рабочим узлам. Но разве эта сериализация также не произойдет в начальном случае, и если класс не будет работать с расслаиванием, он тоже потерпит неудачу? Излишне говорить, что я в замешательстве и не знаком с нюансами того, как spark обрабатывает пакеты зависимостей + модули против просто модулей.
Любые предложения приветствуются!