Python Apache beam DataFlow runner抛出设置错误

Python Apache beam DataFlow runner抛出设置错误,python,google-cloud-dataflow,apache-beam,Python,Google Cloud Dataflow,Apache Beam,我们正在使用Beam Python SDK构建数据管道,并尝试在Dataflow上运行,但出现以下错误: A setup error was detected in beamapp-xxxxyyyy-0322102737-03220329-8a74-harness-lm6v. Please refer to the worker-startup log for detailed information. 但找不到详细的工作程序启动日志 我们尝试增加内存大小、工作计数等,但仍然得到相同的错误 这

我们正在使用Beam Python SDK构建数据管道,并尝试在Dataflow上运行,但出现以下错误:

A setup error was detected in beamapp-xxxxyyyy-0322102737-03220329-8a74-harness-lm6v. Please refer to the worker-startup log for detailed information.
但找不到详细的工作程序启动日志

我们尝试增加内存大小、工作计数等,但仍然得到相同的错误

这是我们使用的命令

python run.py \
--project=xyz \
--runner=DataflowRunner \
--staging_location=gs://xyz/staging \
--temp_location=gs://xyz/temp \
--requirements_file=requirements.txt \
--worker_machine_type n1-standard-8 \
--num_workers 2
管道片段

data = pipeline | "load data" >> beam.io.Read(    
    beam.io.BigQuerySource(query="SELECT * FROM abc_table LIMIT 100")
)

data | "filter data" >> beam.Filter(lambda x: x.get('column_name') == value)
上面的管道只是从BigQuery加载数据,并基于某个列值进行过滤。此管道在DirectRunner中工作得很好,但在数据流中失败

我们有没有明显的设置错误?还有谁会犯同样的错误?我们需要一些帮助来解决这个问题

更新:
我们的管道代码分布在多个文件中,因此我们创建了一个python包。我们通过传递
--setup\u file
参数而不是
--requirements\u file

解决了设置错误问题。我们通过向数据流发送一组不同的参数来解决此设置错误问题。我们的代码分布在多个文件中,因此必须为其创建一个包。如果我们使用
--requirements\u file
,作业将启动,但最终会失败,因为它无法在workers中找到包。beampythonsdk有时不会为这些任务抛出显式错误消息,而是会重试该作业并失败。要使代码与包一起运行,需要传递
--setup\u file
参数,该参数中列出了依赖项。确保由
python setup.py sdist
命令创建的包包含管道代码所需的所有文件

如果您有一个私有托管的python包依赖项,则将路径传递给package.tar.gz文件。更好的方法是存储在GCS存储桶中,并在此处传递路径

我已经编写了一个示例项目来开始使用数据流上的Apache Beam Python SDK-


在这里阅读-

我正在使用ApacheBeam/Dataflow构建一个预测管道。我需要在远程工作者可用的依赖项中包含模型文件。数据流作业失败,错误日志相同:

Error message from worker: A setup error was detected in beamapp-xxx-xxxxxxxxxx-xxxxxxxx-xxxx-harness-xxxx. Please refer to the worker-startup log for detailed information.
但是,此错误消息没有提供有关工作程序启动日志的任何详细信息。最后,我找到了一种方法来记录worker日志并解决这个问题

众所周知,Dataflow创建计算引擎来运行作业并在其上保存日志,以便我们可以访问vm以查看日志。我们可以通过SSH从GCP控制台连接到数据流作业使用的vm。然后我们可以检查位于
/var/log/dataflow/taskrunner/harness
中的
boot json.log
文件:

$ cd /var/log/dataflow/taskrunner/harness
$ cat boot-json.log
这里我们要注意。在批处理模式下运行时,Dataflow创建的vm是短暂的,并且在作业失败时关闭。如果虚拟机已关闭,我们将无法再访问它。但包含失败项的进程会重试4次,因此通常我们有足够的时间打开
boot json.log
,看看发生了什么

最后,我将Python安装解决方案放在这里,这可能会帮助其他人:

main.py

舱单

setup.py

运行数据流管道

$ python main.py --setup_file=/absolute/path/to/setup.py ...

您可以在GCP Stackdriver中找到日志(转到GCP控制台->日志->日志并选择DataFlow作业,但失败了)。我们的管道代码分布在多个文件中,因此我们创建了一个python包。我们通过传递
--setup\u file
参数解决了安装错误问题。--requirements\u file和--setup\u文件在过去对我不起作用,所以我建议您使用--extra\u包并传递模块的tar.gz,您可以通过调用
python setup.py sdist
来获得它。我认为将您的更新作为
include models/*.*
REQUIRED_PACKAGES = [...]

setuptools.setup(
    ...
    include_package_data=True,
    install_requires=REQUIRED_PACKAGES,
    packages=setuptools.find_packages()
)
$ python main.py --setup_file=/absolute/path/to/setup.py ...