Bao gồm một tệp khác trong mẫu flex Dataflow Python, ImportError

Nov 18 2020

Có ví dụ về Mẫu Python Dataflow Flex với nhiều hơn một tệp trong đó tập lệnh đang nhập các tệp khác được bao gồm trong cùng một thư mục không?

Cấu trúc dự án của tôi như thế này:

├── pipeline
│   ├── __init__.py
│   ├── main.py
│   ├── setup.py
│   ├── custom.py

Tôi đang cố nhập custom.py bên trong main.py để có mẫu linh hoạt luồng dữ liệu.

Tôi nhận được lỗi sau trong quá trình thực thi đường ống:

"ModuleNotFoundError: No module named 'custom'"

Đường dẫn hoạt động tốt nếu tôi bao gồm tất cả mã trong một tệp duy nhất và không thực hiện bất kỳ lần nhập nào.

Ví dụ về Dockerfile:

FROM gcr.io/dataflow-templates-base/python3-template-launcher-base

ARG WORKDIR=/dataflow/template/pipeline
RUN mkdir -p ${WORKDIR} WORKDIR ${WORKDIR}

COPY pipeline /dataflow/template/pipeline

COPY spec/python_command_spec.json /dataflow/template/

ENV DATAFLOW_PYTHON_COMMAND_SPEC /dataflow/template/python_command_spec.json

RUN pip install avro-python3 pyarrow==0.11.1 apache-beam[gcp]==2.24.0

ENV FLEX_TEMPLATE_PYTHON_SETUP_FILE="${WORKDIR}/setup.py" ENV FLEX_TEMPLATE_PYTHON_PY_FILE="${WORKDIR}/main.py"

Tệp thông số kỹ thuật Python:

{
    "pyFile":"/dataflow/template/pipeline/main.py"
}
  

Tôi đang triển khai mẫu bằng lệnh sau: gcloud builds submit --project=${PROJECT} --tag ${TARGET_GCR_IMAGE} .

Bất kỳ trợ giúp được đánh giá cao.

Trả lời

3 AkshayApte Nov 19 2020 at 21:58

Tôi thực sự đã giải quyết vấn đề này bằng cách truyền thêm một tham số setup_file để thực thi mẫu. Cũng cần thêm setup_filetham số vào siêu dữ liệu mẫu

--parameters setup_file="/dataflow/template/pipeline/setup.py"

Rõ ràng lệnh ENV FLEX_TEMPLATE_PYTHON_SETUP_FILE="${WORKDIR}/setup.py" trong Dockerfile là vô dụng và không thực sự chọn tệp thiết lập.

Tệp thiết lập của tôi trông như thế này:

import setuptools

setuptools.setup(
    packages=setuptools.find_packages(),
    install_requires=[
        'apache-beam[gcp]==2.24.0'
    ],
 )
3 rsantiago Nov 20 2020 at 11:00

Sau một số thử nghiệm, tôi phát hiện ra rằng vì một số lý do không xác định, các tệp phyton tại thư mục làm việc ( WORKDIR) không thể được tham chiếu với một lần nhập. Nhưng nó hoạt động nếu bạn tạo một thư mục con và di chuyển các phụ thuộc của python vào trong đó. Tôi đã thử nghiệm và nó hoạt động, ví dụ: trong trường hợp sử dụng của bạn, bạn có thể có cấu trúc sau:

├── pipeline
│   ├── main.py
│   ├── setup.py
│   ├── mypackage
│   │   ├── __init__.py
│   │   ├── custom.py

Và bạn sẽ có thể tham khảo: import mypackage.custom. Tệp Docker sẽ di chuyển trong custom.pythư mục thích hợp.

RUN mkdir -p ${WORKDIR}/mypackage RUN touch ${WORKDIR}/mypackage/__init__.py
COPY custom.py ${WORKDIR}/mypackage

Và phần phụ thuộc sẽ được thêm vào thư mục cài đặt python:

$ docker exec -it <container> /bin/bash
# find / -name custom.py
/usr/local/lib/python3.7/site-packages/mypackage/custom.py
jamiet Feb 28 2021 at 16:42

@ pavan-kumar-kattamuri đã yêu cầu tôi đăng giải pháp của mình, vì vậy nó đây.

FROM gcr.io/dataflow-templates-base/python3-template-launcher-base:flex_templates_base_image_release_20210120_RC00

ARG WORKDIR=/dataflow/template
RUN mkdir -p ${WORKDIR} WORKDIR ${WORKDIR}

COPY requirements.txt .


# Read https://stackoverflow.com/questions/65766066/can-i-make-flex-template-jobs-take-less-than-10-minutes-before-they-start-to-pro#comment116304237_65766066
# to understand why apache-beam is not being installed from requirements.txt
RUN pip install --no-cache-dir -U apache-beam==2.26.0
RUN pip install --no-cache-dir -U -r ./requirements.txt

COPY mymodule.py setup.py ./
COPY protoc_gen protoc_gen/

ENV FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE="${WORKDIR}/requirements.txt" ENV FLEX_TEMPLATE_PYTHON_PY_FILE="${WORKDIR}/mymodule.py"
ENV FLEX_TEMPLATE_PYTHON_SETUP_FILE="${WORKDIR}/setup.py"

và đây là setup.py của tôi:

import setuptools

setuptools.setup(
    packages=setuptools.find_packages(),
    install_requires=[],
    name="my df job modules",
)