数据流 flex 模板:ModuleNotFoundError:没有模块名称

Posted

技术标签:

【中文标题】数据流 flex 模板:ModuleNotFoundError:没有模块名称【英文标题】:Dataflow flex template: ModuleNotFoundError: no module name 【发布时间】:2022-01-17 07:45:07 【问题描述】:

我的 Python 包具有以下结构,beam.py 是 Dataflow 的入口点脚本:

package_name\
    __init__.py
    tasks\
        __init__.py
        package_sum.py     
    utils\
        __init__.py
        beam.py
.gitignore
requirements.txt
setup.py
Dockerfile

beam.py:

import argparse

import apache_beam as beam
from apache_beam.options.pipeline_options import PipelineOptions

from package_name.tasks import package_sum


def run(input_pubsub_topic, beam_args):
    beam_pipeline_options = PipelineOptions(
            beam_args, 
            save_main_session=True, 
            streaming=True
    )

    # Initialize the Beam pipeline
    pipeline = beam.Pipeline(options=beam_pipeline_options)

    pipeline | 'ReadFromPubSub' >> beam.io.ReadFromPubSub(input_pubsub_topic)
             | 'Sum' >> beam.Map(package_sum)

    # Run pipeline
    pipeline.run().wait_until_finish()

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="test")
    parser.add_argument("--input_pubsub_topic")

    args, beam_args = parser.parse_known_args()

    run(args.input_pubsub_topic, beam_args)

在我下面的Dockerfile 中,我安装了镜像中的包并将其下载到/tmp/dataflow-requirements-cache

FROM gcr.io/dataflow-templates-base/python3-template-launcher-base:latest

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

COPY requirements.txt .
COPY package_name package_name

# Do not include `apache-beam` in requirements.txt
ENV FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE="$WORKDIR/requirements.txt"
ENV FLEX_TEMPLATE_PYTHON_PY_FILE="$WORKDIR/package_name/utils/beam.py"

# Install apache-beam and other dependencies to launch the pipeline
RUN pip install --no-cache-dir --upgrade pip \
    && pip install --no-cache-dir apache-beam[gcp]==2.32.0
    && pip install --no-cache-dir -r $FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE \
    && pip install --no-cache-dir . \
    # Download the requirements to speed up launching the Dataflow job.
    && pip download --no-cache-dir --dest /tmp/dataflow-requirements-cache -r $FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE \
    && pip download --no-cache-dir --dest /tmp/dataflow-requirements-cache .

# Since we already downloaded all the dependencies, there's no need to rebuild everything.
ENV PIP_NO_DEPS=True

当我启动 flex 模板作业时,它仍然会导致错误:ModuleNotFoundError: No module named 'package_name'。我该如何解决这个问题?

【问题讨论】:

你可以添加你的setup.py的内容吗? 【参考方案1】:

要让 flex 模板识别 package_name,您需要在 Dockerfile 上定义 PYTHONPATH。在 Dockerfile 中添加这一行:

ENV PYTHONPATH $WORKDIR

您的最终 Dockerfile 应如下所示:

FROM gcr.io/dataflow-templates-base/python3-template-launcher-base:latest

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

COPY requirements.txt .
COPY package_name package_name

ENV PYTHONPATH $WORKDIR

# Do not include `apache-beam` in requirements.txt
ENV FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE="$WORKDIR/requirements.txt"
ENV FLEX_TEMPLATE_PYTHON_PY_FILE="$WORKDIR/package_name/utils/beam.py"

# Install apache-beam and other dependencies to launch the pipeline
RUN pip install --no-cache-dir --upgrade pip \
    && pip install --no-cache-dir apache-beam[gcp]==2.32.0
    && pip install --no-cache-dir -r $FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE \
    && pip install --no-cache-dir . \
    # Download the requirements to speed up launching the Dataflow job.
    && pip download --no-cache-dir --dest /tmp/dataflow-requirements-cache -r $FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE \
    && pip download --no-cache-dir --dest /tmp/dataflow-requirements-cache .

# Since we already downloaded all the dependencies, there's no need to rebuild everything.
ENV PIP_NO_DEPS=True

确保在运行 Dataflow flex 模板之前重建图像和 flex 模板。

【讨论】:

谢谢@Ricco,我试过ENV PYTHONPATH $WORKDIR,但是没有用。然后我尝试将FLEX_TEMPLATE_PYTHON_EXTRA_PACKAGES 设置为环境变量,并且成功了。你知道为什么PYTHONPATH 不起作用,而FLEX_TEMPLATE_PYTHON_EXTRA_PACKAGES 起作用吗?我也不明白为什么我需要指定任何这些环境变量,因为包已经安装在我的 Docker 容器中(当我在容器中运行 pip list 时可以看到它),我认为工人会是使用相同的容器和 pip 环境。 @aaron02 我明白了,您也可以发布您的答案并接受它。关于您的后续问题,最好为其创建一个新问题,以便社区可以提供答案。【参考方案2】:

导入名称错误,根据你的项目结构你没有package_sum

试试这个

from package_name.tasks import sum as package_sum

注意:为您的模块和包使用有意义的命名约定,否则,您将找不到真正的错误。

【讨论】:

感谢您的评论,但这是问题中的错字。我现在已将文件名从sum.py 更正为package_sum.py,这就是我所拥有的并且仍然面对ModuleNotFoundError 我很抱歉很难调查,给定的信息。如果您更新完整的错误日志,也许有人会帮助您。

以上是关于数据流 flex 模板:ModuleNotFoundError:没有模块名称的主要内容,如果未能解决你的问题,请参考以下文章

flex10使用新一代js模板引擎NornJ提升React.js开发体验

GCP Flex 模板错误:未在 envsetup 文件中设置 py 选项...错误等待容器:意外 EOF

Flex 布局教程:实例篇(转)

json ACF Pro的基于Genesis的页面模板,允许嵌套的选项卡组。第一级是水平标签,第二级是垂直标签。使用Flex

移动开发入门flex boostrap less

Angular Flex 布局总是显示滚动条