Python 如何将numpy导入到运行在GCP数据流上的apachebeam管道中?

Python 如何将numpy导入到运行在GCP数据流上的apachebeam管道中?,python,numpy,google-cloud-platform,google-cloud-dataflow,apache-beam,Python,Numpy,Google Cloud Platform,Google Cloud Dataflow,Apache Beam,我正在尝试使用Python(3.7)编写ApacheBeam管道。我在导入时遇到了一些问题,特别是在我编写的DoFn转换类中尝试使用numpy时 在GCP数据流中运行时,我收到以下错误“NameError:name'numpy'未定义” 首先,一切都按照使用DirectRunner时的预期工作。问题仅在GCP使用DataFlow runner时出现 我认为问题与GCP数据流中的作用域如何工作有关,而不是导入本身。例如,如果我将导入添加到类中的“process”方法中,我可以成功地使导入工作,但如

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

在GCP数据流中运行时,我收到以下错误“NameError:name'numpy'未定义”

首先,一切都按照使用DirectRunner时的预期工作。问题仅在GCP使用DataFlow runner时出现

我认为问题与GCP数据流中的作用域如何工作有关,而不是导入本身。例如,如果我将导入添加到类中的“process”方法中,我可以成功地使导入工作,但如果我将导入添加到文件顶部,则导入失败

我尝试使用需求文件和setup.py文件作为管道的命令选项,但没有改变。同样,我认为问题不在于带来numpy,而在于数据流具有意外的类/函数范围

setup.py文件

来自未来导入绝对导入
来自未来导入打印功能
导入设置工具
必需的\u包=[
“numpy”,
“赛昂”,
“scipy”,
“谷歌云大表”
]
setuptools.setup(
name='my-pipeline',
version='0.0.1',
安装\u requires=所需的\u软件包,
packages=setuptools.find_packages(),
)
总的来说,我在“范围”方面遇到了很多问题,我希望有人能提供帮助,因为apachebeam文档并没有很好地涵盖这一点

来自未来导入绝对导入
来自未来进口部
将apache_梁作为梁导入
进口numpy
类预处理(beam.DoFn):
def流程(自身、元素、*args、**kwargs):
#演示如何在流程函数中调用numpy
如果numpy.isnan(numpy.sum(元素['signal']):
返回[myObject(元素['signal'])]
def运行(argv=None):
parser=argparse.ArgumentParser()
args,pipeline_args=parser.parse_known_args(argv)
选项=管道选项(管道参数)
p=梁管道(选项=选项)
messages=(p | beam.io.ReadFromPubSub(subscription=args.input_subscription)。带有_output_类型(字节))
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())
结果=p.运行()
结果。等待直到完成()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
logging.getLogger().setLevel(logging.INFO)
运行()

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

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


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

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


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

我不相信这种情况,因为my setup.py需要numpy作为必需的包。我能够让管道在数据流中运行,但我不确定到底是什么修复了它,因为我做了2个更改。1.我开始使用
-m
标志以脚本的形式运行管道。我不再运行
python pipeline.py
,而是运行
python-m pipeline.py
。2.我将所有转换移动到它们自己的文件中。每个转换类都有自己的文件,我现在只需将它们导入pipeline.py即可。@davidl11223344您应该使用
requirements.txt
--setup_file
命令行选项(使用一个或另一个)。我不认为是这种情况,因为我的setup.py需要numpy作为必需的包。我能够让管道在数据流中运行,但我不确定到底是什么修复了它,因为我做了2个更改。1.我开始使用
-m
标志以脚本的形式运行管道。我不再运行
python pipeline.py
,而是运行
python-m pipeline.py
。2.我将所有转换移动到它们自己的文件中。每个转换类都有自己的文件,我现在只需将它们导入pipeline.py即可。@davidl11223344您应该使用
requirements.txt
--setup_file
命令行选项(使用一个或另一个)。