【问题标题】:Including another file in Dataflow Python flex template, ImportError在 Dataflow Python flex 模板中包含另一个文件 ImportError
【发布时间】:2021-03-01 20:44:38
【问题描述】:

是否存在包含多个文件的 Python 数据流 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} .

感谢任何帮助。

【问题讨论】:

  • 您是否尝试将 ${WORKDIR} 附加到 PYTHONPATH 环境变量?您可以尝试将ENV PYTHONPATH="${WORKDIR}:${PYTHONPATH}" 添加到您的 dockerfile。
  • 是的。我尝试附加到 PYTHONPATH。好像没用
  • @AkshayApte 你有 setup.py 作为 custom.py 的同一级别吗?对我来说,find_packages 找不到 custom.py,似乎 setup.py 必须是上面的一个目录 - stackoverflow.com/questions/28573040/… 很好奇你是如何让它工作的。

标签: python google-cloud-platform google-cloud-dataflow apache-beam


【解决方案1】:

我实际上是通过将附加参数 setup_file 传递给模板执行来解决这个问题的。还需要在模板元数据中添加setup_file参数

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

显然 Dockerfile 中的命令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'
    ],
 )

【讨论】:

  • 哇,感谢您发布此信息。对于可能在这里看到的其他人,我还想提一下 setup_files 中的 py_module 也不起作用。我现在试试find_packages()
  • find_packages() 它以某种方式弄乱了我的原型,所以我仍在试图弄清楚如何让 py_module 工作。嗯..
  • 我试过这个并在以这种方式发送setup_file作为参数时得到Unrecognized parameter
  • 还需要在模板元数据中添加 setup_file 参数
  • @jamiet,你能分享你正在使用的代码吗?我正在尝试在dockerfile中使用FLEX_TEMPLATE_PYTHON_SETUP_FILE做同样的事情,在数据流日志中它确实显示正在执行:python /dataflow/template/streaming_beam.py --setup_file=/dataflow/template/setup.py ...但是它立即抛出未找到回溯模块。它实际上并没有执行 setup.py 中提到的设置操作
【解决方案2】:

经过一些测试,我发现由于某些未知原因,工作目录 (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

【讨论】:

  • 您是否使用此技术成功运行了 Dataflow 作业?我已经尝试复制它,但仍然收到错误No module named 'protoc_gen(protoc_gen 是我要添加模块的包)
  • 您的setup.py 文件中有什么内容?
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    在 apache beam 2.27 中还可以,看来我们需要遵循传递 setup_file 参数的原始做法...... 惭愧..

    【讨论】:

      猜你喜欢
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-18
      • 1970-01-01
      • 2012-08-15
      • 2015-11-30
      相关资源
      最近更新 更多