繁体   English   中英

如何将 numpy 导入在 GCP Dataflow 上运行的 Apache Beam 管道?

[英]How do I import numpy into an Apache Beam pipeline, running on GCP Dataflow?

我正在尝试使用 Python (3.7) 编写 Apache Beam 管道。 我在导入numpy时遇到问题,特别是尝试在我写的 DoFn 转换 class 中使用 numpy 。

在 GCP DataFlow 中运行时,我收到以下错误“NameError: name 'numpy' is not defined”

首先,一切都按照使用 DirectRunner 时的预期运行。 该问题仅在使用 GCP 的 DataFlow 运行器时出现。

我相信这个问题与 scope 在 GCP DataFlow 中的工作方式有关,而不是与导入本身有关。 例如,如果我将导入添加到我的 class 中的“进程”方法中,我可以成功地让导入工作,但是当我在文件顶部添加导入时会失败。

我尝试使用需求文件和 setup.py 文件作为管道的命令选项,但没有任何改变。 同样,我不认为问题在于引入 numpy,而是更多地与 DataFlow 具有意外的类/函数范围有关。

安装程序.py 文件

from __future__ import absolute_import
from __future__ import print_function
import setuptools

REQUIRED_PACKAGES = [
    'numpy',
    'Cython',
    'scipy',
    'google-cloud-bigtable'
]

setuptools.setup(
    name='my-pipeline',
    version='0.0.1',
    install_requires=REQUIRED_PACKAGES,
    packages=setuptools.find_packages(),
)

总的来说,我遇到了许多“范围”问题,我希望有人能提供帮助,因为 Apache Beam 文档确实没有很好地涵盖这一点。

from __future__ import absolute_import
from __future__ import division

import apache_beam as beam
import numpy

class Preprocess(beam.DoFn):

    def process(self, element, *args, **kwargs):
        # Demonstrating how I want to call numpy in the process function
        if numpy.isnan(numpy.sum(element['signal'])):
            return [MyOject(element['signal'])]

def run(argv=None):
    parser = argparse.ArgumentParser()
    args, pipeline_args = parser.parse_known_args(argv)
    options = PipelineOptions(pipeline_args)

    p = beam.Pipeline(options=options)
    messages = (p | beam.io.ReadFromPubSub(subscription=args.input_subscription).with_output_types(bytes))
    lines = messages | 'Decode' >> beam.Map(lambda x: x.decode('utf-8'))
    json_messages = lines | "Jsonify" >> beam.Map(lambda x: json.loads(x))

    preprocess_messages = json_messages | "Preprocess" >> beam.ParDo(Preprocess())
    result = p.run()
    result.wait_until_finish()

if __name__ == '__main__':
    logging.getLogger().setLevel(logging.INFO)
    run()

我希望管道的工作方式与使用 DirectRunner 在本地运行时的方式类似,但范围/导入的工作方式不同,并导致我的管道崩溃。

当您从桌面启动 Apache Beam DirectRunner python 程序时,该程序正在您的桌面上运行。 您已经在本地安装了 numpy 库。 但是,您尚未通知 Dataflow 下载并安装 numpy。 这就是为什么您的程序作为 DirectRunner 运行但作为 DataflowRunner 失败的原因。

编辑/创建一个普通的 Python requirements.txt 文件并包括所有依赖项,例如 numpy。 我更喜欢使用 virtualdev,导入所需的包,确保我的程序在 DirectRunner 下运行,然后运行pip freeze为 requirements.txt 创建我的 package 列表。 现在 Dataflow 将知道要导入哪些包,以便您的程序在 Dataflow 集群上运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM