Python 管理依赖项-管道代码跨越多个文件

Python 管理依赖项-管道代码跨越多个文件,python,google-cloud-dataflow,apache-beam,python-packaging,Python,Google Cloud Dataflow,Apache Beam,Python Packaging,在将“主管道代码”和“自定义转换代码”分离为多个文件后,我在DataFlowRunner上运行流式管道时遇到问题,如下所述:-没有元素(pubs消息)读入管道。“作业日志”、“工作日志”、“数据流UI中的作业错误报告”选项卡均未报告任何错误。工作ID:2020-04-06_15_23_52-4004061030939218807如果有人想看一下 管道最小代码(之前)): pipeline.py row=p |“read_sub”>>pubsub.ReadFromPubSub(subscripti

在将“主管道代码”和“自定义转换代码”分离为多个文件后,我在
DataFlowRunner
上运行流式管道时遇到问题,如下所述:-没有元素(pubs消息)读入管道。“作业日志”、“工作日志”、“数据流UI中的作业错误报告”选项卡均未报告任何错误。工作ID:
2020-04-06_15_23_52-4004061030939218807
如果有人想看一下

管道最小代码(之前)): pipeline.py

row=p |“read_sub”>>pubsub.ReadFromPubSub(subscription=sub,带有_属性=True,)\
|“添加时间戳”>>beam.Map(添加时间戳)
add_timestamps
是我的自定义转换

def添加时间戳(e):
有效载荷=e.data.decode()
返回{“消息”:有效负载}
add_timestamp
且管道代码位于同一文件pipeline.py中时,所有这些都可以正常工作

之后我对文件进行了如下重组:

root_dir/
   pipeline.py
   setup.py
   my_transforms/
      __init__py.py
      transforms.py
其中,setup.py

导入设置工具
setuptools.setup(
name='my-custom-transforms-package',
version='1.0',
install_requires=[“datetime”],
packages=['my_transforms']#setuptools.find_packages(),
)
所有
add\u时间戳
transform代码移动到transforms.py(在my\u transforms包目录下)

在mypipeline.py中,我现在导入并使用转换,如下所示:

root_dir/
   pipeline.py
   setup.py
   my_transforms/
      __init__py.py
      transforms.py
从my_transforms.transforms导入添加时间戳
row=p |“read_sub”>>pubsub.ReadFromPubSub(subscription=sub,带有_属性=True,)\
|“添加时间戳”>>beam.Map(添加时间戳)
启动pipline时,我设置了标志:
--setup\u file=./setup.py


但是,没有一个元素被读取到管道中(您可以看到数据水印仍然被卡住,添加的元素(近似值)没有报告任何内容)

我已经测试了Dataflow中的多文件依赖项选项,对我来说,它工作得很好。我从中复制了一个例子

您的目录结构是正确的。您是否在
transforms.py
文件中添加了任何导入

我建议您在
setup.py
中进行一些更改:

import setuptools

REQUIRED_PACKAGES = [
    ‘datetime’
]

PACKAGE_NAME = 'my_transforms'
PACKAGE_VERSION = '0.0.1'

setuptools.setup(
   name=PACKAGE_NAME,
   version=PACKAGE_VERSION,
   description='My transforms package',
   install_requires=REQUIRED_PACKAGES,
   packages=setuptools.find_packages()
)
运行管道时,请注意以下字段的设置:
job\u name
project
runner
staging\u location
temp\u location
。您必须指定至少一个
temp_location
staging_location
以在谷歌云上运行管道。如果使用ApacheBeamSDK for Python 2.15.0或更高版本,还必须指定区域。还记得指定
setup.py
的完整路径吗

它将类似于该命令:

python3 pipeline.py \
--job_name <JOB_NAME>
--project <PROJECT_NAME> \
--runner DataflowRunner \
--region <REGION> \
--temp_location gs://<BUCKET_NAME>/temp \
--setup_file /<FULL_PATH>/setup.py
python3 pipeline.py\
--工作名称
--计划\
--转轮数据流转轮\
--区域\
--临时位置gs:///temp\
--setup\u文件//setup.py

我希望它能有所帮助。

我已经测试了Dataflow中的多文件依赖项选项,对我来说效果很好。我从中复制了一个例子

您的目录结构是正确的。您是否在
transforms.py
文件中添加了任何导入

我建议您在
setup.py
中进行一些更改:

import setuptools

REQUIRED_PACKAGES = [
    ‘datetime’
]

PACKAGE_NAME = 'my_transforms'
PACKAGE_VERSION = '0.0.1'

setuptools.setup(
   name=PACKAGE_NAME,
   version=PACKAGE_VERSION,
   description='My transforms package',
   install_requires=REQUIRED_PACKAGES,
   packages=setuptools.find_packages()
)
运行管道时,请注意以下字段的设置:
job\u name
project
runner
staging\u location
temp\u location
。您必须指定至少一个
temp_location
staging_location
以在谷歌云上运行管道。如果使用ApacheBeamSDK for Python 2.15.0或更高版本,还必须指定区域。还记得指定
setup.py
的完整路径吗

它将类似于该命令:

python3 pipeline.py \
--job_name <JOB_NAME>
--project <PROJECT_NAME> \
--runner DataflowRunner \
--region <REGION> \
--temp_location gs://<BUCKET_NAME>/temp \
--setup_file /<FULL_PATH>/setup.py
python3 pipeline.py\
--工作名称
--计划\
--转轮数据流转轮\
--区域\
--临时位置gs:///temp\
--setup\u文件//setup.py

希望有帮助。

我找到了根本原因。。。我在
setup.py
中设置了标志
--no\u use\u public\u ips
install\u requires=[“datetime”]


当然,没有外部IP,工人无法与python package manager服务器通信以安装
datetime
。通过不设置标志
--no_use_public_ips
(我将在后面介绍如何为工作进程禁用外部IP并仍然能够成功运行)来解决问题。如果作业/工人日志中至少显示了一些错误消息,那就好了!花了2-3天的时间进行故障排除:=)

我找到了根本原因。。。我在
setup.py
中设置了标志
--no\u use\u public\u ips
install\u requires=[“datetime”]


当然,没有外部IP,工人无法与python package manager服务器通信以安装
datetime
。通过不设置标志
--no_use_public_ips
(我将在后面介绍如何为工作进程禁用外部IP并仍然能够成功运行)来解决问题。如果作业/工人日志中至少显示了一些错误消息,那就好了!花了2-3天的时间进行故障排除:=)

谢谢您的评论。一切都安排好了。。试图为
--setup\u文件
提供//setup.py,但也没有帮助。我找到了根本原因-上面已回答。如果作业/工人日志中至少显示了一些错误消息,那就好了!花了2-3天时间进行故障排除:=)感谢您的评论。一切都安排好了。。试图为
--setup\u文件
提供//setup.py,但也没有帮助。我找到了根本原因-上面已回答。如果作业/工人日志中至少显示了一些错误消息,那就好了!花了大约2-3天的时间进行故障排除:=)