在将“主管道代码”和“自定义转换代码”分离为多个文件之后,我在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
。
但是,不会将单个元素读入管道(如您所见,数据水印仍然卡住,并且添加的元素(近似值)不报告任何内容)
答案 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_name
,project
,runner
,staging_location
,{{1 }}。您必须指定temp_location
或temp_location
中的至少一个才能在Google云上运行管道。如果将Apache Beam SDK用于Python 2.15.0或更高版本,则还必须指定区域。记住要指定到staging_location
的完整路径。
它看起来类似于该命令:
setup.py
我希望这会有所帮助。
答案 1 :(得分:1)
我找到了根本原因...我正在设置标志--no_use_public_ips
,并且在install_requires=["datetime"]
中有setup.py
。
datetime
。通过不设置标志--no_use_public_ips
来解决问题(我将在稍后的解决方案中介绍如何为工作人员禁用外部IP并仍然能够成功运行)。至少在“作业/工人”日志中显示了一些错误消息会很好!花了2-3天进行故障排除:=)