管理依赖关系-管道代码跨多个文件

时间:2020-04-07 01:02:48

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

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

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

row = p | "read_sub" >> pubsub.ReadFromPubSub(subscription=SUB,with_attributes=True,) \
        | "add_timestamps" >> beam.Map(add_timestamps)

add_timestamps是我的自定义转换

def add_timestamps(e):
    payload = e.data.decode()
    return {"message":payload}

add_timestamps和管道代码位于同一文件 pipeline.py 中时,一切正常。

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

root_dir/
   pipeline.py
   setup.py
   my_transforms/
      __init__py.py
      transforms.py

其中, setup.py

import setuptools
setuptools.setup(
   name='my-custom-transforms-package',
   version='1.0',
   install_requires=["datetime"],
   packages= ['my_transforms'] #setuptools.find_packages(),
)

所有add_timestamps转换代码都移至 transforms.py (在 my_transforms 软件包目录下)

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

from my_transforms.transforms import add_timestamps
row = p | "read_sub" >> pubsub.ReadFromPubSub(subscription=SUB,with_attributes=True,) \
        | "add_timestamps" >> beam.Map(add_timestamps)

在启动管道时,我确实设置了标志:--setup_file=./setup.py

但是,不会将单个元素读入管道(如您所见,数据水印仍然卡住,并且添加的元素(近似值)不报告任何内容)

2 个答案:

答案 0 :(得分:1)

我已经测试了Dataflow中的“多个文件依赖项”选项,对我来说它运行良好。我从Medium复制了示例。

您的目录结构正确。您是否在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()
)

在运行管道时,请注意在PipelineOptions中设置以下字段:job_nameprojectrunnerstaging_location,{{1 }}。您必须指定temp_locationtemp_location中的至少一个才能在Google云上运行管道。如果将Apache Beam SDK用于Python 2.15.0或更高版本,则还必须指定区域。记住要指定到staging_location的完整路径。

它看起来类似于该命令:

setup.py

我希望这会有所帮助。

答案 1 :(得分:1)

我找到了根本原因...我正在设置标志--no_use_public_ips,并且在install_requires=["datetime"]中有setup.py

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