Menyertakan file lain dalam template flex Dataflow Python, ImportError
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
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'
],
)
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
@ 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",
)