Menyertakan file lain dalam template flex Dataflow Python, ImportError

Nov 18 2020

Apakah ada contoh Template Python Dataflow Flex dengan lebih dari satu file di mana skrip mengimpor file lain yang termasuk dalam folder yang sama?

Struktur proyek saya seperti ini:

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

Saya mencoba untuk mengimpor custom.py di dalam main.py untuk template dataflow flex.

Saya menerima kesalahan berikut dalam eksekusi pipa:

"ModuleNotFoundError: No module named 'custom'"

Pipeline berfungsi dengan baik jika saya menyertakan semua kode dalam satu file dan tidak mengimpor apa pun.

Contoh 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"

File spesifikasi Python:

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

Saya menerapkan template dengan perintah berikut: gcloud builds submit --project=${PROJECT} --tag ${TARGET_GCR_IMAGE} .

Setiap bantuan dihargai.

Jawaban

3 AkshayApte Nov 19 2020 at 21:58

Saya benar-benar menyelesaikan ini dengan mengirimkan parameter tambahan setup_file ke eksekusi template. Juga perlu menambahkan setup_fileparameter ke metadata template

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

Rupanya perintah ENV FLEX_TEMPLATE_PYTHON_SETUP_FILE="${WORKDIR}/setup.py" di Dockerfile tidak berguna dan tidak benar-benar mengambil file setup.

File setup saya terlihat seperti ini:

import setuptools

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

Setelah beberapa pengujian, saya menemukan bahwa karena beberapa alasan yang tidak diketahui file phyton di direktori kerja ( WORKDIR) tidak dapat direferensikan dengan impor. Tetapi itu berfungsi jika Anda membuat subfolder dan memindahkan dependensi python ke dalamnya. Saya menguji dan berhasil, misalnya, dalam kasus penggunaan Anda, Anda dapat memiliki struktur berikut:

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

Dan Anda akan dapat referensi: import mypackage.custom. File Docker harus dipindahkan custom.pyke direktori yang benar.

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

Dan dependecy akan ditambahkan ke direktori instalasi 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 meminta saya untuk memposting solusi saya, jadi ini dia.

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"

dan inilah my setup.py:

import setuptools

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