Python библиотеки не видны в потоке данных - PullRequest
1 голос
/ 31 января 2020

(это не дубликат моего предыдущего вопроса . Я пытаюсь использовать другой подход, использующий setup.py, который отличается от существующего подхода, в котором использовалось requirements.txt)

Мой проект настроен так:

.
├── __pycache__
├── eventstream-to-bigq-main.py
└── setup.py

файл setup.py выглядит следующим образом

from setuptools import setup
from setuptools import find_packages

REQUIRED_PACKAGES = [
    "protobuf3-to-dict==0.1.5",
    "protobuf==3.11.2",
]

setup(
    name="eventstream-to-bigq",
    version="1.0",
    install_requires=REQUIRED_PACKAGES,
    packages=find_packages(),
)

наконец-то я пытаюсь использовать эти 2 библиотеки следующим образом

from google.protobuf.json_format import MessageToDict
from protobuf_to_dict import protobuf_to_dict

def parse_proto(message):
    try:
        dictobj = MessageToDict(message)
        logging.info("google lib", dictobj)
    except Exception as e:
        logging.info("google-lib failed")
        logging.error(e)

    try:
        s = protobuf_to_dict(message)
        logging.info("third party", s)
    except Exception as e:
        logging.info("protobuf-to-dict failed")
        logging.error(e)

Даже после этого я получаю следующие ошибки

message: "name 'MessageToDict' is not defined" и message: "name 'protobuf_to_dict' is not defined".

Я отслеживал журналы, когда загружалось изображение, и мог видеть следующие строки журнала

I 2020-01-31T01:28:22.446626952Z 2020/01/31 01:28:22   Building wheel for protobuf3-to-dict (setup.py): finished with status 'done'

I 2020-01-31T01:28:22.443982764Z 2020/01/31 01:28:22   Building wheel for protobuf3-to-dict (setup.py): started

Я мог видеть аналогичные строки журнала для protobuf. Единственное предупреждение, которое я вижу здесь, это WARNING: You are using pip version 19.3.1; however, version 20.0.2 is available.

Даже после всей этой установки Мой код все еще не работает

EDIT : забыл упомянуть, что я запускаю это используя эту команду

python -m eventstream-to-bigq-main \
    --input_topic "projects/project_name/topics/topic_name" \
    --job_name "rawdata-to-bigq-2" \
    --output "gs://bucketname/wordcount/outputs" \
    --runner DataflowRunner \
    --project "project_name"  \
    --region "us-central1" \
    --temp_location "gs://bucketname/tmp/" \
    --staging_location "gs://bucketname/staging" \
    --setup_file ./setup.py \
    --streaming True

1 Ответ

0 голосов
/ 31 января 2020

Пакет protobuf уже установлен на рабочих Dataflow, что вы можете проверить в документации . Единственный пакет, который вам нужно установить: protobuf3-to-dict.

Сначала установите пакет на свой компьютер:

pip3 install protobuf3-to-dict

Затем проверьте, какие пакеты установлены на вашем компьютере:

pip freeze > requirements.txt

Эта команда создает файл requirements.txt, в котором перечислены все пакеты, установленные на вашем компьютере. Пожалуйста, отредактируйте файл requirements.txt и оставьте только те пакеты, которые были установлены из PyPI. Удалите все пакеты, которые не относятся к вашему коду.

Итак, в вашем случае requirements.txt выглядит так:

protobuf3-to-dict==0.1.5

Запустите ваш конвейер с помощью следующей опции командной строки, которая будет использовать файл для установки дополнительных зависимостей на удаленных работников:

--requirements_file requirements.txt

Я провел несколько тестов, и ошибка исчезла. Я надеюсь, что вы найдете вышеупомянутую информацию полезной.

...