簡體   English   中英

在數據流 Python flex 模板中包含另一個文件,ImportError

[英]Including another file in Dataflow Python flex template, ImportError

是否有 Python Dataflow Flex 模板的示例,其中包含多個文件,其中腳本正在導入同一文件夾中包含的其他文件?

我的項目結構是這樣的:

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

我正在嘗試在 main.py 中導入 custom.py 以獲取數據流 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} .

我實際上是通過向模板執行傳遞一個額外的參數 setup_file 來解決這個問題的。 還需要在模板元數據中添加setup_file參數

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

顯然, ENV FLEX_TEMPLATE_PYTHON_SETUP_FILE="${WORKDIR}/setup.py"的命令ENV FLEX_TEMPLATE_PYTHON_SETUP_FILE="${WORKDIR}/setup.py"沒有用,實際上並沒有選擇安裝文件。

我的安裝文件如下所示:

import setuptools

setuptools.setup(
    packages=setuptools.find_packages(),
    install_requires=[
        'apache-beam[gcp]==2.24.0'
    ],
 )

經過一些測試,我發現由於某些未知原因,工作目錄( 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

@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",
)

好的,使用 apache beam 2.27 似乎我們需要遵循傳遞 setup_file 參數的原始做法....恥辱..

對我來說,我不需要在命令中集成 setup_file 來觸發 flex 模板,這是我的 Dockerfile:

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

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

COPY . .

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

# Install apache-beam and other dependencies to launch the pipeline
RUN pip install apache-beam[gcp]
RUN pip install -U -r ./requirements.txt

這是命令:

gcloud dataflow flex-template run "job_ft" --template-file-gcs-location "$TEMPLATE_PATH" --parameters paramA="valA" --region "europe-west1"

可以在此處找到 Python 數據流 Flex 模板的工作示例,其中包含多個文件,其中腳本正在導入同一文件夾中包含的其他文件: https://github.com/toransahu/apache-beam-eg/tree/main /python/using_flex_template_adv1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM