รวมไฟล์อื่นในเทมเพลต Dataflow Python flex, ImportError

Nov 18 2020

มีตัวอย่างของ Python Dataflow Flex Template ที่มีไฟล์มากกว่าหนึ่งไฟล์ที่สคริปต์กำลังนำเข้าไฟล์อื่น ๆ ที่รวมอยู่ในโฟลเดอร์เดียวกันหรือไม่

โครงสร้างโครงการของฉันเป็นดังนี้:

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

ฉันกำลังพยายามนำเข้า custom.py ภายใน main.py สำหรับเทมเพลต dataflow flex

ฉันได้รับข้อผิดพลาดต่อไปนี้ในการดำเนินการไปป์ไลน์:

"ModuleNotFoundError: No module named 'custom'"

ไปป์ไลน์ทำงานได้ดีถ้าฉันรวมโค้ดทั้งหมดไว้ในไฟล์เดียวและไม่ได้ทำการอิมพอร์ตใด ๆ

ตัวอย่าง 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"

ไฟล์ข้อมูลจำเพาะของ Python:

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

ฉันกำลังปรับใช้เทมเพลตด้วยคำสั่งต่อไปนี้: gcloud builds submit --project=${PROJECT} --tag ${TARGET_GCR_IMAGE} .

ความช่วยเหลือใด ๆ ที่ได้รับการชื่นชม

คำตอบ

3 AkshayApte Nov 19 2020 at 21:58

ฉันแก้ไขสิ่งนี้ได้จริงโดยส่งพารามิเตอร์ setup_file เพิ่มเติมไปยังการเรียกใช้เทมเพลต ยังต้องเพิ่มsetup_fileพารามิเตอร์ให้กับข้อมูลเมตาของเทมเพลต

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

เห็นได้ชัดว่าคำสั่งENV FLEX_TEMPLATE_PYTHON_SETUP_FILE="${WORKDIR}/setup.py" ใน Dockerfile ไม่มีประโยชน์และไม่ได้รับไฟล์ติดตั้งจริง

ไฟล์ติดตั้งของฉันมีลักษณะดังนี้:

import setuptools

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

หลังจากการทดสอบบางอย่างฉันพบว่าด้วยเหตุผลบางประการที่ไม่ทราบสาเหตุไฟล์ phyton ที่ working directory ( WORKDIR) ไม่สามารถอ้างอิงกับการนำเข้าได้ แต่จะใช้งานได้ถ้าคุณสร้างโฟลเดอร์ย่อยและย้ายการอ้างอิงของ python ไปไว้ในโฟลเดอร์นั้น ฉันทดสอบแล้วและใช้งานได้ตัวอย่างเช่นในกรณีการใช้งานของคุณคุณสามารถมีโครงสร้างต่อไปนี้:

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

และคุณจะสามารถอ้างอิง: import mypackage.custom. ไฟล์ Docker ควรย้ายcustom.pyไปยังไดเร็กทอรีที่เหมาะสม

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

และการอ้างอิงจะถูกเพิ่มลงในไดเร็กทอรีการติดตั้ง 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 ขอให้ฉันโพสต์วิธีแก้ปัญหาของฉันดังนั้นนี่คือ.

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"

และนี่คือ setup.py ของฉัน:

import setuptools

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