Dataflow Python 가변 템플릿에 다른 파일 ImportError 포함

Nov 18 2020

스크립트가 동일한 폴더에 포함 된 다른 파일을 가져 오는 파일이 두 개 이상 포함 된 Python Dataflow Flex 템플릿의 예가 있습니까?

내 프로젝트 구조는 다음과 같습니다.

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

데이터 흐름 플렉스 템플릿을 위해 main.py 내부에서 custom.py를 가져 오려고합니다.

파이프 라인 실행에서 다음 오류가 발생합니다.

"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

몇 가지 테스트 후 알 수없는 이유로 작업 디렉토리 ( WORKDIR)에있는 phyton 파일을 가져 오기와 함께 참조 할 수 없음을 발견했습니다. 그러나 하위 폴더를 만들고 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",
)